Hello and thanks everyone. As part of a project to create a simple and fast music player interface, I patched dmenu to allow it to return all matching items instead of just the one at the cursor. dmenu is the browsing interface; and there is another mode of operation that takes keywords as hints for a partial match on filenames. The items then get loaded into a mpc/mpd playlist with a shell script. See http://github.com/dbro/muss for that code.
Why is this patch of interest? I call it "filtermode" because it uses dmenu to generate a list of matches, with interactivity similar to the trendy "instant" style of searching. For applications working with sets of items, this method could be faster than the existing dmenu-multiselect patch, in that it doesn't require the user to manually select each item they want. The basis for the patch is dmenu v4.1.1 . Suggestions, comments welcome. Dan ------ --- dmenu.c 2010-11-09 11:58:12.000000000 -0800 +++ dmenu.c 2010-11-09 13:10:54.000000000 -0800 @@ -98,6 +98,7 @@ static unsigned int numlockmask = 0; static Bool running = True; static Bool xmms = False; +static Bool filtermode = False; static Display *dpy; static DC dc; static Item *allitems = NULL; /* first of all items */ @@ -620,6 +621,12 @@ case XK_Return: if((e->state & ShiftMask) || !sel) fprintf(stdout, "%s", text); + else if(filtermode) { + for(Item *i=sel; i; i=i->right) + fprintf(stdout, "%s\n", i->text); + for(Item *i=item; i&&(i!=sel); i=i->right) + fprintf(stdout, "%s\n", i->text); + } else fprintf(stdout, "%s", sel->text); fflush(stdout); @@ -939,10 +946,12 @@ } else if(!strcmp(argv[i], "-xs")) xmms = True; + else if(!strcmp(argv[i], "-f")) + filtermode = True; else if(!strcmp(argv[i], "-v")) eprint("dmenu-"VERSION", © 2006-2010 dmenu engineers, see LICENSE for details\n"); else - eprint("usage: dmenu [-i] [-b] [-e <xid>] [-l <lines>] [-fn <font>] [-fa <xftfont>] [-nb <color>]\n" + eprint("usage: dmenu [-i] [-b] [-e <xid>] [-f] [-l <lines>] [-fn <font>] [-fa <xftfont>] [-nb <color>]\n" " [-nf <color>] [-p <prompt>] [-sb <color>] [-sf <color>] [-xs] [-v]\n"); if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "warning: no locale support\n"); --- dmenu.1 2010-11-09 08:11:29.000000000 -0800 +++ dmenu.1 2010-11-09 13:14:06.000000000 -0800 @@ -6,6 +6,7 @@ .RB [ \-i ] .RB [ \-b ] .RB [ \-l " <lines>"] +.RB [ \-f ] .RB [ \-fn " <font>"] .RB [ \-nb " <color>"] .RB [ \-nf " <color>"] @@ -32,6 +33,10 @@ activates vertical list mode. The given number of lines will be displayed. Window height will get adjusted. .TP +.B \-f +activates filter mode. +All matching items currently shown in the list will be selected, starting with the item that is highlighted and wrapping around to the beginning of the list. +.TP .B \-fn <font> defines the font. .TP