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 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");
+11 -1
View File
@@ -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);
+34
View File
@@ -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
}
+2
View File
@@ -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)
}
+3
View File
@@ -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;
+2
View File
@@ -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;
+2
View File
@@ -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)
}
+10 -3
View File
@@ -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<String>,
) {
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();
}
}