From 1b4e11f38e5ed7abb85e599483a62cb303cc543d Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Fri, 22 Jun 2012 13:21:37 +0100 Subject: [PATCH] notify_key: Add update_state argument If update_state is true, then notify_key will continue to call xkb_key_update_state to update the local state mask, as before this commit. Otherwise, it will rely on the compositor to manually update the state itself, for nested compositors. Signed-off-by: Daniel Stone --- src/compositor-wayland.c | 3 ++- src/compositor-x11.c | 12 ++++++++---- src/compositor.c | 8 +++++--- src/compositor.h | 3 ++- src/evdev.c | 3 ++- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index 5b6a8f4d..d81a13b8 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -666,7 +666,8 @@ input_handle_key(void *data, struct wl_keyboard *keyboard, notify_key(&c->base.seat->seat, time, key, state ? WL_KEYBOARD_KEY_STATE_PRESSED : - WL_KEYBOARD_KEY_STATE_RELEASED); + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); } static void diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 7738bd01..bda76386 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -710,7 +710,8 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) notify_key(&c->base.seat->seat, weston_compositor_get_time(), key_release->detail - 8, - WL_KEYBOARD_KEY_STATE_RELEASED); + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); free(prev); prev = NULL; break; @@ -753,7 +754,8 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) notify_key(&c->base.seat->seat, weston_compositor_get_time(), key_press->detail - 8, - WL_KEYBOARD_KEY_STATE_PRESSED); + WL_KEYBOARD_KEY_STATE_PRESSED, + STATE_UPDATE_AUTOMATIC); break; case XCB_KEY_RELEASE: /* If we don't have XKB, we need to use the lame @@ -766,7 +768,8 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) notify_key(&c->base.seat->seat, weston_compositor_get_time(), key_release->detail - 8, - WL_KEYBOARD_KEY_STATE_RELEASED); + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); break; case XCB_BUTTON_PRESS: x11_compositor_deliver_button_event(c, event, 1); @@ -848,7 +851,8 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) notify_key(&c->base.seat->seat, weston_compositor_get_time(), key_release->detail - 8, - WL_KEYBOARD_KEY_STATE_RELEASED); + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); free(prev); prev = NULL; break; diff --git a/src/compositor.c b/src/compositor.c index 1d57316b..5362a67e 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -1833,7 +1833,8 @@ update_modifier_state(struct weston_seat *seat, uint32_t key, WL_EXPORT void notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, - enum wl_keyboard_key_state state) + enum wl_keyboard_key_state state, + enum weston_key_state_update update_state) { struct weston_seat *ws = (struct weston_seat *) seat; struct weston_compositor *compositor = ws->compositor; @@ -1842,7 +1843,7 @@ notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, struct wl_keyboard_grab *grab = seat->keyboard->grab; uint32_t serial = wl_display_next_serial(compositor->wl_display); uint32_t *k, *end; - int mods; + int mods = 0; if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { if (compositor->ping_handler && focus) @@ -1855,7 +1856,8 @@ notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, weston_compositor_idle_release(compositor); } - mods = update_modifier_state(ws, key, state); + if (update_state == STATE_UPDATE_AUTOMATIC) + mods = update_modifier_state(ws, key, state); end = seat->keyboard->keys.data + seat->keyboard->keys.size; for (k = seat->keyboard->keys.data; k < end; k++) { if (*k == key) { diff --git a/src/compositor.h b/src/compositor.h index f87843a9..6e981f24 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -509,7 +509,8 @@ notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis, wl_fixed_t value); void notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, - enum wl_keyboard_key_state state); + enum wl_keyboard_key_state state, + enum weston_key_state_update update_state); void notify_pointer_focus(struct wl_seat *seat, struct weston_output *output, diff --git a/src/evdev.c b/src/evdev.c index 05d1ebe6..3355192f 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -88,7 +88,8 @@ evdev_process_key(struct evdev_input_device *device, notify_key(&device->master->base.seat, time, e->code, e->value ? WL_KEYBOARD_KEY_STATE_PRESSED : - WL_KEYBOARD_KEY_STATE_RELEASED); + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); break; } }