Move xkb_state object to weston_seat
authorDaniel Stone <daniel@fooishbar.org>
Wed, 30 May 2012 15:31:43 +0000 (16:31 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 31 May 2012 19:28:32 +0000 (15:28 -0400)
As we need to keep a separate state for every seat (i.e. keyboard
interface) rather than a compositor-global state.

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

index d71cf65..0e39ebe 100644 (file)
@@ -1657,10 +1657,10 @@ weston_surface_activate(struct weston_surface *surface,
        if (seat->seat.keyboard->focus_resource) {
                wl_keyboard_send_modifiers(seat->seat.keyboard->focus_resource,
                                           wl_display_next_serial(compositor->wl_display),
-                                          compositor->xkb_info.mods_depressed,
-                                          compositor->xkb_info.mods_latched,
-                                          compositor->xkb_info.mods_locked,
-                                          compositor->xkb_info.group);
+                                          seat->xkb_state.mods_depressed,
+                                          seat->xkb_state.mods_latched,
+                                          seat->xkb_state.mods_locked,
+                                          seat->xkb_state.group);
        }
 
        wl_signal_emit(&compositor->activate_signal, surface);
@@ -1731,36 +1731,32 @@ notify_axis(struct wl_seat *seat, uint32_t time, uint32_t axis, int32_t value)
 static int
 update_modifier_state(struct weston_seat *seat, uint32_t key, uint32_t state)
 {
-       struct weston_compositor *compositor = seat->compositor;
        enum weston_keyboard_modifier modifier;
        uint32_t mods_depressed, mods_latched, mods_locked, group;
        int ret = 0;
 
-       xkb_state_update_key(seat->compositor->xkb_info.state, key + 8,
+       xkb_state_update_key(seat->xkb_state.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,
+       mods_depressed = xkb_state_serialize_mods(seat->xkb_state.state,
+                                                 XKB_STATE_DEPRESSED);
+       mods_latched = xkb_state_serialize_mods(seat->xkb_state.state,
+                                               XKB_STATE_LATCHED);
+       mods_locked = xkb_state_serialize_mods(seat->xkb_state.state,
+                                              XKB_STATE_LOCKED);
+       group = xkb_state_serialize_group(seat->xkb_state.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)
+       if (mods_depressed != seat->xkb_state.mods_depressed ||
+           mods_latched != seat->xkb_state.mods_latched ||
+           mods_locked != seat->xkb_state.mods_locked ||
+           group != seat->xkb_state.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;
+       seat->xkb_state.mods_depressed = mods_depressed;
+       seat->xkb_state.mods_latched = mods_latched;
+       seat->xkb_state.mods_locked = mods_locked;
+       seat->xkb_state.group = group;
 
        switch (key) {
        case KEY_LEFTCTRL:
@@ -1834,10 +1830,10 @@ notify_key(struct wl_seat *seat, uint32_t time, uint32_t key, uint32_t state)
        if (mods)
                grab->interface->modifiers(grab,
                                           wl_display_get_serial(compositor->wl_display),
-                                          compositor->xkb_info.mods_depressed,
-                                          compositor->xkb_info.mods_latched,
-                                          compositor->xkb_info.mods_locked,
-                                          compositor->xkb_info.group);
+                                          ws->xkb_state.mods_depressed,
+                                          ws->xkb_state.mods_latched,
+                                          ws->xkb_state.mods_locked,
+                                          ws->xkb_state.group);
 }
 
 WL_EXPORT void
@@ -1898,10 +1894,10 @@ notify_keyboard_focus(struct wl_seat *seat, struct wl_array *keys)
                        if (seat->keyboard->focus_resource) {
                                wl_keyboard_send_modifiers(seat->keyboard->focus_resource,
                                                           wl_display_next_serial(compositor->wl_display),
-                                                          compositor->xkb_info.mods_depressed,
-                                                          compositor->xkb_info.mods_latched,
-                                                          compositor->xkb_info.mods_locked,
-                                                          compositor->xkb_info.group);
+                                                          ws->xkb_state.mods_depressed,
+                                                          ws->xkb_state.mods_latched,
+                                                          ws->xkb_state.mods_locked,
+                                                          ws->xkb_state.group);
                        }
                        ws->saved_kbd_focus = NULL;
                }
@@ -2222,6 +2218,46 @@ device_handle_new_drag_icon(struct wl_listener *listener, void *data)
        weston_seat_update_drag_surface(&seat->seat, 0, 0);
 }
 
+static int weston_compositor_xkb_init(struct weston_compositor *ec,
+                                     struct xkb_rule_names *names)
+{
+       ec->xkb_info.context = xkb_context_new(0);
+       if (ec->xkb_info.context == NULL) {
+               fprintf(stderr, "failed to create XKB context\n");
+               return -1;
+       }
+
+       if (names)
+               ec->xkb_info.names = *names;
+       if (!ec->xkb_info.names.rules)
+               ec->xkb_info.names.rules = strdup("evdev");
+       if (!ec->xkb_info.names.model)
+               ec->xkb_info.names.model = strdup("pc105");
+       if (!ec->xkb_info.names.layout)
+               ec->xkb_info.names.layout = strdup("us");
+
+       ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_info.context,
+                                                    &ec->xkb_info.names, 0);
+       if (ec->xkb_info.keymap == NULL) {
+               fprintf(stderr, "failed to compile XKB keymap\n");
+               return -1;
+       }
+
+       return 0;
+}
+
+static void weston_compositor_xkb_destroy(struct weston_compositor *ec)
+{
+       xkb_map_unref(ec->xkb_info.keymap);
+       xkb_context_unref(ec->xkb_info.context);
+
+       free((char *) ec->xkb_info.names.rules);
+       free((char *) ec->xkb_info.names.model);
+       free((char *) ec->xkb_info.names.layout);
+       free((char *) ec->xkb_info.names.variant);
+       free((char *) ec->xkb_info.names.options);
+}
+
 WL_EXPORT void
 weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec)
 {
@@ -2253,6 +2289,20 @@ weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec)
        seat->new_drag_icon_listener.notify = device_handle_new_drag_icon;
        wl_signal_add(&seat->seat.drag_icon_signal,
                      &seat->new_drag_icon_listener);
+
+       if (!ec->xkb_info.context)
+               weston_compositor_xkb_init(ec, NULL);
+
+       seat->xkb_state.mods_depressed = 0;
+       seat->xkb_state.mods_latched = 0;
+       seat->xkb_state.mods_locked = 0;
+       seat->xkb_state.group = 0;
+
+       seat->xkb_state.state = xkb_state_new(ec->xkb_info.keymap);
+       if (seat->xkb_state.state == NULL) {
+               fprintf(stderr, "failed to initialise XKB state\n");
+               exit(1);
+       }
 }
 
 WL_EXPORT void
@@ -2264,6 +2314,8 @@ weston_seat_release(struct weston_seat *seat)
        if (seat->sprite)
                destroy_surface(&seat->sprite->surface.resource);
 
+       xkb_state_unref(seat->xkb_state.state);
+
        wl_seat_release(&seat->seat);
 }
 
@@ -2816,52 +2868,6 @@ weston_compositor_shutdown(struct weston_compositor *ec)
        wl_event_loop_destroy(ec->input_loop);
 }
 
-static int weston_compositor_xkb_init(struct weston_compositor *ec,
-                                     struct xkb_rule_names *names)
-{
-       ec->xkb_info.context = xkb_context_new(0);
-       if (ec->xkb_info.context == NULL) {
-               fprintf(stderr, "failed to create XKB context\n");
-               return -1;
-       }
-
-       ec->xkb_info.names = *names;
-       if (!ec->xkb_info.names.rules)
-               ec->xkb_info.names.rules = strdup("evdev");
-       if (!ec->xkb_info.names.model)
-               ec->xkb_info.names.model = strdup("pc105");
-       if (!ec->xkb_info.names.layout)
-               ec->xkb_info.names.layout = strdup("us");
-
-       ec->xkb_info.keymap = xkb_map_new_from_names(ec->xkb_info.context,
-                                                    &ec->xkb_info.names, 0);
-       if (ec->xkb_info.keymap == NULL) {
-               fprintf(stderr, "failed to compile XKB keymap\n");
-               return -1;
-       }
-
-       ec->xkb_info.state = xkb_state_new(ec->xkb_info.keymap);
-       if (ec->xkb_info.state == NULL) {
-               fprintf(stderr, "failed to initialise XKB state\n");
-               return -1;
-       }
-
-       return 0;
-}
-
-static void weston_compositor_xkb_destroy(struct weston_compositor *ec)
-{
-       xkb_state_unref(ec->xkb_info.state);
-       xkb_map_unref(ec->xkb_info.keymap);
-       xkb_context_unref(ec->xkb_info.context);
-
-       free((char *) ec->xkb_info.names.rules);
-       free((char *) ec->xkb_info.names.model);
-       free((char *) ec->xkb_info.names.layout);
-       free((char *) ec->xkb_info.names.variant);
-       free((char *) ec->xkb_info.names.options);
-}
-
 static int on_term_signal(int signal_number, void *data)
 {
        struct wl_display *display = data;
index 8cf0ce8..26857c2 100644 (file)
@@ -179,6 +179,14 @@ struct weston_seat {
        struct wl_listener touch_focus_resource_listener;
 
        struct wl_listener new_drag_icon_listener;
+
+       struct {
+               struct xkb_state *state;
+               uint32_t mods_depressed;
+               uint32_t mods_latched;
+               uint32_t mods_locked;
+               uint32_t group;
+       } xkb_state;
 };
 
 struct weston_shader {
@@ -297,11 +305,6 @@ struct weston_compositor {
                struct xkb_rule_names names;
                struct xkb_context *context;
                struct xkb_keymap *keymap;
-               struct xkb_state *state;
-               uint32_t mods_depressed;
-               uint32_t mods_latched;
-               uint32_t mods_locked;
-               uint32_t group;
        } xkb_info;
 };