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 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
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user