[gnome-builder] gui: add stateful action helper
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] gui: add stateful action helper
- Date: Thu, 14 Mar 2019 20:46:28 +0000 (UTC)
commit e9e6134c962a0baefa0c41732b1700cd6ffebeb2
Author: Christian Hergert <chergert redhat com>
Date: Thu Mar 14 13:17:07 2019 -0700
gui: add stateful action helper
This will return TRUE if the action is known to be stateful.
src/libide/gui/ide-gui-global.c | 78 ++++++++++++++++++++++++++++++++++++++++
src/libide/gui/ide-gui-private.h | 2 ++
2 files changed, 80 insertions(+)
---
diff --git a/src/libide/gui/ide-gui-global.c b/src/libide/gui/ide-gui-global.c
index bf4063367..fac619753 100644
--- a/src/libide/gui/ide-gui-global.c
+++ b/src/libide/gui/ide-gui-global.c
@@ -356,3 +356,81 @@ ide_gtk_window_present (GtkWindow *window)
*/
gtk_window_present_with_time (window, g_get_monotonic_time () / 1000L);
}
+
+static void
+split_action_name (const gchar *action_name,
+ gchar **prefix,
+ gchar **name)
+{
+ const gchar *dot;
+
+ g_assert (prefix != NULL);
+ g_assert (name != NULL);
+
+ *prefix = NULL;
+ *name = NULL;
+
+ if (action_name == NULL)
+ return;
+
+ dot = strchr (action_name, '.');
+
+ if (dot == NULL)
+ *name = g_strdup (action_name);
+ else
+ {
+ *prefix = g_strndup (action_name, dot - action_name);
+ *name = g_strdup (dot + 1);
+ }
+}
+
+gboolean
+_ide_gtk_widget_action_is_stateful (GtkWidget *widget,
+ const gchar *action_name)
+{
+ g_autofree gchar *name = NULL;
+ g_autofree gchar *prefix = NULL;
+ GtkWidget *toplevel;
+ GApplication *app;
+ GActionGroup *group = NULL;
+
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+ g_return_val_if_fail (action_name, FALSE);
+
+ split_action_name (action_name, &prefix, &name);
+
+ app = g_application_get_default ();
+ toplevel = gtk_widget_get_toplevel (widget);
+
+ while ((group == NULL) && (widget != NULL))
+ {
+ group = gtk_widget_get_action_group (widget, prefix);
+
+ if G_UNLIKELY (GTK_IS_POPOVER (widget))
+ {
+ GtkWidget *relative_to;
+
+ relative_to = gtk_popover_get_relative_to (GTK_POPOVER (widget));
+
+ if (relative_to != NULL)
+ widget = relative_to;
+ else
+ widget = gtk_widget_get_parent (widget);
+ }
+ else
+ {
+ widget = gtk_widget_get_parent (widget);
+ }
+ }
+
+ if (!group && g_str_equal (prefix, "win") && G_IS_ACTION_GROUP (toplevel))
+ group = G_ACTION_GROUP (toplevel);
+
+ if (!group && g_str_equal (prefix, "app") && G_IS_ACTION_GROUP (app))
+ group = G_ACTION_GROUP (app);
+
+ if (group && g_action_group_has_action (group, name))
+ return g_action_group_get_action_state_type (group, name) != NULL;
+
+ return FALSE;
+}
diff --git a/src/libide/gui/ide-gui-private.h b/src/libide/gui/ide-gui-private.h
index a400d0eb8..764b923c3 100644
--- a/src/libide/gui/ide-gui-private.h
+++ b/src/libide/gui/ide-gui-private.h
@@ -43,6 +43,8 @@
G_BEGIN_DECLS
+gboolean _ide_gtk_widget_action_is_stateful (GtkWidget *widget,
+ const gchar *action_name);
void _ide_frame_init_actions (IdeFrame *self);
void _ide_frame_init_shortcuts (IdeFrame *self);
void _ide_frame_update_actions (IdeFrame *self);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]