Compare commits

...

4 Commits

Author SHA1 Message Date
659f2c8e5e Aplly clippy 2023-05-26 05:32:21 +09:00
78a4f8b75e Some fixes 2023-05-26 05:31:26 +09:00
163da695e8 Make case insensitive 2023-05-26 05:30:50 +09:00
4aac16093c Improve CLI 2023-05-26 05:26:28 +09:00
4 changed files with 37 additions and 61 deletions

2
Cargo.lock generated
View File

@ -379,7 +379,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]] [[package]]
name = "winresutil" name = "winresz"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"clap", "clap",

View File

@ -1,5 +1,5 @@
[package] [package]
name = "winresutil" name = "winresz"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2021"

View File

@ -14,7 +14,10 @@ fn filter_target_windows(hwnd: &HWND, q: &TargetInformation) -> bool {
return false; return false;
}; };
if q.title_contains.iter().all(|s| !title.contains(s)) { if q.title_contains
.iter()
.all(|s| !title.to_ascii_lowercase().contains(&s.to_ascii_lowercase()))
{
return false; return false;
} }
} }
@ -30,7 +33,10 @@ fn filter_target_windows(hwnd: &HWND, q: &TargetInformation) -> bool {
return false; return false;
}; };
if q.path_endswith.iter().all(|s| !path.ends_with(s)) { if q.path_endswith
.iter()
.all(|s| !path.to_ascii_lowercase().ends_with(&s.to_ascii_lowercase()))
{
return false; return false;
} }
} }
@ -38,45 +44,33 @@ fn filter_target_windows(hwnd: &HWND, q: &TargetInformation) -> bool {
true true
} }
fn window_callback(hwnd: HWND, op: &Commands) { fn window_callback(hwnd: HWND, op: &Cli) {
let t = match op { if !filter_target_windows(&hwnd, &op.target) {
Commands::Get { target } => target,
Commands::Set {
target,
resolution: _,
} => target,
};
if !filter_target_windows(&hwnd, t) {
return; return;
} }
let client_size = Size::from(hwnd.GetClientRect().unwrap()); let client_size = Size::from(hwnd.GetClientRect().unwrap());
match op { let Some(size) = op.size else {
Commands::Get { target: _ } => { println!("{}\t", client_size - op.target.offset);
println!("{}", client_size - t.offset); return;
} };
Commands::Set {
target: _,
resolution,
} => {
let window_size = Size::from(hwnd.GetWindowRect().unwrap()); let window_size = Size::from(hwnd.GetWindowRect().unwrap());
let border = window_size - client_size; let border = window_size - client_size;
hwnd.SetWindowPos( hwnd.SetWindowPos(
HwndPlace::None, HwndPlace::None,
POINT::new(0, 0), POINT::new(0, 0),
(*resolution + t.offset + border).into(), (size + op.target.offset + border).into(),
SWP::NOMOVE, SWP::NOMOVE,
) )
.unwrap(); .unwrap();
}
}
} }
fn main() { fn main() {
let c = Cli::parse().command; let c = Cli::parse();
EnumWindows(|hwnd: HWND| -> bool { EnumWindows(|hwnd: HWND| -> bool {
window_callback(hwnd, &c); window_callback(hwnd, &c);
true true

View File

@ -1,4 +1,4 @@
use clap::{Args, Parser, Subcommand}; use clap::{Args, Parser};
use std::fmt::{self, Display}; use std::fmt::{self, Display};
use std::io::{Error, ErrorKind}; use std::io::{Error, ErrorKind};
use std::ops::{Add, Sub}; use std::ops::{Add, Sub};
@ -6,35 +6,23 @@ use winsafe::{RECT, SIZE};
#[derive(Debug, Clone, Args)] #[derive(Debug, Clone, Args)]
pub struct TargetInformation { pub struct TargetInformation {
#[arg(short, long)] #[arg(short, long, help = "Filter by binary path")]
pub path_endswith: Vec<String>, pub path_endswith: Vec<String>,
#[arg(short, long)] #[arg(short, long, help = "Filter by title")]
pub title_contains: Vec<String>, pub title_contains: Vec<String>,
#[arg(short, long, value_parser = parse_size, default_value_t = Size::default())] #[arg(short, long, value_parser = parse_size, default_value_t = Size::default(), help = "Additional offset for window")]
pub offset: Size, pub offset: Size,
} }
#[derive(Debug, Clone, Subcommand)]
pub enum Commands {
Get {
#[command(flatten)]
target: TargetInformation,
},
Set {
#[command(flatten)]
target: TargetInformation,
#[arg(value_parser = parse_size)]
resolution: Size,
},
}
#[derive(Debug, Parser)] #[derive(Debug, Parser)]
pub struct Cli { pub struct Cli {
#[command(subcommand)] #[command(flatten)]
pub command: Commands, pub target: TargetInformation,
#[arg(value_parser = parse_size, help = "Set the window size if it's set.")]
pub size: Option<Size>,
} }
#[derive(Debug, Copy, Clone, Parser)] #[derive(Debug, Copy, Clone, Parser, Default)]
pub struct Size { pub struct Size {
pub x: usize, pub x: usize,
pub y: usize, pub y: usize,
@ -78,12 +66,6 @@ impl From<Size> for SIZE {
} }
} }
impl Default for Size {
fn default() -> Self {
Self { x: 0, y: 0 }
}
}
impl Display for Size { impl Display for Size {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}x{}", self.x, self.y) write!(f, "{}x{}", self.x, self.y)