Add modifier support, enter/leave events
This commit is contained in:
+18
-21
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user