From 541ce5ccb2e4357209526c25fb730a5e56d6a52c Mon Sep 17 00:00:00 2001 From: jmb05 Date: Mon, 2 Nov 2026 19:55:43 +0100 Subject: [PATCH] Launcher appears on correct display, Action centre can be triggered by control command --- src/backend/window_manager_hypr.rs | 2 +- src/lib.rs | 3 +++ src/ui.rs | 25 +++++++++++++++---------- src/ui/action_centre.rs | 13 ++++++++++++- src/ui/run_menu.rs | 5 ++--- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/backend/window_manager_hypr.rs b/src/backend/window_manager_hypr.rs index bb73860..6e0c461 100644 --- a/src/backend/window_manager_hypr.rs +++ b/src/backend/window_manager_hypr.rs @@ -204,7 +204,7 @@ impl HyprlandComms { .output() } - pub fn _cursor_monitor() -> Option { + pub fn cursor_monitor() -> Option { if let Ok(pos) = CursorPosition::get() && let Ok(monitors) = Monitors::get() { diff --git a/src/lib.rs b/src/lib.rs index c864fef..adf8ab7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,12 +9,14 @@ pub const SOCKET_PATH: &str = "/run/user/1000/jmb-bar.sock"; #[derive(Clone, Debug)] pub enum ControlCommand { OpenRunMenu, + OpenNetMenu, } impl Display for ControlCommand { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { ControlCommand::OpenRunMenu => f.write_str("menu"), + ControlCommand::OpenNetMenu => f.write_str("net"), } } } @@ -25,6 +27,7 @@ impl FromStr for ControlCommand { fn from_str(s: &str) -> Result { match s { "menu" => Ok(ControlCommand::OpenRunMenu), + "net" => Ok(ControlCommand::OpenNetMenu), other => Err(format!("Unknown command: {other}")), } } diff --git a/src/ui.rs b/src/ui.rs index 08b87a8..67b196b 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -46,9 +46,9 @@ pub fn create_bars(app: &Application, backend: Backend) { ); } let backend_clone = backend.clone(); - display - .monitors() - .connect_items_changed(move |_list, pos, removed, added| { + display.monitors().connect_items_changed({ + let action_centre = action_centre.clone(); + move |_list, pos, removed, added| { if removed == 1 { debug!(&LOGGER, "Detected Monitor disconnect {pos}"); if let Some(bar) = bars.lock().expect("Couldn't get active bars").remove(&pos) { @@ -68,21 +68,26 @@ pub fn create_bars(app: &Application, backend: Backend) { ); }); } - }); + } + }); let mut ctl_channel = backend.subscribe(&[ChannelType::Control]); let ctl_rx = ctl_channel.take_ctl_rx().unwrap(); let app_clone = app.clone(); let mut menu = RunMenu::create(app_clone); - glib::timeout_add_local(Duration::from_millis(100), move || { - while let Ok(cmd) = ctl_rx.try_recv() { - match cmd { - ControlCommand::OpenRunMenu => { - menu.show(); + glib::timeout_add_local(Duration::from_millis(100), { + let action_centre = action_centre.clone(); + move || { + while let Ok(cmd) = ctl_rx.try_recv() { + match cmd { + ControlCommand::OpenRunMenu => menu.show(), + ControlCommand::OpenNetMenu => { + action_centre.show_action_centre_active_monitor() + } } } + ControlFlow::Continue } - ControlFlow::Continue }); } diff --git a/src/ui/action_centre.rs b/src/ui/action_centre.rs index 5fdedf0..4ed2aaf 100644 --- a/src/ui/action_centre.rs +++ b/src/ui/action_centre.rs @@ -2,6 +2,7 @@ use crate::backend::BackendChannels; use crate::backend::network::{ Auth, AuthType, ConnectError, NetworkCommand, NetworkInfo, NetworkState, }; +use crate::backend::window_manager_hypr::HyprlandComms; use crate::ui::widgets::{LabelEntry, WifiWidget}; use glib::prelude::Cast; use glib::{ControlFlow, clone}; @@ -58,7 +59,7 @@ impl ActionCentre { window.set_margin(Edge::Top, 20); window.set_margin(Edge::Right, 20); window.set_margin(Edge::Bottom, 20); - window.set_keyboard_mode(KeyboardMode::OnDemand); + window.set_keyboard_mode(KeyboardMode::Exclusive); let instance = Self { window: window.clone(), @@ -318,6 +319,16 @@ impl ActionCentre { } } + pub fn show_action_centre_active_monitor(&self) { + let Some(display) = Display::default() else { + return; + }; + let Some(monitor) = HyprlandComms::cursor_monitor() else { + return; + }; + self.show_action_centre(monitor as u32, &display); + } + pub fn show_action_centre(&self, monitor_idx: u32, display: &Display) { let window = &self.window; let monitors = display.monitors(); diff --git a/src/ui/run_menu.rs b/src/ui/run_menu.rs index b5ed2f9..17f732d 100644 --- a/src/ui/run_menu.rs +++ b/src/ui/run_menu.rs @@ -67,9 +67,8 @@ impl RunMenu { window.set_child(Some(&v_box)); let display = Display::default().expect("Couldn't get display"); - let monitor = display - .monitors() - .item(HyprlandComms::current_monitor() as u32) + let monitor = HyprlandComms::cursor_monitor() + .and_then(|id| display.monitors().item(id as u32)) .expect("Couldn't get monitor") .downcast::() .ok();