summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stone <daniel@fooishbar.org>2012-06-22 13:21:37 +0100
committerKristian Høgsberg <krh@bitplanet.net>2012-06-22 11:52:07 -0400
commit1b4e11f38e5ed7abb85e599483a62cb303cc543d (patch)
treef09767a628d44f567995e109ce63a353cd420179
parent3ee91e1879301573a320551a19f99da0a715ff86 (diff)
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 <daniel@fooishbar.org>
-rw-r--r--src/compositor-wayland.c3
-rw-r--r--src/compositor-x11.c12
-rw-r--r--src/compositor.c8
-rw-r--r--src/compositor.h3
-rw-r--r--src/evdev.c3
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;
}
}