Print highlighted input text only on single match
authorQuentin Rameau <quinq@fifth.space>
Tue, 26 Jul 2016 10:48:23 +0000 (12:48 +0200)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Tue, 26 Jul 2016 16:29:42 +0000 (18:29 +0200)
When the input text fully matches a single item, do not draw the item
and highlight the input text to show that it matches an item in
opposition to regular input text not matching anything.

dmenu.c

diff --git a/dmenu.c b/dmenu.c
index 8e84fbd..b191486 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -130,7 +130,7 @@ drawmenu(void)
 {
        unsigned int curpos;
        struct item *item;
 {
        unsigned int curpos;
        struct item *item;
-       int x = 0, y = 0, w;
+       int x = 0, y = 0, w, inputscheme;
 
        drw_setscheme(drw, scheme[SchemeNorm]);
        drw_rect(drw, 0, 0, mw, mh, 1, 1);
 
        drw_setscheme(drw, scheme[SchemeNorm]);
        drw_rect(drw, 0, 0, mw, mh, 1, 1);
@@ -138,18 +138,27 @@ drawmenu(void)
        if (prompt && *prompt) {
                drw_setscheme(drw, scheme[SchemeSel]);
                x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0);
        if (prompt && *prompt) {
                drw_setscheme(drw, scheme[SchemeSel]);
                x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0);
+               x += 2;
        }
        /* draw input field */
        w = (lines > 0 || !matches) ? mw - x : inputw;
        }
        /* draw input field */
        w = (lines > 0 || !matches) ? mw - x : inputw;
-       drw_setscheme(drw, scheme[SchemeNorm]);
+       if (matches && !strcmp(text, curr->text))
+               inputscheme = SchemeSel;
+       else
+               inputscheme = SchemeNorm;
+       drw_setscheme(drw, scheme[inputscheme]);
+
        drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
 
        drw_font_getexts(drw->fonts, text, cursor, &curpos, NULL);
        if ((curpos += lrpad / 2 - 1) < w) {
        drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
 
        drw_font_getexts(drw->fonts, text, cursor, &curpos, NULL);
        if ((curpos += lrpad / 2 - 1) < w) {
-               drw_setscheme(drw, scheme[SchemeNorm]);
+               drw_setscheme(drw, scheme[inputscheme]);
                drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
        }
 
                drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
        }
 
+       if (inputscheme == SchemeSel)
+               goto drawmap;
+
        if (lines > 0) {
                /* draw vertical list */
                for (item = curr; item != next; item = item->right)
        if (lines > 0) {
                /* draw vertical list */
                for (item = curr; item != next; item = item->right)
@@ -171,6 +180,7 @@ drawmenu(void)
                        drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0);
                }
        }
                        drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0);
                }
        }
+drawmap:
        drw_map(drw, win, 0, 0, mw, mh);
 }
 
        drw_map(drw, win, 0, 0, mw, mh);
 }