From 841344a76c8363e80029e7d308e6574935a992ab Mon Sep 17 00:00:00 2001 From: Bryan Ndjeutcha Date: Tue, 25 May 2021 07:10:23 -0400 Subject: [PATCH] window title --- README.md | 2 - src/main.rs | 166 +++++++++++++++++++++++++++++++++++----------------- 2 files changed, 113 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 91006d5..818d9bf 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ This client is useful if you want to have a workspace module for somethig like [eww](https://github.com/elkowar/eww) or [waybar](https://github.com/Alexays/Waybar). -I also plan to add an option to display the title of the focused window. - ### Dependencies - rust diff --git a/src/main.rs b/src/main.rs index 6f2b90e..e7cc891 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,16 +1,15 @@ mod wayland; -use wayland_client::protocol::wl_output::WlOutput; -use crate::wayland::{ - river_status_unstable_v1::zriver_status_manager_v1::ZriverStatusManagerV1, - river_status_unstable_v1::zriver_output_status_v1::ZriverOutputStatusV1, +use crate::wayland::river_status_unstable_v1::{ + zriver_output_status_v1, zriver_seat_status_v1, zriver_status_manager_v1::ZriverStatusManagerV1, }; -use crate::wayland::river_status_unstable_v1::zriver_output_status_v1; +use wayland_client::protocol::{wl_output::WlOutput, wl_seat::WlSeat}; use wayland_client::{Display, GlobalManager, Main}; struct Globals { - outputs: Vec, - status_manager: Option> + seats: Vec>, + outputs: Vec>, + status_manager: Option>, } fn main() { @@ -18,30 +17,45 @@ fn main() { let mut event_queue = display.create_event_queue(); - let mut globals = { Globals { - outputs: Vec::new(), - status_manager: None - } }; + let mut globals = { + Globals { + seats: Vec::new(), + outputs: Vec::new(), + status_manager: None, + } + }; let mut args = std::env::args(); + let mut seat = None; let mut monitor = None; let mut enable_tag = false; + let mut enable_title = true; let mut enable_views_tag = false; args.next(); loop { match args.next() { Some(flag) => match flag.as_str() { - "--monitor" | "-m" => monitor = match args.next().unwrap_or(String::new()).parse::() { - Ok(i) => Some(i), - Err(_) => None, - }, + "--seat" | "-s" => { + seat = match args.next().unwrap_or(String::new()).parse::() { + Ok(i) => Some(i), + Err(_) => None, + } + } + "--monitor" | "-m" => { + monitor = match args.next().unwrap_or(String::new()).parse::() { + Ok(i) => Some(i), + Err(_) => None, + } + } + "--window-title" | "-w" => enable_title = true, "--tag" | "-t" => enable_tag = true, "--view-tags" | "-vt" => enable_views_tag = true, "--help" | "-h" | "--h" => { println!("Usage: status [option]\n"); + println!(" --monitor | -m : select the monitor"); println!(" --tag | -t : displays the focused tag"); + println!(" --tag | -t : displays the title of the focused view"); println!(" --view-tags | -vt : displays the tag of all views"); - println!(" --monitor | -m : select the monitor index"); std::process::exit(0); } _ => break, @@ -62,12 +76,20 @@ fn main() { globals.get::().unwrap().status_manager = Some(status_manager_obj); } ], + [ + WlSeat, + 7, + |seat: Main, mut globals: DispatchData| { + seat.quick_assign(move |_, _, _| {}); + globals.get::().unwrap().seats.push(seat); + } + ], [ WlOutput, 3, |output: Main, mut globals: DispatchData| { output.quick_assign(move |_, _, _| {}); - globals.get::().unwrap().outputs.push(output.detach()); + globals.get::().unwrap().outputs.push(output); } ] ), @@ -77,40 +99,73 @@ fn main() { .sync_roundtrip(&mut globals, |_, _, _| unreachable!()) .unwrap(); - for (i, output) in globals.outputs.iter_mut().enumerate() { - let assign; - match monitor { - Some(monitor) => if i == monitor { - assign = true; - } else { assign = false }, - None => assign = true - } - if assign { - let output_status = globals.status_manager - .as_ref() - .expect("Compositor doesn't implement river_status_unstable_v1") - .get_river_output_status(&output); - output_status.quick_assign(move |_, event, _| match event { - zriver_output_status_v1::Event::FocusedTags { tags } => { - if enable_tag { - base10(tags); - println!(""); - } + for (_, seat) in globals + .seats + .iter() + .enumerate() + .filter(|(i, _)| match seat { + Some(seat) => { + if *i == seat { + true + } else { + false } - zriver_output_status_v1::Event::ViewTags { tags } => { - if enable_views_tag { - let len = tags.len(); - let mut i = 0; - while i < len { - let buf: [u8; 4] = [tags[i],tags[i+1],tags[i+2],tags[i+3]]; - base10(u32::from_le_bytes(buf)); - i+=4; - } - println!(""); - } + } + None => true, + }) + { + let seat_status = globals + .status_manager + .as_ref() + .expect("Compositor doesn't implement river_status_unstable_v1") + .get_river_seat_status(&seat); + seat_status.quick_assign(move |_, event, _| match event { + zriver_seat_status_v1::Event::FocusedView { title } => { + if enable_title { + println!("{}", title) } - }); - } + } + _ => {} + }) + } + for (_, output) in globals + .outputs + .iter() + .enumerate() + .filter(|(i, _)| match monitor { + Some(monitor) => { + if *i == monitor { + true + } else { + false + } + } + None => true, + }) + { + let output_status = globals + .status_manager + .as_ref() + .expect("Compositor doesn't implement river_status_unstable_v1") + .get_river_output_status(&output); + output_status.quick_assign(move |_, event, _| match event { + zriver_output_status_v1::Event::FocusedTags { tags } => { + if enable_tag { + base10(tags); + println!(""); + } + } + zriver_output_status_v1::Event::ViewTags { tags } => { + if enable_views_tag { + let len = tags.len(); + for i in (0..len).into_iter().step_by(4) { + let buf: [u8; 4] = [tags[i], tags[i + 1], tags[i + 2], tags[i + 3]]; + base10(u32::from_le_bytes(buf)); + } + println!(""); + } + } + }); } loop { @@ -130,12 +185,17 @@ fn main() { fn base10(tagmask: u32) { let mut tag = 0; let mut current: u32; - while {current = 1 << tag; current <= tagmask} { + while { + current = 1 << tag; + current <= tagmask + } { tag += 1; - if current != tagmask && (tagmask/current) % 2 != 0 { - base10(tagmask-current); + if current != tagmask && (tagmask / current) % 2 != 0 { + base10(tagmask - current); break; - } else if tag == 32 { break } + } else if tag == 32 { + break; + } } print!("{} ", tag); }