widget: Return an array from list_controllers
authorTimm Bäder <mail@baedert.org>
Sat, 28 Mar 2020 19:37:29 +0000 (20:37 +0100)
committerTimm Bäder <mail@baedert.org>
Sun, 29 Mar 2020 13:32:54 +0000 (15:32 +0200)
Minimize the GList usage throughout the code base.

gtk/gtkcombobox.c
gtk/gtkpopovermenu.c
gtk/gtktreeview.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h

index cdf69804e9663238a1e99f91ae2622dfcbb6ca5e..c1e97debb06a1fd1b356709902b82bb3d2155a0b 100644 (file)
@@ -846,7 +846,8 @@ gtk_combo_box_init (GtkComboBox *combo_box)
 {
   GtkComboBoxPrivate *priv = gtk_combo_box_get_instance_private (combo_box);
   GtkEventController *controller;
-  GList *controllers, *list;
+  GtkEventController **controllers;
+  guint n_controllers, i;
 
   priv->active = -1;
   priv->active_row = NULL;
@@ -882,18 +883,20 @@ gtk_combo_box_init (GtkComboBox *combo_box)
                     combo_box);
   gtk_widget_add_controller (GTK_WIDGET (combo_box), controller);
 
-  controllers = gtk_widget_list_controllers (priv->popup_widget, GTK_PHASE_BUBBLE);
-  for (list = controllers; list; list = list->next)
+  controllers = gtk_widget_list_controllers (priv->popup_widget, GTK_PHASE_BUBBLE, &n_controllers);
+  for (i = 0; i < n_controllers; i ++)
     {
-      if (GTK_IS_SHORTCUT_CONTROLLER (list->data))
+      controller = controllers[i];
+
+      if (GTK_IS_SHORTCUT_CONTROLLER (controller))
         {
-          g_object_ref (list->data);
-          gtk_widget_remove_controller (priv->popup_widget, list->data);
-          gtk_widget_add_controller (priv->popup_widget, list->data);
+          g_object_ref (controller);
+          gtk_widget_remove_controller (priv->popup_widget, controller);
+          gtk_widget_add_controller (priv->popup_widget, controller);
           break;
         }
     }
-  g_list_free (controllers);
+  g_free (controllers);
 }
 
 static void
index 39c159ad45711391eec9c371be5a51d81c5a4224..12424e4bb2841607a52eec080a2e42a0cf9738a5 100644 (file)
@@ -201,7 +201,8 @@ gtk_popover_menu_init (GtkPopoverMenu *popover)
 {
   GtkWidget *stack;
   GtkEventController *controller;
-  GList *controllers, *l;
+  GtkEventController **controllers;
+  guint n_controllers, i;
 
   stack = gtk_stack_new ();
   gtk_stack_set_vhomogeneous (GTK_STACK (stack), FALSE);
@@ -221,15 +222,15 @@ gtk_popover_menu_init (GtkPopoverMenu *popover)
   g_signal_connect (controller, "leave", G_CALLBACK (leave_cb), popover);
   gtk_widget_add_controller (GTK_WIDGET (popover), controller);
 
-  controllers = gtk_widget_list_controllers (GTK_WIDGET (popover), GTK_PHASE_CAPTURE);
-  for (l = controllers; l; l = l->next)
+  controllers = gtk_widget_list_controllers (GTK_WIDGET (popover), GTK_PHASE_CAPTURE, &n_controllers);
+  for (i = 0; i < n_controllers; i ++)
     {
-      controller = l->data;
+      controller = controllers[i];
       if (GTK_IS_SHORTCUT_CONTROLLER (controller) &&
           strcmp (gtk_event_controller_get_name (controller), "gtk-shortcut-manager-capture") == 0)
         gtk_shortcut_controller_set_mnemonics_modifiers (GTK_SHORTCUT_CONTROLLER (controller), 0);
     }
-  g_list_free (controllers);
+  g_free (controllers);
 
   gtk_popover_disable_auto_mnemonics (GTK_POPOVER (popover));
 }
index 51fa6d52298f2e5978dcdcaa7584f8c863579e62..548034619c85ed9e61c07de8caef87d2278fdd2c 100644 (file)
@@ -1704,7 +1704,8 @@ gtk_tree_view_init (GtkTreeView *tree_view)
   GtkCssNode *widget_node;
   GtkGesture *gesture;
   GtkEventController *controller;
-  GList *list, *controllers;
+  GtkEventController **controllers;
+  guint n_controllers, i;
 
   gtk_widget_set_can_focus (GTK_WIDGET (tree_view), TRUE);
   gtk_widget_set_overflow (GTK_WIDGET (tree_view), GTK_OVERFLOW_HIDDEN);
@@ -1771,18 +1772,19 @@ gtk_tree_view_init (GtkTreeView *tree_view)
                     G_CALLBACK (gtk_tree_view_forward_controller_key_pressed), tree_view);
   gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
 
-  controllers = gtk_widget_list_controllers (GTK_WIDGET (tree_view), GTK_PHASE_BUBBLE);
-  for (list = controllers; list; list = list->next)
+  controllers = gtk_widget_list_controllers (GTK_WIDGET (tree_view), GTK_PHASE_BUBBLE, &n_controllers);
+  for (i = 0; i < n_controllers; i ++)
     {
-      if (GTK_IS_SHORTCUT_CONTROLLER (list->data))
+      controller = controllers[i];
+      if (GTK_IS_SHORTCUT_CONTROLLER (controller))
         {
-          g_object_ref (list->data);
-          gtk_widget_remove_controller (GTK_WIDGET (tree_view), list->data);
-          gtk_widget_add_controller (GTK_WIDGET (tree_view), list->data);
+          g_object_ref (controller);
+          gtk_widget_remove_controller (GTK_WIDGET (tree_view), controller);
+          gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
           break;
         }
     }
-  g_list_free (controllers);
+  g_free (controllers);
 
   tree_view->click_gesture = gtk_gesture_click_new ();
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (tree_view->click_gesture), 0);
index 46a7e336aced177b4817d764cc6de4a1501b18e2..a276b3369b8efb6973940bad758cec1c385ebb56 100644 (file)
@@ -11474,22 +11474,28 @@ gtk_widget_reset_controllers (GtkWidget *widget)
     }
 }
 
-GList *
+GtkEventController **
 gtk_widget_list_controllers (GtkWidget           *widget,
-                             GtkPropagationPhase  phase)
+                             GtkPropagationPhase  phase,
+                             guint               *out_n_controllers)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-  GList *res = NULL, *l;
+  GPtrArray *controllers = g_ptr_array_new ();
+  GList *l;
+
+  g_assert (out_n_controllers);
 
   for (l = priv->event_controllers; l; l = l->next)
     {
       GtkEventController *controller = l->data;
 
       if (gtk_event_controller_get_propagation_phase (controller) == phase)
-        res = g_list_prepend (res, controller);
+        g_ptr_array_add (controllers, controller);
     }
 
-  return g_list_reverse (res);
+  *out_n_controllers = controllers->len;
+
+  return (GtkEventController **)g_ptr_array_free (controllers, FALSE);
 }
 
 static inline void
index a89dc21b1706b41212adb7d562782de841331996..53467aeae18a62d3c65f27229cbe9a33cf1ee166 100644 (file)
@@ -295,8 +295,9 @@ gboolean          gtk_widget_has_size_request              (GtkWidget *widget);
 
 void              gtk_widget_reset_controllers             (GtkWidget *widget);
 
-GList *           gtk_widget_list_controllers              (GtkWidget           *widget,
-                                                            GtkPropagationPhase  phase);
+GtkEventController **gtk_widget_list_controllers           (GtkWidget           *widget,
+                                                            GtkPropagationPhase  phase,
+                                                            guint               *out_n_controllers);
 
 gboolean          gtk_widget_query_tooltip                 (GtkWidget  *widget,
                                                             gint        x,