@@ -21,7 +21,13 @@ use xkbcommon::xkb;
21
21
22
22
use super :: { Capability , SeatError , SeatHandler , SeatState } ;
23
23
24
+ #[ cfg( feature = "calloop" ) ]
25
+ pub mod repeat;
26
+ #[ cfg( feature = "calloop" ) ]
27
+ use repeat:: RepeatMessage ;
28
+
24
29
/// Error when creating a keyboard.
30
+ #[ must_use]
25
31
#[ derive( Debug , thiserror:: Error ) ]
26
32
pub enum KeyboardError {
27
33
/// Seat error.
@@ -210,7 +216,7 @@ pub trait KeyboardHandler: Sized {
210
216
}
211
217
212
218
/// The rate at which a pressed key is repeated.
213
- #[ derive( Debug ) ]
219
+ #[ derive( Debug , Clone , Copy ) ]
214
220
pub enum RepeatInfo {
215
221
/// Keys will be repeated at the specified rate and delay.
216
222
Repeat {
@@ -308,6 +314,9 @@ pub struct KeyboardData {
308
314
user_specified_rmlvo : bool ,
309
315
xkb_state : Mutex < Option < xkb:: State > > ,
310
316
xkb_compose : Mutex < Option < xkb:: compose:: State > > ,
317
+ #[ cfg( feature = "calloop" ) ]
318
+ repeat_sender : Option < calloop:: channel:: Sender < RepeatMessage > > ,
319
+ current_repeat : Mutex < Option < KeyEvent > > ,
311
320
}
312
321
313
322
impl Debug for KeyboardData {
@@ -350,6 +359,8 @@ impl Default for KeyboardData {
350
359
xkb_state : Mutex :: new ( None ) ,
351
360
user_specified_rmlvo : false ,
352
361
xkb_compose : Mutex :: new ( None ) ,
362
+ repeat_sender : None ,
363
+ current_repeat : Mutex :: new ( None ) ,
353
364
} ;
354
365
355
366
udata. init_compose ( ) ;
@@ -383,6 +394,8 @@ impl KeyboardData {
383
394
xkb_state : Mutex :: new ( xkb_state) ,
384
395
user_specified_rmlvo : true ,
385
396
xkb_compose : Mutex :: new ( None ) ,
397
+ repeat_sender : None ,
398
+ current_repeat : Mutex :: new ( None ) ,
386
399
} ;
387
400
388
401
udata. init_compose ( ) ;
@@ -432,12 +445,17 @@ impl KeyboardData {
432
445
433
446
pub trait KeyboardDataExt : Send + Sync {
434
447
fn keyboard_data ( & self ) -> & KeyboardData ;
448
+ fn keyboard_data_mut ( & mut self ) -> & mut KeyboardData ;
435
449
}
436
450
437
451
impl KeyboardDataExt for KeyboardData {
438
452
fn keyboard_data ( & self ) -> & KeyboardData {
439
453
self
440
454
}
455
+
456
+ fn keyboard_data_mut ( & mut self ) -> & mut KeyboardData {
457
+ self
458
+ }
441
459
}
442
460
443
461
impl < D , U > Dispatch < wl_keyboard:: WlKeyboard , U , D > for SeatState
@@ -560,6 +578,13 @@ where
560
578
wl_keyboard:: Event :: Leave { serial, surface } => {
561
579
// We can send this event without any other checks in the protocol will guarantee a leave is
562
580
// sent before entering a new surface.
581
+ #[ cfg( feature = "calloop" ) ]
582
+ {
583
+ if let Some ( repeat_sender) = & udata. repeat_sender {
584
+ let _ = repeat_sender. send ( RepeatMessage :: StopRepeat ) ;
585
+ }
586
+ }
587
+
563
588
data. leave ( conn, qh, keyboard, & surface, serial) ;
564
589
}
565
590
@@ -598,10 +623,44 @@ where
598
623
599
624
match state {
600
625
wl_keyboard:: KeyState :: Released => {
626
+ #[ cfg( feature = "calloop" ) ]
627
+ {
628
+ if let Some ( repeat_sender) = & udata. repeat_sender {
629
+ let mut current_repeat =
630
+ udata. current_repeat . lock ( ) . unwrap ( ) ;
631
+ if Some ( event. raw_code )
632
+ == current_repeat. as_ref ( ) . map ( |r| r. raw_code )
633
+ {
634
+ current_repeat. take ( ) ;
635
+ let _ = repeat_sender. send ( RepeatMessage :: StopRepeat ) ;
636
+ }
637
+ }
638
+ }
601
639
data. release_key ( conn, qh, keyboard, serial, event) ;
602
640
}
603
641
604
642
wl_keyboard:: KeyState :: Pressed => {
643
+ #[ cfg( feature = "calloop" ) ]
644
+ {
645
+ if let Some ( repeat_sender) = & udata. repeat_sender {
646
+ let state_guard = udata. xkb_state . lock ( ) . unwrap ( ) ;
647
+ let key_repeats = state_guard
648
+ . as_ref ( )
649
+ . map ( |guard| {
650
+ guard. get_keymap ( ) . key_repeats ( event. raw_code + 8 )
651
+ } )
652
+ . unwrap_or_default ( ) ;
653
+ if key_repeats {
654
+ udata
655
+ . current_repeat
656
+ . lock ( )
657
+ . unwrap ( )
658
+ . replace ( event. clone ( ) ) ;
659
+ let _ = repeat_sender
660
+ . send ( RepeatMessage :: StartRepeat ( event. clone ( ) ) ) ;
661
+ }
662
+ }
663
+ }
605
664
data. press_key ( conn, qh, keyboard, serial, event) ;
606
665
}
607
666
@@ -626,7 +685,46 @@ where
626
685
627
686
let mask = match guard. as_mut ( ) {
628
687
Some ( state) => {
629
- state. update_mask ( mods_depressed, mods_latched, mods_locked, 0 , 0 , group)
688
+ let mask = state. update_mask (
689
+ mods_depressed,
690
+ mods_latched,
691
+ mods_locked,
692
+ 0 ,
693
+ 0 ,
694
+ group,
695
+ ) ;
696
+
697
+ // update current repeating key
698
+ let mut current_event = udata. current_repeat . lock ( ) . unwrap ( ) ;
699
+ if let Some ( mut event) = current_event. take ( ) {
700
+ if let Some ( repeat_sender) = & udata. repeat_sender {
701
+ // apply new modifiers to get new utf8
702
+ let utf8 = {
703
+ let mut compose = udata. xkb_compose . lock ( ) . unwrap ( ) ;
704
+
705
+ match compose. as_mut ( ) {
706
+ Some ( compose) => match compose. feed ( event. keysym ) {
707
+ xkb:: FeedResult :: Ignored => None ,
708
+ xkb:: FeedResult :: Accepted => match compose. status ( ) {
709
+ xkb:: Status :: Composed => compose. utf8 ( ) ,
710
+ xkb:: Status :: Nothing => {
711
+ Some ( state. key_get_utf8 ( event. raw_code + 8 ) )
712
+ }
713
+ _ => None ,
714
+ } ,
715
+ } ,
716
+
717
+ // No compose
718
+ None => Some ( state. key_get_utf8 ( event. raw_code + 8 ) ) ,
719
+ }
720
+ } ;
721
+ event. utf8 = utf8;
722
+
723
+ current_event. replace ( event. clone ( ) ) ;
724
+ let _ = repeat_sender. send ( RepeatMessage :: StartRepeat ( event) ) ;
725
+ }
726
+ }
727
+ mask
630
728
}
631
729
None => return ,
632
730
} ;
@@ -650,6 +748,13 @@ where
650
748
RepeatInfo :: Disable
651
749
} ;
652
750
751
+ #[ cfg( feature = "calloop" ) ]
752
+ {
753
+ if let Some ( repeat_sender) = & udata. repeat_sender {
754
+ let _ = repeat_sender. send ( RepeatMessage :: RepeatInfo ( info) ) ;
755
+ }
756
+ }
757
+
653
758
data. update_repeat_info ( conn, qh, keyboard, info) ;
654
759
}
655
760
0 commit comments