summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2015-01-18 02:07:30 +0200
committerJari Vetoniemi <mailroxas@gmail.com>2015-01-18 02:07:30 +0200
commitc2eabf2be13de14e0e57ad6374cceb049b8d03da (patch)
treee02e3fec7d30285d64824c681ff489eb69afaeea /lib
parentf2eaf599f6bb585d1a4921f37a073ed09c619de9 (diff)
downloadbemenu-c2eabf2be13de14e0e57ad6374cceb049b8d03da.tar.gz
bemenu-c2eabf2be13de14e0e57ad6374cceb049b8d03da.tar.bz2
bemenu-c2eabf2be13de14e0e57ad6374cceb049b8d03da.zip
Make scrollbar autohideable
Diffstat (limited to 'lib')
-rw-r--r--lib/bemenu.h29
-rw-r--r--lib/internal.h10
-rw-r--r--lib/menu.c6
-rw-r--r--lib/renderers/cairo.h15
-rw-r--r--lib/renderers/curses/curses.c7
5 files changed, 43 insertions, 24 deletions
diff --git a/lib/bemenu.h b/lib/bemenu.h
index b5598d0..4010683 100644
--- a/lib/bemenu.h
+++ b/lib/bemenu.h
@@ -135,6 +135,23 @@ enum bm_filter_mode {
};
/**
+ * Scrollbar display mode constants for bm_menu instance scrollbar.
+ *
+ * - @link ::bm_run_result BM_SCROLLBAR_ALWAYS @endlink means that scrollbar is not displayed.
+ * - @link ::bm_run_result BM_SCROLLBAR_ALWAYS @endlink means that scrollbar is displayed always.
+ * - @link ::bm_run_result BM_SCROLLBAR_AUTOHIDE @endlink means that scrollbar is only displayed when there are more items than lines.
+ *
+ * @link ::bm_scrollbar_mode BM_SCROLLBAR_LAST @endlink is provided for enumerating scrollbar modes.
+ * Using it as scrollbar mode however provides exactly same functionality as BM_SCROLLBAR_NONE.
+ */
+enum bm_scrollbar_mode {
+ BM_SCROLLBAR_NONE,
+ BM_SCROLLBAR_ALWAYS,
+ BM_SCROLLBAR_AUTOHIDE,
+ BM_SCROLLBAR_LAST,
+};
+
+/**
* Result constants from bm_menu_run_with_key function.
*
* - @link ::bm_run_result BM_RUN_RESULT_RUNNING @endlink means that menu is running and thus should be still renderer && ran.
@@ -389,20 +406,20 @@ bool bm_menu_set_color(struct bm_menu *menu, enum bm_color color, const char *he
const char* bm_menu_get_color(const struct bm_menu *menu, enum bm_color color);
/**
- * Display scrollbar at left side of the menu.
+ * Set scrollbar display mode.
*
* @param menu bm_menu instance to set scrollbar for.
- * @param scrollbar true for scrollbar, false for no scrollbar.
+ * @param mode bm_scrollbar_mode constant.
*/
-void bm_menu_set_scrollbar(struct bm_menu *menu, bool scrollbar);
+void bm_menu_set_scrollbar(struct bm_menu *menu, enum bm_scrollbar_mode mode);
/**
- * Is scrollbar being displayed on the menu?
+ * Return current scrollbar display mode.
*
* @param menu bm_menu instance where to get scrollbar display state from.
- * @return true if scrollbar displayed, false otherwise.
+ * @return bm_scrollbar_mode constant.
*/
-bool bm_menu_get_scrollbar(struct bm_menu *menu);
+enum bm_scrollbar_mode bm_menu_get_scrollbar(struct bm_menu *menu);
/**
* Display menu at bottom of the screen.
diff --git a/lib/internal.h b/lib/internal.h
index 5291b56..52d4125 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -274,6 +274,11 @@ struct bm_menu {
enum bm_filter_mode filter_mode;
/**
+ * Current Scrollbar display mode.
+ */
+ enum bm_scrollbar_mode scrollbar;
+
+ /**
* Should selection be wrapped?
*/
bool wrap;
@@ -287,11 +292,6 @@ struct bm_menu {
* Is menu grabbed?
*/
bool grabbed;
-
- /**
- * Scrollbar enabled?
- */
- bool scrollbar;
};
/* library.c */
diff --git a/lib/menu.c b/lib/menu.c
index b816b28..2eea897 100644
--- a/lib/menu.c
+++ b/lib/menu.c
@@ -298,12 +298,12 @@ char* bm_menu_get_color(const struct bm_menu *menu, enum bm_color color)
}
void
-bm_menu_set_scrollbar(struct bm_menu *menu, bool scrollbar)
+bm_menu_set_scrollbar(struct bm_menu *menu, enum bm_scrollbar_mode mode)
{
- menu->scrollbar = scrollbar;
+ menu->scrollbar = (mode == BM_SCROLLBAR_LAST ? BM_SCROLLBAR_NONE : mode);
}
-bool
+enum bm_scrollbar_mode
bm_menu_get_scrollbar(struct bm_menu *menu)
{
return menu->scrollbar;
diff --git a/lib/renderers/cairo.h b/lib/renderers/cairo.h
index 1a4f7c2..59f61d3 100644
--- a/lib/renderers/cairo.h
+++ b/lib/renderers/cairo.h
@@ -197,17 +197,18 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
paint.pos = (struct pos){ (menu->title ? 2 : 0) + result.x_advance, 2 };
paint.box = (struct box){ (menu->title ? 2 : 4), 0, 2, 2, width - paint.pos.x, 0 };
bm_cairo_draw_line(cairo, &paint, &result, "%s", (menu->filter ? menu->filter : ""));
+ const uint32_t titleh = result.height;
+ out_result->height = titleh;
uint32_t count;
struct bm_item **items = bm_menu_get_filtered_items(menu, &count);
uint32_t lines = (menu->lines > 0 ? menu->lines : 1);
- uint32_t titleh = result.height;
- out_result->height = titleh;
if (lines > 1) {
/* vertical mode */
- uint32_t spacing_x = (menu->scrollbar ? 4 : 0);
+ const bool scrollbar = (menu->scrollbar > BM_SCROLLBAR_NONE && (menu->scrollbar != BM_SCROLLBAR_AUTOHIDE || count > lines) ? true : false);
+ const uint32_t spacing_x = (scrollbar ? 4 : 0);
uint32_t spacing_y = 0; // 0 == variable width spacing
if (lines > max_height / titleh) {
/* there is more lines than screen can fit, enter fixed spacing mode */
@@ -251,17 +252,17 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
out_result->displayed++;
}
- if (menu->scrollbar && count > 0) {
+ if (scrollbar && count > 0) {
bm_cairo_color_from_menu_color(menu, BM_COLOR_SCROLLBAR_BG, &paint.bg);
bm_cairo_color_from_menu_color(menu, BM_COLOR_SCROLLBAR_FG, &paint.fg);
- uint32_t sheight = out_result->height - titleh;
+ const uint32_t sheight = out_result->height - titleh;
cairo_set_source_rgba(cairo->cr, paint.bg.r, paint.bg.b, paint.bg.g, paint.bg.a);
cairo_rectangle(cairo->cr, 0, titleh, 2, sheight);
cairo_fill(cairo->cr);
- uint32_t size = sheight / lines;
- uint32_t percent = (menu->index / (float)(count - 1)) * (sheight - size);
+ const uint32_t size = sheight / lines;
+ const uint32_t percent = (menu->index / (float)(count - 1)) * (sheight - size);
cairo_set_source_rgba(cairo->cr, paint.fg.r, paint.fg.b, paint.fg.g, paint.fg.a);
cairo_rectangle(cairo->cr, 0, titleh + percent, 2, size);
cairo_fill(cairo->cr);
diff --git a/lib/renderers/curses/curses.c b/lib/renderers/curses/curses.c
index 852eb88..1f81775 100644
--- a/lib/renderers/curses/curses.c
+++ b/lib/renderers/curses/curses.c
@@ -186,11 +186,12 @@ render(const struct bm_menu *menu)
uint32_t count, cl = 1;
const uint32_t lines = getmaxy(curses.stdscr);
- const int32_t prefix_x = (menu->prefix ? bm_utf8_string_screen_width(menu->prefix) : 0);
- const int32_t offset_x = (menu->scrollbar ? 2 : 0);
if (lines > 1) {
uint32_t displayed = 0;
struct bm_item **items = bm_menu_get_filtered_items(menu, &count);
+ const bool scrollbar = (menu->scrollbar > BM_SCROLLBAR_NONE && (menu->scrollbar != BM_SCROLLBAR_AUTOHIDE || count > lines) ? true : false);
+ const int32_t offset_x = (scrollbar ? 2 : 0);
+ const int32_t prefix_x = (menu->prefix ? bm_utf8_string_screen_width(menu->prefix) : 0);
for (uint32_t i = (menu->index / (lines - 1)) * (lines - 1); i < count && cl < lines; ++i) {
bool highlighted = (items[i] == bm_menu_get_highlighted_item(menu));
int32_t color = (highlighted ? 2 : (bm_menu_item_is_selected(menu, items[i]) ? 1 : 0));
@@ -204,7 +205,7 @@ render(const struct bm_menu *menu)
++displayed;
}
- if (menu->scrollbar) {
+ if (scrollbar) {
attron(COLOR_PAIR(1));
uint32_t percent = (menu->index / (float)(count - 1)) * (displayed - 1);
mvprintw(1 + percent, 0, "▒");