Skip to content

Commit

Permalink
Wayland support
Browse files Browse the repository at this point in the history
Add necessary functions for Wayland upwards list mode to work.
  • Loading branch information
merrittlj authored and Cloudef committed Nov 21, 2023
1 parent 46c3f76 commit b0751f7
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 11 deletions.
13 changes: 3 additions & 10 deletions lib/renderers/cairo_renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,10 +314,7 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t max_height, struct
uint32_t page_length = 0;

if (menu->lines_mode == BM_LINES_UP && !menu->fixed_height) {
struct cairo_result dummy_result;
bm_cairo_draw_line_str(cairo, &paint, &dummy_result, "");

int32_t new_y_offset = (count < lines ? (lines - count) * result.height : 0);
int32_t new_y_offset = (count < lines ? (lines - count) * height : 0);
bm_menu_set_y_offset(menu, new_y_offset);
}

Expand All @@ -330,7 +327,7 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t max_height, struct
enum bm_color title_bg = (menu->lines_mode == BM_LINES_UP ? BM_COLOR_ITEM_BG : BM_COLOR_TITLE_BG);
bm_cairo_color_from_menu_color(menu, title_fg, &paint.fg);
bm_cairo_color_from_menu_color(menu, title_bg, &paint.bg);
paint.pos = (struct pos){ result.x_advance + border_size + 4, vpadding + border_size };
paint.pos = (struct pos){ border_size + 4, vpadding + border_size };
paint.box = (struct box){ 4, 16, vpadding, -vpadding, 0, height };
bm_cairo_draw_line(cairo, &paint, &result, "%s", menu->title);
title_x = result.x_advance;
Expand Down Expand Up @@ -528,14 +525,12 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t max_height, struct

}

struct cairo_paint pre_up_drawing = paint; // Some behavior may depend on the previous paint.

if (menu->lines_mode == BM_LINES_UP) {
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){ border_size, posy + border_size };
paint.pos = (struct pos){ border_size + 4, posy + vpadding + border_size };
paint.box = (struct box){ 4, 16, vpadding, -vpadding, 0, height };
bm_cairo_draw_line(cairo, &paint, &result, "%s", menu->title);
}
Expand Down Expand Up @@ -570,8 +565,6 @@ bm_cairo_paint(struct cairo *cairo, uint32_t width, uint32_t max_height, struct
posy += (spacing_y ? spacing_y : result.height);
out_result->height = posy;
out_result->displayed++;

paint = pre_up_drawing;
}

if (menu->counter) {
Expand Down
13 changes: 13 additions & 0 deletions lib/renderers/wayland/wayland.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,18 @@ set_align(const struct bm_menu *menu, enum bm_align align)
}
}

static void
set_y_offset(const struct bm_menu *menu, int32_t y_offset)
{
struct wayland *wayland = menu->renderer->internal;
assert(wayland);

struct window *window;
wl_list_for_each(window, &wayland->windows, link) {
bm_wl_window_set_y_offset(window, wayland->display, y_offset);
}
}

static void
grab_keyboard(const struct bm_menu *menu, bool grab)
{
Expand Down Expand Up @@ -672,6 +684,7 @@ register_renderer(struct render_api *api)
api->release_touch = release_touch;
api->render = render;
api->set_align = set_align;
api->set_y_offset = set_y_offset;
api->set_width = set_width;
api->grab_keyboard = grab_keyboard;
api->set_overlap = set_overlap;
Expand Down
2 changes: 2 additions & 0 deletions lib/renderers/wayland/wayland.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ struct window {
uint32_t displayed;
struct wl_list link;
enum bm_align align;
int32_t y_offset;
uint32_t align_anchor;
bool render_pending;

Expand Down Expand Up @@ -175,6 +176,7 @@ void bm_wl_window_schedule_render(struct window *window);
void bm_wl_window_render(struct window *window, struct wl_display *display, struct bm_menu *menu);
void bm_wl_window_set_width(struct window *window, struct wl_display *display, uint32_t margin, float factor);
void bm_wl_window_set_align(struct window *window, struct wl_display *display, enum bm_align align);
void bm_wl_window_set_y_offset(struct window *window, struct wl_display *display, int32_t y_offset);
void bm_wl_window_grab_keyboard(struct window *window, struct wl_display *display, bool grab);
void bm_wl_window_set_overlap(struct window *window, struct wl_display *display, bool overlap);
bool bm_wl_window_create(struct window *window, struct wl_display *display, struct wl_shm *shm, struct wl_output *output, struct zwlr_layer_shell_v1 *layer_shell, struct wl_surface *surface);
Expand Down
13 changes: 13 additions & 0 deletions lib/renderers/wayland/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,19 @@ bm_wl_window_set_align(struct window *window, struct wl_display *display, enum b
wl_display_roundtrip(display);
}

void
bm_wl_window_set_y_offset(struct window *window, struct wl_display *display, int32_t y_offset)
{
if(window->y_offset == y_offset)
return;

window->y_offset = y_offset;

zwlr_layer_surface_v1_set_margin(window->layer_surface, window->y_offset, 0, 0, 0);
wl_surface_commit(window->surface);
wl_display_roundtrip(display);
}

void
bm_wl_window_grab_keyboard(struct window *window, struct wl_display *display, bool grab)
{
Expand Down
1 change: 0 additions & 1 deletion lib/renderers/x11/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,6 @@ bm_x11_window_set_y_offset(struct window *window, int32_t y_offset)
return;

window->y_offset = y_offset;
XMoveWindow(window->display, window->drawable, window->x, window->y + window->y_offset);
}

void
Expand Down

0 comments on commit b0751f7

Please sign in to comment.