X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=main.c;h=27b28afa7f5a12081ef7153b62837b59b7fd0aa7;hb=5c0d28e4ff9909059ac1247aa71f9b1e906fea3a;hp=6ca043d685441b46f5ff1de4d12b33d8f2683d79;hpb=04eade6a767a4145388585f666c6d1628285e96d;p=dmenu.git diff --git a/main.c b/main.c index 6ca043d..27b28af 100644 --- a/main.c +++ b/main.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -40,8 +42,7 @@ static Window root; static Window win; static void -calcoffsets() -{ +calcoffsets(void) { unsigned int tw, w; if(!curr) @@ -69,8 +70,7 @@ calcoffsets() } static void -drawmenu() -{ +drawmenu(void) { Item *i; dc.x = 0; @@ -108,8 +108,7 @@ drawmenu() } static void -match(char *pattern) -{ +match(char *pattern) { unsigned int plen; Item *i, *j; @@ -149,8 +148,7 @@ match(char *pattern) } static void -kpress(XKeyEvent * e) -{ +kpress(XKeyEvent * e) { char buf[32]; int num, prev_nitem; unsigned int i, len; @@ -210,10 +208,8 @@ kpress(XKeyEvent * e) } break; case XK_Return: - if(e->state & ShiftMask) { - if(text) - fprintf(stdout, "%s", text); - } + if((e->state & ShiftMask) && text) + fprintf(stdout, "%s", text); else if(sel) fprintf(stdout, "%s", sel->text); else if(text) @@ -249,8 +245,7 @@ kpress(XKeyEvent * e) } static char * -readstdin() -{ +readstdin(void) { static char *maxname = NULL; char *p, buf[1024]; unsigned int len = 0, max = 0; @@ -287,19 +282,42 @@ Display *dpy; DC dc = {0}; int -main(int argc, char *argv[]) -{ +main(int argc, char *argv[]) { + char *font = FONT; char *maxname; - Item *i; + char *normbg = NORMBGCOLOR; + char *normfg = NORMFGCOLOR; + char *selbg = SELBGCOLOR; + char *selfg = SELFGCOLOR; + fd_set rd; + int i; + struct timeval timeout; + Item *itm; XEvent ev; XSetWindowAttributes wa; - if(argc == 2 && !strncmp("-v", argv[1], 3)) { - fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); - exit(EXIT_SUCCESS); - } - else if(argc != 1) - eprint("usage: dmenu [-v]\n"); + timeout.tv_usec = 0; + timeout.tv_sec = 3; + /* command line args */ + for(i = 1; i < argc; i++) + if(!strncmp(argv[i], "-font", 6)) + font = argv[++i]; + else if(!strncmp(argv[i], "-normbg", 8)) + normbg = argv[++i]; + else if(!strncmp(argv[i], "-normfg", 8)) + normfg = argv[++i]; + else if(!strncmp(argv[i], "-selbg", 7)) + selbg = argv[++i]; + else if(!strncmp(argv[i], "-selfg", 7)) + selfg = argv[++i]; + else if(!strncmp(argv[i], "-t", 3)) + timeout.tv_sec = atoi(argv[++i]); + else if(!strncmp(argv[i], "-v", 3)) { + fputs("dmenu-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout); + exit(EXIT_SUCCESS); + } + else + eprint("usage: dmenu [-font ] [-{norm,sel}{bg,fg} ] [-t ] [-v]\n", stdout); dpy = XOpenDisplay(0); if(!dpy) @@ -307,19 +325,27 @@ main(int argc, char *argv[]) screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); - maxname = readstdin(); - - /* grab as early as possible, but after reading all items!!! */ + /* Note, the select() construction allows to grab all keypresses as + * early as possible, to not loose them. But if there is no standard + * input supplied, we will make sure to exit after MAX_WAIT_STDIN + * seconds. This is convenience behavior for rapid typers. + */ while(XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime) != GrabSuccess) usleep(1000); + FD_ZERO(&rd); + FD_SET(STDIN_FILENO, &rd); + if(select(ConnectionNumber(dpy) + 1, &rd, NULL, NULL, &timeout) < 1) + goto UninitializedEnd; + maxname = readstdin(); + /* style */ - dc.sel[ColBG] = getcolor(SELBGCOLOR); - dc.sel[ColFG] = getcolor(SELFGCOLOR); - dc.norm[ColBG] = getcolor(NORMBGCOLOR); - dc.norm[ColFG] = getcolor(NORMFGCOLOR); - setfont(FONT); + dc.sel[ColBG] = getcolor(selbg); + dc.sel[ColFG] = getcolor(selfg); + dc.norm[ColBG] = getcolor(normbg); + dc.norm[ColFG] = getcolor(normfg); + setfont(font); wa.override_redirect = 1; wa.background_pixmap = ParentRelative; @@ -366,12 +392,11 @@ main(int argc, char *argv[]) } } - XUngrabKeyboard(dpy, CurrentTime); while(allitems) { - i = allitems->next; + itm = allitems->next; free(allitems->text); free(allitems); - allitems = i; + allitems = itm; } if(dc.font.set) XFreeFontSet(dpy, dc.font.set); @@ -380,6 +405,8 @@ main(int argc, char *argv[]) XFreePixmap(dpy, dc.drawable); XFreeGC(dpy, dc.gc); XDestroyWindow(dpy, win); +UninitializedEnd: + XUngrabKeyboard(dpy, CurrentTime); XCloseDisplay(dpy); return ret;