[CONTACT]

[ABOUT]

[POLICY]

git clone dmenu dmenu Log gph

Found at: gopher.r-36.net:70/scm/dmenu/commit/d9c24564d2f46312a9ed94539e0299a9859e87d9.gph

tatexit cleanup - dmenu - Dmenu fork with xft fonts.

git clone git://r-36.net/dmenu

Log

Files

Refs

README

LICENSE

---

commit d9c24564d2f46312a9ed94539e0299a9859e87d9

parent 6ba5103df4552a330ba29fdac88ae3a2897b94cf

Author: Connor Lane Smith

Date:   Fri,  2 Jul 2010 03:44:01 +0100
atexit cleanup
Diffstat:
  dinput.c                            |      35 +++++++++++++------------------
  dmenu.c                             |      47 ++++++++++++++-----------------
2 files changed, 36 insertions(+), 46 deletions(-)
---

diff --git a/dinput.c b/dinput.c

t@@ -26,7 +26,7 @@ static void drawinput(void);
 static Bool grabkeyboard(void);
 static void kpress(XKeyEvent *e);
 static void run(void);
-static void setup(Bool topbar);
+static void setup(void);
 #include "config.h"
t@@ -34,14 +34,13 @@ static void setup(Bool topbar);
 static char *prompt = NULL;
 static char text[4096];
 static int promptw = 0;
-static int ret = 0;
 static int screen;
 static unsigned int cursor = 0;
 static unsigned int numlockmask = 0;
 static unsigned int mw, mh;
 static unsigned long normcol[ColLast];
 static unsigned long selcol[ColLast];
-static Bool running = True;
+static Bool topbar = True;
 static DC dc;
 static Display *dpy;
 static Window win, root;
t@@ -51,6 +50,7 @@ cleanup(void) {
         cleanupdraw(&dc);
         XDestroyWindow(dpy, win);
         XUngrabKeyboard(dpy, CurrentTime);
+        XCloseDisplay(dpy);
 }
 void
t@@ -81,7 +81,6 @@ drawinput(void)
         drawtext(&dc, *text ? text : NULL, normcol, False);
         drawcursor();
         XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
-        XFlush(dpy);
 }
 Bool
t@@ -200,9 +199,7 @@ kpress(XKeyEvent *e) {
                 cursor = len;
                 break;
         case XK_Escape:
-                ret = 1;
-                running = False;
-                return;
+                exit(EXIT_FAILURE);
         case XK_Home:
                 cursor = 0;
                 break;
t@@ -214,8 +211,7 @@ kpress(XKeyEvent *e) {
         case XK_Return:
                 fprintf(stdout, "%s", text);
                 fflush(stdout);
-                running = False;
-                return;
+                exit(EXIT_SUCCESS);
         case XK_Right:
                 if(cursor == len)
                         return;
t@@ -230,7 +226,8 @@ run(void) {
         XEvent ev;
         /* main event loop */
-        while(running && !XNextEvent(dpy, &ev))
+        XSync(dpy, False);
+        while(!XNextEvent(dpy, &ev))
                 switch(ev.type) {
                 case KeyPress:
                         kpress(&ev.xkey);
t@@ -240,14 +237,15 @@ run(void) {
                                 drawinput();
                         break;
                 case VisibilityNotify:
-                        if (ev.xvisibility.state != VisibilityUnobscured)
+                        if(ev.xvisibility.state != VisibilityUnobscured)
                                 XRaiseWindow(dpy, win);
                         break;
                 }
+        exit(EXIT_FAILURE);
 }
 void
-setup(Bool topbar) {
+setup(void) {
         int i, j, x, y;
 #if XINERAMA
         int n;
t@@ -320,7 +318,6 @@ setup(Bool topbar) {
 int
 main(int argc, char *argv[]) {
         unsigned int i;
-        Bool topbar = True;
         /* command line args */
         progname = "dinput";
t@@ -364,15 +361,13 @@ main(int argc, char *argv[]) {
                 fprintf(stderr, "dinput: warning: no locale support\n");
         if(!(dpy = XOpenDisplay(NULL)))
                 eprint("cannot open display\n");
+        if(atexit(&cleanup) != 0)
+                eprint("cannot register cleanup\n");
         screen = DefaultScreen(dpy);
         root = RootWindow(dpy, screen);
-        running = grabkeyboard();
-        setup(topbar);
-        drawinput();
-        XSync(dpy, False);
+        grabkeyboard();
+        setup();
         run();
-        cleanup();
-        XCloseDisplay(dpy);
-        return ret;
+        return 0;
 }

diff --git a/dmenu.c b/dmenu.c

t@@ -36,7 +36,7 @@ static void dinput(void);
 static void drawmenu(void);
 static void drawmenuh(void);
 static void drawmenuv(void);
-static Bool grabkeyboard(void);
+static void grabkeyboard(void);
 static void kpress(XKeyEvent *e);
 static void match(char *pattern);
 static void readstdin(void);
t@@ -52,14 +52,12 @@ static char *prompt = NULL;
 static char text[4096];
 static int cmdw = 0;
 static int promptw = 0;
-static int ret = 0;
 static int screen;
 static unsigned int lines = 0;
 static unsigned int numlockmask = 0;
 static unsigned int mw, mh;
 static unsigned long normcol[ColLast];
 static unsigned long selcol[ColLast];
-static Bool running = True;
 static Bool topbar = True;
 static DC dc;
 static Display *dpy;
t@@ -87,15 +85,15 @@ appenditem(Item *i, Item **list, Item **last) {
 void
 calcoffsetsh(void) {
-        unsigned int w;
+        unsigned int x;
-        w = promptw + cmdw + (2 * spaceitem);
+        x = promptw + cmdw + (2 * spaceitem);
         for(next = curr; next; next = next->right)
-                if((w += MIN(textw(&dc, next->text), mw / 3)) > mw)
+                if((x += MIN(textw(&dc, next->text), mw / 3)) > mw)
                         break;
-        w = promptw + cmdw + (2 * spaceitem);
+        x = promptw + cmdw + (2 * spaceitem);
         for(prev = curr; prev && prev->left; prev = prev->left)
-                if((w += MIN(textw(&dc, prev->left->text), mw / 3)) > mw)
+                if((x += MIN(textw(&dc, prev->left->text), mw / 3)) > mw)
                         break;
 }
t@@ -146,6 +144,7 @@ cleanup(void) {
         cleanupdraw(&dc);
         XDestroyWindow(dpy, win);
         XUngrabKeyboard(dpy, CurrentTime);
+        XCloseDisplay(dpy);
 }
 void
t@@ -182,7 +181,6 @@ drawmenu(void) {
         else if(curr)
                 drawmenuh();
         XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0);
-        XFlush(dpy);
 }
 void
t@@ -219,7 +217,7 @@ drawmenuv(void) {
         XMoveResizeWindow(dpy, win, wa.x, wa.y + (topbar ? 0 : wa.height - mh), mw, mh);
 }
-Bool
+void
 grabkeyboard(void) {
         unsigned int len;
t@@ -229,7 +227,8 @@ grabkeyboard(void) {
                         break;
                 usleep(1000);
         }
-        return len > 0;
+        if(!len)
+                exit(EXIT_FAILURE);
 }
 void
t@@ -326,9 +325,7 @@ kpress(XKeyEvent *e) {
                         sel = sel->right;
                 break;
         case XK_Escape:
-                ret = 1;
-                running = False;
-                return;
+                exit(EXIT_FAILURE);
         case XK_Home:
                 sel = curr = item;
                 calcoffsets();
t@@ -360,8 +357,7 @@ kpress(XKeyEvent *e) {
                         dinput();
                 fprintf(stdout, "%s", sel ? sel->text : text);
                 fflush(stdout);
-                running = False;
-                return;
+                exit(EXIT_SUCCESS);
         case XK_Right:
         case XK_Down:
                 if(!sel || !sel->right)
t@@ -454,7 +450,8 @@ run(void) {
         XEvent ev;
         /* main event loop */
-        while(running && !XNextEvent(dpy, &ev))
+        XSync(dpy, False);
+        while(!XNextEvent(dpy, &ev))
                 switch(ev.type) {
                 case KeyPress:
                         kpress(&ev.xkey);
t@@ -464,10 +461,11 @@ run(void) {
                                 drawmenu();
                         break;
                 case VisibilityNotify:
-                        if (ev.xvisibility.state != VisibilityUnobscured)
+                        if(ev.xvisibility.state != VisibilityUnobscured)
                                 XRaiseWindow(dpy, win);
                         break;
                 }
+        exit(EXIT_FAILURE);
 }
 void
t@@ -586,13 +584,15 @@ main(int argc, char *argv[]) {
                 }
                 else {
                         fputs("usage: dmenu [-i] [-b] [-l ] [-fn ] [-nb ]\n"
-                               "             [-nf ] [-p ] [-sb ] [-sf ] [-v]\n", stderr);
+                              "             [-nf ] [-p ] [-sb ] [-sf ] [-v]\n", stderr);
                         exit(EXIT_FAILURE);
                 }
         if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
                 fprintf(stderr, "dmenu: warning: no locale support\n");
         if(!(dpy = XOpenDisplay(NULL)))
                 eprint("cannot open display\n");
+        if(atexit(&cleanup) != 0)
+                eprint("cannot register cleanup\n");
         screen = DefaultScreen(dpy);
         root = RootWindow(dpy, screen);
         if(!(argp = malloc(sizeof *argp * (argc+2))))
t@@ -600,13 +600,8 @@ main(int argc, char *argv[]) {
         memcpy(argp + 2, argv + 1, sizeof *argp * argc);
         readstdin();
-        running = grabkeyboard();
-
+        grabkeyboard();
         setup();
-        drawmenu();
-        XSync(dpy, False);
         run();
-        cleanup();
-        XCloseDisplay(dpy);
-        return ret;
+        return 0;
 }
.


AD: