On Wed, 10 Nov 2010 21:25:09 -0800
Dan Brown <danbr...@gmail.com> wrote:

> 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
> 

Cool. it's a bit like interactive grep :)

Dieter

Reply via email to