summaryrefslogtreecommitdiff
path: root/src/compositor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor.c')
-rw-r--r--src/compositor.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/src/compositor.c b/src/compositor.c
index 13da40f..c562546 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -1719,10 +1719,39 @@ notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis, int32_t value)
WL_POINTER_AXIS, time, axis, value);
}
-static void
+static int
update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
{
+ struct weston_compositor *compositor = seat->compositor;
uint32_t modifier;
+ uint32_t mods_depressed, mods_latched, mods_locked, group;
+ int ret = 0;
+
+ xkb_state_update_key(seat->compositor->xkb_info.state, key + 8,
+ state ? XKB_KEY_DOWN : XKB_KEY_UP);
+
+ mods_depressed =
+ xkb_state_serialize_mods(compositor->xkb_info.state,
+ XKB_STATE_DEPRESSED);
+ mods_latched =
+ xkb_state_serialize_mods(compositor->xkb_info.state,
+ XKB_STATE_LATCHED);
+ mods_locked =
+ xkb_state_serialize_mods(compositor->xkb_info.state,
+ XKB_STATE_LOCKED);
+ group = xkb_state_serialize_group(compositor->xkb_info.state,
+ XKB_STATE_EFFECTIVE);
+
+ if (mods_depressed != compositor->xkb_info.mods_depressed ||
+ mods_latched != compositor->xkb_info.mods_latched ||
+ mods_locked != compositor->xkb_info.mods_locked ||
+ group != compositor->xkb_info.group)
+ ret = 1;
+
+ compositor->xkb_info.mods_depressed = mods_depressed;
+ compositor->xkb_info.mods_latched = mods_latched;
+ compositor->xkb_info.mods_locked = mods_locked;
+ compositor->xkb_info.group = group;
switch (key) {
case KEY_LEFTCTRL:
@@ -1749,6 +1778,8 @@ update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
seat->modifier_state |= modifier;
else
seat->modifier_state &= ~modifier;
+
+ return ret;
}
WL_EXPORT void
@@ -1758,8 +1789,10 @@ notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, uint32_t state)
struct weston_compositor *compositor = ws->compositor;
struct weston_surface *focus =
(struct weston_surface *) seat->pointer->focus;
+ struct wl_keyboard_grab *grab = seat->keyboard->grab;
uint32_t serial = wl_display_next_serial(compositor->wl_display);
uint32_t *k, *end;
+ int mods;
if (state) {
if (compositor->ping_handler && focus)
@@ -1772,7 +1805,7 @@ notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, uint32_t state)
weston_compositor_idle_release(compositor);
}
- update_modifier_state(ws, key, state);
+ 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)
@@ -1784,12 +1817,11 @@ notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, uint32_t state)
*k = key;
}
- if (seat->keyboard->grab == &seat->keyboard->default_grab)
+ if (grab == &seat->keyboard->default_grab)
weston_compositor_run_binding(compositor, ws,
time, key, 0, 0, state);
- seat->keyboard->grab->interface->key(seat->keyboard->grab,
- time, key, state);
+ grab->interface->key(grab, time, key, state);
}
WL_EXPORT void