[libdazzle] shortcuts: add closure chain utility API
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libdazzle] shortcuts: add closure chain utility API
- Date: Thu, 15 Jun 2017 08:06:16 +0000 (UTC)
commit ea4f66a4fd7b3ecdc6a9c14aeb6f45cc88ed98b8
Author: Christian Hergert <chergert redhat com>
Date: Thu Jun 15 01:04:35 2017 -0700
shortcuts: add closure chain utility API
These will make it easier to port DzlShortcutContext to use the closure
chain.
src/shortcuts/dzl-shortcut-closure-chain.c | 54 +++++++++++++++++++++-------
src/shortcuts/dzl-shortcut-closure-chain.h | 5 +++
2 files changed, 46 insertions(+), 13 deletions(-)
---
diff --git a/src/shortcuts/dzl-shortcut-closure-chain.c b/src/shortcuts/dzl-shortcut-closure-chain.c
index e569348..78fc199 100644
--- a/src/shortcuts/dzl-shortcut-closure-chain.c
+++ b/src/shortcuts/dzl-shortcut-closure-chain.c
@@ -77,7 +77,7 @@ dzl_shortcut_closure_chain_new (DzlShortcutClosureType type)
return ret;
}
-static DzlShortcutClosureChain *
+DzlShortcutClosureChain *
dzl_shortcut_closure_chain_append (DzlShortcutClosureChain *chain,
DzlShortcutClosureChain *element)
{
@@ -219,19 +219,34 @@ dzl_shortcut_closure_chain_append_action_string (DzlShortcutClosureChain *chain,
}
DzlShortcutClosureChain *
-dzl_shortcut_closure_chain_append_signal (DzlShortcutClosureChain *chain,
- const gchar *signal_name,
- guint n_args,
- va_list args)
+dzl_shortcut_closure_chain_append_signalv (DzlShortcutClosureChain *chain,
+ const gchar *signal_name,
+ GArray *params)
{
- DzlShortcutClosureChain *tail;
- g_autoptr(GArray) params = NULL;
g_autofree gchar *truncated_name = NULL;
+ DzlShortcutClosureChain *tail;
+ g_autoptr(GArray) copy = NULL;
const gchar *detail_str;
GQuark detail = 0;
g_return_val_if_fail (signal_name != NULL, NULL);
+ if (params != NULL)
+ {
+ copy = g_array_sized_new (FALSE, TRUE, sizeof (GValue), params ? params->len : 0);
+ g_array_set_clear_func (copy, (GDestroyNotify)g_value_unset);
+ g_array_set_size (copy, params->len);
+
+ for (guint i = 0; i < params->len; i++)
+ {
+ GValue *src = &g_array_index (params, GValue, i);
+ GValue *dst = &g_array_index (copy, GValue, i);
+
+ g_value_init (dst, G_VALUE_TYPE (src));
+ g_value_copy (src, dst);
+ }
+ }
+
if (NULL != (detail_str = strstr (signal_name, "::")))
{
truncated_name = g_strndup (signal_name, detail_str - signal_name);
@@ -240,6 +255,24 @@ dzl_shortcut_closure_chain_append_signal (DzlShortcutClosureChain *chain,
detail = g_quark_try_string (detail_str);
}
+ tail = dzl_shortcut_closure_chain_new (DZL_SHORTCUT_CLOSURE_SIGNAL);
+ tail->signal.name = g_intern_string (signal_name);
+ tail->signal.params = g_steal_pointer (©);
+ tail->signal.detail = detail;
+
+ return dzl_shortcut_closure_chain_append (chain, tail);
+}
+
+DzlShortcutClosureChain *
+dzl_shortcut_closure_chain_append_signal (DzlShortcutClosureChain *chain,
+ const gchar *signal_name,
+ guint n_args,
+ va_list args)
+{
+ g_autoptr(GArray) params = NULL;
+
+ g_return_val_if_fail (signal_name != NULL, NULL);
+
params = g_array_new (FALSE, FALSE, sizeof (GValue));
g_array_set_clear_func (params, (GDestroyNotify)g_value_unset);
@@ -262,12 +295,7 @@ dzl_shortcut_closure_chain_append_signal (DzlShortcutClosureChain *chain,
g_array_append_val (params, value);
}
- tail = dzl_shortcut_closure_chain_new (DZL_SHORTCUT_CLOSURE_SIGNAL);
- tail->signal.name = g_intern_string (signal_name);
- tail->signal.params = g_steal_pointer (¶ms);
- tail->signal.detail = detail;
-
- return dzl_shortcut_closure_chain_append (chain, tail);
+ return dzl_shortcut_closure_chain_append_signalv (chain, signal_name, params);
}
gboolean
diff --git a/src/shortcuts/dzl-shortcut-closure-chain.h b/src/shortcuts/dzl-shortcut-closure-chain.h
index 7abbbd8..3d1e1da 100644
--- a/src/shortcuts/dzl-shortcut-closure-chain.h
+++ b/src/shortcuts/dzl-shortcut-closure-chain.h
@@ -25,10 +25,15 @@ G_BEGIN_DECLS
typedef struct _DzlShortcutClosureChain DzlShortcutClosureChain;
+DzlShortcutClosureChain *dzl_shortcut_closure_chain_append (DzlShortcutClosureChain *chain,
+ DzlShortcutClosureChain *link);
DzlShortcutClosureChain *dzl_shortcut_closure_chain_append_signal (DzlShortcutClosureChain *chain,
const gchar
*signal_name,
guint n_args,
va_list args);
+DzlShortcutClosureChain *dzl_shortcut_closure_chain_append_signalv (DzlShortcutClosureChain *chain,
+ const gchar
*signal_name,
+ GArray *params);
DzlShortcutClosureChain *dzl_shortcut_closure_chain_append_action (DzlShortcutClosureChain *chain,
const gchar
*group_name,
const gchar
*action_name,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]