Attached are two diffs, my token patch updated to 4.4, and a bloat
patch ;) which provides everything you wanted.

cls
diff -r f6b31468f983 dmenu.c
--- a/dmenu.c	Sun Jul 24 20:04:58 2011 +0100
+++ b/dmenu.c	Sun Sep 11 22:36:01 2011 +0100
@@ -30,7 +30,8 @@
 static void grabkeyboard(void);
 static void insert(const char *str, ssize_t n);
 static void keypress(XKeyEvent *ev);
-static void match(Bool sub);
+static void matchstr(Bool sub);
+static void matchtok(Bool sub);
 static size_t nextrune(int inc);
 static void paste(void);
 static void readstdin(void);
@@ -61,6 +62,7 @@
 
 static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
 static char *(*fstrstr)(const char *, const char *) = strstr;
+static void (*match)(Bool) = matchstr;
 
 int
 main(int argc, char *argv[]) {
@@ -81,6 +83,8 @@
 			fstrncmp = strncasecmp;
 			fstrstr = cistrstr;
 		}
+		else if(!strcmp(argv[i], "-t"))
+			match = matchtok;
 		else if(i+1 == argc)
 			usage();
 		/* double flags */
@@ -362,7 +366,7 @@
 }
 
 void
-match(Bool sub) {
+matchstr(Bool sub) {
 	size_t len = strlen(text);
 	Item *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
 	Item *item, *lnext;
@@ -402,6 +406,33 @@
 	calcoffsets();
 }
 
+void
+matchtok(Bool sub) {
+	char buf[sizeof text];
+	char **tokv, *s;
+	int tokc, i;
+	Item *item, *end;
+
+	tokc = 0;
+	tokv = NULL;
+	strcpy(buf, text);
+	for(s = strtok(buf, " "); s; tokv[tokc-1] = s, s = strtok(NULL, " "))
+		if(!(tokv = realloc(tokv, ++tokc * sizeof *tokv)))
+			eprintf("cannot realloc %u bytes\n", tokc * sizeof *tokv);
+
+	matches = end = NULL;
+	for(item = items; item->text; item++) {
+		for(i = 0; i < tokc; i++)
+			if(!fstrstr(item->text, tokv[i]))
+				break;
+		if(i == tokc)
+			appenditem(item, &matches, &end);
+	}
+	free(tokv);
+	curr = prev = next = sel = matches;
+	calcoffsets();
+}
+
 size_t
 nextrune(int inc) {
 	ssize_t n;
@@ -532,7 +563,7 @@
 
 void
 usage(void) {
-	fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font]\n"
+	fputs("usage: dmenu [-b] [-f] [-i] [-t] [-l lines] [-p prompt] [-fn font]\n"
 	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
 	exit(EXIT_FAILURE);
 }
diff -r f6b31468f983 dmenu.c
--- a/dmenu.c	Sun Jul 24 20:04:58 2011 +0100
+++ b/dmenu.c	Sun Sep 11 22:44:05 2011 +0100
@@ -30,7 +30,8 @@
 static void grabkeyboard(void);
 static void insert(const char *str, ssize_t n);
 static void keypress(XKeyEvent *ev);
-static void match(Bool sub);
+static void matchstr(Bool sub);
+static void matchtok(Bool sub);
 static size_t nextrune(int inc);
 static void paste(void);
 static void readstdin(void);
@@ -51,8 +52,9 @@
 static const char *selfgcolor  = "#ffffff";
 static unsigned long normcol[ColLast];
 static unsigned long selcol[ColLast];
-static Atom utf8;
+static Atom utf8, clip;
 static Bool topbar = True;
+static Bool stable = False;
 static DC *dc;
 static Item *items = NULL;
 static Item *matches, *matchend;
@@ -61,6 +63,7 @@
 
 static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
 static char *(*fstrstr)(const char *, const char *) = strstr;
+static void (*match)(Bool) = matchstr;
 
 int
 main(int argc, char *argv[]) {
@@ -81,6 +84,10 @@
 			fstrncmp = strncasecmp;
 			fstrstr = cistrstr;
 		}
+		else if(!strcmp(argv[i], "-s"))
+			stable = True;
+		else if(!strcmp(argv[i], "-t"))
+			match = matchtok;
 		else if(i+1 == argc)
 			usage();
 		/* double flags */
@@ -257,6 +264,9 @@
 		case XK_u: /* delete left */
 			insert(NULL, 0 - cursor);
 			break;
+		case XK_v: /* paste clipboard */
+			XConvertSelection(dc->dpy, clip, utf8, utf8, win, CurrentTime);
+			return;
 		case XK_w: /* delete word */
 			while(cursor > 0 && text[nextrune(-1)] == ' ')
 				insert(NULL, nextrune(-1) - cursor);
@@ -362,7 +372,7 @@
 }
 
 void
-match(Bool sub) {
+matchstr(Bool sub) {
 	size_t len = strlen(text);
 	Item *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
 	Item *item, *lnext;
@@ -370,9 +380,9 @@
 	lexact = lprefix = lsubstr = exactend = prefixend = substrend = NULL;
 	for(item = sub ? matches : items; item && item->text; item = lnext) {
 		lnext = sub ? item->right : item + 1;
-		if(!fstrncmp(text, item->text, len + 1))
+		if(!stable && !fstrncmp(text, item->text, len + 1))
 			appenditem(item, &lexact, &exactend);
-		else if(!fstrncmp(text, item->text, len))
+		else if(!stable && !fstrncmp(text, item->text, len))
 			appenditem(item, &lprefix, &prefixend);
 		else if(fstrstr(item->text, text))
 			appenditem(item, &lsubstr, &substrend);
@@ -402,6 +412,33 @@
 	calcoffsets();
 }
 
+void
+matchtok(Bool sub) {
+	char buf[sizeof text];
+	char **tokv, *s;
+	int tokc, i;
+	Item *item, *end;
+
+	tokc = 0;
+	tokv = NULL;
+	strcpy(buf, text);
+	for(s = strtok(buf, " "); s; tokv[tokc-1] = s, s = strtok(NULL, " "))
+		if(!(tokv = realloc(tokv, ++tokc * sizeof *tokv)))
+			eprintf("cannot realloc %u bytes\n", tokc * sizeof *tokv);
+
+	matches = end = NULL;
+	for(item = items; item->text; item++) {
+		for(i = 0; i < tokc; i++)
+			if(!fstrstr(item->text, tokv[i]))
+				break;
+		if(i == tokc)
+			appenditem(item, &matches, &end);
+	}
+	free(tokv);
+	curr = prev = next = sel = matches;
+	calcoffsets();
+}
+
 size_t
 nextrune(int inc) {
 	ssize_t n;
@@ -485,6 +522,7 @@
 	selcol[ColFG]  = getcolor(dc, selfgcolor);
 
 	utf8 = XInternAtom(dc->dpy, "UTF8_STRING", False);
+	clip = XInternAtom(dc->dpy, "CLIPBOARD",   False);
 
 	/* menu geometry */
 	bh = dc->font.height + 2;
@@ -532,7 +570,7 @@
 
 void
 usage(void) {
-	fputs("usage: dmenu [-b] [-f] [-i] [-l lines] [-p prompt] [-fn font]\n"
+	fputs("usage: dmenu [-b] [-f] [-i] [-s] [-t] [-l lines] [-p prompt] [-fn font]\n"
 	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-v]\n", stderr);
 	exit(EXIT_FAILURE);
 }

Reply via email to