tatexit cleanup - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d9c24564d2f46312a9ed94539e0299a9859e87d9
 (DIR) parent 6ba5103df4552a330ba29fdac88ae3a2897b94cf
 (HTM) Author: Connor Lane Smith <cls@lubutu.com>
       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(-)
       ---
 (DIR) 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;
        }
 (DIR) 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 <lines>] [-fn <font>] [-nb <color>]\n"
       -                               "             [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n", stderr);
       +                              "             [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-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;
        }