Update XKB state in update_modifier_state
authorDaniel Stone <daniel@fooishbar.org>
Wed, 30 May 2012 15:31:40 +0000 (16:31 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 31 May 2012 17:59:28 +0000 (13:59 -0400)
As well as just updating Weston's internal modifier_state, also update
our xkb_state object, in preparation for serialising modifier values to
clients.  This also makes update_modifier_state return 1 if the
modifier/group state has changed, or 0 if not.

Signed-off-by: Daniel Stone <daniel@fooishbar.org>
src/compositor.c

index 13da40f..c562546 100644 (file)
@@ -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