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
This commit is contained in:
Carlos Garnacho 2019-05-23 17:55:20 +02:00
parent 832fc798d5
commit 2b519cba36
6 changed files with 64 additions and 142 deletions

View File

@ -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);

View File

@ -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 */

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;
}

View File

@ -104,7 +104,6 @@ struct _MetaWaylandKeyboard
MetaWaylandKeyboardGrab default_grab;
GSettings *settings;
GSettings *gsd_settings;
};
void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard);