summaryrefslogtreecommitdiff
path: root/lib/menu.c
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-04-10 22:02:47 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-04-10 22:02:47 +0300
commit45502a2fd994fdb10b77e4ac79c5f9fd8a8399e8 (patch)
tree3af00fb5ae08fd93e8bea828f6a85358751939f4 /lib/menu.c
parent05212f5e44571945b40f72ae70ec7012af85fe75 (diff)
downloadbemenu-45502a2fd994fdb10b77e4ac79c5f9fd8a8399e8.tar.gz
bemenu-45502a2fd994fdb10b77e4ac79c5f9fd8a8399e8.tar.bz2
bemenu-45502a2fd994fdb10b77e4ac79c5f9fd8a8399e8.zip
Proper filtering functions.
Diffstat (limited to 'lib/menu.c')
-rw-r--r--lib/menu.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/lib/menu.c b/lib/menu.c
index bf26c51..e9cf647 100644
--- a/lib/menu.c
+++ b/lib/menu.c
@@ -16,6 +16,11 @@ static void _bmMenuFilter(bmMenu *menu)
{
assert(menu);
+ if (!menu->items.list || menu->items.count <= 0) {
+ _bmItemListFreeList(&menu->filtered);
+ return;
+ }
+
unsigned int count, selected;
bmItem **filtered = filterFunc[menu->filterMode](menu, &count, &selected);
@@ -82,9 +87,6 @@ void bmMenuFree(bmMenu *menu)
if (menu->title)
free(menu->title);
- if (menu->filtered.list)
- free(menu->filtered.list);
-
bmMenuFreeItems(menu);
free(menu);
}
@@ -200,7 +202,13 @@ const char* bmMenuGetTitle(const bmMenu *menu)
int bmMenuAddItemAt(bmMenu *menu, bmItem *item, unsigned int index)
{
assert(menu);
- return _bmItemListAddItemAt(&menu->items, item, index);;
+
+ int ret = _bmItemListAddItemAt(&menu->items, item, index);
+
+ if (ret)
+ _bmMenuFilter(menu);
+
+ return ret;
}
/**
@@ -212,7 +220,12 @@ int bmMenuAddItemAt(bmMenu *menu, bmItem *item, unsigned int index)
*/
int bmMenuAddItem(bmMenu *menu, bmItem *item)
{
- return _bmItemListAddItem(&menu->items, item);
+ int ret = _bmItemListAddItem(&menu->items, item);
+
+ if (ret)
+ _bmMenuFilter(menu);
+
+ return ret;
}
/**
@@ -237,6 +250,7 @@ int bmMenuRemoveItemAt(bmMenu *menu, unsigned int index)
if (ret) {
_bmItemListRemoveItem(&menu->selection, item);
_bmItemListRemoveItem(&menu->filtered, item);
+ _bmMenuFilter(menu);
}
return ret;
@@ -260,6 +274,7 @@ int bmMenuRemoveItem(bmMenu *menu, bmItem *item)
if (ret) {
_bmItemListRemoveItem(&menu->selection, item);
_bmItemListRemoveItem(&menu->filtered, item);
+ _bmMenuFilter(menu);
}
return ret;
@@ -275,7 +290,9 @@ int bmMenuRemoveItem(bmMenu *menu, bmItem *item)
int bmMenuSetHighlightedIndex(bmMenu *menu, unsigned int index)
{
assert(menu);
- unsigned int itemsCount = (menu->filtered.list ? menu->filtered.count : menu->items.count);
+
+ unsigned int itemsCount;
+ bmMenuGetFilteredItems(menu, &itemsCount);
if (itemsCount <= index)
return 0;
@@ -376,6 +393,7 @@ int bmMenuSetItems(bmMenu *menu, const bmItem **items, unsigned int nmemb)
if (ret) {
_bmItemListFreeList(&menu->selection);
_bmItemListFreeList(&menu->filtered);
+ _bmMenuFilter(menu);
}
return ret;
@@ -410,7 +428,7 @@ bmItem** bmMenuGetFilteredItems(const bmMenu *menu, unsigned int *outNmemb)
{
assert(menu);
- if (menu->filtered.list)
+ if (strlen(menu->filter))
return _bmItemListGetItems(&menu->filtered, outNmemb);
return _bmItemListGetItems(&menu->items, outNmemb);
@@ -463,8 +481,11 @@ bmKey bmMenuGetKey(bmMenu *menu, unsigned int *outUnicode)
bmRunResult bmMenuRunWithKey(bmMenu *menu, bmKey key, unsigned int unicode)
{
assert(menu);
+
+ unsigned int itemsCount;
+ bmMenuGetFilteredItems(menu, &itemsCount);
+
char *oldFilter = _bmStrdup(menu->filter);
- unsigned int itemsCount = (menu->filtered.list ? menu->filtered.count : menu->items.count);
switch (key) {
case BM_KEY_LEFT: