config: implement shortcut latching
This commit is contained in:
parent
90dbde99ab
commit
6f55675bdb
14 changed files with 367 additions and 93 deletions
|
|
@ -17,11 +17,11 @@ use {
|
|||
jay_config::{
|
||||
_private::{
|
||||
bincode_ops,
|
||||
ipc::{InitMessage, ServerMessage, V1InitMessage},
|
||||
ipc::{InitMessage, ServerFeature, ServerMessage, V1InitMessage},
|
||||
ConfigEntry, VERSION,
|
||||
},
|
||||
input::{InputDevice, Seat},
|
||||
keyboard::ModifiedKeySym,
|
||||
keyboard::{mods::Modifiers, syms::KeySym},
|
||||
video::{Connector, DrmDevice},
|
||||
},
|
||||
libloading::Library,
|
||||
|
|
@ -63,12 +63,22 @@ impl ConfigProxy {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn invoke_shortcut(&self, seat: SeatId, modsym: &ModifiedKeySym) {
|
||||
self.send(&ServerMessage::InvokeShortcut {
|
||||
seat: Seat(seat.raw() as _),
|
||||
mods: modsym.mods,
|
||||
sym: modsym.sym,
|
||||
});
|
||||
pub fn invoke_shortcut(&self, seat: SeatId, shortcut: &InvokedShortcut) {
|
||||
let msg = if shortcut.unmasked_mods == shortcut.effective_mods {
|
||||
ServerMessage::InvokeShortcut {
|
||||
seat: Seat(seat.raw() as _),
|
||||
mods: shortcut.effective_mods,
|
||||
sym: shortcut.sym,
|
||||
}
|
||||
} else {
|
||||
ServerMessage::InvokeShortcut2 {
|
||||
seat: Seat(seat.raw() as _),
|
||||
unmasked_mods: shortcut.unmasked_mods,
|
||||
effective_mods: shortcut.effective_mods,
|
||||
sym: shortcut.sym,
|
||||
}
|
||||
};
|
||||
self.send(&msg);
|
||||
}
|
||||
|
||||
pub fn new_drm_dev(&self, dev: DrmDeviceId) {
|
||||
|
|
@ -203,7 +213,9 @@ impl ConfigProxy {
|
|||
}
|
||||
|
||||
pub fn configure(&self, reload: bool) {
|
||||
self.send(&ServerMessage::Features { features: vec![] });
|
||||
self.send(&ServerMessage::Features {
|
||||
features: vec![ServerFeature::MOD_MASK],
|
||||
});
|
||||
self.send(&ServerMessage::Configure { reload });
|
||||
}
|
||||
|
||||
|
|
@ -288,3 +300,9 @@ unsafe extern "C" fn handle_msg(data: *const u8, msg: *const u8, size: usize) {
|
|||
rc.handle_request(msg);
|
||||
mem::forget(rc);
|
||||
}
|
||||
|
||||
pub struct InvokedShortcut {
|
||||
pub unmasked_mods: Modifiers,
|
||||
pub effective_mods: Modifiers,
|
||||
pub sym: KeySym,
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ use {
|
|||
crate::{
|
||||
backend::{ConnectorId, InputEvent, KeyState, AXIS_120},
|
||||
client::ClientId,
|
||||
config::InvokedShortcut,
|
||||
fixed::Fixed,
|
||||
ifs::{
|
||||
ipc::{
|
||||
|
|
@ -39,7 +40,6 @@ use {
|
|||
jay_config::keyboard::{
|
||||
mods::{Modifiers, CAPS, NUM, RELEASE},
|
||||
syms::KeySym,
|
||||
ModifiedKeySym,
|
||||
},
|
||||
smallvec::SmallVec,
|
||||
std::{cell::RefCell, collections::hash_map::Entry, rc::Rc},
|
||||
|
|
@ -386,8 +386,9 @@ impl WlSeatGlobal {
|
|||
if let Some(key_mods) = scs.get(&sym) {
|
||||
for (key_mods, mask) in key_mods {
|
||||
if mods & mask == key_mods {
|
||||
shortcuts.push(ModifiedKeySym {
|
||||
mods: Modifiers(key_mods),
|
||||
shortcuts.push(InvokedShortcut {
|
||||
unmasked_mods: Modifiers(mods),
|
||||
effective_mods: Modifiers(key_mods),
|
||||
sym: KeySym(sym),
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,6 +95,16 @@ unsafe extern "C" fn handle_msg(data: *const u8, msg: *const u8, size: usize) {
|
|||
tc.invoked_shortcuts
|
||||
.set((SeatId::from_raw(seat.0 as _), mods | sym), ());
|
||||
}
|
||||
ServerMessage::InvokeShortcut2 {
|
||||
seat,
|
||||
unmasked_mods,
|
||||
effective_mods,
|
||||
sym,
|
||||
} => {
|
||||
let _ = unmasked_mods;
|
||||
tc.invoked_shortcuts
|
||||
.set((SeatId::from_raw(seat.0 as _), effective_mods | sym), ());
|
||||
}
|
||||
ServerMessage::NewInputDevice { .. } => {}
|
||||
ServerMessage::DelInputDevice { .. } => {}
|
||||
ServerMessage::ConnectorConnect { .. } => {}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue