wayland: Refactor key event processing

Split out the event translation and the key repeat handling
in subroutines.
This commit is contained in:
Matthias Clasen
2016-03-02 15:55:36 -05:00
parent 4bee19c0a8
commit 38cd533159

View File

@@ -1691,65 +1691,13 @@ get_key_repeat (GdkWaylandDeviceData *device,
}
static void
stop_key_repeat (GdkWaylandDeviceData *device)
start_key_repeat (GdkWaylandDeviceData *device,
uint32_t key)
{
if (device->repeat_timer)
{
g_source_remove (device->repeat_timer);
device->repeat_timer = 0;
}
g_clear_pointer (&device->repeat_callback, wl_callback_destroy);
}
static void
deliver_key_event (GdkWaylandDeviceData *device,
uint32_t time_,
uint32_t key,
uint32_t state)
{
GdkEvent *event;
struct xkb_state *xkb_state;
struct xkb_keymap *xkb_keymap;
GdkKeymap *keymap;
xkb_keysym_t sym;
guint delay, interval, timeout;
stop_key_repeat (device);
keymap = device->keymap;
xkb_state = _gdk_wayland_keymap_get_xkb_state (keymap);
xkb_keymap = _gdk_wayland_keymap_get_xkb_keymap (keymap);
sym = xkb_state_key_get_one_sym (xkb_state, key);
device->time = time_;
device->key_modifiers = gdk_keymap_get_modifier_state (keymap);
event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
event->key.window = device->keyboard_focus ? g_object_ref (device->keyboard_focus) : NULL;
gdk_event_set_device (event, device->master_keyboard);
gdk_event_set_source_device (event, device->keyboard);
gdk_event_set_seat (event, gdk_device_get_seat (device->master_keyboard));
event->key.time = time_;
event->key.state = device->button_modifiers | device->key_modifiers;
event->key.group = 0;
event->key.hardware_keycode = key;
event->key.keyval = sym;
event->key.is_modifier = _gdk_wayland_keymap_key_is_modifier (keymap, key);
translate_keyboard_string (&event->key);
_gdk_wayland_display_deliver_event (device->display, event);
GDK_NOTE (EVENTS,
g_message ("keyboard event, code %d, sym %d, "
"string %s, mods 0x%x",
event->key.hardware_keycode, event->key.keyval,
event->key.string, event->key.state));
if (state == 0)
return;
xkb_keymap = _gdk_wayland_keymap_get_xkb_keymap (device->keymap);
if (!xkb_keymap_key_repeats (xkb_keymap, key))
return;
@@ -1770,6 +1718,76 @@ deliver_key_event (GdkWaylandDeviceData *device,
g_source_set_name_by_id (device->repeat_timer, "[gtk+] keyboard_repeat");
}
static void
stop_key_repeat (GdkWaylandDeviceData *device)
{
if (device->repeat_timer)
{
g_source_remove (device->repeat_timer);
device->repeat_timer = 0;
}
g_clear_pointer (&device->repeat_callback, wl_callback_destroy);
}
static Gdkevent *
translate_key_event (GdkWaylandDeviceData *device,
uint32_t time_,
uint32_t key,
uint32_t state)
{
GdkEvent *event;
struct xkb_state *xkb_state;
xkb_keysym_t sym;
xkb_state = _gdk_wayland_keymap_get_xkb_state (device->keymap);
sym = xkb_state_key_get_one_sym (xkb_state, key);
event = gdk_event_new (state ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
event->key.window = device->keyboard_focus ? g_object_ref (device->keyboard_focus) : NULL;
gdk_event_set_device (event, device->master_keyboard);
gdk_event_set_source_device (event, device->keyboard);
gdk_event_set_seat (event, gdk_device_get_seat (device->master_keyboard));
event->key.time = time_;
event->key.state = device->button_modifiers | device->key_modifiers;
event->key.group = 0;
event->key.hardware_keycode = key;
event->key.keyval = sym;
event->key.is_modifier = _gdk_wayland_keymap_key_is_modifier (keymap, key);
translate_keyboard_string (&event->key);
return event;
}
static void
deliver_key_event (GdkWaylandDeviceData *device,
uint32_t time_,
uint32_t key,
uint32_t state)
{
GdkEvent *event;
device->time = time_;
device->key_modifiers = gdk_keymap_get_modifier_state (device->keymap);
event = translate_key_event (device, time_, key, state);
_gdk_wayland_display_deliver_event (device->display, event);
GDK_NOTE (EVENTS,
g_message ("keyboard event, code %d, sym %d, "
"string %s, mods 0x%x",
event->key.hardware_keycode, event->key.keyval,
event->key.string, event->key.state));
stop_key_repeat (device);
if (state == 0)
return;
start_key_repeat (device, key);
}
static void
sync_after_repeat_callback (void *data,
struct wl_callback *callback,