Skip to content

Commit

Permalink
Add support for screens that are not only layed out horizontally.
Browse files Browse the repository at this point in the history
  • Loading branch information
SirVer committed Oct 20, 2021
1 parent 89b0e9e commit f46dc7e
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 73 deletions.
120 changes: 60 additions & 60 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "move_window"
version = "0.3.0"
version = "0.3.1"
authors = ["Holger Rapp <HolgerRapp@gmx.net>"]
edition = "2018"

Expand Down
29 changes: 17 additions & 12 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ enum ScreenSelector {
Index(usize),
Char(char),
}

#[derive(Debug)]
struct MoveParameters {
screen: ScreenSelector,
Expand Down Expand Up @@ -143,14 +144,14 @@ fn get_screens() -> Vec<Screen> {
})
}
};
println!("#sirver rv: {:#?}", rv);
// The window frames have their origins in the bottom left of the screen, y going upwards.
// However, screen bounds have the origin at the top left going down. We need to convert here
// to get them in the screen space.
for idx in 1..rv.len() {
let y = rv[0].frame.height - rv[idx].visible_frame.height - rv[idx].visible_frame.y;
rv[idx].visible_frame.y = y;
}
rv.sort_by_key(|s| s.visible_frame.x);
rv
}

Expand Down Expand Up @@ -181,20 +182,24 @@ fn main() {
};

let screens = get_screens();
let screen = match params.screen {
ScreenSelector::Index(index) => {
let mut screen = None;
for s in &screens {
if s.index == index as u64 {
screen = Some(s)
}
let get_screen_by_index = |index| {
let mut screen = None;
for s in &screens {
if s.index == index as u64 {
screen = Some(s)
}
screen.expect("Unknown screen index.")
}
screen.expect("Unknown screen index.")
};
println!("#sirver screens: {:#?}", screens);
let screen = match params.screen {
ScreenSelector::Index(index) => get_screen_by_index(index),
ScreenSelector::Char(c) => match c {
'l' => &screens[0],
'm' | 'c' => &screens[1],
'r' => &screens[screens.len() - 1],
'm' | 'c' => get_screen_by_index(0),
'l' => screens.iter().min_by_key(|s| s.frame.x).unwrap(),
'r' => screens.iter().max_by_key(|s| s.frame.x).unwrap(),
't' | 'u' => screens.iter().max_by_key(|s| s.frame.y).unwrap(),
'b' | 'd' => screens.iter().min_by_key(|s| s.frame.y).unwrap(),
_ => panic!("Unknown character for screen selection: {}", c),
},
};
Expand Down

0 comments on commit f46dc7e

Please sign in to comment.