From 7e9d9c7eb9149a7678e9f25ab10a2fe03a964ee9 Mon Sep 17 00:00:00 2001 From: Bilal Elmoussaoui Date: Mon, 9 May 2022 16:26:19 +0200 Subject: [PATCH] core: Add meta_accelerator_name As we have switched to using meta_parse_accelerator in PadActionMapper. We need a function that does the other direction for the client side usage. See https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/f1d50a4a/js/ui/padOsd.js#L107 Part-of: --- src/core/meta-accel-parse.c | 77 +++++++++++++++++++++++++++++++++++++ src/meta/util.h | 4 ++ 2 files changed, 81 insertions(+) diff --git a/src/core/meta-accel-parse.c b/src/core/meta-accel-parse.c index 0d34251af..04d50beb4 100644 --- a/src/core/meta-accel-parse.c +++ b/src/core/meta-accel-parse.c @@ -25,6 +25,8 @@ #include "config.h" #include "core/meta-accel-parse.h" +#include "clutter/clutter-keyval.h" +#include "meta/util.h" #include #include @@ -356,3 +358,78 @@ meta_parse_modifier (const char *accel, *mask = combo.modifiers; return TRUE; } + +/** + * meta_accelerator_name: + * @accelerator_mods: Accelerator modifier mask. + * @accelerator_key: Accelerator keyval. + * + * Convert an accelerator keyval and modifier mask into a string parsable by `meta_parse_accelerator`. + * + * Returns: The accelerator name. + */ +char * +meta_accelerator_name (ClutterModifierType accelerator_mods, + unsigned int accelerator_key) +{ +#define TXTLEN(s) sizeof (s) - 1 + static const struct { + guint mask; + const char *text; + gsize text_len; + } mask_text[] = { + { CLUTTER_SHIFT_MASK, "", TXTLEN ("") }, + { CLUTTER_CONTROL_MASK, "", TXTLEN ("") }, + { CLUTTER_MOD1_MASK, "", TXTLEN ("") }, + { CLUTTER_META_MASK, "", TXTLEN ("") }, + { CLUTTER_SUPER_MASK, "", TXTLEN ("") }, + { CLUTTER_HYPER_MASK, "", TXTLEN ("") } + }; +#undef TXTLEN + + ClutterModifierType saved_mods; + guint l; + guint name_len; + const char *keyval_name; + char *accelerator; + int i; + unsigned int lower_key; + + accelerator_mods &= CLUTTER_MODIFIER_MASK; + + clutter_keyval_convert_case (accelerator_key, &lower_key, NULL); + keyval_name = clutter_keyval_name (lower_key); + if (!keyval_name) + keyval_name = ""; + + name_len = strlen (keyval_name); + + saved_mods = accelerator_mods; + for (i = 0; i < G_N_ELEMENTS (mask_text); i++) + { + if (accelerator_mods & mask_text[i].mask) + name_len += mask_text[i].text_len; + } + + if (name_len == 0) + return g_strdup (keyval_name); + + name_len += 1; /* NUL byte */ + accelerator = g_new (char, name_len); + + accelerator_mods = saved_mods; + l = 0; + for (i = 0; i < G_N_ELEMENTS (mask_text); i++) + { + if (accelerator_mods & mask_text[i].mask) + { + strcpy (accelerator + l, mask_text[i].text); + l += mask_text[i].text_len; + } + } + + strcpy (accelerator + l, keyval_name); + accelerator[name_len - 1] = '\0'; + + return accelerator; +} \ No newline at end of file diff --git a/src/meta/util.h b/src/meta/util.h index 2366b1b1f..d61fa85d8 100644 --- a/src/meta/util.h +++ b/src/meta/util.h @@ -220,4 +220,8 @@ void meta_remove_debug_paint_flag (MetaDebugPaintFlag flag); META_EXPORT MetaDebugPaintFlag meta_get_debug_paint_flags (void); +META_EXPORT +char * meta_accelerator_name (ClutterModifierType accelerator_mods, + unsigned int accelerator_key); + #endif /* META_UTIL_H */