From 2b519cba363a6788c5c99244b52fdf445b435ef9 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 23 May 2019 17:55:20 +0200 Subject: [PATCH] backends: Move numlock persistence handling here We used to have wayland-specific paths for this in src/wayland, now we have ClutterKeymap that we can rely on in order to do state tracking, and can do this all on src/backend domain. This accomodates the feature in common code, so will work on both Wayland and X11. https://gitlab.gnome.org/GNOME/mutter/merge_requests/590 --- src/backends/meta-backend.c | 19 +++ src/backends/meta-input-settings-private.h | 3 + src/backends/meta-input-settings.c | 38 ++++++ src/backends/native/meta-backend-native.c | 4 + src/wayland/meta-wayland-keyboard.c | 141 --------------------- src/wayland/meta-wayland-keyboard.h | 1 - 6 files changed, 64 insertions(+), 142 deletions(-) diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index a199f1af4..7b05d72eb 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -144,6 +144,7 @@ struct _MetaBackendPrivate gboolean is_pointer_position_initialized; guint device_update_idle_id; + guint keymap_state_changed_id; GHashTable *device_monitors; @@ -178,6 +179,14 @@ meta_backend_finalize (GObject *object) MetaBackend *backend = META_BACKEND (object); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + if (priv->keymap_state_changed_id) + { + ClutterKeymap *keymap; + + keymap = clutter_backend_get_keymap (priv->clutter_backend); + g_signal_handler_disconnect (keymap, priv->keymap_state_changed_id); + } + g_list_free_full (priv->gpus, g_object_unref); g_clear_object (&priv->monitor_manager); @@ -491,6 +500,7 @@ meta_backend_real_post_init (MetaBackend *backend) { MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); ClutterDeviceManager *device_manager = clutter_device_manager_get_default (); + ClutterKeymap *keymap = clutter_backend_get_keymap (priv->clutter_backend); priv->stage = meta_stage_new (backend); clutter_actor_realize (priv->stage); @@ -517,6 +527,15 @@ meta_backend_real_post_init (MetaBackend *backend) priv->input_settings = meta_backend_create_input_settings (backend); + if (priv->input_settings) + { + priv->keymap_state_changed_id = + g_signal_connect_swapped (keymap, "state-changed", + G_CALLBACK (meta_input_settings_maybe_save_numlock_state), + priv->input_settings); + meta_input_settings_maybe_restore_numlock_state (priv->input_settings); + } + #ifdef HAVE_REMOTE_DESKTOP priv->remote_access_controller = g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL); diff --git a/src/backends/meta-input-settings-private.h b/src/backends/meta-input-settings-private.h index 18f2bdc4d..a035db78f 100644 --- a/src/backends/meta-input-settings-private.h +++ b/src/backends/meta-input-settings-private.h @@ -144,4 +144,7 @@ WacomDevice * meta_input_settings_get_tablet_wacom_device (MetaInputSettings *se ClutterInputDevice *device); #endif +void meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings); +void meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings); + #endif /* META_INPUT_SETTINGS_PRIVATE_H */ diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c index 847ba1bea..3ebf826ac 100644 --- a/src/backends/meta-input-settings.c +++ b/src/backends/meta-input-settings.c @@ -1152,6 +1152,8 @@ 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); } } @@ -2609,3 +2611,39 @@ meta_input_settings_get_pad_action_label (MetaInputSettings *input_settings, return NULL; } + +void +meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings) +{ + MetaInputSettingsPrivate *priv; + ClutterKeymap *keymap; + gboolean numlock_state; + + priv = meta_input_settings_get_instance_private (input_settings); + + if (!g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state")) + return; + + keymap = clutter_backend_get_keymap (clutter_get_default_backend ()); + numlock_state = clutter_keymap_get_num_lock_state (keymap); + + if (numlock_state == g_settings_get_boolean (priv->keyboard_settings, "numlock-state")) + return; + + g_settings_set_boolean (priv->keyboard_settings, "numlock-state", numlock_state); +} + +void +meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings) +{ + MetaInputSettingsPrivate *priv; + gboolean numlock_state; + + priv = meta_input_settings_get_instance_private (input_settings); + + if (!g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state")) + return; + + numlock_state = g_settings_get_boolean (priv->keyboard_settings, "numlock-state"); + meta_backend_set_numlock (meta_get_backend (), numlock_state); +} diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c index f34437e6d..d285d61f2 100644 --- a/src/backends/native/meta-backend-native.c +++ b/src/backends/native/meta-backend-native.c @@ -814,6 +814,7 @@ void meta_backend_native_resume (MetaBackendNative *native) meta_backend_get_monitor_manager (backend); MetaMonitorManagerKms *monitor_manager_kms = META_MONITOR_MANAGER_KMS (monitor_manager); + MetaInputSettings *input_settings; MetaIdleMonitor *idle_monitor; meta_monitor_manager_kms_resume (monitor_manager_kms); @@ -827,4 +828,7 @@ void meta_backend_native_resume (MetaBackendNative *native) idle_monitor = meta_backend_get_idle_monitor (backend, 0); meta_idle_monitor_reset_idletime (idle_monitor); + + input_settings = meta_backend_get_input_settings (backend); + meta_input_settings_maybe_restore_numlock_state (input_settings); } diff --git a/src/wayland/meta-wayland-keyboard.c b/src/wayland/meta-wayland-keyboard.c index 8b23d76ce..291faa1e9 100644 --- a/src/wayland/meta-wayland-keyboard.c +++ b/src/wayland/meta-wayland-keyboard.c @@ -65,19 +65,11 @@ #endif #define GSD_KEYBOARD_SCHEMA "org.gnome.settings-daemon.peripherals.keyboard" -typedef enum -{ - GSD_KEYBOARD_NUM_LOCK_STATE_UNKNOWN, - GSD_KEYBOARD_NUM_LOCK_STATE_ON, - GSD_KEYBOARD_NUM_LOCK_STATE_OFF -} GsdKeyboardNumLockState; G_DEFINE_TYPE (MetaWaylandKeyboard, meta_wayland_keyboard, META_TYPE_WAYLAND_INPUT_DEVICE) static void meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard); -static void meta_wayland_keyboard_set_numlock (MetaWaylandKeyboard *keyboard, - gboolean numlock_state); static void notify_modifiers (MetaWaylandKeyboard *keyboard); static guint evdev_code (const ClutterKeyEvent *event); @@ -404,110 +396,6 @@ notify_modifiers (MetaWaylandKeyboard *keyboard) xkb_state_serialize_mods (state, XKB_STATE_MODS_EFFECTIVE)); } -static void -numlock_set_xkb_state (MetaWaylandKeyboard *keyboard, - GsdKeyboardNumLockState state) -{ - MetaBackend *backend = meta_get_backend (); - gboolean numlock_state; - - if (state != GSD_KEYBOARD_NUM_LOCK_STATE_ON && - state != GSD_KEYBOARD_NUM_LOCK_STATE_OFF) - return; - - numlock_state = (state == GSD_KEYBOARD_NUM_LOCK_STATE_ON); - meta_verbose ("set numlock state %s\n", (numlock_state ? "ON" : "OFF")); - meta_backend_set_numlock (backend, numlock_state); - meta_wayland_keyboard_set_numlock (keyboard, numlock_state); -} - -static void -maybe_restore_numlock_state (MetaWaylandKeyboard *keyboard) -{ - gboolean remember_numlock; - - if (!keyboard->gsd_settings) - return; - - /* We are cheating for now, we use g-s-d settings... */ - remember_numlock = g_settings_get_boolean (keyboard->gsd_settings, - "remember-numlock-state"); - - if (remember_numlock) - { - GsdKeyboardNumLockState state; - - state = g_settings_get_enum (keyboard->gsd_settings, "numlock-state"); - numlock_set_xkb_state (keyboard, state); - } -} - -static void -maybe_save_numlock_state (MetaWaylandKeyboard *keyboard) -{ -#ifdef HAVE_NATIVE_BACKEND - MetaWaylandXkbInfo *xkb_info = &keyboard->xkb_info; - GsdKeyboardNumLockState numlock_state; - int numlock_active; - - if (!META_IS_BACKEND_NATIVE (meta_get_backend ())) - return; - - if (!xkb_info->state) - return; - - if (!keyboard->gsd_settings) - return; - - if (!g_settings_get_boolean (keyboard->gsd_settings, "remember-numlock-state")) - return; - - numlock_active = xkb_state_mod_name_is_active(xkb_info->state, - "Mod2", - XKB_STATE_MODS_LOCKED); - switch (numlock_active) - { - case -1: - numlock_state = GSD_KEYBOARD_NUM_LOCK_STATE_UNKNOWN; - break; - case 0: - numlock_state = GSD_KEYBOARD_NUM_LOCK_STATE_OFF; - break; - default: - numlock_state = GSD_KEYBOARD_NUM_LOCK_STATE_ON; - break; - } - g_settings_set_enum (keyboard->gsd_settings, "numlock-state", numlock_state); -#endif -} - -static void -meta_wayland_keyboard_set_numlock (MetaWaylandKeyboard *keyboard, - gboolean numlock_state) -{ - MetaWaylandXkbInfo *xkb_info = &keyboard->xkb_info; - xkb_mod_mask_t latched, locked, group, depressed; - xkb_mod_mask_t numlock; - - meta_verbose ("backend numlock state %s\n", (numlock_state ? "ON" : "OFF")); - - latched = xkb_state_serialize_mods (xkb_info->state, XKB_STATE_MODS_LATCHED); - locked = xkb_state_serialize_mods (xkb_info->state, XKB_STATE_MODS_LOCKED); - group = xkb_state_serialize_layout (xkb_info->state, XKB_STATE_LAYOUT_EFFECTIVE); - depressed = xkb_state_serialize_mods(xkb_info->state, XKB_STATE_DEPRESSED); - numlock = (1 << xkb_keymap_mod_get_index(xkb_info->keymap, "Mod2")); - - if (numlock_state == TRUE) - locked |= numlock; - else - locked &= ~numlock; - - xkb_state_update_mask (xkb_info->state, depressed, latched, locked, 0, 0, group); - kbd_a11y_apply_mask (keyboard); - - notify_modifiers (keyboard); -} - static void meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard) { @@ -615,16 +503,6 @@ notify_key_repeat (MetaWaylandKeyboard *keyboard) } } -static void -remember_numlock_state_changed (GSettings *settings, - const char *key, - gpointer data) -{ - MetaWaylandKeyboard *keyboard = data; - - maybe_save_numlock_state (keyboard); -} - static void settings_changed (GSettings *settings, const char *key, @@ -678,24 +556,11 @@ void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard) { MetaBackend *backend = meta_get_backend (); - GSettingsSchema *schema; keyboard->settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard"); g_signal_connect (keyboard->settings, "changed", G_CALLBACK (settings_changed), keyboard); - /* We are cheating for now, we use g-s-d settings... Check if available */ - schema = g_settings_schema_source_lookup (g_settings_schema_source_get_default (), - GSD_KEYBOARD_SCHEMA, - TRUE); - if (schema) - { - keyboard->gsd_settings = g_settings_new_full (schema, NULL, NULL); - g_settings_schema_unref (schema); - g_signal_connect (keyboard->gsd_settings, "changed::remember-numlock-state", - G_CALLBACK (remember_numlock_state_changed), keyboard); - } - g_signal_connect (backend, "keymap-changed", G_CALLBACK (on_keymap_changed), keyboard); g_signal_connect (backend, "keymap-layout-group-changed", @@ -705,8 +570,6 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard) G_CALLBACK (on_kbd_a11y_mask_changed), keyboard); meta_wayland_keyboard_take_keymap (keyboard, meta_backend_get_keymap (backend)); - - maybe_restore_numlock_state (keyboard); } static void @@ -735,8 +598,6 @@ meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard) wl_list_init (&keyboard->focus_resource_list); g_clear_object (&keyboard->settings); - if (keyboard->gsd_settings) - g_object_unref (keyboard->gsd_settings); } static guint @@ -802,8 +663,6 @@ meta_wayland_keyboard_handle_event (MetaWaylandKeyboard *keyboard, if (keyboard->mods_changed != 0) { - if (keyboard->mods_changed & XKB_STATE_MODS_LOCKED) - maybe_save_numlock_state (keyboard); notify_modifiers (keyboard); keyboard->mods_changed = 0; } diff --git a/src/wayland/meta-wayland-keyboard.h b/src/wayland/meta-wayland-keyboard.h index 20f309fff..1dd3b12ba 100644 --- a/src/wayland/meta-wayland-keyboard.h +++ b/src/wayland/meta-wayland-keyboard.h @@ -104,7 +104,6 @@ struct _MetaWaylandKeyboard MetaWaylandKeyboardGrab default_grab; GSettings *settings; - GSettings *gsd_settings; }; void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard);