From: Mario Rugiero <mrugi...@gmail.com>

Double pointer allows to process lists in a more linear fashion.
The functions changed are:
icon_grid_add
icon_grid_set_constrain_width
icon_grid_remove
icon_grid_reorder_child

NOTE I'm not exactly sure how to test this.
I'm assuming lxpanel by default uses the new icon-grid, and I'm not
finding how to change it. Thus, it is RFC quality.
---
 src/icon-grid-old.c | 74 +++++++++++++++++----------------------------
 1 file changed, 28 insertions(+), 46 deletions(-)

diff --git a/src/icon-grid-old.c b/src/icon-grid-old.c
index 57afe22..b3c631c 100644
--- a/src/icon-grid-old.c
+++ b/src/icon-grid-old.c
@@ -307,19 +307,18 @@ void icon_grid_add(IconGrid * ig, GtkWidget * child, 
gboolean visible)
 {
     /* Create and initialize a structure representing the child. */
     IconGridElement * ige = g_new0(IconGridElement, 1);
+    IconGridElement ** pige;
+    /* ige will be the last element. */
+    ige->flink = NULL;
     ige->ig = ig;
     ige->widget = child;
     ige->visible = visible;
 
     /* Insert at the tail of the child list.  This keeps the graphics in the 
order they were added. */
-    if (ig->child_list == NULL)
-        ig->child_list = ige;
-    else
-    {
-        IconGridElement * ige_cursor;
-        for (ige_cursor = ig->child_list; ige_cursor->flink != NULL; 
ige_cursor = ige_cursor->flink) ;
-        ige_cursor->flink = ige;
-    }
+    for (pige = &(ig->child_list);
+         *pige != NULL;
+         pige = &((*pige)->flink)) ;
+    *pige = ige;
 
     /* Add the widget to the layout container. */
     if (visible)
@@ -339,25 +338,25 @@ extern void icon_grid_set_constrain_width(IconGrid * ig, 
gboolean constrain_widt
 /* Remove an icon grid element. */
 void icon_grid_remove(IconGrid * ig, GtkWidget * child)
 {
+    IconGridElement ** pige;
     IconGridElement * ige_pred = NULL;
-    IconGridElement * ige;
-    for (ige = ig->child_list; ige != NULL; ige_pred = ige, ige = ige->flink)
+
+    for (pige = &(ig->child_list);
+         *pige != NULL;
+         pige = &((*pige)->flink))
     {
-        if (ige->widget == child)
+        if ((*pige)->widget == child)
         {
             /* The child is found.  Remove from child list and layout 
container. */
-            gtk_widget_hide(ige->widget);
-            gtk_container_remove(GTK_CONTAINER(ig->widget), ige->widget);
+            gtk_widget_hide((*pige)->widget);
+            gtk_container_remove(GTK_CONTAINER(ig->widget), (*pige)->widget);
 
-            if (ige_pred == NULL)
-                ig->child_list = ige->flink;
-            else
-                ige_pred->flink = ige->flink;
+            *pige = (*pige)->flink;
 
             /* Do a relayout. */
             icon_grid_demand_resize(ig);
             break;
-        }
+       }
     }
 }
 
@@ -381,16 +380,14 @@ extern gint icon_grid_get_child_position(IconGrid * ig, 
GtkWidget * child)
 extern void icon_grid_reorder_child(IconGrid * ig, GtkWidget * child, gint 
position)
 {
     /* Remove the child from its current position. */
-    IconGridElement * ige_pred = NULL;
+    IconGridElement ** pige;
     IconGridElement * ige;
-    for (ige = ig->child_list; ige != NULL; ige_pred = ige, ige = ige->flink)
+    for (pige = &(ig->child_list); *pige != NULL; pige = &((*pige)->flink))
     {
-        if (ige->widget == child)
+        if ((*pige)->widget == child)
         {
-            if (ige_pred == NULL)
-                ig->child_list = ige->flink;
-            else
-                ige_pred->flink = ige->flink;
+            ige = *pige;
+            *pige = ige->flink;
             break;
         }
     }
@@ -398,28 +395,13 @@ extern void icon_grid_reorder_child(IconGrid * ig, 
GtkWidget * child, gint posit
     /* If the child was found, insert it at the new position. */
     if (ige != NULL)
     {
-        if (ig->child_list == NULL)
-        {
-            ige->flink = NULL;
-            ig->child_list = ige;
-        }
-        else if (position == 0)
-        {
-            ige->flink = ig->child_list;
-            ig->child_list = ige;
-        }
-        else
+        for (pige = &(ig->child_list);
+             (*pige != NULL) && (position > 0);
+             pige = &((*pige)->flink));
+        if (*pige != NULL)
         {
-            int local_position = position - 1;
-            IconGridElement * ige_pred;
-            for (
-              ige_pred = ig->child_list;
-              ((ige_pred != NULL) && (local_position > 0));
-              local_position -= 1, ige_pred = ige_pred->flink) ;
-           if (ige_pred != NULL) {
-              ige->flink = ige_pred->flink; // ige_pred can be NULL
-              ige_pred->flink = ige;
-           }
+            ige->flink = (*pige)->flink;
+            (*pige)->flink = ige;
         }
 
         /* Do a relayout. */
-- 
2.17.1



_______________________________________________
Lxde-list mailing list
Lxde-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxde-list

Reply via email to