Re: Re : [dev] dmenu : auto confirm when only one item remains

From: Donald Chai <donald.chai_AT_gmail.com>
Date: Thu, 13 Aug 2009 11:58:43 -0700

On Aug 13, 2009, at 10:05 AM, Julien Steinhauser wrote:

> Julien Steinhauser a écrit :
>>
>>> IMO very bad idea. If you do that you won't be able to run command
>>> with arguments (eg. urxvt -e irssi).
>>>
>>> Regards,
>>> Slawek.
>>
>> You're right, but dmenu is small enough to have several version in /
>> usr/local/bin.
>> At the moment, I've one with Fresch patch for vertical display and
>> xmms like matching,
>> for mpd playlist and uzbl history and bookmarks, one brand new with
>> autoconfirmation
>> to surf in my directories faster than in shell and launching
>> personnal scripts
>> which don't need arguments, and a little script to launch terminal
>> apps direct from dmenu,
>> which is a copy of dmenu_run in which I've added urxvtc -e beetween
>> "exec" and "$exe".
>>
> Actually, you're not really right, when I tried my new dmenu
> yesterday,
> it had :
> 1) the patch to autoconfirm when only one item remains
>
> AND
>
> 2) the patch to make it auto confirm on exact matching,
> that I had found yesterday and just tested before I post my first
> message.
>
> With the second one, it was obviously not possible to give dmenu an
> argument.
> Now the second one is removed, I just keep going with the proposal
> below
> that Donald Chai made to me, which works great!

I'm glad it works well for you, this minor change should work for
matching on substrings as well:

diff -r 9b203c5c180d dmenu.c
--- a/dmenu.c Sat Apr 18 12:50:12 2009 +0100
+++ b/dmenu.c Thu Aug 13 11:24:18 2009 -0700
@@ -69,6 +69,7 @@
  /* variables */
  static char *maxname = NULL;
  static char *prompt = NULL;
+static Bool autoconfirm = False;
  static char text[4096];
  static int cmdw = 0;
  static int promptw = 0;
@@ -514,6 +515,12 @@
          }
          curr = prev = next = sel = item;
          calcoffsets();
+
+ if(autoconfirm && item && !item->right) {
+ fprintf(stdout, "%s", item->text);
+ fflush(stdout);
+ running = False;
+ }
  }

  void
@@ -674,6 +681,8 @@
                          fstrncmp = strncasecmp;
                          fstrstr = cistrstr;
                  }
+ else if(!strcmp(argv[i], "-a"))
+ autoconfirm = True;
                  else if(!strcmp(argv[i], "-b"))
                          topbar = False;
                  else if(!strcmp(argv[i], "-fn")) {

> To all people who have complained about such patch,
> as it could break their personnal scripts
> or complicate their life in making impossible
> adding arguments to dmenu,
>
> I guess you have done a confusion beetween "exact match
> autoconfirmation",
> which wasn't actually my request and "one remaining item
> autoconfirmation"
>
> With Donald's proposal, I can still give arguments to dmenu
> and none of my scripts are broken.

I think the argument against this patch is the following situation:
I run
        echo -e "opera\nxpdf" | dmenu -a
if I want to type "xpdf foo.pdf" to open foo.pdf, I can't. dmenu will
immediately output "xpdf" after I press 'x'.

To any detractors:
1) Please stop telling people what to do with their own computer.
2) I personally use dmenu only with a static list of X apps (a listing
of command-line apps from /bin is just clutter), so Julien's idea
works great for me, as the behavior is totally predictable.
3) We had a discussion on the list about program arguments, and the
conclusion was that bashrun is probably better suited for this case.

> #!/bin/sh
> cd /
> index=`ls -dU .*/ */ | dmenu -p $PWD`
> [ -z $index ]
> if [ $? = 1 ]; then
> cd $index && lsd ; else
> actions
> fi

FYI: I don't know if this is representative of your shell code, but
you can simplify it by using
        if [[ -n $index ]]; then
or
        if [[ "x$index" != "x" ]]; then
Received on Thu Aug 13 2009 - 18:58:43 UTC

This archive was generated by hypermail 2.2.0 : Sun Aug 16 2009 - 14:18:47 UTC