mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 16:10:41 -05:00
wayland-keyboard: Don't use our own tracking to detect autorepeat
Clutter already marks all autorepeat key events it as synthetic key events. We can simply ignore these instead of relying on custom key tracking code.
This commit is contained in:
parent
0cdf3bd383
commit
ae8f21a3dc
@ -365,7 +365,7 @@ set_modifiers (MetaWaylandKeyboard *keyboard,
|
|||||||
new_state.group);
|
new_state.group);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static void
|
||||||
update_pressed_keys (MetaWaylandKeyboard *keyboard,
|
update_pressed_keys (MetaWaylandKeyboard *keyboard,
|
||||||
uint32_t evdev_code,
|
uint32_t evdev_code,
|
||||||
gboolean is_press)
|
gboolean is_press)
|
||||||
@ -376,13 +376,10 @@ update_pressed_keys (MetaWaylandKeyboard *keyboard,
|
|||||||
keyboard->keys.size);
|
keyboard->keys.size);
|
||||||
uint32_t *k;
|
uint32_t *k;
|
||||||
|
|
||||||
/* We want to ignore events that are sent because of auto-repeat. In
|
/* Make sure we don't already have this key. */
|
||||||
the Clutter event stream these appear as a single key press
|
|
||||||
event. We can detect that because the key will already have been
|
|
||||||
pressed */
|
|
||||||
for (k = keyboard->keys.data; k < end; k++)
|
for (k = keyboard->keys.data; k < end; k++)
|
||||||
if (*k == evdev_code)
|
if (*k == evdev_code)
|
||||||
return TRUE;
|
return;
|
||||||
|
|
||||||
/* Otherwise add the key to the list of pressed keys */
|
/* Otherwise add the key to the list of pressed keys */
|
||||||
k = wl_array_add (&keyboard->keys, sizeof (*k));
|
k = wl_array_add (&keyboard->keys, sizeof (*k));
|
||||||
@ -400,18 +397,11 @@ update_pressed_keys (MetaWaylandKeyboard *keyboard,
|
|||||||
{
|
{
|
||||||
*k = *(end - 1);
|
*k = *(end - 1);
|
||||||
keyboard->keys.size -= sizeof (*k);
|
keyboard->keys.size -= sizeof (*k);
|
||||||
|
return;
|
||||||
goto found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_warning ("unexpected key release event for key 0x%x", evdev_code);
|
g_warning ("unexpected key release event for key 0x%x", evdev_code);
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
found:
|
|
||||||
(void) 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -421,7 +411,6 @@ meta_wayland_keyboard_handle_event (MetaWaylandKeyboard *keyboard,
|
|||||||
gboolean is_press = event->type == CLUTTER_KEY_PRESS;
|
gboolean is_press = event->type == CLUTTER_KEY_PRESS;
|
||||||
guint xkb_keycode, evdev_code;
|
guint xkb_keycode, evdev_code;
|
||||||
uint32_t serial;
|
uint32_t serial;
|
||||||
gboolean autorepeat;
|
|
||||||
gboolean handled;
|
gboolean handled;
|
||||||
|
|
||||||
xkb_keycode = event->hardware_keycode;
|
xkb_keycode = event->hardware_keycode;
|
||||||
@ -430,15 +419,16 @@ meta_wayland_keyboard_handle_event (MetaWaylandKeyboard *keyboard,
|
|||||||
xkb_keycode, &evdev_code))
|
xkb_keycode, &evdev_code))
|
||||||
evdev_code = xkb_keycode - 8; /* What everyone is doing in practice... */
|
evdev_code = xkb_keycode - 8; /* What everyone is doing in practice... */
|
||||||
|
|
||||||
autorepeat = update_pressed_keys (keyboard, evdev_code, is_press);
|
/* Synthetic key events are for autorepeat. Ignore those, as
|
||||||
|
* autorepeat in Wayland is done on the client side. */
|
||||||
|
if (event->flags & CLUTTER_EVENT_FLAG_SYNTHETIC)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
meta_verbose ("Handling key %s%s event code %d\n",
|
meta_verbose ("Handling key %s event code %d\n",
|
||||||
is_press ? "press" : "release",
|
is_press ? "press" : "release",
|
||||||
autorepeat ? " (autorepeat)" : "",
|
|
||||||
xkb_keycode);
|
xkb_keycode);
|
||||||
|
|
||||||
if (autorepeat)
|
update_pressed_keys (keyboard, evdev_code, is_press);
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
serial = wl_display_next_serial (keyboard->display);
|
serial = wl_display_next_serial (keyboard->display);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user