From ace183f38f030e1795594bda5666bf053f823286 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 30 Mar 2020 19:02:35 -0400 Subject: [PATCH 1/3] shortcutcontroller: Fix builder support The GtkBuilder support was not working anymore after triggers and actions have been turned into objects. Fix this. --- gtk/gtkbuilder.c | 48 +++++++++++++++++++------------------ gtk/gtkshortcutcontroller.c | 2 +- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index c444e15036..a4351bade1 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -531,6 +531,8 @@ gtk_builder_get_parameters (GtkBuilder *builder, (G_PARAM_SPEC_VALUE_TYPE (prop->pspec) != GDK_TYPE_PIXBUF) && (G_PARAM_SPEC_VALUE_TYPE (prop->pspec) != GDK_TYPE_TEXTURE) && (G_PARAM_SPEC_VALUE_TYPE (prop->pspec) != GDK_TYPE_PAINTABLE) && + (G_PARAM_SPEC_VALUE_TYPE (prop->pspec) != GTK_TYPE_SHORTCUT_TRIGGER) && + (G_PARAM_SPEC_VALUE_TYPE (prop->pspec) != GTK_TYPE_SHORTCUT_ACTION) && (G_PARAM_SPEC_VALUE_TYPE (prop->pspec) != G_TYPE_FILE)) { GObject *object = g_hash_table_lookup (priv->objects, @@ -2097,29 +2099,6 @@ gtk_builder_value_from_string_type (GtkBuilder *builder, ret = FALSE; } } - else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_TRIGGER)) - { - GtkShortcutTrigger *trigger = gtk_shortcut_trigger_parse_string (string); - - if (trigger) - g_value_take_object (value, trigger); - else - { - g_set_error (error, - GTK_BUILDER_ERROR, - GTK_BUILDER_ERROR_INVALID_VALUE, - "Could not parse shortcut trigger '%s'", - string); - ret = FALSE; - } - } - else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_ACTION)) - { - GtkShortcutAction *action = gtk_shortcut_action_parse_builder (builder, string, error); - - /* Works for success and failure (NULL) case */ - g_value_take_object (value, action); - } else if (G_VALUE_HOLDS (value, G_TYPE_STRV)) { gchar **vector = g_strsplit (string, "\n", 0); @@ -2237,6 +2216,29 @@ gtk_builder_value_from_string_type (GtkBuilder *builder, ret = TRUE; } + else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_TRIGGER)) + { + GtkShortcutTrigger *trigger = gtk_shortcut_trigger_parse_string (string); + + if (trigger) + g_value_take_object (value, trigger); + else + { + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_VALUE, + "Could not parse shortcut trigger '%s'", + string); + ret = FALSE; + } + } + else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_ACTION)) + { + GtkShortcutAction *action = gtk_shortcut_action_parse_builder (builder, string, error); + + /* Works for success and failure (NULL) case */ + g_value_take_object (value, action); + } else { GObject *object = g_hash_table_lookup (priv->objects, string); diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c index 8123d796e6..d18b6902f2 100644 --- a/gtk/gtkshortcutcontroller.c +++ b/gtk/gtkshortcutcontroller.c @@ -127,7 +127,7 @@ gtk_shortcut_controller_buildable_add_child (GtkBuildable *buildable, } if (GTK_IS_SHORTCUT (child)) { - gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (buildable), GTK_SHORTCUT (child)); + gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (buildable), g_object_ref (GTK_SHORTCUT (child))); } else { From 96f822434f0b67c97e4be03abf19e84143bd39ef Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 30 Mar 2020 19:03:22 -0400 Subject: [PATCH 2/3] testsuite: Add a builder test for shortcut controllers --- testsuite/gtk/builder.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/testsuite/gtk/builder.c b/testsuite/gtk/builder.c index c7178d476d..e2c2fcf992 100644 --- a/testsuite/gtk/builder.c +++ b/testsuite/gtk/builder.c @@ -2418,6 +2418,35 @@ test_file_filter (void) g_object_unref (builder); } +static void +test_shortcuts (void) +{ + GtkBuilder *builder; + GObject *obj; + + const char buffer[] = + "" + " " + " " + " " + " managed" + " " + " " + " <Control>k" + " activate" + " " + " " + " " + " " + " " + ""; + + builder = builder_new_from_string (buffer, -1, NULL); + obj = gtk_builder_get_object (builder, "controller"); + g_assert (GTK_IS_SHORTCUT_CONTROLLER (obj)); + g_object_unref (builder); +} + int main (int argc, char **argv) { @@ -2462,6 +2491,7 @@ main (int argc, char **argv) g_test_add_func ("/Builder/Property Bindings", test_property_bindings); g_test_add_func ("/Builder/anaconda-signal", test_anaconda_signal); g_test_add_func ("/Builder/FileFilter", test_file_filter); + g_test_add_func ("/Builder/Shortcuts", test_shortcuts); return g_test_run(); } From 15eb3bbbf12d94d107483eb71acbf67352317c11 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 30 Mar 2020 20:09:29 -0400 Subject: [PATCH 3/3] shortcutcontroller: Document buildable support --- gtk/gtkshortcutcontroller.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c index d18b6902f2..d7534001fe 100644 --- a/gtk/gtkshortcutcontroller.c +++ b/gtk/gtkshortcutcontroller.c @@ -36,6 +36,28 @@ * * #GtkShortcutController implements #GListModel for querying the shortcuts that * have been added to it. + * + * # GtkShortcutController as a GtkBuildable + * + * GtkShortcutControllers can be creates in ui files to set up shortcuts + * in the same place as the widgets. + * + * An example of a UI definition fragment with GtkShortcutController: + * |[ + * + * + * + * managed + * + * + * <Control>k + * activate + * + * + * + * + * + * ]| **/ #include "config.h"