qulogic/talkatu

Parents 11dfbe8b2012
Children e1a202cc3e2b
Add an signal to TalkatuActionGroup named action-activated so that users of it can tell when an enduser activated one of the actions. Fixes #36
--- a/talkatu/talkatuactiongroup.c Thu Sep 20 22:25:55 2018 -0500
+++ b/talkatu/talkatuactiongroup.c Mon Sep 24 22:10:54 2018 -0500
@@ -89,20 +89,98 @@
PROP_BUFFER,
N_PROPERTIES
};
+static GParamSpec *properties[N_PROPERTIES] = {NULL,};
-static GParamSpec *properties[N_PROPERTIES] = {NULL,};
+enum {
+ SIG_ACTION_ACTIVATED,
+ LAST_SIGNAL
+};
+static guint signals[LAST_SIGNAL] = {0, };
G_DEFINE_TYPE_WITH_PRIVATE(TalkatuActionGroup, talkatu_action_group, G_TYPE_SIMPLE_ACTION_GROUP)
/******************************************************************************
+ * Helpers
+ *****************************************************************************/
+static void
+talkatu_action_group_set_buffer(TalkatuActionGroup *ag, GtkTextBuffer *buffer) {
+ TalkatuActionGroupPrivate *priv = talkatu_action_group_get_instance_private(ag);
+
+ if(priv->buffer) {
+ g_object_unref(priv->buffer);
+ }
+
+ priv->buffer = g_object_ref(buffer);
+}
+
+static void
+talkatu_action_group_emit_action_activated(TalkatuActionGroup *ag, GAction *action) {
+ gchar *name = NULL;
+
+ g_object_get(G_OBJECT(action), "name", &name, NULL);
+ g_signal_emit(ag, signals[SIG_ACTION_ACTIVATED], 0, action, name);
+ g_free(name);
+}
+
+static void
+talkatu_action_group_action_activated(GSimpleAction *action,
+ GVariant *parameter,
+ gpointer data)
+{
+ TalkatuActionGroup *ag = TALKATU_ACTION_GROUP(data);
+
+ talkatu_action_group_emit_action_activated(ag, G_ACTION(action));
+}
+
+/******************************************************************************
* Callbacks
*****************************************************************************/
static void
+talkatu_action_group_action_added(GActionGroup *ag,
+ gchar *name,
+ gpointer data)
+{
+ GAction *action = g_action_map_lookup_action(G_ACTION_MAP(ag), name);
+
+ if(action != NULL) {
+ guint sig_id = g_signal_connect(
+ G_OBJECT(action),
+ "activate",
+ G_CALLBACK(talkatu_action_group_action_activated),
+ ag
+ );
+
+ g_object_set_data(
+ G_OBJECT(action),
+ "talkatu-action-group-activate-signal-id",
+ GUINT_TO_POINTER(sig_id)
+ );
+ }
+}
+
+static void
+talkatu_action_group_action_removed(GActionGroup *ag,
+ gchar *name,
+ gpointer data)
+{
+ GAction *action = g_action_map_lookup_action(G_ACTION_MAP(ag), name);
+
+ if(action != NULL) {
+ guint sig_id = GPOINTER_TO_UINT(g_object_get_data(
+ G_OBJECT(action),
+ "talkatu-action-group-activate-signal-id"
+ ));
+ g_signal_handler_disconnect(G_OBJECT(action), sig_id);
+ }
+}
+
+static void
talkatu_action_activate(GSimpleAction *action,
GVariant *parameter,
gpointer user_data)
{
g_message(_("activating action %s"), g_action_get_name(G_ACTION(action)));
+
}
static void
@@ -202,20 +280,6 @@
}
/******************************************************************************
- * Helpers
- *****************************************************************************/
-static void
-talkatu_action_group_set_buffer(TalkatuActionGroup *ag, GtkTextBuffer *buffer) {
- TalkatuActionGroupPrivate *priv = talkatu_action_group_get_instance_private(ag);
-
- if(priv->buffer) {
- g_object_unref(priv->buffer);
- }
-
- priv->buffer = g_object_ref(buffer);
-}
-
-/******************************************************************************
* GObject Stuff
*****************************************************************************/
static void
@@ -309,6 +373,20 @@
},
};
+ g_signal_connect(
+ object,
+ "action-added",
+ G_CALLBACK(talkatu_action_group_action_added),
+ NULL
+ );
+
+ g_signal_connect(
+ object,
+ "action-removed",
+ G_CALLBACK(talkatu_action_group_action_removed),
+ NULL
+ );
+
g_action_map_add_action_entries(G_ACTION_MAP(ag), entries, G_N_ELEMENTS(entries), priv->buffer);
/* disable all of the actions by default */
@@ -333,6 +411,7 @@
obj_class->set_property = talkatu_action_group_set_property;
obj_class->finalize = talkatu_action_group_finalize;
+ /* setup our properties */
properties[PROP_BUFFER] = g_param_spec_object(
"buffer", "buffer", "The buffer to work on",
GTK_TYPE_TEXT_BUFFER,
@@ -340,6 +419,32 @@
);
g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
+
+ /* setup our signals */
+
+ /**
+ * TalkatuActionGroup::action-activated
+ * @talkatuactiongroup: The #TalkatuActionGroup instance.
+ * @arg1: The #GAction that was activated.
+ * @user_data: User supplied data.
+ *
+ * Emitted when one of the actions in @talkatuactiongroup are activated.
+ * This is a convenience signal so people don't have to connect to every
+ * action themselves.
+ */
+ signals[SIG_ACTION_ACTIVATED] = g_signal_new(
+ "action-activated",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET(TalkatuActionGroupClass, action_activated),
+ NULL,
+ NULL,
+ NULL,
+ G_TYPE_NONE,
+ 2,
+ G_TYPE_ACTION,
+ G_TYPE_STRING
+ );
}
/******************************************************************************
--- a/talkatu/talkatuactiongroup.h Thu Sep 20 22:25:55 2018 -0500
+++ b/talkatu/talkatuactiongroup.h Mon Sep 24 22:10:54 2018 -0500
@@ -50,6 +50,8 @@
struct _TalkatuActionGroupClass {
GSimpleActionGroupClass parent;
+ void (*action_activated)(TalkatuActionGroup *ag, GAction *action, const gchar *name);
+
void (*_talkatu_reserved1)(void);
void (*_talkatu_reserved2)(void);
void (*_talkatu_reserved3)(void);
--- a/talkatu/talkatubuffer.c Thu Sep 20 22:25:55 2018 -0500
+++ b/talkatu/talkatubuffer.c Mon Sep 24 22:10:54 2018 -0500
@@ -450,7 +450,7 @@
g_return_val_if_fail(klass != NULL, NULL);
g_return_val_if_fail(klass->create_action_group != NULL, NULL);
- klass->create_action_group(buffer);
+ action_group = klass->create_action_group(buffer);
talkatu_buffer_set_action_group(buffer, action_group);
g_object_unref(G_OBJECT(action_group));
}