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
Received on Thu Nov 11 2010 - 06:25:09 CET
This archive was generated by hypermail 2.2.0 : Thu Nov 11 2010 - 06:36:02 CET