[mutter/bilelmoussaoui/gdk-x11-only: 21/23] core: Add meta_accelerator_name
- From: Bilal Elmoussaoui <bilelmoussaoui src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/bilelmoussaoui/gdk-x11-only: 21/23] core: Add meta_accelerator_name
- Date: Mon, 30 May 2022 08:05:53 +0000 (UTC)
commit a8fd22fa34fa4e2bf2f33f9b3c324e198f11db47
Author: Bilal Elmoussaoui <belmouss redhat com>
Date: Mon May 9 16:26:19 2022 +0200
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
src/core/meta-accel-parse.c | 76 +++++++++++++++++++++++++++++++++++++++++++++
src/core/meta-accel-parse.h | 4 +++
2 files changed, 80 insertions(+)
---
diff --git a/src/core/meta-accel-parse.c b/src/core/meta-accel-parse.c
index 0d34251afc..c0a5fa4a28 100644
--- a/src/core/meta-accel-parse.c
+++ b/src/core/meta-accel-parse.c
@@ -25,6 +25,7 @@
#include "config.h"
#include "core/meta-accel-parse.h"
+#include "clutter/clutter-keyval.h"
#include <stdlib.h>
#include <string.h>
@@ -356,3 +357,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, "<Shift>", TXTLEN ("<Shift>") },
+ { CLUTTER_CONTROL_MASK, "<Control>", TXTLEN ("<Control>") },
+ { CLUTTER_MOD1_MASK, "<Alt>", TXTLEN ("<Alt>") },
+ { CLUTTER_META_MASK, "<Meta>", TXTLEN ("<Meta>") },
+ { CLUTTER_SUPER_MASK, "<Super>", TXTLEN ("<Super>") },
+ { CLUTTER_HYPER_MASK, "<Hyper>", TXTLEN ("<Hyper>") }
+ };
+#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/core/meta-accel-parse.h b/src/core/meta-accel-parse.h
index 12cf3f9821..6c323f3be4 100644
--- a/src/core/meta-accel-parse.h
+++ b/src/core/meta-accel-parse.h
@@ -41,4 +41,8 @@ gboolean meta_parse_accelerator (const char *accel,
gboolean meta_parse_modifier (const char *accel,
MetaVirtualModifier *mask);
+META_EXPORT
+char * meta_accelerator_name (ClutterModifierType accelerator_mods,
+ unsigned int accelerator_key);
+
#endif /* META_ACCEL_PARSE_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]