Add modifier support, enter/leave events

This commit is contained in:
Kenny Levinsen
2019-10-02 16:20:10 +02:00
parent 50e2ab25a5
commit 3572d22ba8
8 changed files with 82 additions and 25 deletions
+18 -21
View File
@@ -222,9 +222,10 @@ impl App {
let inner = self.inner.lock().unwrap(); let inner = self.inner.lock().unwrap();
let time = Local::now(); let time = Local::now();
if !inner.visible || if !inner.visible
inner.shell_surfaces.len() != *inner.configured_surfaces.lock().unwrap() || || inner.shell_surfaces.len() != *inner.configured_surfaces.lock().unwrap()
inner.surfaces.len() == 0 { || inner.surfaces.len() == 0
{
// Not ready yet // Not ready yet
return Ok(()); return Ok(());
} }
@@ -258,7 +259,7 @@ impl App {
} }
false false
} }
_ => true _ => true,
}; };
if force { if force {
@@ -315,15 +316,6 @@ impl App {
Ok(()) 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) { pub fn hide(&mut self) {
let mut inner = self.inner.lock().unwrap(); let mut inner = self.inner.lock().unwrap();
inner.visible = false; inner.visible = false;
@@ -444,6 +436,14 @@ impl App {
// Keyboard processing // Keyboard processing
// //
let kbd_clone = cmd_queue.clone(); 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 { map_keyboard_auto(&seat, move |event: KbEvent, _| match event {
KbEvent::Key { KbEvent::Key {
keysym, keysym,
@@ -453,22 +453,19 @@ impl App {
} => match state { } => match state {
KeyState::Pressed => match keysym { KeyState::Pressed => match keysym {
keysyms::XKB_KEY_Escape => kbd_clone.lock().unwrap().push_back(Cmd::Exit), 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 { v => kbd_clone.lock().unwrap().push_back(Cmd::Keyboard {
key: v, key: v,
key_state: state, key_state: state,
modifiers_state: ModifiersState { modifiers_state: modifiers_state.lock().unwrap().clone(),
ctrl: false,
alt: false,
shift: false,
caps_lock: false,
logo: false,
num_lock: false,
},
interpreted: utf8, interpreted: utf8,
}), }),
}, },
_ => (), _ => (),
}, },
KbEvent::Modifiers { modifiers } => *modifiers_state.lock().unwrap() = modifiers,
_ => (), _ => (),
}) })
.expect("Failed to map keyboard"); .expect("Failed to map keyboard");
+11 -1
View File
@@ -206,6 +206,7 @@ fn main() {
app.cmd_queue().lock().unwrap().push_back(Cmd::Draw); app.cmd_queue().lock().unwrap().push_back(Cmd::Draw);
let mut visible = !daemon;
let q = app.cmd_queue(); let q = app.cmd_queue();
loop { loop {
let cmd = q.lock().unwrap().pop_front(); let cmd = q.lock().unwrap().pop_front();
@@ -238,12 +239,21 @@ fn main() {
q.lock().unwrap().push_back(Cmd::Draw); q.lock().unwrap().push_back(Cmd::Draw);
} }
Cmd::ToggleVisible => { 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(); app.flush_display();
} }
Cmd::Exit => { Cmd::Exit => {
if daemon { if daemon {
visible = false;
app.hide(); app.hide();
app.get_widget().leave();
app.flush_display(); app.flush_display();
} else { } else {
let _ = std::fs::remove_file(socket_path); let _ = std::fs::remove_file(socket_path);
+34
View File
@@ -30,6 +30,8 @@ impl DrawReport {
} }
pub trait Widget { pub trait Widget {
fn enter(&mut self);
fn leave(&mut self);
fn size(&self) -> (u32, u32); fn size(&self) -> (u32, u32);
fn draw( fn draw(
&mut self, &mut self,
@@ -60,6 +62,16 @@ impl VerticalLayout {
} }
impl Widget for 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) { fn size(&self) -> (u32, u32) {
let mut width = 0; let mut width = 0;
let mut height = 0; let mut height = 0;
@@ -156,6 +168,16 @@ impl HorizontalLayout {
} }
impl Widget for 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) { fn size(&self) -> (u32, u32) {
let mut width = 0; let mut width = 0;
let mut height = 0; let mut height = 0;
@@ -258,6 +280,12 @@ impl Margin {
} }
impl Widget for Margin { impl Widget for Margin {
fn enter(&mut self) {
self.child.enter()
}
fn leave(&mut self) {
self.child.leave()
}
fn size(&self) -> (u32, u32) { fn size(&self) -> (u32, u32) {
let size = self.child.size(); let size = self.child.size();
( (
@@ -326,6 +354,12 @@ impl Fixed {
} }
impl Widget for Fixed { impl Widget for Fixed {
fn enter(&mut self) {
self.child.enter()
}
fn leave(&mut self) {
self.child.leave()
}
fn size(&self) -> (u32, u32) { fn size(&self) -> (u32, u32) {
self.size self.size
} }
+2
View File
@@ -61,6 +61,8 @@ impl BarWidget {
} }
impl Widget for BarWidget { impl Widget for BarWidget {
fn enter(&mut self) {}
fn leave(&mut self) {}
fn size(&self) -> (u32, u32) { fn size(&self) -> (u32, u32) {
(self.length, self.font_size) (self.length, self.font_size)
} }
+3
View File
@@ -177,6 +177,9 @@ impl Calendar {
} }
impl Widget for Calendar { impl Widget for Calendar {
fn enter(&mut self) {}
fn leave(&mut self) {}
fn size(&self) -> (u32, u32) { fn size(&self) -> (u32, u32) {
let cal_width = 7 * self.font_size * 3 + self.font_size * 2; let cal_width = 7 * self.font_size * 3 + self.font_size * 2;
let cal_pad = self.font_size * 3; let cal_pad = self.font_size * 3;
+2
View File
@@ -45,6 +45,8 @@ impl Clock {
} }
impl Widget for Clock { impl Widget for Clock {
fn enter(&mut self) {}
fn leave(&mut self) {}
fn size(&self) -> (u32, u32) { fn size(&self) -> (u32, u32) {
let digit = (self.size * 0.45).ceil() as u32; let digit = (self.size * 0.45).ceil() as u32;
let colon = (self.size * 0.20).ceil() as u32; let colon = (self.size * 0.20).ceil() as u32;
+2
View File
@@ -27,6 +27,8 @@ impl Date {
} }
impl Widget for Date { impl Widget for Date {
fn enter(&mut self) {}
fn leave(&mut self) {}
fn size(&self) -> (u32, u32) { fn size(&self) -> (u32, u32) {
((6.5 * self.size).ceil() as u32, self.size.ceil() as u32) ((6.5 * self.size).ceil() as u32, self.size.ceil() as u32)
} }
+10 -3
View File
@@ -192,6 +192,14 @@ fn wlcopy(s: &str) -> Result<(), String> {
} }
impl Widget for Launcher { 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) { fn size(&self) -> (u32, u32) {
(self.length, self.font_size) (self.length, self.font_size)
} }
@@ -269,11 +277,12 @@ impl Widget for Launcher {
fn keyboard_input( fn keyboard_input(
&mut self, &mut self,
key: u32, key: u32,
_: ModifiersState, modifiers: ModifiersState,
_: KeyState, _: KeyState,
interpreted: Option<String>, interpreted: Option<String>,
) { ) {
match key { match key {
keysyms::XKB_KEY_u if modifiers.ctrl => self.leave(),
keysyms::XKB_KEY_BackSpace => { keysyms::XKB_KEY_BackSpace => {
if self.input.len() > 0 { if self.input.len() > 0 {
self.input = self.input[..self.input.len() - 1].to_string(); self.input = self.input[..self.input.len() - 1].to_string();
@@ -322,7 +331,6 @@ impl Widget for Launcher {
if lexed.len() > 0 { if lexed.len() > 0 {
let _ = let _ =
Command::new(lexed[0].clone()).args(&lexed[1..]).spawn(); Command::new(lexed[0].clone()).args(&lexed[1..]).spawn();
self.input = "".to_string();
self.tx.send(Cmd::Exit).unwrap(); self.tx.send(Cmd::Exit).unwrap();
} }
} }
@@ -334,7 +342,6 @@ impl Widget for Launcher {
let _ = Command::new(lexed[0].clone()) let _ = Command::new(lexed[0].clone())
.args(&lexed[1..]) .args(&lexed[1..])
.spawn(); .spawn();
self.input = "".to_string();
self.tx.send(Cmd::Exit).unwrap(); self.tx.send(Cmd::Exit).unwrap();
} }
} }