@@ -229,10 +229,10 @@ static Uint64 Wayland_EventTimestampMSToNS(Uint32 wl_timestamp_ms)
229
229
* to accumulate the rollover offset if needed later.
230
230
*/
231
231
232
- static Uint64 Wayland_GetKeyboardTimestampRaw (SDL_WaylandSeat * seat , Uint32 wl_timestamp_ms )
232
+ static Uint64 Wayland_GetKeyboardTimestamp (SDL_WaylandSeat * seat , Uint32 wl_timestamp_ms )
233
233
{
234
- const Uint64 adjustedTimestampMS = Wayland_EventTimestampMSToNS (wl_timestamp_ms );
235
- return seat -> keyboard .timestamps ? seat -> keyboard .highres_timestamp_ns : adjustedTimestampMS ;
234
+ const Uint64 adjustedTimestampNS = Wayland_EventTimestampMSToNS (wl_timestamp_ms );
235
+ return Wayland_AdjustEventTimestampBase ( seat -> keyboard .timestamps ? seat -> keyboard .highres_timestamp_ns : adjustedTimestampNS ) ;
236
236
}
237
237
238
238
static Uint64 Wayland_GetPointerTimestamp (SDL_WaylandSeat * seat , Uint32 wl_timestamp_ms )
@@ -309,17 +309,9 @@ static bool keyboard_repeat_handle(SDL_WaylandKeyboardRepeat *repeat_info, Uint6
309
309
{
310
310
bool ret = false;
311
311
312
- /* Cap the elapsed time to something sane in case the compositor sends a bad timestamp,
313
- * which can result it in it looking like the key has been pressed for a *very* long time,
314
- * bringing everything to a halt while it tries to enqueue all the repeat events.
315
- *
316
- * 3 seconds seems reasonable.
317
- */
318
- elapsed = SDL_min (elapsed , SDL_MS_TO_NS (3000 ));
319
-
320
312
while (elapsed >= repeat_info -> next_repeat_ns ) {
321
313
if (repeat_info -> scancode != SDL_SCANCODE_UNKNOWN ) {
322
- const Uint64 timestamp = repeat_info -> wl_press_time_ns + repeat_info -> next_repeat_ns ;
314
+ const Uint64 timestamp = repeat_info -> base_time_ns + repeat_info -> next_repeat_ns ;
323
315
SDL_SendKeyboardKeyIgnoreModifiers (Wayland_AdjustEventTimestampBase (timestamp ), repeat_info -> keyboard_id , repeat_info -> key , repeat_info -> scancode , true);
324
316
}
325
317
if (repeat_info -> text [0 ]) {
@@ -339,16 +331,17 @@ static void keyboard_repeat_clear(SDL_WaylandKeyboardRepeat *repeat_info)
339
331
repeat_info -> is_key_down = false;
340
332
}
341
333
342
- static void keyboard_repeat_set (SDL_WaylandKeyboardRepeat * repeat_info , Uint32 keyboard_id , uint32_t key , Uint64 wl_press_time_ns ,
343
- uint32_t scancode , bool has_text , char text [8 ])
334
+ static void keyboard_repeat_set (SDL_WaylandKeyboardRepeat * repeat_info , Uint32 keyboard_id , uint32_t key , Uint32 wl_press_time_ms ,
335
+ Uint64 base_time_ns , uint32_t scancode , bool has_text , char text [8 ])
344
336
{
345
337
if (!repeat_info -> is_initialized || !repeat_info -> repeat_rate ) {
346
338
return ;
347
339
}
348
340
repeat_info -> is_key_down = true;
349
341
repeat_info -> keyboard_id = keyboard_id ;
350
342
repeat_info -> key = key ;
351
- repeat_info -> wl_press_time_ns = wl_press_time_ns ;
343
+ repeat_info -> wl_press_time_ms = wl_press_time_ms ;
344
+ repeat_info -> base_time_ns = base_time_ns ;
352
345
repeat_info -> sdl_press_time_ns = SDL_GetTicksNS ();
353
346
repeat_info -> next_repeat_ns = SDL_MS_TO_NS (repeat_info -> repeat_delay_ms );
354
347
repeat_info -> scancode = scancode ;
@@ -1975,7 +1968,7 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
1975
1968
char text [8 ];
1976
1969
bool has_text = false;
1977
1970
bool handled_by_ime = false;
1978
- const Uint64 timestamp_raw_ns = Wayland_GetKeyboardTimestampRaw (seat , time );
1971
+ const Uint64 timestamp_ns = Wayland_GetKeyboardTimestamp (seat , time );
1979
1972
1980
1973
Wayland_UpdateImplicitGrabSerial (seat , serial );
1981
1974
@@ -1996,17 +1989,17 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
1996
1989
* Using SDL_GetTicks would be wrong, as it would report when the release event is processed,
1997
1990
* which may be off if the application hasn't pumped events for a while.
1998
1991
*/
1999
- keyboard_repeat_handle (& seat -> keyboard .repeat , timestamp_raw_ns - seat -> keyboard .repeat .wl_press_time_ns );
1992
+ const Uint64 elapsed = SDL_MS_TO_NS (time - seat -> keyboard .repeat .wl_press_time_ms );
1993
+ keyboard_repeat_handle (& seat -> keyboard .repeat , elapsed );
2000
1994
keyboard_repeat_clear (& seat -> keyboard .repeat );
2001
1995
}
2002
1996
keyboard_input_get_text (text , seat , key , false, & handled_by_ime );
2003
1997
}
2004
1998
2005
1999
const SDL_Scancode scancode = Wayland_GetScancodeForKey (seat , key );
2006
2000
Wayland_HandleModifierKeys (seat , scancode , state == WL_KEYBOARD_KEY_STATE_PRESSED );
2007
- Uint64 timestamp = Wayland_AdjustEventTimestampBase (timestamp_raw_ns );
2008
2001
2009
- SDL_SendKeyboardKeyIgnoreModifiers (timestamp , seat -> keyboard .sdl_id , key , scancode , state == WL_KEYBOARD_KEY_STATE_PRESSED );
2002
+ SDL_SendKeyboardKeyIgnoreModifiers (timestamp_ns , seat -> keyboard .sdl_id , key , scancode , state == WL_KEYBOARD_KEY_STATE_PRESSED );
2010
2003
2011
2004
if (state == WL_KEYBOARD_KEY_STATE_PRESSED ) {
2012
2005
if (has_text && !(SDL_GetModState () & (SDL_KMOD_CTRL | SDL_KMOD_ALT ))) {
@@ -2015,7 +2008,7 @@ static void keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
2015
2008
}
2016
2009
}
2017
2010
if (seat -> keyboard .xkb .keymap && WAYLAND_xkb_keymap_key_repeats (seat -> keyboard .xkb .keymap , key + 8 )) {
2018
- keyboard_repeat_set (& seat -> keyboard .repeat , seat -> keyboard .sdl_id , key , timestamp_raw_ns , scancode , has_text , text );
2011
+ keyboard_repeat_set (& seat -> keyboard .repeat , seat -> keyboard .sdl_id , key , time , timestamp_ns , scancode , has_text , text );
2019
2012
}
2020
2013
}
2021
2014
}
0 commit comments