wayland-keyboard: Make update_pressed_keys() more generic

It will allow us to re-use this function next. Also rename the keys
array to pressed_keys since we'll need to add a different one.

https://bugzilla.gnome.org/show_bug.cgi?id=727178
This commit is contained in:
Rui Matos 2014-03-27 14:42:11 +01:00
parent 63c627ec18
commit bf9fdf448d
2 changed files with 15 additions and 20 deletions

View File

@ -359,7 +359,7 @@ meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
keyboard->focus_surface_listener.notify = keyboard_handle_focus_surface_destroy; keyboard->focus_surface_listener.notify = keyboard_handle_focus_surface_destroy;
wl_array_init (&keyboard->keys); wl_array_init (&keyboard->pressed_keys);
keyboard->xkb_context = xkb_context_new (0 /* flags */); keyboard->xkb_context = xkb_context_new (0 /* flags */);
keyboard->xkb_info.keymap_fd = -1; keyboard->xkb_info.keymap_fd = -1;
@ -397,43 +397,38 @@ meta_wayland_keyboard_release (MetaWaylandKeyboard *keyboard)
xkb_context_unref (keyboard->xkb_context); xkb_context_unref (keyboard->xkb_context);
/* XXX: What about keyboard->resource_list? */ /* XXX: What about keyboard->resource_list? */
wl_array_release (&keyboard->keys); wl_array_release (&keyboard->pressed_keys);
g_object_unref (keyboard->settings); g_object_unref (keyboard->settings);
} }
static void static void
update_pressed_keys (MetaWaylandKeyboard *keyboard, update_pressed_keys (struct wl_array *keys,
uint32_t evdev_code, uint32_t evdev_code,
gboolean is_press) gboolean is_press)
{ {
uint32_t *end = (void *) ((char *) keys->data + keys->size);
uint32_t *k;
if (is_press) if (is_press)
{ {
uint32_t *end = (void *) ((char *) keyboard->keys.data +
keyboard->keys.size);
uint32_t *k;
/* Make sure we don't already have this key. */ /* Make sure we don't already have this key. */
for (k = keyboard->keys.data; k < end; k++) for (k = keys->data; k < end; k++)
if (*k == evdev_code) if (*k == evdev_code)
return; 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 (keys, sizeof (*k));
*k = evdev_code; *k = evdev_code;
} }
else else
{ {
uint32_t *end = (void *) ((char *) keyboard->keys.data +
keyboard->keys.size);
uint32_t *k;
/* Remove the key from the array */ /* Remove the key from the array */
for (k = keyboard->keys.data; k < end; k++) for (k = keys->data; k < end; k++)
if (*k == evdev_code) if (*k == evdev_code)
{ {
*k = *(end - 1); *k = *(end - 1);
keyboard->keys.size -= sizeof (*k); keys->size -= sizeof (*k);
return; return;
} }
@ -457,7 +452,7 @@ meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard,
struct xkb_state *state = keyboard->xkb_info.state; struct xkb_state *state = keyboard->xkb_info.state;
enum xkb_state_component changed_state; enum xkb_state_component changed_state;
update_pressed_keys (keyboard, evdev_code (event), is_press); update_pressed_keys (&keyboard->pressed_keys, evdev_code (event), is_press);
changed_state = xkb_state_update_key (state, changed_state = xkb_state_update_key (state,
event->hardware_keycode, event->hardware_keycode,
@ -581,7 +576,7 @@ meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED), xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED),
xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE)); xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE));
wl_keyboard_send_enter (resource, serial, keyboard->focus_surface->resource, wl_keyboard_send_enter (resource, serial, keyboard->focus_surface->resource,
&keyboard->keys); &keyboard->pressed_keys);
} }
keyboard->focus_serial = serial; keyboard->focus_serial = serial;

View File

@ -69,7 +69,7 @@ struct _MetaWaylandKeyboard
struct wl_listener focus_surface_listener; struct wl_listener focus_surface_listener;
uint32_t focus_serial; uint32_t focus_serial;
struct wl_array keys; struct wl_array pressed_keys;
struct xkb_context *xkb_context; struct xkb_context *xkb_context;
MetaWaylandXkbInfo xkb_info; MetaWaylandXkbInfo xkb_info;