From 3572d22ba86f264b8eb1889bc91f2826733c1abc Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Wed, 2 Oct 2019 14:05:35 +0200 Subject: [PATCH] Add modifier support, enter/leave events --- src/app.rs | 39 ++++++++++++++++++--------------------- src/main.rs | 12 +++++++++++- src/widget.rs | 34 ++++++++++++++++++++++++++++++++++ src/widgets/bar_widget.rs | 2 ++ src/widgets/calendar.rs | 3 +++ src/widgets/clock.rs | 2 ++ src/widgets/date.rs | 2 ++ src/widgets/launcher.rs | 13 ++++++++++--- 8 files changed, 82 insertions(+), 25 deletions(-) diff --git a/src/app.rs b/src/app.rs index c8dc414..b0acf8c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -222,9 +222,10 @@ impl App { let inner = self.inner.lock().unwrap(); let time = Local::now(); - if !inner.visible || - inner.shell_surfaces.len() != *inner.configured_surfaces.lock().unwrap() || - inner.surfaces.len() == 0 { + if !inner.visible + || inner.shell_surfaces.len() != *inner.configured_surfaces.lock().unwrap() + || inner.surfaces.len() == 0 + { // Not ready yet return Ok(()); } @@ -258,7 +259,7 @@ impl App { } false } - _ => true + _ => true, }; if force { @@ -315,15 +316,6 @@ impl App { Ok(()) } - pub fn toggle_visible(&mut self) { - let mut inner = self.inner.lock().unwrap(); - inner.visible = !inner.visible; - if !inner.visible { - self.last_dim = (0, 0); - } - inner.outputs_changed(); - } - pub fn hide(&mut self) { let mut inner = self.inner.lock().unwrap(); inner.visible = false; @@ -444,6 +436,14 @@ impl App { // Keyboard processing // let kbd_clone = cmd_queue.clone(); + let modifiers_state = Arc::new(Mutex::new(ModifiersState { + ctrl: false, + alt: false, + shift: false, + caps_lock: false, + logo: false, + num_lock: false, + })); map_keyboard_auto(&seat, move |event: KbEvent, _| match event { KbEvent::Key { keysym, @@ -453,22 +453,19 @@ impl App { } => match state { KeyState::Pressed => match keysym { keysyms::XKB_KEY_Escape => kbd_clone.lock().unwrap().push_back(Cmd::Exit), + keysyms::XKB_KEY_c if modifiers_state.lock().unwrap().ctrl => { + kbd_clone.lock().unwrap().push_back(Cmd::Exit) + } v => kbd_clone.lock().unwrap().push_back(Cmd::Keyboard { key: v, key_state: state, - modifiers_state: ModifiersState { - ctrl: false, - alt: false, - shift: false, - caps_lock: false, - logo: false, - num_lock: false, - }, + modifiers_state: modifiers_state.lock().unwrap().clone(), interpreted: utf8, }), }, _ => (), }, + KbEvent::Modifiers { modifiers } => *modifiers_state.lock().unwrap() = modifiers, _ => (), }) .expect("Failed to map keyboard"); diff --git a/src/main.rs b/src/main.rs index ea011e1..c630514 100644 --- a/src/main.rs +++ b/src/main.rs @@ -206,6 +206,7 @@ fn main() { app.cmd_queue().lock().unwrap().push_back(Cmd::Draw); + let mut visible = !daemon; let q = app.cmd_queue(); loop { let cmd = q.lock().unwrap().pop_front(); @@ -238,12 +239,21 @@ fn main() { q.lock().unwrap().push_back(Cmd::Draw); } Cmd::ToggleVisible => { - app.toggle_visible(); + visible = !visible; + if visible { + app.get_widget().enter(); + app.show(); + } else { + app.hide(); + app.get_widget().leave(); + } app.flush_display(); } Cmd::Exit => { if daemon { + visible = false; app.hide(); + app.get_widget().leave(); app.flush_display(); } else { let _ = std::fs::remove_file(socket_path); diff --git a/src/widget.rs b/src/widget.rs index f452825..670bd18 100644 --- a/src/widget.rs +++ b/src/widget.rs @@ -30,6 +30,8 @@ impl DrawReport { } pub trait Widget { + fn enter(&mut self); + fn leave(&mut self); fn size(&self) -> (u32, u32); fn draw( &mut self, @@ -60,6 +62,16 @@ impl VerticalLayout { } impl Widget for VerticalLayout { + fn enter(&mut self) { + for child in &mut self.children { + child.enter(); + } + } + fn leave(&mut self) { + for child in &mut self.children { + child.leave(); + } + } fn size(&self) -> (u32, u32) { let mut width = 0; let mut height = 0; @@ -156,6 +168,16 @@ impl HorizontalLayout { } impl Widget for HorizontalLayout { + fn enter(&mut self) { + for child in &mut self.children { + child.enter(); + } + } + fn leave(&mut self) { + for child in &mut self.children { + child.leave(); + } + } fn size(&self) -> (u32, u32) { let mut width = 0; let mut height = 0; @@ -258,6 +280,12 @@ impl Margin { } impl Widget for Margin { + fn enter(&mut self) { + self.child.enter() + } + fn leave(&mut self) { + self.child.leave() + } fn size(&self) -> (u32, u32) { let size = self.child.size(); ( @@ -326,6 +354,12 @@ impl Fixed { } impl Widget for Fixed { + fn enter(&mut self) { + self.child.enter() + } + fn leave(&mut self) { + self.child.leave() + } fn size(&self) -> (u32, u32) { self.size } diff --git a/src/widgets/bar_widget.rs b/src/widgets/bar_widget.rs index 998f130..a451bc0 100644 --- a/src/widgets/bar_widget.rs +++ b/src/widgets/bar_widget.rs @@ -61,6 +61,8 @@ impl BarWidget { } impl Widget for BarWidget { + fn enter(&mut self) {} + fn leave(&mut self) {} fn size(&self) -> (u32, u32) { (self.length, self.font_size) } diff --git a/src/widgets/calendar.rs b/src/widgets/calendar.rs index 87ca50d..898a4b8 100644 --- a/src/widgets/calendar.rs +++ b/src/widgets/calendar.rs @@ -177,6 +177,9 @@ impl Calendar { } impl Widget for Calendar { + fn enter(&mut self) {} + fn leave(&mut self) {} + fn size(&self) -> (u32, u32) { let cal_width = 7 * self.font_size * 3 + self.font_size * 2; let cal_pad = self.font_size * 3; diff --git a/src/widgets/clock.rs b/src/widgets/clock.rs index f38167b..76e4015 100644 --- a/src/widgets/clock.rs +++ b/src/widgets/clock.rs @@ -45,6 +45,8 @@ impl Clock { } impl Widget for Clock { + fn enter(&mut self) {} + fn leave(&mut self) {} fn size(&self) -> (u32, u32) { let digit = (self.size * 0.45).ceil() as u32; let colon = (self.size * 0.20).ceil() as u32; diff --git a/src/widgets/date.rs b/src/widgets/date.rs index 47a6f07..b09eb82 100644 --- a/src/widgets/date.rs +++ b/src/widgets/date.rs @@ -27,6 +27,8 @@ impl Date { } impl Widget for Date { + fn enter(&mut self) {} + fn leave(&mut self) {} fn size(&self) -> (u32, u32) { ((6.5 * self.size).ceil() as u32, self.size.ceil() as u32) } diff --git a/src/widgets/launcher.rs b/src/widgets/launcher.rs index 68da86b..bc9e39d 100644 --- a/src/widgets/launcher.rs +++ b/src/widgets/launcher.rs @@ -192,6 +192,14 @@ fn wlcopy(s: &str) -> Result<(), String> { } impl Widget for Launcher { + fn enter(&mut self) {} + fn leave(&mut self) { + self.input = "".to_string(); + self.offset = 0; + self.result = None; + self.dirty = true; + } + fn size(&self) -> (u32, u32) { (self.length, self.font_size) } @@ -269,11 +277,12 @@ impl Widget for Launcher { fn keyboard_input( &mut self, key: u32, - _: ModifiersState, + modifiers: ModifiersState, _: KeyState, interpreted: Option, ) { match key { + keysyms::XKB_KEY_u if modifiers.ctrl => self.leave(), keysyms::XKB_KEY_BackSpace => { if self.input.len() > 0 { self.input = self.input[..self.input.len() - 1].to_string(); @@ -322,7 +331,6 @@ impl Widget for Launcher { if lexed.len() > 0 { let _ = Command::new(lexed[0].clone()).args(&lexed[1..]).spawn(); - self.input = "".to_string(); self.tx.send(Cmd::Exit).unwrap(); } } @@ -334,7 +342,6 @@ impl Widget for Launcher { let _ = Command::new(lexed[0].clone()) .args(&lexed[1..]) .spawn(); - self.input = "".to_string(); self.tx.send(Cmd::Exit).unwrap(); } }