summaryrefslogtreecommitdiff
path: root/lib/filter.c
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-04-12 12:56:34 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-04-12 12:56:34 +0300
commit9d867bea0c0fdd620d258ecf30e30b40e5dbe3b1 (patch)
treeb511ba5f8a7922c84c55755749b4161d6c971789 /lib/filter.c
parent471046d1b2f9ee0a7f6ac3814a261ef67e218976 (diff)
downloadbemenu-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.c27
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 :*/