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:
parent
832fc798d5
commit
2b519cba36
@ -144,6 +144,7 @@ struct _MetaBackendPrivate
|
|||||||
gboolean is_pointer_position_initialized;
|
gboolean is_pointer_position_initialized;
|
||||||
|
|
||||||
guint device_update_idle_id;
|
guint device_update_idle_id;
|
||||||
|
guint keymap_state_changed_id;
|
||||||
|
|
||||||
GHashTable *device_monitors;
|
GHashTable *device_monitors;
|
||||||
|
|
||||||
@ -178,6 +179,14 @@ meta_backend_finalize (GObject *object)
|
|||||||
MetaBackend *backend = META_BACKEND (object);
|
MetaBackend *backend = META_BACKEND (object);
|
||||||
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
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_list_free_full (priv->gpus, g_object_unref);
|
||||||
|
|
||||||
g_clear_object (&priv->monitor_manager);
|
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);
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
|
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
|
||||||
|
ClutterKeymap *keymap = clutter_backend_get_keymap (priv->clutter_backend);
|
||||||
|
|
||||||
priv->stage = meta_stage_new (backend);
|
priv->stage = meta_stage_new (backend);
|
||||||
clutter_actor_realize (priv->stage);
|
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);
|
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
|
#ifdef HAVE_REMOTE_DESKTOP
|
||||||
priv->remote_access_controller =
|
priv->remote_access_controller =
|
||||||
g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL);
|
g_object_new (META_TYPE_REMOTE_ACCESS_CONTROLLER, NULL);
|
||||||
|
@ -144,4 +144,7 @@ WacomDevice * meta_input_settings_get_tablet_wacom_device (MetaInputSettings *se
|
|||||||
ClutterInputDevice *device);
|
ClutterInputDevice *device);
|
||||||
#endif
|
#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 */
|
#endif /* META_INPUT_SETTINGS_PRIVATE_H */
|
||||||
|
@ -1152,6 +1152,8 @@ meta_input_settings_changed_cb (GSettings *settings,
|
|||||||
strcmp (key, "repeat-interval") == 0 ||
|
strcmp (key, "repeat-interval") == 0 ||
|
||||||
strcmp (key, "delay") == 0)
|
strcmp (key, "delay") == 0)
|
||||||
update_keyboard_repeat (input_settings);
|
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;
|
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);
|
||||||
|
}
|
||||||
|
@ -814,6 +814,7 @@ void meta_backend_native_resume (MetaBackendNative *native)
|
|||||||
meta_backend_get_monitor_manager (backend);
|
meta_backend_get_monitor_manager (backend);
|
||||||
MetaMonitorManagerKms *monitor_manager_kms =
|
MetaMonitorManagerKms *monitor_manager_kms =
|
||||||
META_MONITOR_MANAGER_KMS (monitor_manager);
|
META_MONITOR_MANAGER_KMS (monitor_manager);
|
||||||
|
MetaInputSettings *input_settings;
|
||||||
MetaIdleMonitor *idle_monitor;
|
MetaIdleMonitor *idle_monitor;
|
||||||
|
|
||||||
meta_monitor_manager_kms_resume (monitor_manager_kms);
|
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);
|
idle_monitor = meta_backend_get_idle_monitor (backend, 0);
|
||||||
meta_idle_monitor_reset_idletime (idle_monitor);
|
meta_idle_monitor_reset_idletime (idle_monitor);
|
||||||
|
|
||||||
|
input_settings = meta_backend_get_input_settings (backend);
|
||||||
|
meta_input_settings_maybe_restore_numlock_state (input_settings);
|
||||||
}
|
}
|
||||||
|
@ -65,19 +65,11 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GSD_KEYBOARD_SCHEMA "org.gnome.settings-daemon.peripherals.keyboard"
|
#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,
|
G_DEFINE_TYPE (MetaWaylandKeyboard, meta_wayland_keyboard,
|
||||||
META_TYPE_WAYLAND_INPUT_DEVICE)
|
META_TYPE_WAYLAND_INPUT_DEVICE)
|
||||||
|
|
||||||
static void meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard);
|
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 void notify_modifiers (MetaWaylandKeyboard *keyboard);
|
||||||
static guint evdev_code (const ClutterKeyEvent *event);
|
static guint evdev_code (const ClutterKeyEvent *event);
|
||||||
|
|
||||||
@ -404,110 +396,6 @@ notify_modifiers (MetaWaylandKeyboard *keyboard)
|
|||||||
xkb_state_serialize_mods (state, XKB_STATE_MODS_EFFECTIVE));
|
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
|
static void
|
||||||
meta_wayland_keyboard_update_xkb_state (MetaWaylandKeyboard *keyboard)
|
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
|
static void
|
||||||
settings_changed (GSettings *settings,
|
settings_changed (GSettings *settings,
|
||||||
const char *key,
|
const char *key,
|
||||||
@ -678,24 +556,11 @@ void
|
|||||||
meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
|
meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
|
||||||
{
|
{
|
||||||
MetaBackend *backend = meta_get_backend ();
|
MetaBackend *backend = meta_get_backend ();
|
||||||
GSettingsSchema *schema;
|
|
||||||
|
|
||||||
keyboard->settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard");
|
keyboard->settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard");
|
||||||
g_signal_connect (keyboard->settings, "changed",
|
g_signal_connect (keyboard->settings, "changed",
|
||||||
G_CALLBACK (settings_changed), keyboard);
|
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_signal_connect (backend, "keymap-changed",
|
||||||
G_CALLBACK (on_keymap_changed), keyboard);
|
G_CALLBACK (on_keymap_changed), keyboard);
|
||||||
g_signal_connect (backend, "keymap-layout-group-changed",
|
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);
|
G_CALLBACK (on_kbd_a11y_mask_changed), keyboard);
|
||||||
|
|
||||||
meta_wayland_keyboard_take_keymap (keyboard, meta_backend_get_keymap (backend));
|
meta_wayland_keyboard_take_keymap (keyboard, meta_backend_get_keymap (backend));
|
||||||
|
|
||||||
maybe_restore_numlock_state (keyboard);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -735,8 +598,6 @@ meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard)
|
|||||||
wl_list_init (&keyboard->focus_resource_list);
|
wl_list_init (&keyboard->focus_resource_list);
|
||||||
|
|
||||||
g_clear_object (&keyboard->settings);
|
g_clear_object (&keyboard->settings);
|
||||||
if (keyboard->gsd_settings)
|
|
||||||
g_object_unref (keyboard->gsd_settings);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
@ -802,8 +663,6 @@ meta_wayland_keyboard_handle_event (MetaWaylandKeyboard *keyboard,
|
|||||||
|
|
||||||
if (keyboard->mods_changed != 0)
|
if (keyboard->mods_changed != 0)
|
||||||
{
|
{
|
||||||
if (keyboard->mods_changed & XKB_STATE_MODS_LOCKED)
|
|
||||||
maybe_save_numlock_state (keyboard);
|
|
||||||
notify_modifiers (keyboard);
|
notify_modifiers (keyboard);
|
||||||
keyboard->mods_changed = 0;
|
keyboard->mods_changed = 0;
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,6 @@ struct _MetaWaylandKeyboard
|
|||||||
MetaWaylandKeyboardGrab default_grab;
|
MetaWaylandKeyboardGrab default_grab;
|
||||||
|
|
||||||
GSettings *settings;
|
GSettings *settings;
|
||||||
GSettings *gsd_settings;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard);
|
void meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user