fast grab patch (thanks Rob)
[dmenu.git] / dmenu.c
diff --git a/dmenu.c b/dmenu.c
index a24dfe3..2193f82 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -36,9 +36,8 @@ static void paste(void);
 static void readstdin(void);
 static void run(void);
 static void setup(void);
-static void usage(void);
 
-static char text[BUFSIZ];
+static char text[BUFSIZ] = "";
 static int bh, mw, mh;
 static int inputw = 0;
 static int lines = 0;
@@ -65,21 +64,24 @@ static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
 
 int
 main(int argc, char *argv[]) {
+       Bool fast = False;
        int i;
 
        progname = "dmenu";
        for(i = 1; i < argc; i++)
                /* single flags */
                if(!strcmp(argv[i], "-v")) {
-                       fputs("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n", stdout);
+                       fputs("dmenu-"VERSION", © 2006-2011 dmenu engineers, see LICENSE for details\n", stdout);
                        exit(EXIT_SUCCESS);
                }
                else if(!strcmp(argv[i], "-b"))
                        topbar = False;
                else if(!strcmp(argv[i], "-i"))
                        fstrncmp = strncasecmp;
+               else if(!strcmp(argv[i], "-f"))
+                       fast = True;
                else if(i == argc-1)
-                       usage();
+                       goto usage;
                /* double flags */
                else if(!strcmp(argv[i], "-l"))
                        lines = atoi(argv[++i]);
@@ -98,15 +100,27 @@ main(int argc, char *argv[]) {
                else if(!strcmp(argv[i], "-sf"))
                        selfgcolor = argv[++i];
                else
-                       usage();
+                       goto usage;
 
        dc = initdc();
        initfont(dc, font);
-       readstdin();
-       setup();
+
+       if(fast) {
+               setup();
+               readstdin();
+       }
+       else {
+               readstdin();
+               setup();
+       }
+       match();
        run();
+       return EXIT_FAILURE;
 
-       return EXIT_FAILURE;  /* should not reach */
+usage:
+       fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-m monitor] [-p prompt] [-fn font]\n"
+             "             [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
+       return EXIT_FAILURE;
 }
 
 void
@@ -223,7 +237,7 @@ keypress(XKeyEvent *ev) {
 
        len = strlen(text);
        XLookupString(ev, buf, sizeof buf, &ksym, NULL);
-       if(ev->state & ControlMask) {
+       if(ev->state & ControlMask)
                switch(tolower(ksym)) {
                default:
                        return;
@@ -277,7 +291,6 @@ keypress(XKeyEvent *ev) {
                        XConvertSelection(dc->dpy, XA_PRIMARY, utf8, utf8, win, CurrentTime);
                        return;
                }
-       }
        switch(ksym) {
        default:
                if(!iscntrl(*buf))
@@ -341,7 +354,6 @@ keypress(XKeyEvent *ev) {
        case XK_Return:
        case XK_KP_Enter:
                fputs((sel && !(ev->state & ShiftMask)) ? sel->text : text, stdout);
-               fflush(stdout);
                exit(EXIT_SUCCESS);
        case XK_Right:
                if(cursor < len) {
@@ -403,7 +415,7 @@ match(void) {
                else
                        matches = lsubstr;
        }
-       curr = prev = next = sel = matches;
+       curr = sel = matches;
        calcoffsets();
 }
 
@@ -438,11 +450,10 @@ readstdin(void) {
        for(end = &items; fgets(buf, sizeof buf, stdin); *end = item, end = &item->next) {
                if((p = strchr(buf, '\n')))
                        *p = '\0';
-               if(!(item = malloc(sizeof *item)))
-                       eprintf("cannot malloc %u bytes\n", sizeof *item);
+               if(!(item = calloc(1, sizeof *item)))
+                       eprintf("cannot malloc %u bytes:", sizeof *item);
                if(!(item->text = strdup(buf)))
-                       eprintf("cannot strdup %u bytes\n", strlen(buf)+1);
-               item->next = item->left = item->right = NULL;
+                       eprintf("cannot strdup %u bytes:", strlen(buf)+1);
                inputw = MAX(inputw, textw(dc, item->text));
        }
 }
@@ -530,13 +541,4 @@ setup(void) {
        inputw = MIN(inputw, mw/3);
        promptw = prompt ? textw(dc, prompt) : 0;
        XMapRaised(dc->dpy, win);
-       text[0] = '\0';
-       match();
-}
-
-void
-usage(void) {
-       fputs("usage: dmenu [-b] [-i] [-l lines] [-m monitor] [-p prompt] [-fn font]\n"
-             "             [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
-       exit(EXIT_FAILURE);
 }