dmenu

my dmenu build
Log | Files | Refs | README | LICENSE

dmenu-prefixcompletion-4.9.diff (2606B)


      1 From 2874b35e41a85731df8c7583f76c71eb249d3dfd Mon Sep 17 00:00:00 2001
      2 From: Felix Van der Jeugt <felix.vanderjeugt@gmail.com>
      3 Date: Wed, 19 Oct 2016 22:18:21 +0200
      4 Subject: [PATCH] tabcomplete with longest common prefix
      5 
      6 when hitting tab, the current input will be set to the longest common prefix
      7 of the current selection instead of the first item of the selection
      8 ---
      9  dmenu.c | 32 ++++++++++++++------------------
     10  1 file changed, 14 insertions(+), 18 deletions(-)
     11 
     12 diff --git a/dmenu.c b/dmenu.c
     13 index f803149..4bb1c23 100644
     14 --- a/dmenu.c
     15 +++ b/dmenu.c
     16 @@ -219,7 +219,7 @@ match(void)
     17  	char buf[sizeof text], *s;
     18  	int i, tokc = 0;
     19  	size_t len, textsize;
     20 -	struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
     21 +	struct item *item, *lprefix, *prefixend;
     22  
     23  	strcpy(buf, text);
     24  	/* separate input text into tokens to be matched individually */
     25 @@ -228,8 +228,8 @@ match(void)
     26  			die("cannot realloc %u bytes:", tokn * sizeof *tokv);
     27  	len = tokc ? strlen(tokv[0]) : 0;
     28  
     29 -	matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
     30 -	textsize = strlen(text) + 1;
     31 +	matches = lprefix = matchend = prefixend = NULL;
     32 +	textsize = strlen(text);
     33  	for (item = items; item && item->text; item++) {
     34  		for (i = 0; i < tokc; i++)
     35  			if (!fstrstr(item->text, tokv[i]))
     36 @@ -241,8 +241,6 @@ match(void)
     37  			appenditem(item, &matches, &matchend);
     38  		else if (!fstrncmp(tokv[0], item->text, len))
     39  			appenditem(item, &lprefix, &prefixend);
     40 -		else
     41 -			appenditem(item, &lsubstr, &substrend);
     42  	}
     43  	if (lprefix) {
     44  		if (matches) {
     45 @@ -252,14 +250,6 @@ match(void)
     46  			matches = lprefix;
     47  		matchend = prefixend;
     48  	}
     49 -	if (lsubstr) {
     50 -		if (matches) {
     51 -			matchend->right = lsubstr;
     52 -			lsubstr->left = matchend;
     53 -		} else
     54 -			matches = lsubstr;
     55 -		matchend = substrend;
     56 -	}
     57  	curr = sel = matches;
     58  	calcoffsets();
     59  }
     60 @@ -309,6 +299,7 @@ keypress(XKeyEvent *ev)
     61  {
     62  	char buf[32];
     63  	int len;
     64 +	struct item * item;
     65  	KeySym ksym;
     66  	Status status;
     67  
     68 @@ -487,12 +478,17 @@ insert:
     69  		}
     70  		break;
     71  	case XK_Tab:
     72 -		if (!sel)
     73 -			return;
     74 -		strncpy(text, sel->text, sizeof text - 1);
     75 +		if (!matches) break; /* cannot complete no matches */
     76 +		strncpy(text, matches->text, sizeof text - 1);
     77  		text[sizeof text - 1] = '\0';
     78 -		cursor = strlen(text);
     79 -		match();
     80 +		len = cursor = strlen(text); /* length of longest common prefix */
     81 +		for (item = matches; item && item->text; item = item->right) {
     82 +			cursor = 0;
     83 +			while (cursor < len && text[cursor] == item->text[cursor])
     84 +				cursor++;
     85 +			len = cursor;
     86 +		}
     87 +		memset(text + len, '\0', strlen(text) - len);
     88  		break;
     89  	}
     90  
     91 -- 
     92 2.20.1
     93