kbvm: use indicators to determine the active LEDs
This commit is contained in:
parent
0c7f7429db
commit
f5e04355d7
8 changed files with 101 additions and 57 deletions
|
|
@ -24,7 +24,7 @@ pub mod zwp_virtual_keyboard_v1;
|
|||
use {
|
||||
crate::{
|
||||
async_engine::SpawnedFuture,
|
||||
backend::{KeyState, LED_CAPS_LOCK, LED_NUM_LOCK, Leds},
|
||||
backend::{KeyState, Leds},
|
||||
client::{Client, ClientError, ClientId},
|
||||
cursor_user::{CursorUser, CursorUserGroup, CursorUserOwner},
|
||||
ei::ei_ifs::ei_seat::EiSeat,
|
||||
|
|
@ -75,7 +75,7 @@ use {
|
|||
xdg_toplevel_drag_v1::XdgToplevelDragV1,
|
||||
},
|
||||
kbvm::{KbvmMap, KbvmMapId, KbvmState, PhysicalKeyboardState},
|
||||
keyboard::{DynKeyboardState, KeyboardState, KeyboardStateId, KeymapFd, ModifiersListener},
|
||||
keyboard::{DynKeyboardState, KeyboardState, KeyboardStateId, KeymapFd, LedsListener},
|
||||
leaks::Tracker,
|
||||
object::{Object, Version},
|
||||
rect::Rect,
|
||||
|
|
@ -107,7 +107,7 @@ use {
|
|||
},
|
||||
ahash::AHashMap,
|
||||
jay_config::keyboard::syms::{KeySym, SYM_Escape},
|
||||
kbvm::{Components, Keycode, ModifierMask},
|
||||
kbvm::Keycode,
|
||||
smallvec::SmallVec,
|
||||
std::{
|
||||
cell::{Cell, RefCell},
|
||||
|
|
@ -236,8 +236,8 @@ pub struct WlSeatGlobal {
|
|||
focus_history_same_workspace: Cell<bool>,
|
||||
mark_mode: Cell<Option<MarkMode>>,
|
||||
marks: CopyHashMap<Keycode, Rc<dyn Node>>,
|
||||
modifiers_listener: EventListener<dyn ModifiersListener>,
|
||||
modifiers_forward: EventSource<dyn ModifiersListener>,
|
||||
modifiers_listener: EventListener<dyn LedsListener>,
|
||||
modifiers_forward: EventSource<dyn LedsListener>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
|
|
@ -330,7 +330,7 @@ impl WlSeatGlobal {
|
|||
});
|
||||
slf.pointer_cursor.set_owner(slf.clone());
|
||||
slf.modifiers_listener
|
||||
.attach(&seat_kb_state.borrow().kb_state.mods_changed);
|
||||
.attach(&seat_kb_state.borrow().kb_state.leds_changed);
|
||||
let seat = slf.clone();
|
||||
let future = state.eng.spawn("seat handler", async move {
|
||||
loop {
|
||||
|
|
@ -541,8 +541,8 @@ impl WlSeatGlobal {
|
|||
}
|
||||
{
|
||||
let new = &*new.borrow();
|
||||
self.modifiers_listener.attach(&new.kb_state.mods_changed);
|
||||
self.dispatch_seat_modifiers_listeners(&new.kb_state.mods);
|
||||
self.modifiers_listener.attach(&new.kb_state.leds_changed);
|
||||
self.dispatch_seat_leds_listeners(new.kb_state.leds);
|
||||
}
|
||||
self.handle_keyboard_state_change(&old.borrow().kb_state, &new.borrow().kb_state);
|
||||
}
|
||||
|
|
@ -581,7 +581,7 @@ impl WlSeatGlobal {
|
|||
fn attach_modifiers_listener(
|
||||
&self,
|
||||
id: PhysicalKeyboardId,
|
||||
listener: &EventListener<dyn ModifiersListener>,
|
||||
listener: &EventListener<dyn LedsListener>,
|
||||
map: Option<&Rc<KbvmMap>>,
|
||||
) {
|
||||
let _ = self.get_physical_keyboard(id, map);
|
||||
|
|
@ -592,18 +592,18 @@ impl WlSeatGlobal {
|
|||
}
|
||||
Some(m) => {
|
||||
let state = self.get_kb_state(m);
|
||||
listener.attach(&state.borrow().kb_state.mods_changed);
|
||||
listener.attach(&state.borrow().kb_state.leds_changed);
|
||||
state
|
||||
}
|
||||
};
|
||||
if let Some(l) = listener.get() {
|
||||
l.locked_mods(&state.borrow().kb_state.mods);
|
||||
l.leds(state.borrow().kb_state.leds);
|
||||
}
|
||||
}
|
||||
|
||||
fn dispatch_seat_modifiers_listeners(&self, mods: &Components) {
|
||||
fn dispatch_seat_leds_listeners(&self, leds: Leds) {
|
||||
for listener in self.modifiers_forward.iter() {
|
||||
listener.locked_mods(mods);
|
||||
listener.leds(leds);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1514,8 +1514,8 @@ impl WlSeat {
|
|||
|
||||
pub fn keymap_fd(&self, state: &KeyboardState) -> Result<KeymapFd, WlKeyboardError> {
|
||||
let fd = match self.client.is_xwayland {
|
||||
true => &state.xwayland_map,
|
||||
_ => &state.map,
|
||||
true => &state.map.xwayland_map,
|
||||
_ => &state.map.map,
|
||||
};
|
||||
if self.version >= READ_ONLY_KEYMAP_SINCE {
|
||||
return Ok(fd.clone());
|
||||
|
|
@ -1739,22 +1739,15 @@ impl DeviceHandlerData {
|
|||
}
|
||||
}
|
||||
|
||||
impl ModifiersListener for DeviceHandlerData {
|
||||
fn locked_mods(&self, mods: &Components) {
|
||||
let mut leds = Leds::none();
|
||||
if mods.mods_locked.contains(ModifierMask::NUM_LOCK) {
|
||||
leds |= LED_NUM_LOCK;
|
||||
}
|
||||
if mods.mods_locked.contains(ModifierMask::LOCK) {
|
||||
leds |= LED_CAPS_LOCK;
|
||||
}
|
||||
impl LedsListener for DeviceHandlerData {
|
||||
fn leds(&self, leds: Leds) {
|
||||
self.device.set_enabled_leds(leds);
|
||||
}
|
||||
}
|
||||
|
||||
impl ModifiersListener for WlSeatGlobal {
|
||||
fn locked_mods(&self, mods: &Components) {
|
||||
self.dispatch_seat_modifiers_listeners(mods);
|
||||
impl LedsListener for WlSeatGlobal {
|
||||
fn leds(&self, leds: Leds) {
|
||||
self.dispatch_seat_leds_listeners(leds)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ impl ZwpInputMethodKeyboardGrabV2 {
|
|||
}
|
||||
|
||||
fn send_keymap(&self, kb_state: &KeyboardState) {
|
||||
let map = match kb_state.map.create_unprotected_fd() {
|
||||
let map = match kb_state.map.map.create_unprotected_fd() {
|
||||
Ok(m) => m,
|
||||
Err(e) => {
|
||||
log::error!("Could not create new keymap fd: {}", ErrorFmt(e));
|
||||
|
|
|
|||
|
|
@ -86,11 +86,11 @@ impl ZwpVirtualKeyboardManagerV1RequestHandler for ZwpVirtualKeyboardManagerV1 {
|
|||
version: self.version,
|
||||
kb_state: Rc::new(RefCell::new(KeyboardState {
|
||||
id: self.client.state.keyboard_state_ids.next(),
|
||||
map: seat_keymap.map.clone(),
|
||||
xwayland_map: seat_keymap.xwayland_map.clone(),
|
||||
map: seat_keymap.clone(),
|
||||
pressed_keys: Default::default(),
|
||||
mods: Default::default(),
|
||||
mods_changed: Default::default(),
|
||||
leds: Default::default(),
|
||||
leds_changed: Default::default(),
|
||||
})),
|
||||
});
|
||||
track!(self.client, kb);
|
||||
|
|
|
|||
|
|
@ -80,11 +80,11 @@ impl ZwpVirtualKeyboardV1RequestHandler for ZwpVirtualKeyboardV1 {
|
|||
.map_err(ZwpVirtualKeyboardV1Error::ParseKeymap)?;
|
||||
*self.kb_state.borrow_mut() = KeyboardState {
|
||||
id: self.client.state.keyboard_state_ids.next(),
|
||||
map: map.map.clone(),
|
||||
xwayland_map: map.xwayland_map.clone(),
|
||||
map: map.clone(),
|
||||
pressed_keys: Default::default(),
|
||||
mods: Default::default(),
|
||||
mods_changed: Default::default(),
|
||||
leds: Default::default(),
|
||||
leds_changed: Default::default(),
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -113,15 +113,12 @@ impl ZwpVirtualKeyboardV1RequestHandler for ZwpVirtualKeyboardV1 {
|
|||
|
||||
fn modifiers(&self, req: Modifiers, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
||||
let kb_state = &mut *self.kb_state.borrow_mut();
|
||||
let locked_mods = kb_state.mods.mods_locked;
|
||||
kb_state.mods.mods_pressed.0 = req.mods_depressed;
|
||||
kb_state.mods.mods_latched.0 = req.mods_latched;
|
||||
kb_state.mods.mods_locked.0 = req.mods_locked;
|
||||
kb_state.mods.group_locked.0 = req.group;
|
||||
kb_state.mods.update_effective();
|
||||
if locked_mods != kb_state.mods.mods_locked {
|
||||
kb_state.dispatch_locked_mods_listeners();
|
||||
}
|
||||
kb_state.update_leds();
|
||||
self.for_each_kb(|serial, surface, kb| {
|
||||
kb.on_mods_changed(serial, surface.id, &kb_state);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue