summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2019-05-31 20:32:02 +0000
committerAlyssa Ross <hi@alyssa.is>2019-05-31 23:20:54 +0000
commit93cde4831bca7055c38a1d6246fdcb84df07f7ec (patch)
tree15bc616a6da2139483d76ebe384d00a636b16441 /lib
parent121367b9406b58c80591a21be3bd6e4771facb5e (diff)
downloadbemenu-93cde4831bca7055c38a1d6246fdcb84df07f7ec.tar.gz
bemenu-93cde4831bca7055c38a1d6246fdcb84df07f7ec.tar.bz2
bemenu-93cde4831bca7055c38a1d6246fdcb84df07f7ec.zip
bemenu: add --line-height / -H option
Text is displayed vertically centered in a line. If unspecified, or 0, the previous behaviour of making the height the size of the text, plus two pixels on either side, is used, so there will be no change in behaviour if this option is not used. Fixes https://github.com/Cloudef/bemenu/issues/44.
Diffstat (limited to 'lib')
-rw-r--r--lib/bemenu.h17
-rw-r--r--lib/internal.h5
-rw-r--r--lib/menu.c14
-rw-r--r--lib/renderers/cairo.h34
-rw-r--r--lib/renderers/wayland/wayland.h2
-rw-r--r--lib/renderers/wayland/window.c2
-rw-r--r--lib/renderers/x11/window.c2
-rw-r--r--lib/renderers/x11/x11.h2
8 files changed, 59 insertions, 19 deletions
diff --git a/lib/bemenu.h b/lib/bemenu.h
index 8b28dfe..9482b31 100644
--- a/lib/bemenu.h
+++ b/lib/bemenu.h
@@ -386,6 +386,23 @@ bool bm_menu_set_font(struct bm_menu *menu, const char *font);
const char* bm_menu_get_font(const struct bm_menu *menu);
/**
+ * Set size of line in pixels.
+ * Some renderers such as ncurses may ignore this when it does not make sense.
+ *
+ * @param menu bm_menu instance where to set line height.
+ * @param line_height 0 for default line height, > 0 for that many pixels.
+ */
+void bm_menu_set_line_height(struct bm_menu *menu, uint32_t line_height);
+
+/**
+ * Get size of line in pixels.
+ *
+ * @param menu bm_menu instance where to get line height.
+ * @return uint32_t for max amount of vertical lines to be shown.
+ */
+uint32_t bm_menu_get_line_height(struct bm_menu *menu);
+
+/**
* Set a hexadecimal color for element.
*
* @param menu bm_menu instance where to set color.
diff --git a/lib/internal.h b/lib/internal.h
index adb06f6..2920d1a 100644
--- a/lib/internal.h
+++ b/lib/internal.h
@@ -225,6 +225,11 @@ struct bm_menu {
struct bm_font font;
/**
+ * Line height.
+ */
+ uint32_t line_height;
+
+ /**
* Colors.
*/
struct bm_hex_color colors[BM_COLOR_LAST];
diff --git a/lib/menu.c b/lib/menu.c
index e876126..c46a2d6 100644
--- a/lib/menu.c
+++ b/lib/menu.c
@@ -266,6 +266,20 @@ bm_menu_get_font(const struct bm_menu *menu)
return menu->font.name;
}
+void
+bm_menu_set_line_height(struct bm_menu *menu, uint32_t line_height)
+{
+ assert(menu);
+ menu->line_height = line_height;
+}
+
+uint32_t
+bm_menu_get_line_height(struct bm_menu *menu)
+{
+ assert(menu);
+ return menu->line_height;
+}
+
bool
bm_menu_set_color(struct bm_menu *menu, enum bm_color color, const char *hex)
{
diff --git a/lib/renderers/cairo.h b/lib/renderers/cairo.h
index cdb477d..c5a3be4 100644
--- a/lib/renderers/cairo.h
+++ b/lib/renderers/cairo.h
@@ -166,10 +166,12 @@ bm_cairo_color_from_menu_color(const struct bm_menu *menu, enum bm_color color,
}
__attribute__((unused)) static void
-bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t max_height, const struct bm_menu *menu, struct cairo_paint_result *out_result)
+bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t max_height, const struct bm_menu *menu, struct cairo_paint_result *out_result)
{
assert(cairo && menu && out_result);
+ uint32_t height = fmin(menu->line_height, max_height);
+
memset(out_result, 0, sizeof(struct cairo_paint_result));
out_result->displayed = 1;
@@ -189,21 +191,23 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
ascii_height = result.height;
paint.baseline = result.baseline;
+ int32_t vpadding = height == 0 ? 2 : (height - ascii_height) / 2;
+
memset(&result, 0, sizeof(result));
uint32_t title_x = 0;
if (menu->title) {
bm_cairo_color_from_menu_color(menu, BM_COLOR_TITLE_FG, &paint.fg);
bm_cairo_color_from_menu_color(menu, BM_COLOR_TITLE_BG, &paint.bg);
- paint.pos = (struct pos){ result.x_advance, 2 };
- paint.box = (struct box){ 4, 8, 2, 2, 0, ascii_height };
+ paint.pos = (struct pos){ result.x_advance, vpadding };
+ paint.box = (struct box){ 4, 8, vpadding, vpadding, 0, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, "%s", menu->title);
title_x = result.x_advance;
}
bm_cairo_color_from_menu_color(menu, BM_COLOR_FILTER_FG, &paint.fg);
bm_cairo_color_from_menu_color(menu, BM_COLOR_FILTER_BG, &paint.bg);
- 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, ascii_height };
+ paint.pos = (struct pos){ (menu->title ? 2 : 0) + result.x_advance, vpadding };
+ paint.box = (struct box){ (menu->title ? 2 : 4), 0, vpadding, vpadding, width - paint.pos.x, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, "%s", (menu->filter ? menu->filter : ""));
const uint32_t titleh = result.height;
out_result->height = titleh;
@@ -247,12 +251,12 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
}
if (menu->prefix && highlighted) {
- paint.pos = (struct pos){ 0, 2 + posy };
- paint.box = (struct box){ 4 + spacing_x, 0, 2, 2, width - paint.pos.x, ascii_height };
+ paint.pos = (struct pos){ 0, vpadding + posy };
+ paint.box = (struct box){ 4 + spacing_x, 0, vpadding, vpadding, width - paint.pos.x, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, "%s %s", menu->prefix, (items[i]->text ? items[i]->text : ""));
} else {
- paint.pos = (struct pos){ 0, 2 + posy };
- paint.box = (struct box){ 4 + spacing_x + prefix_x, 0, 2, 2, width - paint.pos.x, ascii_height };
+ paint.pos = (struct pos){ 0, vpadding + posy };
+ paint.box = (struct box){ 4 + spacing_x + prefix_x, 0, vpadding, vpadding, width - paint.pos.x, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, "%s", (items[i]->text ? items[i]->text : ""));
}
@@ -283,8 +287,8 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
uint32_t cl = fmin(title_x + result.x_advance, width / 4);
if (menu->wrap || menu->index > 0) {
- paint.pos = (struct pos){ cl, 2 };
- paint.box = (struct box){ 1, 2, 2, 2, 0, ascii_height };
+ paint.pos = (struct pos){ cl, vpadding };
+ paint.box = (struct box){ 1, 2, vpadding, vpadding, 0, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, "<");
cl += result.x_advance + 1;
}
@@ -303,8 +307,8 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
bm_cairo_color_from_menu_color(menu, BM_COLOR_ITEM_BG, &paint.bg);
}
- paint.pos = (struct pos){ cl, 2 };
- paint.box = (struct box){ 2, 4, 2, 2, 0, ascii_height };
+ paint.pos = (struct pos){ cl, vpadding };
+ paint.box = (struct box){ 2, 4, vpadding, vpadding, 0, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, "%s", (items[i]->text ? items[i]->text : ""));
cl += result.x_advance + 2;
out_result->displayed += (cl < width);
@@ -315,8 +319,8 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t ma
bm_cairo_color_from_menu_color(menu, BM_COLOR_FILTER_FG, &paint.fg);
bm_cairo_color_from_menu_color(menu, BM_COLOR_FILTER_BG, &paint.bg);
bm_pango_get_text_extents(cairo, &paint, &result, ">");
- paint.pos = (struct pos){ width - result.x_advance - 2, 2 };
- paint.box = (struct box){ 1, 2, 2, 2, 0, ascii_height };
+ paint.pos = (struct pos){ width - result.x_advance - 2, vpadding };
+ paint.box = (struct box){ 1, 2, vpadding, vpadding, 0, ascii_height };
bm_cairo_draw_line(cairo, &paint, &result, ">");
}
}
diff --git a/lib/renderers/wayland/wayland.h b/lib/renderers/wayland/wayland.h
index c6da458..752f095 100644
--- a/lib/renderers/wayland/wayland.h
+++ b/lib/renderers/wayland/wayland.h
@@ -87,7 +87,7 @@ struct window {
bool render_pending;
struct {
- void (*render)(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t max_height, const struct bm_menu *menu, struct cairo_paint_result *result);
+ void (*render)(struct cairo *cairo, uint32_t width, uint32_t max_height, const struct bm_menu *menu, struct cairo_paint_result *result);
} notify;
};
diff --git a/lib/renderers/wayland/window.c b/lib/renderers/wayland/window.c
index 55b8690..ef515b2 100644
--- a/lib/renderers/wayland/window.c
+++ b/lib/renderers/wayland/window.c
@@ -231,7 +231,7 @@ bm_wl_window_render(struct window *window, struct wl_display *display, const str
break;
struct cairo_paint_result result;
- window->notify.render(&buffer->cairo, buffer->width, fmin(buffer->height, window->max_height), window->max_height, menu, &result);
+ window->notify.render(&buffer->cairo, buffer->width, window->max_height, menu, &result);
window->displayed = result.displayed;
if (window->height == result.height)
diff --git a/lib/renderers/x11/window.c b/lib/renderers/x11/window.c
index 3fb24dc..cf2d986 100644
--- a/lib/renderers/x11/window.c
+++ b/lib/renderers/x11/window.c
@@ -72,7 +72,7 @@ bm_x11_window_render(struct window *window, const struct bm_menu *menu)
cairo_push_group(buffer->cairo.cr);
struct cairo_paint_result result;
- window->notify.render(&buffer->cairo, buffer->width, buffer->height, window->max_height, menu, &result);
+ window->notify.render(&buffer->cairo, buffer->width, window->max_height, menu, &result);
window->displayed = result.displayed;
cairo_pop_group_to_source(buffer->cairo.cr);
diff --git a/lib/renderers/x11/x11.h b/lib/renderers/x11/x11.h
index fa6cea6..3dfb78f 100644
--- a/lib/renderers/x11/x11.h
+++ b/lib/renderers/x11/x11.h
@@ -36,7 +36,7 @@ struct window {
bool bottom;
struct {
- void (*render)(struct cairo *cairo, uint32_t width, uint32_t height, uint32_t max_height, const struct bm_menu *menu, struct cairo_paint_result *result);
+ void (*render)(struct cairo *cairo, uint32_t width, uint32_t max_height, const struct bm_menu *menu, struct cairo_paint_result *result);
} notify;
};