@@ -902,6 +902,7 @@ impl WlSeatGlobal {
902902 match key_state {
903903 KeyState :: Released => pk. remove ( & kc. to_evdev ( ) ) ,
904904 KeyState :: Pressed => pk. insert ( kc. to_evdev ( ) ) ,
905+ KeyState :: Repeated => unreachable ! ( ) ,
905906 }
906907 } ;
907908 if key_state == KeyState :: Pressed
@@ -922,6 +923,7 @@ impl WlSeatGlobal {
922923 continue ;
923924 }
924925 shortcuts. clear ( ) ;
926+ let repeats;
925927 {
926928 let mut mods = kbvm_state. kb_state . mods . mods . 0 & !( CAPS . 0 | NUM . 0 ) ;
927929 if key_state == KeyState :: Released {
@@ -933,6 +935,7 @@ impl WlSeatGlobal {
933935 ModifierMask :: default ( ) ,
934936 kc,
935937 ) ;
938+ repeats = keysyms. repeats ( ) ;
936939 let mut revert_pointer_to_default = false ;
937940 for props in keysyms {
938941 let sym = props. keysym ( ) . 0 ;
@@ -982,28 +985,44 @@ impl WlSeatGlobal {
982985 }
983986 }
984987 self . send_components ( & mut components_changed, & kbvm_state) ;
985- let mut forward_to_node = true ;
986- if let Some ( g) = self . input_method_grab . get ( ) {
987- forward_to_node =
988- g. on_key ( time_usec, kc. to_evdev ( ) , key_state, & kbvm_state. kb_state ) ;
989- }
990- if forward_to_node {
991- self . keyboard_node . get ( ) . node_on_key (
992- self ,
993- time_usec,
994- kc. to_evdev ( ) ,
995- key_state,
996- & kbvm_state. kb_state ,
997- )
998- }
988+ self . send_key ( time_usec, kc, key_state, & kbvm_state. kb_state ) ;
999989 self . for_each_ei_seat ( |ei_seat| {
1000990 ei_seat. handle_key ( time_usec, kc. to_evdev ( ) , key_state, & kbvm_state. kb_state ) ;
1001991 } ) ;
1002992 update_pressed_keys ( & mut kbvm_state) ;
993+ match key_state {
994+ KeyState :: Released => {
995+ if self . repeat_key . get ( ) == Some ( kc) {
996+ self . clear_repeat_key ( ) ;
997+ }
998+ }
999+ KeyState :: Pressed => {
1000+ if repeats {
1001+ self . set_repeat_key ( kc, kbvm_state_rc) ;
1002+ }
1003+ }
1004+ KeyState :: Repeated => { }
1005+ }
10031006 }
10041007 self . send_components ( & mut components_changed, & kbvm_state) ;
10051008 }
10061009
1010+ fn send_key ( & self , time_usec : u64 , kc : Keycode , key_state : KeyState , kb_state : & KeyboardState ) {
1011+ let mut forward_to_node = true ;
1012+ if let Some ( g) = self . input_method_grab . get ( ) {
1013+ forward_to_node = g. on_key ( time_usec, kc. to_evdev ( ) , key_state, kb_state) ;
1014+ }
1015+ if forward_to_node {
1016+ self . keyboard_node . get ( ) . node_on_key (
1017+ self ,
1018+ time_usec,
1019+ kc. to_evdev ( ) ,
1020+ key_state,
1021+ kb_state,
1022+ )
1023+ }
1024+ }
1025+
10071026 pub fn create_mark_interactive ( & self ) {
10081027 self . mark_mode . set ( Some ( MarkMode :: Mark ) ) ;
10091028 }
@@ -1306,6 +1325,82 @@ impl WlSeatGlobal {
13061325 }
13071326 self . changes . set ( 0 ) ;
13081327 }
1328+
1329+ pub ( super ) fn set_repeat_key ( & self , key : Keycode , state : & Rc < RefCell < KbvmState > > ) {
1330+ self . repeat_key_version . fetch_add ( 1 ) ;
1331+ self . repeat_key_start_ns . set ( self . state . now_nsec ( ) ) ;
1332+ self . repeat_key_state . set ( Some ( state. clone ( ) ) ) ;
1333+ let old = self . repeat_key . replace ( Some ( key) ) ;
1334+ if old. is_none ( ) {
1335+ self . have_repeat_key . trigger ( ) ;
1336+ }
1337+ }
1338+
1339+ pub ( super ) fn clear_repeat_key ( & self ) {
1340+ self . repeat_key_version . fetch_add ( 1 ) ;
1341+ self . repeat_key_state . take ( ) ;
1342+ self . repeat_key . take ( ) ;
1343+ }
1344+
1345+ pub ( super ) fn create_repeat_handler ( self : & Rc < Self > ) {
1346+ self . clear_repeat_key ( ) ;
1347+ let ( rate, delay_ms) = self . repeat_rate . get ( ) ;
1348+ self . key_repeater . take ( ) ;
1349+ if rate == 0 {
1350+ return ;
1351+ }
1352+ let delay_first_repeat_ns = delay_ms as u64 * 1_000_000 ;
1353+ let delay_subsequent_repeat_ns = 1_000_000_000 / rate as u64 ;
1354+ let slf = self . clone ( ) ;
1355+ let handle = self . state . eng . spawn ( "key repeat" , async move {
1356+ ' outer: loop {
1357+ let Some ( key) = slf. repeat_key . get ( ) else {
1358+ slf. have_repeat_key . triggered ( ) . await ;
1359+ continue ;
1360+ } ;
1361+ let mut base_ns = slf. repeat_key_start_ns . get ( ) ;
1362+ let kbvm_state = slf. repeat_key_state . get ( ) . unwrap ( ) ;
1363+ let version = slf. repeat_key_version . get ( ) ;
1364+ macro_rules! check_version {
1365+ ( ) => {
1366+ if slf. repeat_key_version. get( ) != version {
1367+ continue ' outer;
1368+ }
1369+ } ;
1370+ }
1371+ let target_ns = base_ns + delay_first_repeat_ns;
1372+ slf. state . ring . timeout ( target_ns) . await . unwrap ( ) ;
1373+ check_version ! ( ) ;
1374+ let send_key = |now_ns : u64 | {
1375+ slf. send_key (
1376+ now_ns / 1_000 ,
1377+ key,
1378+ KeyState :: Repeated ,
1379+ & kbvm_state. borrow ( ) . kb_state ,
1380+ ) ;
1381+ } ;
1382+ send_key ( target_ns) ;
1383+ base_ns = target_ns;
1384+ let mut now_ns = slf. state . now_nsec ( ) ;
1385+ loop {
1386+ let max_sleep_ns = now_ns + delay_first_repeat_ns;
1387+ let target_ns = base_ns + delay_subsequent_repeat_ns;
1388+ slf. state
1389+ . ring
1390+ . timeout ( target_ns. min ( max_sleep_ns) )
1391+ . await
1392+ . unwrap ( ) ;
1393+ check_version ! ( ) ;
1394+ now_ns = slf. state . now_nsec ( ) ;
1395+ if now_ns >= target_ns {
1396+ send_key ( target_ns) ;
1397+ base_ns = target_ns;
1398+ }
1399+ }
1400+ }
1401+ } ) ;
1402+ self . key_repeater . set ( Some ( handle) ) ;
1403+ }
13091404}
13101405
13111406// Button callbacks
0 commit comments