[gtk/wip/baedert/test-cflags] padcontroller: Copy action entries
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/test-cflags] padcontroller: Copy action entries
- Date: Sat, 7 Mar 2020 14:18:04 +0000 (UTC)
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]