move actions to end of main loop
authorphillbush <phillbush@cock.li>
Tue, 29 Dec 2020 22:40:17 +0000 (19:40 -0300)
committerphillbush <phillbush@cock.li>
Tue, 29 Dec 2020 22:40:17 +0000 (19:40 -0300)
xmenu.c
xmenu.h

diff --git a/xmenu.c b/xmenu.c
index 7ae7162..1515165 100644 (file)
--- a/xmenu.c
+++ b/xmenu.c
@@ -1150,13 +1150,15 @@ run(struct Menu *currmenu)
        struct Item *lastitem;
        KeySym ksym;
        XEvent ev;
        struct Item *lastitem;
        KeySym ksym;
        XEvent ev;
+       int action;
 
        mapmenu(currmenu);
        while (!XNextEvent(dpy, &ev)) {
 
        mapmenu(currmenu);
        while (!XNextEvent(dpy, &ev)) {
+               action = ACTION_NOP;
                switch(ev.type) {
                case Expose:
                        if (ev.xexpose.count == 0)
                switch(ev.type) {
                case Expose:
                        if (ev.xexpose.count == 0)
-                               drawmenus(currmenu);
+                               action = ACTION_DRAW;
                        break;
                case MotionNotify:
                        menu = getmenu(currmenu, ev.xbutton.window);
                        break;
                case MotionNotify:
                        menu = getmenu(currmenu, ev.xbutton.window);
@@ -1171,8 +1173,7 @@ run(struct Menu *currmenu)
                        } else {
                                currmenu = menu;
                        }
                        } else {
                                currmenu = menu;
                        }
-                       mapmenu(currmenu);
-                       drawmenus(currmenu);
+                       action = ACTION_MAP | ACTION_DRAW;
                        break;
                case ButtonRelease:
                        if (!isclickbutton(ev.xbutton.button))
                        break;
                case ButtonRelease:
                        if (!isclickbutton(ev.xbutton.button))
@@ -1190,9 +1191,8 @@ selectitem:
                                printf("%s\n", item->output);
                                return;
                        }
                                printf("%s\n", item->output);
                                return;
                        }
-                       mapmenu(currmenu);
                        currmenu->selected = currmenu->list;
                        currmenu->selected = currmenu->list;
-                       drawmenus(currmenu);
+                       action = ACTION_MAP | ACTION_DRAW;
                        break;
                case ButtonPress:
                        menu = getmenu(currmenu, ev.xbutton.window);
                        break;
                case ButtonPress:
                        menu = getmenu(currmenu, ev.xbutton.window);
@@ -1235,16 +1235,16 @@ selectitem:
                                   currmenu->parent != NULL) {
                                item = currmenu->parent->selected;
                                currmenu = currmenu->parent;
                                   currmenu->parent != NULL) {
                                item = currmenu->parent->selected;
                                currmenu = currmenu->parent;
-                               mapmenu(currmenu);
+                               action = ACTION_MAP;
                        } else
                                break;
                        currmenu->selected = item;
                        } else
                                break;
                        currmenu->selected = item;
-                       drawmenus(currmenu);
+                       action |= ACTION_DRAW;
                        break;
                case LeaveNotify:
                        previtem = NULL;
                        currmenu->selected = NULL;
                        break;
                case LeaveNotify:
                        previtem = NULL;
                        currmenu->selected = NULL;
-                       drawmenus(currmenu);
+                       action = ACTION_DRAW;
                        break;
                case ConfigureNotify:
                        menu = getmenu(currmenu, ev.xconfigure.window);
                        break;
                case ConfigureNotify:
                        menu = getmenu(currmenu, ev.xconfigure.window);
@@ -1261,9 +1261,13 @@ selectitem:
                        if (menu->parent == NULL)
                                return;     /* closing the root menu closes the program */
                        currmenu = menu->parent;
                        if (menu->parent == NULL)
                                return;     /* closing the root menu closes the program */
                        currmenu = menu->parent;
-                       mapmenu(currmenu);
+                       action = ACTION_MAP;
                        break;
                }
                        break;
                }
+               if (action & ACTION_MAP)
+                       mapmenu(currmenu);
+               if (action & ACTION_DRAW)
+                       drawmenus(currmenu);
        }
 }
 
        }
 }
 
diff --git a/xmenu.h b/xmenu.h
index 340ce24..ee420da 100644 (file)
--- a/xmenu.h
+++ b/xmenu.h
@@ -1,5 +1,10 @@
 #define PROGNAME "xmenu"
 
 #define PROGNAME "xmenu"
 
+/* Actions for the main loop */
+#define ACTION_NOP  0
+#define ACTION_MAP  1<<0
+#define ACTION_DRAW 1<<1
+
 /* enum for keyboard menu navigation */
 enum { ITEMPREV, ITEMNEXT, ITEMFIRST, ITEMLAST };
 
 /* enum for keyboard menu navigation */
 enum { ITEMPREV, ITEMNEXT, ITEMFIRST, ITEMLAST };