diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 12:56:34 +0300 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2014-04-12 12:56:34 +0300 |
commit | 9d867bea0c0fdd620d258ecf30e30b40e5dbe3b1 (patch) | |
tree | b511ba5f8a7922c84c55755749b4161d6c971789 /lib/filter.c | |
parent | 471046d1b2f9ee0a7f6ac3814a261ef67e218976 (diff) | |
download | bemenu-9d867bea0c0fdd620d258ecf30e30b40e5dbe3b1.tar.gz bemenu-9d867bea0c0fdd620d258ecf30e30b40e5dbe3b1.tar.bz2 bemenu-9d867bea0c0fdd620d258ecf30e30b40e5dbe3b1.zip |
Sort results like dmenu does.
Diffstat (limited to 'lib/filter.c')
-rw-r--r-- | lib/filter.c | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/lib/filter.c b/lib/filter.c index 85a0037..16e57a3 100644 --- a/lib/filter.c +++ b/lib/filter.c @@ -82,9 +82,11 @@ fail: * @param outHighlighted unsigned int reference to new outHighlighted item index. * @return Pointer to array of bmItem pointers. */ -bmItem** _bmFilterDmenuFun(bmMenu *menu, char addition, char* (*fstrstr)(const char *a, const char *b), unsigned int *outNmemb, unsigned int *outHighlighted) +bmItem** _bmFilterDmenuFun(bmMenu *menu, char addition, char* (*fstrstr)(const char *a, const char *b), int (*fstrncmp)(const char *a, const char *b, size_t len), unsigned int *outNmemb, unsigned int *outHighlighted) { assert(menu); + assert(fstrstr); + assert(fstrncmp); assert(outNmemb); assert(outHighlighted); *outNmemb = *outHighlighted = 0; @@ -110,8 +112,9 @@ bmItem** _bmFilterDmenuFun(bmMenu *menu, char addition, char* (*fstrstr)(const c bmItem *highlighted = bmMenuGetHighlightedItem(menu); - unsigned int i, f; - for (f = i = 0; i < itemsCount; ++i) { + size_t len = (tokc ? strlen(tokv[0]) : 0); + unsigned int i, f, e; + for (e = f = i = 0; i < itemsCount; ++i) { bmItem *item = items[i]; if (!item->text && tokc != 0) continue; @@ -126,7 +129,19 @@ bmItem** _bmFilterDmenuFun(bmMenu *menu, char addition, char* (*fstrstr)(const c if (item == highlighted) *outHighlighted = f; - filtered[f++] = item; + if (tokc && item->text && !fstrncmp(tokv[0], item->text, len + 1)) { /* exact matches */ + //memmove(&filtered[e + 1], &filtered[e], (f - e) * sizeof(bmItem*)); + memmove(&filtered[1], filtered, f * sizeof(bmItem*)); + filtered[0] = item; + e++; /* where do exact matches end */ + } else if (tokc && item->text && !fstrncmp(tokv[0], item->text, len)) { /* prefixes */ + memmove(&filtered[e + 1], &filtered[e], (f - e) * sizeof(bmItem*)); + filtered[e] = item; + e++; /* where do exact matches end */ + } else { + filtered[f] = item; + } + f++; /* where do all matches end */ } if (buffer) @@ -155,7 +170,7 @@ fail: */ bmItem** _bmFilterDmenu(bmMenu *menu, char addition, unsigned int *outNmemb, unsigned int *outHighlighted) { - return _bmFilterDmenuFun(menu, addition, strstr, outNmemb, outHighlighted); + return _bmFilterDmenuFun(menu, addition, strstr, strncmp, outNmemb, outHighlighted); } /** @@ -169,7 +184,7 @@ bmItem** _bmFilterDmenu(bmMenu *menu, char addition, unsigned int *outNmemb, uns */ bmItem** _bmFilterDmenuCaseInsensitive(bmMenu *menu, char addition, unsigned int *outNmemb, unsigned int *outHighlighted) { - return _bmFilterDmenuFun(menu, addition, _bmStrupstr, outNmemb, outHighlighted); + return _bmFilterDmenuFun(menu, addition, _bmStrupstr, _bmStrnupcmp, outNmemb, outHighlighted); } /* vim: set ts=8 sw=4 tw=0 :*/ |