---
dmenu.1 | 8 ++++++++
dmenu.c | 17 ++++++++++++++---
2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/dmenu.1 b/dmenu.1
index 3b527c1..f98d0ff 100644
--- a/dmenu.1
+++ b/dmenu.1
_AT_@ -52,6 +52,14 @@ X until stdin reaches end\-of\-file.
.B \-i
dmenu matches menu items case insensitively.
.TP
+.B \-t
+Allow the use of Ctrl+Enter to select multiple entries. When using Ctrl+Enter
+to select multiple entries, pressing Ctrl+C or Escape will not cause dmenu to
+exit with a non-zero status if at least one item was selected.
+.TP
+.B \-T
+Same as as -t but does not reset the user input after a selection.
+.TP
.BI \-l " lines"
dmenu lists items vertically, with the given number of lines.
.TP
diff --git a/dmenu.c b/dmenu.c
index ef844b1..296d291 100644
--- a/dmenu.c
+++ b/dmenu.c
_AT_@ -17,6 +17,8 @@
* MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
+#define MULTI_SELECT 1
+#define MULTI_SELECT_NO_RESET 2
typedef struct Item Item;
struct Item {
_AT_@ -56,6 +58,7 @@ static Window win;
static XIC xic;
static int mon = -1;
static Bool print_if_unambiguous = False;
+static int multi_select_mode = 0;
#include "config.h"
_AT_@ -83,6 +86,10 @@ main(int argc, char *argv[]) {
fstrncmp = strncasecmp;
fstrstr = cistrstr;
}
+ else if(!strcmp(argv[i], "-t")) /* allow arbitrary number of selections */
+ multi_select_mode = MULTI_SELECT;
+ else if(!strcmp(argv[i], "-T")) /* Same as -t but do not clear prompt */
+ multi_select_mode = MULTI_SELECT_NO_RESET;
else if(i+1 == argc)
usage();
/* these options take one argument */
_AT_@ -335,7 +342,7 @@ keypress(XKeyEvent *ev) {
sel = matchend;
break;
case XK_Escape:
- exit(EXIT_FAILURE);
+ exit(sel->out ? EXIT_SUCCESS : EXIT_FAILURE);
case XK_Home:
if(sel == matches) {
cursor = 0;
_AT_@ -374,8 +381,12 @@ keypress(XKeyEvent *ev) {
case XK_KP_Enter:
print_selection:
puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
- if(!(ev->state & ControlMask))
+ if(!(ev->state & ControlMask) || !multi_select_mode)
exit(EXIT_SUCCESS);
+ if(multi_select_mode != MULTI_SELECT_NO_RESET) {
+ text[(cursor = 0)] = '\0';
+ match();
+ }
if(sel)
sel->out = True;
break;
_AT_@ -627,6 +638,6 @@ setup(void) {
void
usage(void) {
fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
- " [-nb color] [-nf color] [-sb color] [-sf color] [-v] [-a]\n", stderr);
+ " [-nb color] [-nf color] [-sb color] [-sf color] [-v] [-a] [-t] [-T]\n", stderr);
exit(EXIT_FAILURE);
}
--
1.7.10.4
--x+6KMIRAuhnl3hBn--
Received on Mon Sep 17 2001 - 00:00:00 CEST
This archive was generated by hypermail 2.3.0 : Mon Apr 13 2015 - 02:24:03 CEST