[libdazzle] shortcuts: add closure chain utility API



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 (&copy);
+  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 (&params);
-  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]