prefs: Handle up to two combos for special keys

The second combo is still disabled. This is in preparation for a
subsequent commit that is going to parse the preference in a
different way and might end up with two combos defined.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4050>
This commit is contained in:
Alessandro Bono 2024-09-26 00:15:17 +02:00 committed by Marge Bot
parent b48c7536ab
commit c051c2ff69
3 changed files with 47 additions and 35 deletions

View File

@ -145,8 +145,8 @@ gboolean meta_prefs_add_keybinding (const char *name,
gboolean meta_prefs_remove_keybinding (const char *name);
GList * meta_prefs_get_keybindings (void);
void meta_prefs_get_overlay_binding (MetaKeyCombo *combo);
void meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo);
void meta_prefs_get_overlay_bindings (MetaKeyCombo combos[2]);
void meta_prefs_get_locate_pointer_bindings (MetaKeyCombo combos[2]);
const char * meta_prefs_get_iso_next_group_option (void);
gboolean meta_prefs_is_locate_pointer_enabled (void);

View File

@ -823,21 +823,21 @@ reload_active_keyboard_layouts (MetaKeyBindingManager *keys)
static void
reload_combos (MetaKeyBindingManager *keys)
{
MetaKeyCombo combo;
MetaKeyCombo combos[2];
g_hash_table_remove_all (keys->key_bindings_index);
reload_active_keyboard_layouts (keys);
meta_prefs_get_overlay_binding (&combo);
resolve_key_combo (keys,
&combo,
&keys->overlay_resolved_key_combo);
meta_prefs_get_overlay_bindings (combos);
resolve_special_key_combo (keys,
combos,
&keys->overlay_resolved_key_combo);
meta_prefs_get_locate_pointer_binding (&combo);
resolve_key_combo (keys,
&combo,
&keys->locate_pointer_resolved_key_combo);
meta_prefs_get_locate_pointer_bindings (combos);
resolve_special_key_combo (keys,
combos,
&keys->locate_pointer_resolved_key_combo);
reload_iso_next_group_combos (keys);

View File

@ -77,8 +77,8 @@ static GList *listeners = NULL;
static GHashTable *settings_schemas;
static ClutterModifierType mouse_button_mods = CLUTTER_MOD1_MASK;
static MetaKeyCombo overlay_key_combo = { 0, 0, 0 };
static MetaKeyCombo locate_pointer_key_combo = { 0, 0, 0 };
static MetaKeyCombo overlay_key_combos[2] = { 0 };
static MetaKeyCombo locate_pointer_key_combos[2] = { 0 };
static GDesktopFocusMode focus_mode = G_DESKTOP_FOCUS_MODE_CLICK;
static GDesktopFocusNewWindows focus_new_windows = G_DESKTOP_FOCUS_NEW_WINDOWS_SMART;
static gboolean raise_on_click = TRUE;
@ -1470,26 +1470,30 @@ overlay_key_handler (GVariant *value,
gpointer *result,
gpointer data)
{
MetaKeyCombo combo;
MetaKeyCombo combos[2] = { 0 };
const gchar *string_value;
int i;
*result = NULL; /* ignored */
string_value = g_variant_get_string (value, NULL);
if (!string_value || !meta_parse_accelerator (string_value, &combo))
if (!string_value || !meta_parse_accelerator (string_value, &combos[0]))
{
meta_topic (META_DEBUG_KEYBINDINGS,
"Failed to parse value for overlay-key");
return FALSE;
}
combo.modifiers = 0;
if (overlay_key_combo.keysym != combo.keysym ||
overlay_key_combo.keycode != combo.keycode)
for (i = 0; i < G_N_ELEMENTS (combos); i++)
{
overlay_key_combo = combo;
queue_changed (META_PREF_KEYBINDINGS);
combos[i].modifiers = 0;
if (overlay_key_combos[i].keysym != combos[i].keysym ||
overlay_key_combos[i].keycode != combos[i].keycode)
{
overlay_key_combos[i] = combos[i];
queue_changed (META_PREF_KEYBINDINGS);
}
}
return TRUE;
@ -1500,26 +1504,30 @@ locate_pointer_key_handler (GVariant *value,
gpointer *result,
gpointer data)
{
MetaKeyCombo combo;
MetaKeyCombo combos[2] = { 0 };
const gchar *string_value;
int i;
*result = NULL; /* ignored */
string_value = g_variant_get_string (value, NULL);
if (!string_value || !meta_parse_accelerator (string_value, &combo))
if (!string_value || !meta_parse_accelerator (string_value, &combos[0]))
{
meta_topic (META_DEBUG_KEYBINDINGS,
"Failed to parse value for locate-pointer-key");
return FALSE;
}
combo.modifiers = 0;
if (locate_pointer_key_combo.keysym != combo.keysym ||
locate_pointer_key_combo.keycode != combo.keycode)
for (i = 0; i < G_N_ELEMENTS (combos); i++)
{
locate_pointer_key_combo = combo;
queue_changed (META_PREF_KEYBINDINGS);
combos[i].modifiers = 0;
if (locate_pointer_key_combos[i].keysym != combos[i].keysym ||
locate_pointer_key_combos[i].keycode != combos[i].keycode)
{
locate_pointer_key_combos[i] = combos[i];
queue_changed (META_PREF_KEYBINDINGS);
}
}
return TRUE;
@ -1729,7 +1737,8 @@ init_bindings (void)
pref = g_new0 (MetaKeyPref, 1);
pref->name = g_strdup ("overlay-key");
pref->action = META_KEYBINDING_ACTION_OVERLAY_KEY;
pref->combos = g_slist_prepend (pref->combos, &overlay_key_combo);
pref->combos = g_slist_prepend (pref->combos, &overlay_key_combos[0]);
pref->combos = g_slist_prepend (pref->combos, &overlay_key_combos[1]);
pref->builtin = 1;
g_hash_table_insert (key_bindings, g_strdup (pref->name), pref);
@ -1737,7 +1746,8 @@ init_bindings (void)
pref = g_new0 (MetaKeyPref, 1);
pref->name = g_strdup ("locate-pointer-key");
pref->action = META_KEYBINDING_ACTION_LOCATE_POINTER_KEY;
pref->combos = g_slist_prepend (pref->combos, &locate_pointer_key_combo);
pref->combos = g_slist_prepend (pref->combos, &locate_pointer_key_combos[0]);
pref->combos = g_slist_prepend (pref->combos, &locate_pointer_key_combos[1]);
pref->builtin = 1;
g_hash_table_insert (key_bindings, g_strdup (pref->name), pref);
@ -2013,15 +2023,17 @@ meta_prefs_get_keybindings (void)
}
void
meta_prefs_get_overlay_binding (MetaKeyCombo *combo)
meta_prefs_get_overlay_bindings (MetaKeyCombo combos[2])
{
*combo = overlay_key_combo;
combos[0] = overlay_key_combos[0];
combos[1] = overlay_key_combos[1];
}
void
meta_prefs_get_locate_pointer_binding (MetaKeyCombo *combo)
meta_prefs_get_locate_pointer_bindings (MetaKeyCombo combos[2])
{
*combo = locate_pointer_key_combo;
combos[0] = locate_pointer_key_combos[0];
combos[1] = locate_pointer_key_combos[1];
}
gboolean