diff options
author | Jari Vetoniemi <mailroxas@gmail.com> | 2015-01-16 02:08:18 +0200 |
---|---|---|
committer | Jari Vetoniemi <mailroxas@gmail.com> | 2015-01-16 02:08:18 +0200 |
commit | a54bcf694ad152ba0a5c1c3f2de6bc9c82bba02f (patch) | |
tree | 035ff1c1db386e48135705b5c663060248b3fa66 /lib/renderers/wayland | |
parent | 20189fb8d26e422bf17dda4264e84ed7b1b2a340 (diff) | |
parent | ada6edc175eb89d318e55204368e2ba5dad07b1b (diff) | |
download | bemenu-a54bcf694ad152ba0a5c1c3f2de6bc9c82bba02f.tar.gz bemenu-a54bcf694ad152ba0a5c1c3f2de6bc9c82bba02f.tar.bz2 bemenu-a54bcf694ad152ba0a5c1c3f2de6bc9c82bba02f.zip |
Merge branch 'pango-wip'
Diffstat (limited to 'lib/renderers/wayland')
-rw-r--r-- | lib/renderers/wayland/CMakeLists.txt | 5 | ||||
-rw-r--r-- | lib/renderers/wayland/wayland.c | 7 | ||||
-rw-r--r-- | lib/renderers/wayland/wayland.h | 4 | ||||
-rw-r--r-- | lib/renderers/wayland/window.c | 44 |
4 files changed, 30 insertions, 30 deletions
diff --git a/lib/renderers/wayland/CMakeLists.txt b/lib/renderers/wayland/CMakeLists.txt index 4f93d18..19672da 100644 --- a/lib/renderers/wayland/CMakeLists.txt +++ b/lib/renderers/wayland/CMakeLists.txt @@ -2,12 +2,13 @@ FIND_PACKAGE(Wayland) if (WAYLAND_FOUND) FIND_PACKAGE(Cairo REQUIRED) + FIND_PACKAGE(Pango REQUIRED) FIND_PACKAGE(XKBCommon REQUIRED) INCLUDE(Wayland) WAYLAND_ADD_PROTOCOL_CLIENT(proto-xdg-shell "xdg-shell.xml" xdg-shell) - INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${WAYLAND_CLIENT_INCLUDE_DIR} ${XKBCOMMON_INCLUDE_DIR} ${CAIRO_INCLUDE_DIRECTORIES}) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${WAYLAND_CLIENT_INCLUDE_DIR} ${XKBCOMMON_INCLUDE_DIR} ${CAIRO_INCLUDE_DIRS} ${PANGO_INCLUDE_DIRS}) ADD_LIBRARY(bemenu-renderer-wayland SHARED wayland.c registry.c window.c ${proto-xdg-shell}) SET_TARGET_PROPERTIES(bemenu-renderer-wayland PROPERTIES PREFIX "") - TARGET_LINK_LIBRARIES(bemenu-renderer-wayland ${WAYLAND_CLIENT_LIBRARIES} ${XKBCOMMON_LIBRARIES} ${CAIRO_LIBRARIES}) + TARGET_LINK_LIBRARIES(bemenu-renderer-wayland ${WAYLAND_CLIENT_LIBRARIES} ${XKBCOMMON_LIBRARIES} ${CAIRO_LIBRARIES} ${PANGO_LIBRARIES}) INSTALL(TARGETS bemenu-renderer-wayland DESTINATION lib/bemenu) endif () diff --git a/lib/renderers/wayland/wayland.c b/lib/renderers/wayland/wayland.c index 3852a6d..5d85479 100644 --- a/lib/renderers/wayland/wayland.c +++ b/lib/renderers/wayland/wayland.c @@ -39,10 +39,7 @@ render(const struct bm_menu *menu) } if (wayland->input.code != wayland->input.last_code) { - uint32_t count; - bm_menu_get_filtered_items(menu, &count); - uint32_t lines = (count < menu->lines ? count : menu->lines) + 1; - bm_wl_window_render(&wayland->window, menu, lines); + bm_wl_window_render(&wayland->window, menu); wayland->input.last_code = wayland->input.code; } } @@ -187,7 +184,7 @@ constructor(struct bm_menu *menu) goto fail; wayland->window.width = 800; - wayland->window.height = 14; + wayland->window.height = 1; if (!(wayland->display = wl_display_connect(NULL))) goto fail; diff --git a/lib/renderers/wayland/wayland.h b/lib/renderers/wayland/wayland.h index 886a0fd..dff6aba 100644 --- a/lib/renderers/wayland/wayland.h +++ b/lib/renderers/wayland/wayland.h @@ -85,7 +85,7 @@ struct window { uint32_t displayed; struct { - uint32_t (*render)(struct cairo *cairo, uint32_t width, uint32_t height, const struct bm_menu *menu); + 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); } notify; }; @@ -111,7 +111,7 @@ struct wayland { void bm_wl_repeat(struct wayland *wayland); bool bm_wl_registry_register(struct wayland *wayland); void bm_wl_registry_destroy(struct wayland *wayland); -void bm_wl_window_render(struct window *window, const struct bm_menu *menu, uint32_t lines); +void bm_wl_window_render(struct window *window, const struct bm_menu *menu); bool bm_wl_window_create(struct window *window, struct wl_shm *shm, struct wl_shell *shell, struct xdg_shell *xdg_shell, struct wl_surface *surface); void bm_wl_window_destroy(struct window *window); diff --git a/lib/renderers/wayland/window.c b/lib/renderers/wayland/window.c index 58d2e2b..bfff232 100644 --- a/lib/renderers/wayland/window.c +++ b/lib/renderers/wayland/window.c @@ -105,11 +105,7 @@ destroy_buffer(struct buffer *buffer) { if (buffer->buffer) wl_buffer_destroy(buffer->buffer); - if (buffer->cairo.cr) - cairo_destroy(buffer->cairo.cr); - if (buffer->cairo.surface) - cairo_surface_destroy(buffer->cairo.surface); - + bm_cairo_destroy(&buffer->cairo); memset(buffer, 0, sizeof(struct buffer)); } @@ -149,11 +145,14 @@ create_buffer(struct wl_shm *shm, struct buffer *buffer, int32_t width, int32_t wl_buffer_add_listener(buffer->buffer, &buffer_listener, buffer); - if (!(buffer->cairo.surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride))) + cairo_surface_t *surf; + if (!(surf = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride))) goto fail; - if (!(buffer->cairo.cr = cairo_create(buffer->cairo.surface))) + if (!bm_cairo_create_for_surface(&buffer->cairo, surf)) { + cairo_surface_destroy(surf); goto fail; + } buffer->width = width; buffer->height = height; @@ -251,7 +250,7 @@ static const struct wl_callback_listener listener = { }; void -bm_wl_window_render(struct window *window, const struct bm_menu *menu, uint32_t lines) +bm_wl_window_render(struct window *window, const struct bm_menu *menu) { assert(window && menu); @@ -259,22 +258,25 @@ bm_wl_window_render(struct window *window, const struct bm_menu *menu, uint32_t return; struct buffer *buffer; - if (!(buffer = next_buffer(window))) { - fprintf(stderr, "could not get next buffer"); - exit(EXIT_FAILURE); - } + for (int tries = 0; tries < 2; ++tries) { + if (!(buffer = next_buffer(window))) { + fprintf(stderr, "could not get next buffer"); + exit(EXIT_FAILURE); + } - cairo_font_extents_t fe; - bm_cairo_get_font_extents(&buffer->cairo, &menu->font, &fe); - window->height = MIN(lines * (fe.height + 4), window->max_height); + if (!window->notify.render) + break; - if (window->height != buffer->height && !(buffer = next_buffer(window))) { - fprintf(stderr, "could not get next buffer"); - exit(EXIT_FAILURE); - } + struct cairo_paint_result result; + window->notify.render(&buffer->cairo, buffer->width, fmin(buffer->height, window->max_height), window->max_height, menu, &result); + window->displayed = result.displayed; - if (window->notify.render) - window->displayed = window->notify.render(&buffer->cairo, buffer->width, buffer->height, menu); + if (window->height == result.height) + break; + + window->height = result.height; + destroy_buffer(buffer); + } window->frame_cb = wl_surface_frame(window->surface); wl_callback_add_listener(window->frame_cb, &listener, window); |