# HG changeset patch # User Michal Janeczek # Date 1190487325 -7200 # Node ID adb817592f7269c9314d57d9becc5ab8e36b679f # Parent 41a58f68f67b4382b1a9c2f846061b1574b629f1 Fixed ignore case option. diff -r 41a58f68f67b -r adb817592f72 dmenu.1 --- a/dmenu.1 Sat Sep 22 09:12:50 2007 +0200 +++ b/dmenu.1 Sat Sep 22 20:55:25 2007 +0200 @@ -4,6 +4,7 @@ dmenu \- dynamic menu .SH SYNOPSIS .B dmenu .RB [ \-b ] +.RB [ \-c ] .RB [ \-fn " "] .RB [ \-nb " "] .RB [ \-nf " "] @@ -21,6 +22,9 @@ efficiently. .TP .B \-b makes dmenu appear at the screen bottom (by default it appears at the screen top). +.TP +.B \-c +makes dmenu match menu entries case-insensitively (by default it is case sensitive). .TP .B \-fn defines the font. diff -r 41a58f68f67b -r adb817592f72 dmenu.c --- a/dmenu.c Sat Sep 22 09:12:50 2007 +0200 +++ b/dmenu.c Sat Sep 22 20:55:25 2007 +0200 @@ -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,6 +57,7 @@ void readstdin(void); void readstdin(void); void run(void); void setup(Bool bottom); +int strcaseido(const char *text, const char *pattern); int strido(const char *text, const char *pattern); unsigned int textnw(const char *text, unsigned int len); unsigned int textw(const char *text); @@ -77,6 +80,7 @@ unsigned int promptw = 0; unsigned int promptw = 0; unsigned int nitem = 0; unsigned int numlockmask = 0; +Bool ignorecase = False; Bool running = True; Display *dpy; DC dc = {0}; @@ -87,6 +91,19 @@ Item *prev = NULL; 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) { @@ -489,41 +506,32 @@ 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(!plen || !strncmp(pattern, i->text, plen)) + j = appenditem(i,j); + if(ignorecase) + 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 && strstr(i->text, pattern)) + j = appenditem(i, j); + if(ignorecase) + for (i = allitems; i; i = i->next) + if(!i->matched && strcasestr(i->text, pattern)) + j = appenditem(i, j); + + for(i = allitems; i; i = i->next) + if(!i->matched && strido(i->text, pattern)) + j = appenditem(i, j); + if(ignorecase) + 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,6 +637,14 @@ setup(Bool bottom) { } int +strcaseido(const char *text, const char *pattern) { + for(; *text && *pattern; text++) + if (tolower(*text) == tolower(*pattern)) + pattern++; + return !*pattern; +} + +int strido(const char *text, const char *pattern) { for(; *text && *pattern; text++) if (*text == *pattern) @@ -662,6 +678,9 @@ main(int argc, char *argv[]) { if(!strcmp(argv[i], "-b")) { bottom = True; } + else if(!strcmp(argv[i], "-c")) { + ignorecase = True; + } else if(!strcmp(argv[i], "-fn")) { if(++i < argc) font = argv[i]; } @@ -683,7 +702,7 @@ main(int argc, char *argv[]) { else if(!strcmp(argv[i], "-v")) eprint("dmenu-"VERSION", © 2006-2007 Anselm R. Garbe, Sander van Dijk\n"); else - eprint("usage: dmenu [-b] [-fn ] [-nb ] [-nf ]\n" + eprint("usage: dmenu [-b] [-c] [-fn ] [-nb ] [-nf ]\n" " [-p ] [-sb ] [-sf ] [-v]\n"); setlocale(LC_CTYPE, ""); dpy = XOpenDisplay(0);