Saving users memory.
authorphillbush <phillbush@cock.li>
Sat, 30 May 2020 01:52:55 +0000 (22:52 -0300)
committerphillbush <phillbush@cock.li>
Sat, 30 May 2020 01:52:55 +0000 (22:52 -0300)
When the item->label and item->output are the same, XMenu now only
strdup() the item->label and make item->output equal to item->label.
This saves memory when the user do not write a output specification
in the input.

xmenu.c

diff --git a/xmenu.c b/xmenu.c
index 17aa3fb..7127914 100644 (file)
--- a/xmenu.c
+++ b/xmenu.c
@@ -86,7 +86,7 @@ static void drawmenu(struct Menu *currmenu);
 static struct Item *itemcycle(struct Menu *currmenu, int direction);
 static void run(struct Menu *currmenu);
 static void freemenu(struct Menu *menu);
 static struct Item *itemcycle(struct Menu *currmenu, int direction);
 static void run(struct Menu *currmenu);
 static void freemenu(struct Menu *menu);
-static void cleanup(struct Menu *rootmenu);
+static void cleanup(void);
 static void usage(void);
 
 /* global variables (X stuff and geometries) */
 static void usage(void);
 
 /* global variables (X stuff and geometries) */
@@ -145,7 +145,10 @@ main(int argc, char *argv[])
        /* run event loop */
        run(rootmenu);
 
        /* run event loop */
        run(rootmenu);
 
-       cleanup(rootmenu);
+       /* freeing stuff */
+       freemenu(rootmenu);
+       cleanup();
+
        return 0;
 }
 
        return 0;
 }
 
@@ -254,8 +257,12 @@ allocitem(const char *label, const char *output)
        } else {
                if ((item->label = strdup(label)) == NULL)
                        err(1, "strdup");
        } else {
                if ((item->label = strdup(label)) == NULL)
                        err(1, "strdup");
-               if ((item->output = strdup(output)) == NULL)
-                       err(1, "strdup");
+               if (label == output) {
+                       item->output = item->label;
+               } else {
+                       if ((item->output = strdup(output)) == NULL)
+                               err(1, "strdup");
+               }
        }
        item->y = 0;
        item->h = item->label ? geom.itemh : geom.separator;
        }
        item->y = 0;
        item->h = item->label ? geom.itemh : geom.separator;
@@ -818,7 +825,8 @@ freemenu(struct Menu *menu)
                        freemenu(item->submenu);
                tmp = item;
                item = item->next;
                        freemenu(item->submenu);
                tmp = item;
                item = item->next;
-               free(tmp->label);
+               if (tmp->label != tmp->output)
+                       free(tmp->label);
                free(tmp->output);
                free(tmp);
        }
                free(tmp->output);
                free(tmp);
        }
@@ -831,13 +839,11 @@ freemenu(struct Menu *menu)
 
 /* cleanup and exit */
 static void
 
 /* cleanup and exit */
 static void
-cleanup(struct Menu *rootmenu)
+cleanup(void)
 {
        XUngrabPointer(dpy, CurrentTime);
        XUngrabKeyboard(dpy, CurrentTime);
 
 {
        XUngrabPointer(dpy, CurrentTime);
        XUngrabKeyboard(dpy, CurrentTime);
 
-       freemenu(rootmenu);
-
        XftColorFree(dpy, visual, colormap, &dc.normal[ColorBG]);
        XftColorFree(dpy, visual, colormap, &dc.normal[ColorFG]);
        XftColorFree(dpy, visual, colormap, &dc.selected[ColorBG]);
        XftColorFree(dpy, visual, colormap, &dc.normal[ColorBG]);
        XftColorFree(dpy, visual, colormap, &dc.normal[ColorFG]);
        XftColorFree(dpy, visual, colormap, &dc.selected[ColorBG]);