diff options
author | Connor Lane Smith <cls@lubutu.com> | 2010-07-02 03:44:01 +0100 |
---|---|---|
committer | Connor Lane Smith <cls@lubutu.com> | 2010-07-02 03:44:01 +0100 |
commit | d9c24564d2f46312a9ed94539e0299a9859e87d9 (patch) | |
tree | 36b93f99cc67a2a67db0af3afa570e8bc178c064 | |
parent | 6ba5103df4552a330ba29fdac88ae3a2897b94cf (diff) |
atexit cleanup
-rw-r--r-- | dinput.c | 35 | ||||
-rw-r--r-- | dmenu.c | 47 |
2 files changed, 36 insertions, 46 deletions
@@ -26,7 +26,7 @@ static void drawinput(void); | |||
26 | static Bool grabkeyboard(void); | 26 | static Bool grabkeyboard(void); |
27 | static void kpress(XKeyEvent *e); | 27 | static void kpress(XKeyEvent *e); |
28 | static void run(void); | 28 | static void run(void); |
29 | static void setup(Bool topbar); | 29 | static void setup(void); |
30 | 30 | ||
31 | #include "config.h" | 31 | #include "config.h" |
32 | 32 | ||
@@ -34,14 +34,13 @@ static void setup(Bool topbar); | |||
34 | static char *prompt = NULL; | 34 | static char *prompt = NULL; |
35 | static char text[4096]; | 35 | static char text[4096]; |
36 | static int promptw = 0; | 36 | static int promptw = 0; |
37 | static int ret = 0; | ||
38 | static int screen; | 37 | static int screen; |
39 | static unsigned int cursor = 0; | 38 | static unsigned int cursor = 0; |
40 | static unsigned int numlockmask = 0; | 39 | static unsigned int numlockmask = 0; |
41 | static unsigned int mw, mh; | 40 | static unsigned int mw, mh; |
42 | static unsigned long normcol[ColLast]; | 41 | static unsigned long normcol[ColLast]; |
43 | static unsigned long selcol[ColLast]; | 42 | static unsigned long selcol[ColLast]; |
44 | static Bool running = True; | 43 | static Bool topbar = True; |
45 | static DC dc; | 44 | static DC dc; |
46 | static Display *dpy; | 45 | static Display *dpy; |
47 | static Window win, root; | 46 | static Window win, root; |
@@ -51,6 +50,7 @@ cleanup(void) { | |||
51 | cleanupdraw(&dc); | 50 | cleanupdraw(&dc); |
52 | XDestroyWindow(dpy, win); | 51 | XDestroyWindow(dpy, win); |
53 | XUngrabKeyboard(dpy, CurrentTime); | 52 | XUngrabKeyboard(dpy, CurrentTime); |
53 | XCloseDisplay(dpy); | ||
54 | } | 54 | } |
55 | 55 | ||
56 | void | 56 | void |
@@ -81,7 +81,6 @@ drawinput(void) | |||
81 | drawtext(&dc, *text ? text : NULL, normcol, False); | 81 | drawtext(&dc, *text ? text : NULL, normcol, False); |
82 | drawcursor(); | 82 | drawcursor(); |
83 | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | 83 | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); |
84 | XFlush(dpy); | ||
85 | } | 84 | } |
86 | 85 | ||
87 | Bool | 86 | Bool |
@@ -200,9 +199,7 @@ kpress(XKeyEvent *e) { | |||
200 | cursor = len; | 199 | cursor = len; |
201 | break; | 200 | break; |
202 | case XK_Escape: | 201 | case XK_Escape: |
203 | ret = 1; | 202 | exit(EXIT_FAILURE); |
204 | running = False; | ||
205 | return; | ||
206 | case XK_Home: | 203 | case XK_Home: |
207 | cursor = 0; | 204 | cursor = 0; |
208 | break; | 205 | break; |
@@ -214,8 +211,7 @@ kpress(XKeyEvent *e) { | |||
214 | case XK_Return: | 211 | case XK_Return: |
215 | fprintf(stdout, "%s", text); | 212 | fprintf(stdout, "%s", text); |
216 | fflush(stdout); | 213 | fflush(stdout); |
217 | running = False; | 214 | exit(EXIT_SUCCESS); |
218 | return; | ||
219 | case XK_Right: | 215 | case XK_Right: |
220 | if(cursor == len) | 216 | if(cursor == len) |
221 | return; | 217 | return; |
@@ -230,7 +226,8 @@ run(void) { | |||
230 | XEvent ev; | 226 | XEvent ev; |
231 | 227 | ||
232 | /* main event loop */ | 228 | /* main event loop */ |
233 | while(running && !XNextEvent(dpy, &ev)) | 229 | XSync(dpy, False); |
230 | while(!XNextEvent(dpy, &ev)) | ||
234 | switch(ev.type) { | 231 | switch(ev.type) { |
235 | case KeyPress: | 232 | case KeyPress: |
236 | kpress(&ev.xkey); | 233 | kpress(&ev.xkey); |
@@ -240,14 +237,15 @@ run(void) { | |||
240 | drawinput(); | 237 | drawinput(); |
241 | break; | 238 | break; |
242 | case VisibilityNotify: | 239 | case VisibilityNotify: |
243 | if (ev.xvisibility.state != VisibilityUnobscured) | 240 | if(ev.xvisibility.state != VisibilityUnobscured) |
244 | XRaiseWindow(dpy, win); | 241 | XRaiseWindow(dpy, win); |
245 | break; | 242 | break; |
246 | } | 243 | } |
244 | exit(EXIT_FAILURE); | ||
247 | } | 245 | } |
248 | 246 | ||
249 | void | 247 | void |
250 | setup(Bool topbar) { | 248 | setup(void) { |
251 | int i, j, x, y; | 249 | int i, j, x, y; |
252 | #if XINERAMA | 250 | #if XINERAMA |
253 | int n; | 251 | int n; |
@@ -320,7 +318,6 @@ setup(Bool topbar) { | |||
320 | int | 318 | int |
321 | main(int argc, char *argv[]) { | 319 | main(int argc, char *argv[]) { |
322 | unsigned int i; | 320 | unsigned int i; |
323 | Bool topbar = True; | ||
324 | 321 | ||
325 | /* command line args */ | 322 | /* command line args */ |
326 | progname = "dinput"; | 323 | progname = "dinput"; |
@@ -364,15 +361,13 @@ main(int argc, char *argv[]) { | |||
364 | fprintf(stderr, "dinput: warning: no locale support\n"); | 361 | fprintf(stderr, "dinput: warning: no locale support\n"); |
365 | if(!(dpy = XOpenDisplay(NULL))) | 362 | if(!(dpy = XOpenDisplay(NULL))) |
366 | eprint("cannot open display\n"); | 363 | eprint("cannot open display\n"); |
364 | if(atexit(&cleanup) != 0) | ||
365 | eprint("cannot register cleanup\n"); | ||
367 | screen = DefaultScreen(dpy); | 366 | screen = DefaultScreen(dpy); |
368 | root = RootWindow(dpy, screen); | 367 | root = RootWindow(dpy, screen); |
369 | 368 | ||
370 | running = grabkeyboard(); | 369 | grabkeyboard(); |
371 | setup(topbar); | 370 | setup(); |
372 | drawinput(); | ||
373 | XSync(dpy, False); | ||
374 | run(); | 371 | run(); |
375 | cleanup(); | 372 | return 0; |
376 | XCloseDisplay(dpy); | ||
377 | return ret; | ||
378 | } | 373 | } |
@@ -36,7 +36,7 @@ static void dinput(void); | |||
36 | static void drawmenu(void); | 36 | static void drawmenu(void); |
37 | static void drawmenuh(void); | 37 | static void drawmenuh(void); |
38 | static void drawmenuv(void); | 38 | static void drawmenuv(void); |
39 | static Bool grabkeyboard(void); | 39 | static void grabkeyboard(void); |
40 | static void kpress(XKeyEvent *e); | 40 | static void kpress(XKeyEvent *e); |
41 | static void match(char *pattern); | 41 | static void match(char *pattern); |
42 | static void readstdin(void); | 42 | static void readstdin(void); |
@@ -52,14 +52,12 @@ static char *prompt = NULL; | |||
52 | static char text[4096]; | 52 | static char text[4096]; |
53 | static int cmdw = 0; | 53 | static int cmdw = 0; |
54 | static int promptw = 0; | 54 | static int promptw = 0; |
55 | static int ret = 0; | ||
56 | static int screen; | 55 | static int screen; |
57 | static unsigned int lines = 0; | 56 | static unsigned int lines = 0; |
58 | static unsigned int numlockmask = 0; | 57 | static unsigned int numlockmask = 0; |
59 | static unsigned int mw, mh; | 58 | static unsigned int mw, mh; |
60 | static unsigned long normcol[ColLast]; | 59 | static unsigned long normcol[ColLast]; |
61 | static unsigned long selcol[ColLast]; | 60 | static unsigned long selcol[ColLast]; |
62 | static Bool running = True; | ||
63 | static Bool topbar = True; | 61 | static Bool topbar = True; |
64 | static DC dc; | 62 | static DC dc; |
65 | static Display *dpy; | 63 | static Display *dpy; |
@@ -87,15 +85,15 @@ appenditem(Item *i, Item **list, Item **last) { | |||
87 | 85 | ||
88 | void | 86 | void |
89 | calcoffsetsh(void) { | 87 | calcoffsetsh(void) { |
90 | unsigned int w; | 88 | unsigned int x; |
91 | 89 | ||
92 | w = promptw + cmdw + (2 * spaceitem); | 90 | x = promptw + cmdw + (2 * spaceitem); |
93 | for(next = curr; next; next = next->right) | 91 | for(next = curr; next; next = next->right) |
94 | if((w += MIN(textw(&dc, next->text), mw / 3)) > mw) | 92 | if((x += MIN(textw(&dc, next->text), mw / 3)) > mw) |
95 | break; | 93 | break; |
96 | w = promptw + cmdw + (2 * spaceitem); | 94 | x = promptw + cmdw + (2 * spaceitem); |
97 | for(prev = curr; prev && prev->left; prev = prev->left) | 95 | for(prev = curr; prev && prev->left; prev = prev->left) |
98 | if((w += MIN(textw(&dc, prev->left->text), mw / 3)) > mw) | 96 | if((x += MIN(textw(&dc, prev->left->text), mw / 3)) > mw) |
99 | break; | 97 | break; |
100 | } | 98 | } |
101 | 99 | ||
@@ -146,6 +144,7 @@ cleanup(void) { | |||
146 | cleanupdraw(&dc); | 144 | cleanupdraw(&dc); |
147 | XDestroyWindow(dpy, win); | 145 | XDestroyWindow(dpy, win); |
148 | XUngrabKeyboard(dpy, CurrentTime); | 146 | XUngrabKeyboard(dpy, CurrentTime); |
147 | XCloseDisplay(dpy); | ||
149 | } | 148 | } |
150 | 149 | ||
151 | void | 150 | void |
@@ -182,7 +181,6 @@ drawmenu(void) { | |||
182 | else if(curr) | 181 | else if(curr) |
183 | drawmenuh(); | 182 | drawmenuh(); |
184 | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); | 183 | XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, mw, mh, 0, 0); |
185 | XFlush(dpy); | ||
186 | } | 184 | } |
187 | 185 | ||
188 | void | 186 | void |
@@ -219,7 +217,7 @@ drawmenuv(void) { | |||
219 | XMoveResizeWindow(dpy, win, wa.x, wa.y + (topbar ? 0 : wa.height - mh), mw, mh); | 217 | XMoveResizeWindow(dpy, win, wa.x, wa.y + (topbar ? 0 : wa.height - mh), mw, mh); |
220 | } | 218 | } |
221 | 219 | ||
222 | Bool | 220 | void |
223 | grabkeyboard(void) { | 221 | grabkeyboard(void) { |
224 | unsigned int len; | 222 | unsigned int len; |
225 | 223 | ||
@@ -229,7 +227,8 @@ grabkeyboard(void) { | |||
229 | break; | 227 | break; |
230 | usleep(1000); | 228 | usleep(1000); |
231 | } | 229 | } |
232 | return len > 0; | 230 | if(!len) |
231 | exit(EXIT_FAILURE); | ||
233 | } | 232 | } |
234 | 233 | ||
235 | void | 234 | void |
@@ -326,9 +325,7 @@ kpress(XKeyEvent *e) { | |||
326 | sel = sel->right; | 325 | sel = sel->right; |
327 | break; | 326 | break; |
328 | case XK_Escape: | 327 | case XK_Escape: |
329 | ret = 1; | 328 | exit(EXIT_FAILURE); |
330 | running = False; | ||
331 | return; | ||
332 | case XK_Home: | 329 | case XK_Home: |
333 | sel = curr = item; | 330 | sel = curr = item; |
334 | calcoffsets(); | 331 | calcoffsets(); |
@@ -360,8 +357,7 @@ kpress(XKeyEvent *e) { | |||
360 | dinput(); | 357 | dinput(); |
361 | fprintf(stdout, "%s", sel ? sel->text : text); | 358 | fprintf(stdout, "%s", sel ? sel->text : text); |
362 | fflush(stdout); | 359 | fflush(stdout); |
363 | running = False; | 360 | exit(EXIT_SUCCESS); |
364 | return; | ||
365 | case XK_Right: | 361 | case XK_Right: |
366 | case XK_Down: | 362 | case XK_Down: |
367 | if(!sel || !sel->right) | 363 | if(!sel || !sel->right) |
@@ -454,7 +450,8 @@ run(void) { | |||
454 | XEvent ev; | 450 | XEvent ev; |
455 | 451 | ||
456 | /* main event loop */ | 452 | /* main event loop */ |
457 | while(running && !XNextEvent(dpy, &ev)) | 453 | XSync(dpy, False); |
454 | while(!XNextEvent(dpy, &ev)) | ||
458 | switch(ev.type) { | 455 | switch(ev.type) { |
459 | case KeyPress: | 456 | case KeyPress: |
460 | kpress(&ev.xkey); | 457 | kpress(&ev.xkey); |
@@ -464,10 +461,11 @@ run(void) { | |||
464 | drawmenu(); | 461 | drawmenu(); |
465 | break; | 462 | break; |
466 | case VisibilityNotify: | 463 | case VisibilityNotify: |
467 | if (ev.xvisibility.state != VisibilityUnobscured) | 464 | if(ev.xvisibility.state != VisibilityUnobscured) |
468 | XRaiseWindow(dpy, win); | 465 | XRaiseWindow(dpy, win); |
469 | break; | 466 | break; |
470 | } | 467 | } |
468 | exit(EXIT_FAILURE); | ||
471 | } | 469 | } |
472 | 470 | ||
473 | void | 471 | void |
@@ -586,13 +584,15 @@ main(int argc, char *argv[]) { | |||
586 | } | 584 | } |
587 | else { | 585 | else { |
588 | fputs("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>]\n" | 586 | fputs("usage: dmenu [-i] [-b] [-l <lines>] [-fn <font>] [-nb <color>]\n" |
589 | " [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n", stderr); | 587 | " [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n", stderr); |
590 | exit(EXIT_FAILURE); | 588 | exit(EXIT_FAILURE); |
591 | } | 589 | } |
592 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) | 590 | if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) |
593 | fprintf(stderr, "dmenu: warning: no locale support\n"); | 591 | fprintf(stderr, "dmenu: warning: no locale support\n"); |
594 | if(!(dpy = XOpenDisplay(NULL))) | 592 | if(!(dpy = XOpenDisplay(NULL))) |
595 | eprint("cannot open display\n"); | 593 | eprint("cannot open display\n"); |
594 | if(atexit(&cleanup) != 0) | ||
595 | eprint("cannot register cleanup\n"); | ||
596 | screen = DefaultScreen(dpy); | 596 | screen = DefaultScreen(dpy); |
597 | root = RootWindow(dpy, screen); | 597 | root = RootWindow(dpy, screen); |
598 | if(!(argp = malloc(sizeof *argp * (argc+2)))) | 598 | if(!(argp = malloc(sizeof *argp * (argc+2)))) |
@@ -600,13 +600,8 @@ main(int argc, char *argv[]) { | |||
600 | memcpy(argp + 2, argv + 1, sizeof *argp * argc); | 600 | memcpy(argp + 2, argv + 1, sizeof *argp * argc); |
601 | 601 | ||
602 | readstdin(); | 602 | readstdin(); |
603 | running = grabkeyboard(); | 603 | grabkeyboard(); |
604 | |||
605 | setup(); | 604 | setup(); |
606 | drawmenu(); | ||
607 | XSync(dpy, False); | ||
608 | run(); | 605 | run(); |
609 | cleanup(); | 606 | return 0; |
610 | XCloseDisplay(dpy); | ||
611 | return ret; | ||
612 | } | 607 | } |