[gtk/wip/ebassi/shortcut: 190/267] Allow installing bindings bound to actions



commit fcfaa3b2b9fbcfb4e73498c512aea83391b08efe
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Wed Feb 5 17:08:37 2020 +0000

    Allow installing bindings bound to actions
    
    This is just convenience code around GtkShortcut, just like bindings for
    signal emission and callback invocation.

 gtk/gtkwidget.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 gtk/gtkwidget.h |  8 ++++++++
 2 files changed, 57 insertions(+)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 86126ffd14..31ebf46602 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -4453,6 +4453,55 @@ gtk_widget_class_add_binding_signal (GtkWidgetClass  *widget_class,
   g_object_unref (shortcut);
 }
 
+/**
+ * gtk_widget_class_add_binding_action: (skip)
+ * @widget_class: the class to add the binding to
+ * @keyval: key value of binding to install
+ * @mods: key modifier of binding to install
+ * @action_name: the action to activate
+ * @format_string: GVariant format string for arguments or %NULL for
+ *     no arguments
+ * @...: arguments, as given by format string.
+ *
+ * Creates a new shortcut for @widget_class that activates the given
+ * @action_name with arguments read according to @format_string.
+ * The arguments and format string must be provided in the same way as
+ * with g_variant_new().
+ *
+ * This function is a convenience wrapper around
+ * gtk_widget_class_add_shortcut() and must be called during class
+ * initialization.
+ */
+void
+gtk_widget_class_add_binding_action (GtkWidgetClass  *widget_class,
+                                     guint            keyval,
+                                     GdkModifierType  mods,
+                                     const gchar     *action_name,
+                                     const gchar     *format_string,
+                                     ...)
+{
+  GtkShortcut *shortcut;
+
+  g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
+  /* XXX: validate variant format for action */
+
+  shortcut = gtk_shortcut_new ();
+  gtk_shortcut_set_trigger (shortcut, gtk_keyval_trigger_new (keyval, mods));
+  gtk_shortcut_set_action (shortcut, action_name);
+  if (format_string)
+    {
+      va_list args;
+      va_start (args, format_string);
+      gtk_shortcut_set_arguments (shortcut,
+                                  g_variant_new_va (format_string, NULL, &args));
+      va_end (args);
+    }
+
+  gtk_widget_class_add_shortcut (widget_class, shortcut);
+
+  g_object_unref (shortcut);
+}
+
 /**
  * gtk_widget_class_add_shortcut:
  * @widget_class: the class to add the shortcut to
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index cd072ba2bc..67d1db1224 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -390,6 +390,14 @@ void       gtk_widget_class_add_binding_signal
                                            const gchar         *format_string,
                                            ...);
 GDK_AVAILABLE_IN_ALL
+void       gtk_widget_class_add_binding_action
+                                          (GtkWidgetClass      *widget_class,
+                                           GdkModifierType      mods,
+                                           guint                keyval,
+                                           const gchar         *action_name,
+                                           const gchar         *format_string,
+                                           ...);
+GDK_AVAILABLE_IN_ALL
 void       gtk_widget_class_add_shortcut  (GtkWidgetClass      *widget_class,
                                            GtkShortcut         *shortcut);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]