dmenu

dynamic menu
git clone git://git.suckless.org/dmenu
Log | Files | Refs | README | LICENSE

commit 724fe3cf7fc456db96bf10c2caeb7c307e529d73
parent 70cb32b021848255907ac0a4e3341f81f1d2ae24
Author: Anselm R. Garbe <garbeam@gmail.com>
Date:   Sun, 23 Sep 2007 18:26:41 +0200

applied Michał Janeczek dmenu patch, made dmenu match case-insensitive by default, added -i command line option to enable ido matching, added Michał to Copyright holders
Diffstat:
MLICENSE | 1+
Mconfig.mk | 2+-
Mdmenu.1 | 4++++
Mdmenu.c | 79+++++++++++++++++++++++++++++++++++++++----------------------------------------
4 files changed, 45 insertions(+), 41 deletions(-)

diff --git a/LICENSE b/LICENSE @@ -2,6 +2,7 @@ MIT/X Consortium License © 2006-2007 Anselm R. Garbe <garbeam at gmail dot com> © 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com> +© 2006-2007 Michał Janeczek <janeczek at gmail dot com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/config.mk b/config.mk @@ -1,5 +1,5 @@ # dmenu version -VERSION = 3.3 +VERSION = 3.4 # Customize below to fit your system diff --git a/dmenu.1 b/dmenu.1 @@ -4,6 +4,7 @@ dmenu \- dynamic menu .SH SYNOPSIS .B dmenu .RB [ \-b ] +.RB [ \-i ] .RB [ \-fn " <font>"] .RB [ \-nb " <color>"] .RB [ \-nf " <color>"] @@ -22,6 +23,9 @@ efficiently. .B \-b makes dmenu appear at the screen bottom (by default it appears at the screen top). .TP +.B \-i +makes dmenu match menu entries with ignoring intermediate characters. +.TP .B \-fn <font> defines the font. .TP diff --git a/dmenu.c b/dmenu.c @@ -37,9 +37,11 @@ struct Item { Item *next; /* traverses all items */ Item *left, *right; /* traverses items matching current search pattern */ char *text; + Bool matched; }; /* forward declarations */ +Item *appenditem(Item *i, Item *last); void calcoffsets(void); void cleanup(void); void drawmenu(void); @@ -55,7 +57,7 @@ void match(char *pattern); void readstdin(void); void run(void); void setup(Bool bottom); -int strido(const char *text, const char *pattern); +int strcaseido(const char *text, const char *pattern); unsigned int textnw(const char *text, unsigned int len); unsigned int textw(const char *text); @@ -77,6 +79,7 @@ unsigned int mw, mh; unsigned int promptw = 0; unsigned int nitem = 0; unsigned int numlockmask = 0; +Bool idomatch = False; Bool running = True; Display *dpy; DC dc = {0}; @@ -88,6 +91,20 @@ Item *prev = NULL; Item *curr = NULL; Window root, win; +Item * +appenditem(Item *i, Item *last) { + if(!last) + item = i; + else + last->right = i; + i->matched = True; + i->left = last; + i->right = NULL; + last = i; + nitem++; + return last; +} + void calcoffsets(void) { unsigned int tw, w; @@ -489,41 +506,21 @@ match(char *pattern) { item = j = NULL; nitem = 0; for(i = allitems; i; i=i->next) - if(!plen || !strncmp(pattern, i->text, plen)) { - if(!j) - item = i; - else - j->right = i; - i->left = j; - i->right = NULL; - j = i; - nitem++; - } - for(i = allitems; i; i=i->next) - if(plen && strncmp(pattern, i->text, plen) - && strstr(i->text, pattern)) { - if(!j) - item = i; - else - j->right = i; - i->left = j; - i->right = NULL; - j = i; - nitem++; - } - for(i = allitems; i; i=i->next) - if(plen && strncmp(pattern, i->text, plen) - && !strstr(i->text, pattern) - && strido(i->text,pattern)) { - if(!j) - item = i; - else - j->right = i; - i->left = j; - i->right = NULL; - j = i; - nitem++; - } + i->matched = False; + + for(i = allitems; i; i = i->next) + if(!i->matched && !strncasecmp(pattern, i->text, plen)) + j = appenditem(i,j); + + for (i = allitems; i; i = i->next) + if(!i->matched && strcasestr(i->text, pattern)) + j = appenditem(i, j); + + if(idomatch) + for (i = allitems; i; i = i->next) + if(!i->matched && strcaseido(i->text, pattern)) + j = appenditem(i, j); + curr = prev = next = sel = item; calcoffsets(); } @@ -629,9 +626,9 @@ setup(Bool bottom) { } int -strido(const char *text, const char *pattern) { +strcaseido(const char *text, const char *pattern) { for(; *text && *pattern; text++) - if (*text == *pattern) + if (tolower(*text) == tolower(*pattern)) pattern++; return !*pattern; } @@ -662,6 +659,8 @@ main(int argc, char *argv[]) { if(!strcmp(argv[i], "-b")) { bottom = True; } + else if(!strcmp(argv[i], "-i")) + idomatch = True; else if(!strcmp(argv[i], "-fn")) { if(++i < argc) font = argv[i]; } @@ -681,9 +680,9 @@ main(int argc, char *argv[]) { if(++i < argc) selfg = argv[i]; } else if(!strcmp(argv[i], "-v")) - eprint("dmenu-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk\n"); + eprint("dmenu-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk, Michał Janeczek\n"); else - eprint("usage: dmenu [-b] [-fn <font>] [-nb <color>] [-nf <color>]\n" + eprint("usage: dmenu [-b] [-i] [-fn <font>] [-nb <color>] [-nf <color>]\n" " [-p <prompt>] [-sb <color>] [-sf <color>] [-v]\n"); setlocale(LC_CTYPE, ""); dpy = XOpenDisplay(0);