[mutter/wip/carlosg/input-thread] backends: Handle numlock saving/restoring directly in backends



commit 1767f76608c02af9d283d2fafdf5ed505cf07139
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Nov 26 23:10:25 2020 +0100

    backends: Handle numlock saving/restoring directly in backends
    
    Simplify the handling of numlock state, so it can be entirely handled
    within the input thread. Since the saving/restoring is triggered inside
    each backend code, there's no need anymore for meta_backend_set_numlock().

 src/backends/meta-backend-private.h        |   3 -
 src/backends/meta-backend.c                |  26 ------
 src/backends/meta-input-settings-private.h |   5 +-
 src/backends/meta-input-settings.c         |  23 ++---
 src/backends/native/meta-backend-native.c  |  13 ---
 src/backends/native/meta-seat-impl.c       | 136 +++++++++++++----------------
 src/backends/native/meta-seat-impl.h       |   3 -
 src/backends/native/meta-seat-native.c     |  14 ---
 src/backends/native/meta-seat-native.h     |   3 -
 src/backends/x11/meta-backend-x11.c        |  36 +++++---
 src/backends/x11/meta-keymap-x11.c         |  17 ++++
 11 files changed, 111 insertions(+), 168 deletions(-)
---
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 0ea419069f..80df654bc6 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -100,9 +100,6 @@ struct _MetaBackendClass
   void (* update_screen_size) (MetaBackend *backend, int width, int height);
   void (* select_stage_events) (MetaBackend *backend);
 
-  void (* set_numlock) (MetaBackend *backend,
-                        gboolean     numlock_state);
-
   void (* set_pointer_constraint) (MetaBackend           *backend,
                                    MetaPointerConstraint *constraint);
 };
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index b445bbcbf6..27dc8c4a46 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -157,7 +157,6 @@ struct _MetaBackendPrivate
   gboolean is_pointer_position_initialized;
 
   guint device_update_idle_id;
-  gulong keymap_state_changed_id;
 
   GHashTable *device_monitors;
 
@@ -198,16 +197,6 @@ meta_backend_finalize (GObject *object)
   MetaBackend *backend = META_BACKEND (object);
   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
 
-  if (priv->keymap_state_changed_id)
-    {
-      ClutterSeat *seat;
-      ClutterKeymap *keymap;
-
-      seat = clutter_backend_get_default_seat (priv->clutter_backend);
-      keymap = clutter_seat_get_keymap (seat);
-      g_clear_signal_handler (&priv->keymap_state_changed_id, keymap);
-    }
-
   g_list_free_full (priv->gpus, g_object_unref);
 
   g_clear_object (&priv->current_device);
@@ -573,7 +562,6 @@ meta_backend_real_post_init (MetaBackend *backend)
 {
   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
   ClutterSeat *seat = clutter_backend_get_default_seat (priv->clutter_backend);
-  ClutterKeymap *keymap = clutter_seat_get_keymap (seat);
   MetaInputSettings *input_settings;
 
   priv->stage = meta_stage_new (backend);
@@ -604,12 +592,6 @@ meta_backend_real_post_init (MetaBackend *backend)
 
   if (input_settings)
     {
-      priv->keymap_state_changed_id =
-        g_signal_connect_swapped (keymap, "state-changed",
-                                  G_CALLBACK (meta_input_settings_maybe_save_numlock_state),
-                                  input_settings);
-      meta_input_settings_maybe_restore_numlock_state (input_settings);
-
       g_signal_connect (priv->input_mapper, "device-mapped",
                         G_CALLBACK (input_mapper_device_mapped_cb),
                         input_settings);
@@ -1359,14 +1341,6 @@ meta_backend_lock_layout_group (MetaBackend *backend,
   META_BACKEND_GET_CLASS (backend)->lock_layout_group (backend, idx);
 }
 
-void
-meta_backend_set_numlock (MetaBackend *backend,
-                          gboolean     numlock_state)
-{
-  META_BACKEND_GET_CLASS (backend)->set_numlock (backend, numlock_state);
-}
-
-
 /**
  * meta_backend_get_stage:
  * @backend: A #MetaBackend
diff --git a/src/backends/meta-input-settings-private.h b/src/backends/meta-input-settings-private.h
index 639bede226..10de61d783 100644
--- a/src/backends/meta-input-settings-private.h
+++ b/src/backends/meta-input-settings-private.h
@@ -173,8 +173,9 @@ struct _MetaInputSettingsClass
                                     ClutterInputDevice *device);
 };
 
-void meta_input_settings_maybe_save_numlock_state    (MetaInputSettings *input_settings);
-void meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings);
+void meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings,
+                                                   gboolean           numlock_state);
+gboolean meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings);
 
 void meta_input_settings_set_device_matrix (MetaInputSettings  *input_settings,
                                             ClutterInputDevice *device,
diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c
index 4b154927a6..39a28f73f0 100644
--- a/src/backends/meta-input-settings.c
+++ b/src/backends/meta-input-settings.c
@@ -1164,8 +1164,6 @@ meta_input_settings_changed_cb (GSettings  *settings,
           strcmp (key, "repeat-interval") == 0 ||
           strcmp (key, "delay") == 0)
         update_keyboard_repeat (input_settings);
-      else if (strcmp (key, "remember-numlock-state") == 0)
-        meta_input_settings_maybe_save_numlock_state (input_settings);
     }
 
   g_mutex_unlock (&priv->lock);
@@ -1871,12 +1869,10 @@ meta_input_settings_init (MetaInputSettings *settings)
 }
 
 void
-meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings)
+meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings,
+                                              gboolean           numlock_state)
 {
   MetaInputSettingsPrivate *priv;
-  ClutterSeat *seat;
-  ClutterKeymap *keymap;
-  gboolean numlock_state;
 
   priv = meta_input_settings_get_instance_private (input_settings);
   g_mutex_lock (&priv->lock);
@@ -1884,10 +1880,6 @@ meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings)
   if (!g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state"))
     goto out;
 
-  seat = clutter_backend_get_default_seat (clutter_get_default_backend ());
-  keymap = clutter_seat_get_keymap (seat);
-  numlock_state = clutter_keymap_get_num_lock_state (keymap);
-
   if (numlock_state == g_settings_get_boolean (priv->keyboard_settings, "numlock-state"))
     goto out;
 
@@ -1897,22 +1889,21 @@ meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings)
   g_mutex_unlock (&priv->lock);
 }
 
-void
+gboolean
 meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings)
 {
   MetaInputSettingsPrivate *priv;
-  gboolean numlock_state;
+  gboolean numlock_state = FALSE;
 
   priv = meta_input_settings_get_instance_private (input_settings);
   g_mutex_lock (&priv->lock);
 
   if (g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state"))
-    {
-      numlock_state = g_settings_get_boolean (priv->keyboard_settings, "numlock-state");
-      meta_backend_set_numlock (meta_get_backend (), numlock_state);
-    }
+    numlock_state = g_settings_get_boolean (priv->keyboard_settings, "numlock-state");
 
   g_mutex_unlock (&priv->lock);
+
+  return numlock_state;
 }
 
 void
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index b0c953ad23..939885a64a 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -308,18 +308,6 @@ meta_backend_native_lock_layout_group (MetaBackend *backend,
   meta_backend_notify_keymap_layout_group_changed (backend, idx);
 }
 
-static void
-meta_backend_native_set_numlock (MetaBackend *backend,
-                                 gboolean     numlock_state)
-{
-  ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
-  ClutterSeat *seat;
-
-  seat = clutter_backend_get_default_seat (clutter_backend);
-  meta_seat_native_set_keyboard_numlock (META_SEAT_NATIVE (seat),
-                                         numlock_state);
-}
-
 static void
 meta_backend_native_set_pointer_constraint (MetaBackend           *backend,
                                             MetaPointerConstraint *constraint)
@@ -552,7 +540,6 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
   backend_class->get_keymap_layout_group = meta_backend_native_get_keymap_layout_group;
   backend_class->lock_layout_group = meta_backend_native_lock_layout_group;
   backend_class->update_screen_size = meta_backend_native_update_screen_size;
-  backend_class->set_numlock = meta_backend_native_set_numlock;
 
   backend_class->set_pointer_constraint = meta_backend_native_set_pointer_constraint;
 }
diff --git a/src/backends/native/meta-seat-impl.c b/src/backends/native/meta-seat-impl.c
index 1f4ef94d5c..173ba2f785 100644
--- a/src/backends/native/meta-seat-impl.c
+++ b/src/backends/native/meta-seat-impl.c
@@ -423,9 +423,18 @@ meta_seat_impl_notify_key_in_impl (MetaSeatImpl       *seat_impl,
   if (update_keys && (changed_state & XKB_STATE_LEDS))
     {
       MetaInputDeviceNative *keyboard_native;
+      gboolean numlock_active;
 
       emit_signal (seat_impl, signals[MODS_STATE_CHANGED], NULL, 0);
       meta_seat_impl_sync_leds_in_impl (seat_impl);
+
+      numlock_active =
+        xkb_state_mod_name_is_active (seat_impl->xkb, XKB_MOD_NAME_NUM,
+                                      XKB_STATE_MODS_LATCHED |
+                                      XKB_STATE_MODS_LOCKED);
+      meta_input_settings_maybe_save_numlock_state (seat_impl->input_settings,
+                                                    numlock_active);
+
       keyboard_native = META_INPUT_DEVICE_NATIVE (seat_impl->core_keyboard);
       meta_input_device_native_a11y_maybe_notify_toggle_keys_in_impl (keyboard_native);
     }
@@ -2526,6 +2535,48 @@ kbd_a11y_changed_cb (MetaInputSettings   *input_settings,
   meta_input_device_native_apply_kbd_a11y_settings_in_impl (keyboard, a11y_settings);
 }
 
+static void
+meta_seat_impl_set_keyboard_numlock_in_impl (MetaSeatImpl *seat_impl,
+                                             gboolean      numlock_state)
+{
+  xkb_mod_mask_t depressed_mods;
+  xkb_mod_mask_t latched_mods;
+  xkb_mod_mask_t locked_mods;
+  xkb_mod_mask_t group_mods;
+  xkb_mod_mask_t numlock;
+  struct xkb_keymap *xkb_keymap;
+  MetaKeymapNative *keymap;
+
+  keymap = seat_impl->keymap;
+  xkb_keymap = meta_keymap_native_get_keyboard_map_in_impl (keymap);
+
+  numlock = (1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod2"));
+
+  depressed_mods =
+    xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_DEPRESSED);
+  latched_mods =
+    xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_LATCHED);
+  locked_mods =
+    xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_LOCKED);
+  group_mods =
+    xkb_state_serialize_layout (seat_impl->xkb, XKB_STATE_LAYOUT_EFFECTIVE);
+
+  if (numlock_state)
+    locked_mods |= numlock;
+  else
+    locked_mods &= ~numlock;
+
+  xkb_state_update_mask (seat_impl->xkb,
+                         depressed_mods,
+                         latched_mods,
+                         locked_mods,
+                         0, 0,
+                         group_mods);
+
+  meta_seat_impl_sync_leds_in_impl (seat_impl);
+  meta_keymap_native_update_in_impl (seat_impl->keymap);
+}
+
 static gpointer
 input_thread (MetaSeatImpl *seat_impl)
 {
@@ -2566,7 +2617,6 @@ input_thread (MetaSeatImpl *seat_impl)
   seat_impl->input_settings = meta_input_settings_native_new_in_impl (seat_impl);
   g_signal_connect_object (seat_impl->input_settings, "kbd-a11y-changed",
                            G_CALLBACK (kbd_a11y_changed_cb), seat_impl, 0);
-
   source = meta_event_source_new (seat_impl);
   seat_impl->event_source = source;
 
@@ -2586,6 +2636,9 @@ input_thread (MetaSeatImpl *seat_impl)
         xkb_keymap_led_get_index (xkb_keymap, XKB_LED_NAME_SCROLL);
     }
 
+  if (meta_input_settings_maybe_restore_numlock_state (seat_impl->input_settings))
+    meta_seat_impl_set_keyboard_numlock_in_impl (seat_impl, TRUE);
+
   seat_impl->has_touchscreen = has_touchscreen (seat_impl);
   seat_impl->has_tablet_switch = has_tablet_switch (seat_impl);
   update_touch_mode (seat_impl);
@@ -2719,6 +2772,7 @@ static void
 meta_seat_impl_finalize (GObject *object)
 {
   MetaSeatImpl *seat_impl = META_SEAT_IMPL (object);
+  gboolean numlock_active;
   GSList *iter;
 
   g_main_loop_quit (seat_impl->input_loop);
@@ -2740,6 +2794,13 @@ meta_seat_impl_finalize (GObject *object)
 
   meta_event_source_free (seat_impl->event_source);
 
+  numlock_active =
+    xkb_state_mod_name_is_active (seat_impl->xkb, XKB_MOD_NAME_NUM,
+                                  XKB_STATE_MODS_LATCHED |
+                                  XKB_STATE_MODS_LOCKED);
+  meta_input_settings_maybe_save_numlock_state (seat_impl->input_settings,
+                                                numlock_active);
+
   xkb_state_unref (seat_impl->xkb);
 
   meta_seat_impl_clear_repeat_source (seat_impl);
@@ -3210,79 +3271,6 @@ meta_seat_impl_set_keyboard_layout_index (MetaSeatImpl       *seat_impl,
   g_object_unref (task);
 }
 
-static gboolean
-set_keyboard_numlock (GTask *task)
-{
-  MetaSeatImpl *seat_impl = g_task_get_source_object (task);
-  gboolean numlock_state = GPOINTER_TO_UINT (g_task_get_task_data (task));
-  xkb_mod_mask_t depressed_mods;
-  xkb_mod_mask_t latched_mods;
-  xkb_mod_mask_t locked_mods;
-  xkb_mod_mask_t group_mods;
-  xkb_mod_mask_t numlock;
-  struct xkb_keymap *xkb_keymap;
-  MetaKeymapNative *keymap;
-
-  g_rw_lock_writer_lock (&seat_impl->state_lock);
-
-  keymap = seat_impl->keymap;
-  xkb_keymap = meta_keymap_native_get_keyboard_map_in_impl (keymap);
-
-  numlock = (1 << xkb_keymap_mod_get_index (xkb_keymap, "Mod2"));
-
-  depressed_mods =
-    xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_DEPRESSED);
-  latched_mods =
-    xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_LATCHED);
-  locked_mods =
-    xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_LOCKED);
-  group_mods =
-    xkb_state_serialize_layout (seat_impl->xkb, XKB_STATE_LAYOUT_EFFECTIVE);
-
-  if (numlock_state)
-    locked_mods |= numlock;
-  else
-    locked_mods &= ~numlock;
-
-  xkb_state_update_mask (seat_impl->xkb,
-                         depressed_mods,
-                         latched_mods,
-                         locked_mods,
-                         0, 0,
-                         group_mods);
-
-  meta_seat_impl_sync_leds_in_impl (seat_impl);
-  meta_keymap_native_update_in_impl (seat_impl->keymap);
-
-  g_rw_lock_writer_unlock (&seat_impl->state_lock);
-
-  g_task_return_boolean (task, TRUE);
-
-  return G_SOURCE_REMOVE;
-}
-
-/**
- * meta_seat_impl_set_keyboard_numlock: (skip)
- * @seat: the #ClutterSeat created by the evdev backend
- * @numlock_set: TRUE to set NumLock ON, FALSE otherwise.
- *
- * Sets the NumLock state on the backend's #xkb_state .
- */
-void
-meta_seat_impl_set_keyboard_numlock (MetaSeatImpl *seat_impl,
-                                     gboolean      numlock_state)
-{
-  GTask *task;
-
-  g_return_if_fail (META_IS_SEAT_IMPL (seat_impl));
-
-  task = g_task_new (seat_impl, NULL, NULL, NULL);
-  g_task_set_task_data (task, GUINT_TO_POINTER (numlock_state), NULL);
-  meta_seat_impl_run_input_task (seat_impl, task,
-                                 (GSourceFunc) set_keyboard_numlock);
-  g_object_unref (task);
-}
-
 /**
  * meta_seat_impl_set_keyboard_repeat_in_impl:
  * @seat: the #ClutterSeat created by the evdev backend
diff --git a/src/backends/native/meta-seat-impl.h b/src/backends/native/meta-seat-impl.h
index d7a8f9a227..ab0ef75d38 100644
--- a/src/backends/native/meta-seat-impl.h
+++ b/src/backends/native/meta-seat-impl.h
@@ -226,9 +226,6 @@ void meta_seat_impl_set_keyboard_map (MetaSeatImpl      *seat_impl,
 void meta_seat_impl_set_keyboard_layout_index (MetaSeatImpl       *seat_impl,
                                                xkb_layout_index_t  idx);
 
-void meta_seat_impl_set_keyboard_numlock (MetaSeatImpl *seat_impl,
-                                          gboolean      numlock_state);
-
 void meta_seat_impl_set_keyboard_repeat_in_impl (MetaSeatImpl *seat_impl,
                                                  gboolean      repeat,
                                                  uint32_t      delay,
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index bc0ded9130..c204d07f33 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -615,20 +615,6 @@ meta_seat_native_get_keyboard_layout_index (MetaSeatNative *seat)
   return seat->xkb_layout_index;
 }
 
-/**
- * meta_seat_native_set_keyboard_numlock: (skip)
- * @seat: the #ClutterSeat created by the evdev backend
- * @numlock_set: TRUE to set NumLock ON, FALSE otherwise.
- *
- * Sets the NumLock state on the backend's #xkb_state .
- */
-void
-meta_seat_native_set_keyboard_numlock (MetaSeatNative *seat,
-                                       gboolean        numlock_state)
-{
-  meta_seat_impl_set_keyboard_numlock (seat->impl, numlock_state);
-}
-
 MetaBarrierManagerNative *
 meta_seat_native_get_barrier_manager (MetaSeatNative *seat)
 {
diff --git a/src/backends/native/meta-seat-native.h b/src/backends/native/meta-seat-native.h
index 35fa03ec06..7f94828d0e 100644
--- a/src/backends/native/meta-seat-native.h
+++ b/src/backends/native/meta-seat-native.h
@@ -107,9 +107,6 @@ void meta_seat_native_set_keyboard_layout_index (MetaSeatNative     *seat,
 
 xkb_layout_index_t meta_seat_native_get_keyboard_layout_index (MetaSeatNative *seat);
 
-void meta_seat_native_set_keyboard_numlock (MetaSeatNative *seat,
-                                            gboolean        numlock_state);
-
 void meta_seat_native_set_keyboard_repeat (MetaSeatNative *seat,
                                            gboolean        repeat,
                                            uint32_t        delay,
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index 068f138c65..94a13e7cdb 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -82,6 +82,8 @@ struct _MetaBackendX11Private
   uint8_t xkb_event_base;
   uint8_t xkb_error_base;
 
+  gulong keymap_state_changed_id;
+
   struct xkb_keymap *keymap;
   xkb_layout_index_t keymap_layout_group;
 
@@ -605,6 +607,14 @@ meta_backend_x11_post_init (MetaBackend *backend)
       g_signal_connect_object (meta_backend_get_input_settings (backend),
                                "kbd-a11y-changed",
                                G_CALLBACK (on_kbd_a11y_changed), backend, 0);
+
+      if (meta_input_settings_maybe_restore_numlock_state (input_settings))
+        {
+          unsigned int num_mask;
+
+          num_mask = XkbKeysymToModifiers (priv->xdisplay, XK_Num_Lock);
+          XkbLockModifiers (priv->xdisplay, XkbUseCoreKbd, num_mask, num_mask);
+        }
     }
 }
 
@@ -758,19 +768,6 @@ meta_backend_x11_get_keymap_layout_group (MetaBackend *backend)
   return priv->keymap_layout_group;
 }
 
-static void
-meta_backend_x11_set_numlock (MetaBackend *backend,
-                              gboolean     numlock_state)
-{
-  MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
-  MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
-  unsigned int num_mask;
-
-  num_mask = XkbKeysymToModifiers (priv->xdisplay, XK_Num_Lock);
-  XkbLockModifiers (priv->xdisplay, XkbUseCoreKbd, num_mask,
-                    numlock_state ? num_mask : 0);
-}
-
 void
 meta_backend_x11_handle_event (MetaBackendX11 *x11,
                                XEvent      *xevent)
@@ -853,9 +850,21 @@ initable_iface_init (GInitableIface *initable_iface)
 static void
 meta_backend_x11_finalize (GObject *object)
 {
+  MetaBackend *backend = META_BACKEND (object);
   MetaBackendX11 *x11 = META_BACKEND_X11 (object);
   MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
 
+  if (priv->keymap_state_changed_id)
+    {
+      ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
+      ClutterSeat *seat = clutter_backend_get_default_seat (clutter_backend);
+      ClutterKeymap *keymap;
+
+      seat = clutter_backend_get_default_seat (clutter_backend);
+      keymap = clutter_seat_get_keymap (seat);
+      g_clear_signal_handler (&priv->keymap_state_changed_id, keymap);
+    }
+
   if (priv->user_active_alarm != None)
     {
       XSyncDestroyAlarm (priv->xdisplay, priv->user_active_alarm);
@@ -880,7 +889,6 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
   backend_class->get_current_logical_monitor = meta_backend_x11_get_current_logical_monitor;
   backend_class->get_keymap = meta_backend_x11_get_keymap;
   backend_class->get_keymap_layout_group = meta_backend_x11_get_keymap_layout_group;
-  backend_class->set_numlock = meta_backend_x11_set_numlock;
 }
 
 static void
diff --git a/src/backends/x11/meta-keymap-x11.c b/src/backends/x11/meta-keymap-x11.c
index ac2b1d7878..d30b46e985 100644
--- a/src/backends/x11/meta-keymap-x11.c
+++ b/src/backends/x11/meta-keymap-x11.c
@@ -26,6 +26,8 @@
 #include <X11/Xatom.h>
 #include <X11/XKBlib.h>
 
+#include "backends/meta-backend-private.h"
+#include "backends/meta-input-settings-private.h"
 #include "backends/x11/meta-keymap-x11.h"
 #include "clutter/clutter.h"
 #include "clutter/clutter-mutter.h"
@@ -218,6 +220,21 @@ update_locked_mods (MetaKeymapX11 *keymap_x11,
   if ((keymap_x11->caps_lock_state != old_caps_lock_state) ||
       (keymap_x11->num_lock_state != old_num_lock_state))
     g_signal_emit_by_name (keymap_x11, "state-changed");
+
+  if (keymap_x11->num_lock_state != old_num_lock_state)
+    {
+      MetaBackend *backend;
+      MetaInputSettings *input_settings;
+
+      backend = meta_get_backend ();
+      input_settings = meta_backend_get_input_settings (backend);
+
+      if (input_settings)
+        {
+          meta_input_settings_maybe_save_numlock_state (input_settings,
+                                                        keymap_x11->num_lock_state);
+        }
+    }
 }
 
 /* the code to retrieve the keymap direction and cache it


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