@@ -40,6 +40,7 @@ struct InputCaptureState {
4040 active_clients : Lazy < HashSet < Position > > ,
4141 current_pos : Option < Position > ,
4242 bounds : Bounds ,
43+ modifier_state : XMods ,
4344}
4445
4546#[ derive( Debug ) ]
@@ -57,6 +58,7 @@ impl InputCaptureState {
5758 active_clients : Lazy :: new ( HashSet :: new) ,
5859 current_pos : None ,
5960 bounds : Bounds :: default ( ) ,
61+ modifier_state : Default :: default ( ) ,
6062 } ;
6163 res. update_bounds ( ) ?;
6264 Ok ( res)
@@ -180,6 +182,7 @@ fn get_events(
180182 ev_type : & CGEventType ,
181183 ev : & CGEvent ,
182184 result : & mut Vec < CaptureEvent > ,
185+ modifier_state : & mut XMods ,
183186) -> Result < ( ) , CaptureError > {
184187 fn map_pointer_event ( ev : & CGEvent ) -> PointerEvent {
185188 PointerEvent :: Motion {
@@ -215,29 +218,42 @@ fn get_events(
215218 } ) ) ) ;
216219 }
217220 CGEventType :: FlagsChanged => {
218- let mut mods = XMods :: empty ( ) ;
221+ let mut depressed = XMods :: empty ( ) ;
219222 let mut mods_locked = XMods :: empty ( ) ;
220223 let cg_flags = ev. get_flags ( ) ;
221224
222225 if cg_flags. contains ( CGEventFlags :: CGEventFlagShift ) {
223- mods |= XMods :: ShiftMask ;
226+ depressed |= XMods :: ShiftMask ;
224227 }
225228 if cg_flags. contains ( CGEventFlags :: CGEventFlagControl ) {
226- mods |= XMods :: ControlMask ;
229+ depressed |= XMods :: ControlMask ;
227230 }
228231 if cg_flags. contains ( CGEventFlags :: CGEventFlagAlternate ) {
229- mods |= XMods :: Mod1Mask ;
232+ depressed |= XMods :: Mod1Mask ;
230233 }
231234 if cg_flags. contains ( CGEventFlags :: CGEventFlagCommand ) {
232- mods |= XMods :: Mod4Mask ;
235+ depressed |= XMods :: Mod4Mask ;
233236 }
234237 if cg_flags. contains ( CGEventFlags :: CGEventFlagAlphaShift ) {
235- mods |= XMods :: LockMask ;
238+ depressed |= XMods :: LockMask ;
236239 mods_locked |= XMods :: LockMask ;
237240 }
238241
242+ // check if pressed or released
243+ let state = if depressed > * modifier_state { 1 } else { 0 } ;
244+ * modifier_state = depressed;
245+
246+ if let Ok ( key) = map_key ( ev) {
247+ let key_event = CaptureEvent :: Input ( Event :: Keyboard ( KeyboardEvent :: Key {
248+ time : 0 ,
249+ key,
250+ state,
251+ } ) ) ;
252+ result. push ( key_event) ;
253+ }
254+
239255 let modifier_event = KeyboardEvent :: Modifiers {
240- depressed : mods . bits ( ) ,
256+ depressed : depressed . bits ( ) ,
241257 latched : 0 ,
242258 locked : mods_locked. bits ( ) ,
243259 group : 0 ,
@@ -366,7 +382,13 @@ fn create_event_tap<'a>(
366382 // Are we in a client?
367383 if let Some ( current_pos) = state. current_pos {
368384 pos = Some ( current_pos) ;
369- get_events ( & event_type, cg_ev, & mut res_events) . unwrap_or_else ( |e| {
385+ get_events (
386+ & event_type,
387+ cg_ev,
388+ & mut res_events,
389+ & mut state. modifier_state ,
390+ )
391+ . unwrap_or_else ( |e| {
370392 log:: error!( "Failed to get events: {e}" ) ;
371393 } ) ;
372394
0 commit comments