summaryrefslogtreecommitdiff
path: root/lib/menu.c
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2014-10-25 20:02:34 +0300
committerJari Vetoniemi <mailroxas@gmail.com>2014-10-25 20:02:34 +0300
commitd3db039136ad66d2c83c1c0fbf0964bfbb5afb16 (patch)
tree93af6d73ad168e0169183a9c4f625acd5492e08c /lib/menu.c
parent2820734ec01ad6d2e1a0611fa480c3dd533588c7 (diff)
downloadbemenu-d3db039136ad66d2c83c1c0fbf0964bfbb5afb16.tar.gz
bemenu-d3db039136ad66d2c83c1c0fbf0964bfbb5afb16.tar.bz2
bemenu-d3db039136ad66d2c83c1c0fbf0964bfbb5afb16.zip
Single line mode, color customization, etc..
Diffstat (limited to 'lib/menu.c')
-rw-r--r--lib/menu.c111
1 files changed, 107 insertions, 4 deletions
diff --git a/lib/menu.c b/lib/menu.c
index 594344c..43de830 100644
--- a/lib/menu.c
+++ b/lib/menu.c
@@ -1,10 +1,33 @@
#include "internal.h"
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
/**
+ * Default font.
+ */
+static const char *default_font = "Terminus";
+
+/**
+ * Default hexadecimal colors.
+ */
+static const char *default_colors[BM_COLOR_LAST] = {
+ "#121212", // BM_COLOR_BG
+ "#121212", // BM_COLOR_TITLE_BG
+ "#D81860", // BM_COLOR_TITLE_FG
+ "#121212", // BM_COLOR_FILTER_BG
+ "#CACACA", // BM_COLOR_FILTER_FG
+ "#121212", // BM_COLOR_ITEM_BG
+ "#CACACA", // BM_COLOR_ITEM_FG
+ "#121212", // BM_COLOR_HIGHLIGHTED_BG
+ "#D81860", // BM_COLOR_HIGHLIGHTED_FG
+ "#121212", // BM_COLOR_SELECTED_BG
+ "#D81860" // BM_COLOR_SELECTED_FG
+};
+
+/**
* Filter function map.
*/
static struct bm_item** (*filter_func[BM_FILTER_MODE_LAST])(struct bm_menu *menu, bool addition, uint32_t *out_nmemb) = {
@@ -51,12 +74,21 @@ bm_menu_new(const char *renderer, enum bm_prioritory prioritory)
break;
}
- if (!menu->renderer) {
- bm_menu_free(menu);
- return NULL;
- }
+ if (!menu->renderer)
+ goto fail;
+ if (!bm_menu_set_font(menu, NULL, 0))
+ goto fail;
+
+ for (uint32_t i = 0; i < BM_COLOR_LAST; ++i) {
+ if (!bm_menu_set_color(menu, i, NULL))
+ goto fail;
+ }
return menu;
+
+fail:
+ bm_menu_free(menu);
+ return NULL;
}
void
@@ -71,6 +103,11 @@ bm_menu_free(struct bm_menu *menu)
free(menu->filter);
free(menu->old_filter);
+ free(menu->font.name);
+
+ for (uint32_t i = 0; i < BM_COLOR_LAST; ++i)
+ free(menu->colors[i].hex);
+
bm_menu_free_items(menu);
free(menu);
}
@@ -130,6 +167,20 @@ bm_menu_get_filter_mode(const struct bm_menu *menu)
}
void
+bm_menu_set_lines(struct bm_menu *menu, uint32_t lines)
+{
+ assert(menu);
+ menu->lines = lines;
+}
+
+uint32_t
+bm_menu_get_lines(struct bm_menu *menu)
+{
+ assert(menu);
+ return menu->lines;
+}
+
+void
bm_menu_set_wrap(struct bm_menu *menu, bool wrap)
{
assert(menu);
@@ -165,6 +216,58 @@ bm_menu_get_title(const struct bm_menu *menu)
}
bool
+bm_menu_set_font(struct bm_menu *menu, const char *font, uint32_t size)
+{
+ assert(menu);
+
+ const char *nfont = (font ? font : default_font);
+
+ char *copy = NULL;
+ if (!(copy = bm_strdup(nfont)))
+ return false;
+
+ free(menu->font.name);
+ menu->font.name = copy;
+ menu->font.size = (size > 0 ? size : 12);
+ return true;
+}
+
+const char* bm_menu_get_font(const struct bm_menu *menu, uint32_t *out_size)
+{
+ assert(menu);
+ if (out_size) *out_size = menu->font.size;
+ return menu->font.name;
+}
+
+bool bm_menu_set_color(struct bm_menu *menu, enum bm_color color, const char *hex)
+{
+ assert(menu);
+
+ const char *nhex = (hex ? hex : default_colors[color]);
+
+ int32_t r, g, b;
+ if (sscanf(nhex,"#%2x%2x%2x", &r, &b, &g) != 3)
+ return false;
+
+ char *copy = NULL;
+ if (!(copy = bm_strdup(nhex)))
+ return false;
+
+ free(menu->colors[color].hex);
+ menu->colors[color].hex = copy;
+ menu->colors[color].r = r;
+ menu->colors[color].g = g;
+ menu->colors[color].b = b;
+ return true;
+}
+
+const char* bm_menu_get_color(const struct bm_menu *menu, enum bm_color color)
+{
+ assert(menu);
+ return menu->colors[color].hex;
+}
+
+bool
bm_menu_add_items_at(struct bm_menu *menu, struct bm_item *item, uint32_t index)
{
assert(menu);