shortcuttrigger: Add gtk_shortcut_trigger_to_label()
authorBenjamin Otte <otte@redhat.com>
Mon, 13 Aug 2018 03:45:12 +0000 (05:45 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 26 Mar 2020 03:14:27 +0000 (23:14 -0400)
Provide a user-presentable string.

docs/reference/gtk/gtk4-sections.txt
gtk/gtkshortcuttrigger.c
gtk/gtkshortcuttrigger.h

index cac4380cb3cefa6c1d40eb1116135122df03516a..b11bb4e2462e8fd497cbddf1508fa58a68b074bb 100644 (file)
@@ -6054,6 +6054,10 @@ gtk_shortcut_trigger_unref
 GtkShortcutTriggerType
 gtk_shortcut_trigger_get_trigger_type
 gtk_shortcut_trigger_trigger
+gtk_shortcut_trigger_to_string
+gtk_shortcut_trigger_print
+gtk_shortcut_trigger_to_label
+gtk_shortcut_trigger_print_label
 
 <SUBSECTION>
 gtk_keyval_trigger_new
index 5044e7a16446bb597c30a7a7d3c5b4d01ec90231..cdefa820597bce054c1854505b741268b2f319a6 100644 (file)
@@ -39,7 +39,7 @@
 
 #include "gtkshortcuttrigger.h"
 
-#include "gtkaccelgroup.h"
+#include "gtkaccelgroupprivate.h"
 
 typedef struct _GtkShortcutTriggerClass GtkShortcutTriggerClass;
 
@@ -63,6 +63,9 @@ struct _GtkShortcutTriggerClass
                                    GdkEvent            *event);
   void            (* print)       (GtkShortcutTrigger  *trigger,
                                    GString             *string);
+  gboolean        (* print_label) (GtkShortcutTrigger  *trigger,
+                                   GdkDisplay          *display,
+                                   GString             *string);
 };
 
 G_DEFINE_BOXED_TYPE (GtkShortcutTrigger, gtk_shortcut_trigger,
@@ -214,6 +217,71 @@ gtk_shortcut_trigger_print (GtkShortcutTrigger *self,
   return self->trigger_class->print (self, string);
 }
 
+/**
+ * gtk_shortcut_trigger_to_label:
+ * @self: a #GtkShortcutTrigger
+ * @display: #GdkDisplay to print for
+ *
+ * Gets textual representation for the given trigger. This
+ * function is returning a translated string for presentation
+ * to end users for example in menu items or in help texts.
+ *
+ * The @display in use may influence the resulting string in
+ * various forms, such as resolving hardware keycodes or by
+ * causing display-specific modifier names.
+ *
+ * The form of the representation may change at any time and is
+ * not guaranteed to stay identical.
+ *
+ * Returns: (transfer full): a new string
+ **/
+char *
+gtk_shortcut_trigger_to_label (GtkShortcutTrigger *self,
+                               GdkDisplay         *display)
+{
+  GString *string;
+
+  g_return_val_if_fail (self != NULL, NULL);
+
+  string = g_string_new (NULL);
+  gtk_shortcut_trigger_print_label (self, display, string);
+
+  return g_string_free (string, FALSE);
+}
+
+/**
+ * gtk_shortcut_trigger_print_label:
+ * @self: a #GtkShortcutTrigger
+ * @display: #GdkDisplay to print for
+ * @string: a #GString to print into
+ *
+ * Prints the given trigger into a string. This function is
+ * returning a translated string for presentation to end users
+ * for example in menu items or in help texts.
+ *
+ * The @display in use may influence the resulting string in
+ * various forms, such as resolving hardware keycodes or by
+ * causing display-specific modifier names.
+ *
+ * The form of the representation may change at any time and is
+ * not guaranteed to stay identical.
+ *
+ * Returns: %TRUE if something was printed or %FALSE if the
+ *     trigger did not have a textual representation suitable
+ *     for end users.
+ **/
+gboolean
+gtk_shortcut_trigger_print_label (GtkShortcutTrigger *self,
+                                  GdkDisplay         *display,
+                                  GString            *string)
+{
+  g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), FALSE);
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
+  g_return_val_if_fail (string != NULL, FALSE);
+
+  return self->trigger_class->print_label (self, display, string);
+}
+
 /*** GTK_SHORTCUT_TRIGGER_NEVER ***/
 
 typedef struct _GtkNeverTrigger GtkNeverTrigger;
@@ -246,13 +314,22 @@ gtk_never_trigger_print (GtkShortcutTrigger *trigger,
   g_string_append (string, "<never>");
 }
 
+static gboolean
+gtk_never_trigger_print_label (GtkShortcutTrigger *trigger,
+                               GdkDisplay         *display,
+                               GString            *string)
+{
+  return FALSE;
+}
+
 static const GtkShortcutTriggerClass GTK_NEVER_TRIGGER_CLASS = {
   GTK_SHORTCUT_TRIGGER_NEVER,
   sizeof (GtkNeverTrigger),
   "GtkNeverTrigger",
   gtk_never_trigger_finalize,
   gtk_never_trigger_trigger,
-  gtk_never_trigger_print
+  gtk_never_trigger_print,
+  gtk_never_trigger_print_label
 };
 
 static GtkNeverTrigger never = { { &GTK_NEVER_TRIGGER_CLASS, 1 } };
@@ -324,13 +401,26 @@ gtk_keyval_trigger_print (GtkShortcutTrigger *trigger,
   g_free (accelerator_name);
 }
 
+static gboolean
+gtk_keyval_trigger_print_label (GtkShortcutTrigger *trigger,
+                                GdkDisplay         *display,
+                                GString            *string)
+{
+  GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
+
+  gtk_accelerator_print_label (string, self->keyval, self->modifiers);
+
+  return TRUE;
+}
+
 static const GtkShortcutTriggerClass GTK_KEYVAL_TRIGGER_CLASS = {
   GTK_SHORTCUT_TRIGGER_KEYVAL,
   sizeof (GtkKeyvalTrigger),
   "GtkKeyvalTrigger",
   gtk_keyval_trigger_finalize,
   gtk_keyval_trigger_trigger,
-  gtk_keyval_trigger_print
+  gtk_keyval_trigger_print,
+  gtk_keyval_trigger_print_label
 };
 
 /**
@@ -438,7 +528,6 @@ gtk_alternative_trigger_trigger (GtkShortcutTrigger *trigger,
 static void
 gtk_alternative_trigger_print (GtkShortcutTrigger *trigger,
                                GString            *string)
-                  
 {
   GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
 
@@ -447,13 +536,34 @@ gtk_alternative_trigger_print (GtkShortcutTrigger *trigger,
   gtk_shortcut_trigger_print (self->second, string);
 }
 
+static gboolean
+gtk_alternative_trigger_print_label (GtkShortcutTrigger *trigger,
+                                     GdkDisplay         *display,
+                                     GString            *string)
+{
+  GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
+
+  if (gtk_shortcut_trigger_print_label (self->first, display, string))
+    {
+      g_string_append (string, ", ");
+      if (!gtk_shortcut_trigger_print_label (self->second, display, string))
+        g_string_truncate (string, string->len - 2);
+      return TRUE;
+    }
+  else
+    {
+      return gtk_shortcut_trigger_print_label (self->second, display, string);
+    }
+}
+
 static const GtkShortcutTriggerClass GTK_ALTERNATIVE_TRIGGER_CLASS = {
   GTK_SHORTCUT_TRIGGER_ALTERNATIVE,
   sizeof (GtkAlternativeTrigger),
   "GtkAlternativeTrigger",
   gtk_alternative_trigger_finalize,
   gtk_alternative_trigger_trigger,
-  gtk_alternative_trigger_print
+  gtk_alternative_trigger_print,
+  gtk_alternative_trigger_print_label
 };
 
 /**
index d37fbcc222d9c03326137fd04a646f5d25c54e83..2323bb0d13d35f277b4a74192622f936a66924b6 100644 (file)
@@ -64,6 +64,13 @@ char *                  gtk_shortcut_trigger_to_string          (GtkShortcutTrig
 GDK_AVAILABLE_IN_ALL
 void                    gtk_shortcut_trigger_print              (GtkShortcutTrigger *self,
                                                                  GString            *string);
+GDK_AVAILABLE_IN_ALL
+char *                  gtk_shortcut_trigger_to_label           (GtkShortcutTrigger *self,
+                                                                 GdkDisplay         *display);
+GDK_AVAILABLE_IN_ALL
+gboolean                gtk_shortcut_trigger_print_label        (GtkShortcutTrigger *self,
+                                                                 GdkDisplay         *display,
+                                                                 GString            *string);
 
 GDK_AVAILABLE_IN_ALL
 gboolean                gtk_shortcut_trigger_trigger            (GtkShortcutTrigger *self,