[mutter] wayland-keyboard: Handle keymap-layout-group-changed signal



commit 656573c5d22e5fbd36fcf9ed3b723be3cfbb8372
Author: Rui Matos <tiagomatos gmail com>
Date:   Wed Sep 10 19:23:55 2014 +0200

    wayland-keyboard: Handle keymap-layout-group-changed signal
    
    We need to send a modifiers event to wayland clients when the layout
    group changes.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=736433

 src/wayland/meta-wayland-keyboard.c |   58 +++++++++++++++++++++++------------
 1 files changed, 38 insertions(+), 20 deletions(-)
---
diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c
index 1980c6f..0c6b88f 100644
--- a/src/wayland/meta-wayland-keyboard.c
+++ b/src/wayland/meta-wayland-keyboard.c
@@ -62,9 +62,7 @@
 #include "meta-wayland-private.h"
 
 static void meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard);
-static void notify_modifiers (MetaWaylandKeyboard *keyboard, uint32_t serial,
-                              uint32_t mods_depressed, uint32_t mods_latched,
-                              uint32_t mods_locked, uint32_t group);
+static void notify_modifiers (MetaWaylandKeyboard *keyboard);
 
 static void
 unbind_resource (struct wl_resource *resource)
@@ -190,12 +188,8 @@ meta_wayland_keyboard_take_keymap (MetaWaylandKeyboard *keyboard,
 
   inform_clients_of_new_keymap (keyboard);
 
-  notify_modifiers (keyboard,
-                    wl_display_next_serial (keyboard->display),
-                    xkb_state_serialize_mods (xkb_info->state, XKB_STATE_MODS_DEPRESSED),
-                    xkb_state_serialize_mods (xkb_info->state, XKB_STATE_MODS_LATCHED),
-                    xkb_state_serialize_mods (xkb_info->state, XKB_STATE_MODS_LOCKED),
-                    xkb_state_serialize_layout (xkb_info->state, XKB_STATE_LAYOUT_EFFECTIVE));
+  notify_modifiers (keyboard);
+
   return;
 
 err_dev_zero:
@@ -216,6 +210,28 @@ on_keymap_changed (MetaBackend *backend,
 }
 
 static void
+on_keymap_layout_group_changed (MetaBackend *backend,
+                                guint        idx,
+                                gpointer     data)
+{
+  MetaWaylandKeyboard *keyboard = data;
+  xkb_mod_mask_t depressed_mods;
+  xkb_mod_mask_t latched_mods;
+  xkb_mod_mask_t locked_mods;
+  struct xkb_state *state;
+
+  state = keyboard->xkb_info.state;
+
+  depressed_mods = xkb_state_serialize_mods (state, XKB_STATE_MODS_DEPRESSED);
+  latched_mods = xkb_state_serialize_mods (state, XKB_STATE_MODS_LATCHED);
+  locked_mods = xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED);
+
+  xkb_state_update_mask (state, depressed_mods, latched_mods, locked_mods, 0, 0, idx);
+
+  notify_modifiers (keyboard);
+}
+
+static void
 keyboard_handle_focus_surface_destroy (struct wl_listener *listener, void *data)
 {
   MetaWaylandKeyboard *keyboard = wl_container_of (listener, keyboard, focus_surface_listener);
@@ -248,18 +264,23 @@ notify_key (MetaWaylandKeyboard *keyboard,
 }
 
 static void
-notify_modifiers (MetaWaylandKeyboard *keyboard, uint32_t serial,
-                  uint32_t mods_depressed, uint32_t mods_latched,
-                  uint32_t mods_locked, uint32_t group)
+notify_modifiers (MetaWaylandKeyboard *keyboard)
 {
+  struct xkb_state *state;
   struct wl_resource *resource;
   struct wl_list *l;
 
+  state = keyboard->xkb_info.state;
+
   l = &keyboard->focus_resource_list;
   wl_resource_for_each (resource, l)
     {
-      wl_keyboard_send_modifiers (resource, serial, mods_depressed,
-                                  mods_latched, mods_locked, group);
+      wl_keyboard_send_modifiers (resource,
+                                  wl_display_next_serial (keyboard->display),
+                                  xkb_state_serialize_mods (state, XKB_STATE_MODS_DEPRESSED),
+                                  xkb_state_serialize_mods (state, XKB_STATE_MODS_LATCHED),
+                                  xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED),
+                                  xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE));
     }
 }
 
@@ -367,6 +388,8 @@ meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard,
 
   g_signal_connect (backend, "keymap-changed",
                     G_CALLBACK (on_keymap_changed), keyboard);
+  g_signal_connect (backend, "keymap-layout-group-changed",
+                    G_CALLBACK (on_keymap_layout_group_changed), keyboard);
   meta_wayland_keyboard_take_keymap (keyboard, meta_backend_get_keymap (backend));
 }
 
@@ -454,12 +477,7 @@ meta_wayland_keyboard_update (MetaWaylandKeyboard *keyboard,
   if (changed_state == 0)
     return;
 
-  notify_modifiers (keyboard,
-                    wl_display_next_serial (keyboard->display),
-                    xkb_state_serialize_mods (state, XKB_STATE_MODS_DEPRESSED),
-                    xkb_state_serialize_mods (state, XKB_STATE_MODS_LATCHED),
-                    xkb_state_serialize_mods (state, XKB_STATE_MODS_LOCKED),
-                    xkb_state_serialize_layout (state, XKB_STATE_LAYOUT_EFFECTIVE));
+  notify_modifiers (keyboard);
 }
 
 gboolean


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]