@@ -19,14 +19,14 @@ const ATSPI_DEVICE_A11Y_MANAGER_VIRTUAL_MOD_START: u32 = 15;
1919#[ derive( PartialEq , Eq , Debug ) ]
2020struct KeyGrab {
2121 pub mods : u32 ,
22- pub virtual_modifiers : HashSet < Keysym > ,
22+ pub virtual_mods : HashSet < Keysym > ,
2323 pub key : Keysym ,
2424}
2525
2626impl KeyGrab {
27- fn new ( virtual_modifiers : & [ Keysym ] , key : Keysym , raw_mods : u32 ) -> Self {
27+ fn new ( virtual_mods : & [ Keysym ] , key : Keysym , raw_mods : u32 ) -> Self {
2828 let mods = raw_mods & ( ( 1 << ATSPI_DEVICE_A11Y_MANAGER_VIRTUAL_MOD_START ) - 1 ) ;
29- let virtual_modifiers = virtual_modifiers
29+ let virtual_mods = virtual_mods
3030 . iter ( )
3131 . copied ( )
3232 . enumerate ( )
@@ -37,7 +37,7 @@ impl KeyGrab {
3737 . collect ( ) ;
3838 Self {
3939 mods,
40- virtual_modifiers ,
40+ virtual_mods ,
4141 key,
4242 }
4343 }
@@ -47,7 +47,7 @@ impl KeyGrab {
4747struct Client {
4848 grabbed : bool ,
4949 watched : bool ,
50- virtual_modifiers : HashSet < Keysym > ,
50+ virtual_mods : HashSet < Keysym > ,
5151 key_grabs : Vec < KeyGrab > ,
5252}
5353
@@ -68,7 +68,7 @@ impl Clients {
6868pub struct A11yKeyboardMonitorState {
6969 executor : ThreadPool ,
7070 clients : Arc < Mutex < Clients > > ,
71- active_virtual_modifiers : HashSet < Keysym > ,
71+ active_virtual_mods : HashSet < Keysym > ,
7272 conn : Arc < OnceLock < zbus:: Connection > > ,
7373}
7474
@@ -92,7 +92,7 @@ impl A11yKeyboardMonitorState {
9292 Self {
9393 clients,
9494 executor,
95- active_virtual_modifiers : HashSet :: new ( ) ,
95+ active_virtual_mods : HashSet :: new ( ) ,
9696 conn : conn_cell,
9797 }
9898 }
@@ -103,7 +103,35 @@ impl A11yKeyboardMonitorState {
103103 . unwrap ( )
104104 . 0
105105 . values ( )
106- . any ( |client| client. virtual_modifiers . contains ( & keysym) )
106+ . any ( |client| client. virtual_mods . contains ( & keysym) )
107+ }
108+
109+ pub fn remove_active_virtual_modifier ( & mut self , keysym : Keysym ) -> bool {
110+ self . active_virtual_mods . remove ( & keysym)
111+ }
112+
113+ pub fn has_keyboard_grab ( & self ) -> bool {
114+ self . clients
115+ . lock ( )
116+ . unwrap ( )
117+ . 0
118+ . values ( )
119+ . any ( |client| client. grabbed )
120+ }
121+
122+ /// Key grab exists for mods, key, with active virtual mods
123+ pub fn has_key_grab ( & self , mods : u32 , key : Keysym ) -> bool {
124+ self . clients
125+ . lock ( )
126+ . unwrap ( )
127+ . 0
128+ . values ( )
129+ . flat_map ( |client| & client. key_grabs )
130+ . any ( |grab| {
131+ grab. mods == mods
132+ && grab. virtual_mods == self . active_virtual_mods
133+ && grab. key == key
134+ } )
107135 }
108136
109137 pub fn key_event (
@@ -139,7 +167,7 @@ impl A11yKeyboardMonitorState {
139167 let future = KeyboardMonitor :: key_event (
140168 signal_context,
141169 released,
142- modifiers. serialized . depressed ,
170+ modifiers. serialized . layout_effective ,
143171 keysym. modified_sym ( ) . raw ( ) ,
144172 unichar,
145173 keysym. raw_code ( ) . raw ( ) as u16 ,
@@ -191,16 +219,16 @@ impl KeyboardMonitor {
191219 fn set_key_grabs (
192220 & self ,
193221 #[ zbus( header) ] header : Header < ' _ > ,
194- virtual_modifiers : Vec < u32 > ,
222+ virtual_mods : Vec < u32 > ,
195223 keystrokes : Vec < ( u32 , u32 ) > ,
196224 ) {
197- let virtual_modifiers = virtual_modifiers
225+ let virtual_mods = virtual_mods
198226 . into_iter ( )
199227 . map ( Keysym :: from)
200228 . collect :: < Vec < _ > > ( ) ;
201229 let key_grabs = keystrokes
202230 . into_iter ( )
203- . map ( |( k, mods) | KeyGrab :: new ( & virtual_modifiers , Keysym :: from ( k) , mods) )
231+ . map ( |( k, mods) | KeyGrab :: new ( & virtual_mods , Keysym :: from ( k) , mods) )
204232 . collect :: < Vec < _ > > ( ) ;
205233
206234 if let Some ( sender) = header. sender ( ) {
@@ -209,9 +237,9 @@ impl KeyboardMonitor {
209237 eprintln ! (
210238 "key grabs set by {}: {:?}" ,
211239 sender,
212- ( & virtual_modifiers , & key_grabs)
240+ ( & virtual_mods , & key_grabs)
213241 ) ;
214- client. virtual_modifiers = virtual_modifiers . into_iter ( ) . collect :: < HashSet < _ > > ( ) ;
242+ client. virtual_mods = virtual_mods . into_iter ( ) . collect :: < HashSet < _ > > ( ) ;
215243 client. key_grabs = key_grabs;
216244 }
217245 }
0 commit comments