[mutter/wip/carlosg/pad-ring-strip-action-labels] core: Mark both directions in rings/strips as (un)handled altogether
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/pad-ring-strip-action-labels] core: Mark both directions in rings/strips as (un)handled altogether
- Date: Mon, 20 Sep 2021 14:48:09 +0000 (UTC)
commit ba7fecf57986b888be613e166a2a98d3df2ead92
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jul 16 13:10:48 2021 +0200
core: Mark both directions in rings/strips as (un)handled altogether
If going on a direction has a keycombo associated and the other does
not, it does not make sense to let the wayland bits handle pad
ring/strip events that only go in one direction.
Ensure that's the case, and also while figuring out the ring/strip
direction based on the initial events.
Fixes: https://gitlab.gnome.org/GNOME/mutter/-/issues/1889
src/core/meta-pad-action-mapper.c | 122 +++++++++++++++++++++++++++-----------
1 file changed, 89 insertions(+), 33 deletions(-)
---
diff --git a/src/core/meta-pad-action-mapper.c b/src/core/meta-pad-action-mapper.c
index 5b479a67d5..ac34ea98f7 100644
--- a/src/core/meta-pad-action-mapper.c
+++ b/src/core/meta-pad-action-mapper.c
@@ -640,27 +640,51 @@ meta_pad_action_mapper_handle_action (MetaPadActionMapper *mapper,
guint number,
guint mode)
{
- MetaPadDirection direction = = META_PAD_DIRECTION_NONE;
- GSettings *settings;
- gboolean handled = FALSE;
- char *accel;
+ MetaPadDirection direction = META_PAD_DIRECTION_NONE;
+ g_autoptr (GSettings) settings1 = NULL, settings2 = NULL;
+ g_autofree char *accel1, *accel2;
+ gboolean handled;
- if (!meta_pad_action_mapper_get_action_direction (mapper,
- event, &direction))
- return FALSE;
+ if (action == META_PAD_ACTION_RING)
+ {
+ settings1 = lookup_pad_action_settings (pad, action, number,
+ META_PAD_DIRECTION_CW, mode);
+ settings2 = lookup_pad_action_settings (pad, action, number,
+ META_PAD_DIRECTION_CCW, mode);
+ }
+ else if (action == META_PAD_ACTION_STRIP)
+ {
+ settings1 = lookup_pad_action_settings (pad, action, number,
+ META_PAD_DIRECTION_UP, mode);
+ settings2 = lookup_pad_action_settings (pad, action, number,
+ META_PAD_DIRECTION_DOWN, mode);
+ }
+ else
+ {
+ return FALSE;
+ }
- settings = lookup_pad_action_settings (pad, action, number, direction, mode);
- accel = g_settings_get_string (settings, "keybinding");
+ accel1 = g_settings_get_string (settings1, "keybinding");
+ accel2 = g_settings_get_string (settings2, "keybinding");
+ handled = ((accel1 && *accel1) || (accel2 && *accel2));
- if (accel && *accel)
+ if (meta_pad_action_mapper_get_action_direction (mapper, event, &direction))
{
- meta_pad_action_mapper_emulate_keybinding (mapper, accel, TRUE);
- meta_pad_action_mapper_emulate_keybinding (mapper, accel, FALSE);
- handled = TRUE;
- }
+ const gchar *accel;
- g_object_unref (settings);
- g_free (accel);
+ if (direction == META_PAD_DIRECTION_UP ||
+ direction == META_PAD_DIRECTION_CW)
+ accel = accel1;
+ else if (direction == META_PAD_DIRECTION_DOWN ||
+ direction == META_PAD_DIRECTION_CCW)
+ accel = accel2;
+
+ if (accel && *accel)
+ {
+ meta_pad_action_mapper_emulate_keybinding (mapper, accel, TRUE);
+ meta_pad_action_mapper_emulate_keybinding (mapper, accel, FALSE);
+ }
+ }
return handled;
}
@@ -694,29 +718,59 @@ meta_pad_action_mapper_handle_event (MetaPadActionMapper *mapper,
}
}
+static void
+format_directional_action (GString *str,
+ MetaPadDirection direction,
+ const gchar *action)
+{
+ switch (direction)
+ {
+ case META_PAD_DIRECTION_CW:
+ g_string_append_printf (str, "⭮ %s", action);
+ break;
+ case META_PAD_DIRECTION_CCW:
+ g_string_append_printf (str, "⭯ %s", action);
+ break;
+ case META_PAD_DIRECTION_UP:
+ g_string_append_printf (str, "↥ %s", action);
+ break;
+ case META_PAD_DIRECTION_DOWN:
+ g_string_append_printf (str, "↧ %s", action);
+ break;
+ case META_PAD_DIRECTION_NONE:
+ g_assert_not_reached ();
+ }
+}
static char *
-compose_directional_action_label (GSettings *direction1,
- GSettings *direction2)
+compose_directional_action_label (MetaPadDirection direction1,
+ GSettings *value1,
+ MetaPadDirection direction2,
+ GSettings *value2)
{
- char *accel1, *accel2, *str = NULL;
- /* TRANSLATORS: This is a (non) action on an input device gadget */
- const char *none_label = N_("None");
+ g_autofree char *accel1, *accel2;
+ GString *str;
+
+ accel1 = g_settings_get_string (value1, "keybinding");
+ accel2 = g_settings_get_string (value2, "keybinding");
+
+ if ((!accel1 || !*accel1) && ((!accel2 || !*accel2)))
+ return NULL;
- accel1 = g_settings_get_string (direction1, "keybinding");
- accel2 = g_settings_get_string (direction2, "keybinding");
+ str = g_string_new (NULL);
- if ((accel1 && *accel1) || (accel2 && *accel2))
+ if (accel1 && *accel1)
+ format_directional_action (str, direction1, accel1);
+
+ if (accel2 && *accel2)
{
- str = g_strdup_printf ("%s / %s",
- (accel1 && *accel1) ? accel1 : _(none_label),
- (accel2 && *accel2) ? accel2 : _(none_label));
- }
+ if (str->len != 0)
+ g_string_append (str, " / ");
- g_free (accel1);
- g_free (accel2);
+ format_directional_action (str, direction2, accel2);
+ }
- return str;
+ return g_string_free (str, FALSE);
}
static char *
@@ -733,7 +787,8 @@ meta_pad_action_mapper_get_ring_label (MetaPadActionMapper *mapper,
META_PAD_DIRECTION_CW, mode);
settings2 = lookup_pad_action_settings (pad, META_PAD_ACTION_RING, number,
META_PAD_DIRECTION_CCW, mode);
- label = compose_directional_action_label (settings1, settings2);
+ label = compose_directional_action_label (META_PAD_DIRECTION_CW, settings1,
+ META_PAD_DIRECTION_CCW, settings2);
g_object_unref (settings1);
g_object_unref (settings2);
@@ -754,7 +809,8 @@ meta_pad_action_mapper_get_strip_label (MetaPadActionMapper *mapper,
META_PAD_DIRECTION_UP, mode);
settings2 = lookup_pad_action_settings (pad, META_PAD_ACTION_STRIP, number,
META_PAD_DIRECTION_DOWN, mode);
- label = compose_directional_action_label (settings1, settings2);
+ label = compose_directional_action_label (META_PAD_DIRECTION_UP, settings1,
+ META_PAD_DIRECTION_DOWN, settings2);
g_object_unref (settings1);
g_object_unref (settings2);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]