[gtk/wip/baedert/test-cflags] padcontroller: Copy action entries



commit 049f841900e0e196f4eba293aadf84b0735ee8d0
Author: Timm Bäder <mail baedert org>
Date:   Sat Mar 7 14:48:07 2020 +0100

    padcontroller: Copy action entries
    
    The label and action_name entries of GtkPadActionEntry are supposed to
    be const, so copy them into a private ActionEntryData struct that we
    later free.

 gtk/gtkpadcontroller.c | 94 ++++++++++++++++++++++++++++----------------------
 gtk/gtkpadcontroller.h |  8 ++---
 2 files changed, 57 insertions(+), 45 deletions(-)
---
diff --git a/gtk/gtkpadcontroller.c b/gtk/gtkpadcontroller.c
index d3efc61426..ef86f8c76a 100644
--- a/gtk/gtkpadcontroller.c
+++ b/gtk/gtkpadcontroller.c
@@ -84,7 +84,7 @@ struct _GtkPadController {
   GActionGroup *action_group;
   GdkDevice *pad;
 
-  GList *entries;
+  GArray *action_entries;
 };
 
 struct _GtkPadControllerClass {
@@ -98,42 +98,31 @@ enum {
   N_PROPS
 };
 
-static GParamSpec *pspecs[N_PROPS] = { NULL };
-
-G_DEFINE_TYPE (GtkPadController, gtk_pad_controller, GTK_TYPE_EVENT_CONTROLLER)
-
-static GtkPadActionEntry *
-gtk_pad_action_entry_copy (const GtkPadActionEntry *entry)
+typedef struct
 {
-  GtkPadActionEntry *copy;
-
-  copy = g_slice_new0 (GtkPadActionEntry);
-  *copy = *entry;
-  copy->label = g_strdup (entry->label);
-  copy->action_name = g_strdup (entry->action_name);
+  GtkPadActionType type;
+  int index;
+  int mode;
+  char *label;
+  char *action_name;
+} ActionEntryData;
 
-  return copy;
-}
+static GParamSpec *pspecs[N_PROPS] = { NULL };
 
-static void
-gtk_pad_action_entry_free (GtkPadActionEntry *entry)
-{
-  g_free (entry->label);
-  g_free (entry->action_name);
-  g_slice_free (GtkPadActionEntry, entry);
-}
+G_DEFINE_TYPE (GtkPadController, gtk_pad_controller, GTK_TYPE_EVENT_CONTROLLER)
 
-static const GtkPadActionEntry *
+static const ActionEntryData *
 gtk_pad_action_find_match (GtkPadController *controller,
                            GtkPadActionType  type,
                            gint              index,
                            gint              mode)
 {
-  GList *l;
+  guint i;
 
-  for (l = controller->entries; l; l = l->next)
+  for (i = 0; i < controller->action_entries->len; i++)
     {
-      GtkPadActionEntry *entry = l->data;
+      const ActionEntryData *entry = &g_array_index (controller->action_entries,
+                                                     ActionEntryData, i);
       gboolean match_index = FALSE, match_mode = FALSE;
 
       if (entry->type != type)
@@ -151,7 +140,7 @@ gtk_pad_action_find_match (GtkPadController *controller,
 
 static void
 gtk_pad_controller_activate_action (GtkPadController        *controller,
-                                    const GtkPadActionEntry *entry)
+                                    const ActionEntryData   *entry)
 {
   g_action_group_activate_action (controller->action_group,
                                   entry->action_name,
@@ -160,7 +149,7 @@ gtk_pad_controller_activate_action (GtkPadController        *controller,
 
 static void
 gtk_pad_controller_activate_action_with_axis (GtkPadController        *controller,
-                                              const GtkPadActionEntry *entry,
+                                              const ActionEntryData   *entry,
                                               gdouble                  value)
 {
   g_action_group_activate_action (controller->action_group,
@@ -177,7 +166,7 @@ gtk_pad_controller_handle_mode_switch (GtkPadController *controller,
 #ifdef GDK_WINDOWING_WAYLAND
   if (GDK_IS_WAYLAND_DISPLAY (gdk_device_get_display (pad)))
     {
-      const GtkPadActionEntry *entry;
+      const ActionEntryData *entry;
       gint elem, idx, n_features;
 
       for (elem = GTK_PAD_ACTION_BUTTON; elem <= GTK_PAD_ACTION_STRIP; elem++)
@@ -235,7 +224,7 @@ gtk_pad_controller_handle_event (GtkEventController *controller,
 {
   GtkPadController *pad_controller = GTK_PAD_CONTROLLER (controller);
   GdkEventType event_type = gdk_event_get_event_type (event);
-  const GtkPadActionEntry *entry;
+  const ActionEntryData *entry;
   GtkPadActionType type;
   guint index, mode, group;
   gdouble value = 0;
@@ -346,8 +335,17 @@ static void
 gtk_pad_controller_finalize (GObject *object)
 {
   GtkPadController *controller = GTK_PAD_CONTROLLER (object);
+  guint i;
+
+  for (i = 0; i < controller->action_entries->len; i++)
+    {
+      const ActionEntryData *entry = &g_array_index (controller->action_entries,
+                                                     ActionEntryData, i);
 
-  g_list_free_full (controller->entries, (GDestroyNotify) gtk_pad_action_entry_free);
+      g_free (entry->label);
+      g_free (entry->action_name);
+    }
+  g_array_free (controller->action_entries, TRUE);
 
   G_OBJECT_CLASS (gtk_pad_controller_parent_class)->finalize (object);
 }
@@ -385,6 +383,7 @@ gtk_pad_controller_class_init (GtkPadControllerClass *klass)
 static void
 gtk_pad_controller_init (GtkPadController *controller)
 {
+  controller->action_entries = g_array_new (FALSE, TRUE, sizeof (ActionEntryData));
 }
 
 /**
@@ -444,11 +443,25 @@ static void
 gtk_pad_controller_add_entry (GtkPadController        *controller,
                               const GtkPadActionEntry *entry)
 {
-  GtkPadActionEntry *copy;
+  guint i;
+  const ActionEntryData new_entry = {
+   .type = entry->type,
+   .index = entry->index,
+   .mode = entry->mode,
+   .label= g_strdup (entry->label),
+   .action_name = g_strdup (entry->action_name)
+  };
+
+  g_array_set_size (controller->action_entries, controller->action_entries->len + 1);
+
+  for (i = 0; i < controller->action_entries->len; i++)
+    {
+      if (entry_compare_func (&new_entry,
+                              &g_array_index (controller->action_entries, ActionEntryData, i)) == 0)
+        break;
+    }
 
-  copy = gtk_pad_action_entry_copy (entry);
-  controller->entries = g_list_insert_sorted (controller->entries, copy,
-                                              (GCompareFunc) entry_compare_func);
+  g_array_insert_val (controller->action_entries, i, new_entry);
 }
 
 /**
@@ -496,13 +509,12 @@ gtk_pad_controller_set_action_entries (GtkPadController        *controller,
 void
 gtk_pad_controller_set_action (GtkPadController *controller,
                                GtkPadActionType  type,
-                               gint              index,
-                               gint              mode,
-                               const gchar      *label,
-                               const gchar      *action_name)
+                               int               index,
+                               int               mode,
+                               const char       *label,
+                               const char       *action_name)
 {
-  GtkPadActionEntry entry = { type, index, mode,
-                              (gchar *) label, (gchar *) action_name };
+  const GtkPadActionEntry entry = { type, index, mode, label, action_name };
 
   g_return_if_fail (GTK_IS_PAD_CONTROLLER (controller));
   g_return_if_fail (type <= GTK_PAD_ACTION_STRIP);
diff --git a/gtk/gtkpadcontroller.h b/gtk/gtkpadcontroller.h
index 0fabc4a146..b0749d626e 100644
--- a/gtk/gtkpadcontroller.h
+++ b/gtk/gtkpadcontroller.h
@@ -68,10 +68,10 @@ typedef enum {
  */
 struct _GtkPadActionEntry {
   GtkPadActionType type;
-  gint index;
-  gint mode;
-  gchar *label;
-  gchar *action_name;
+  int index;
+  int mode;
+  const char *label;
+  const char *action_name;
 };
 
 GDK_AVAILABLE_IN_ALL


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]