diff options
author | Ilia Bozhinov <ammen99@gmail.com> | 2019-03-24 20:18:59 +0100 |
---|---|---|
committer | Ilia Bozhinov <ammen99@gmail.com> | 2019-03-24 20:18:59 +0100 |
commit | ab82afab7f8da81fbd6445a0b65fb70ecba898b8 (patch) | |
tree | c82dd19bad0e36bcf841c09c60125c02f65ccb8a /lib/renderers/wayland/window.c | |
parent | 33e540a2b04ce78f5c7ab4a60b899c67f586cc32 (diff) | |
download | bemenu-ab82afab7f8da81fbd6445a0b65fb70ecba898b8.tar.gz bemenu-ab82afab7f8da81fbd6445a0b65fb70ecba898b8.tar.bz2 bemenu-ab82afab7f8da81fbd6445a0b65fb70ecba898b8.zip |
wayland: implement a proper repaint cycle
Diffstat (limited to 'lib/renderers/wayland/window.c')
-rw-r--r-- | lib/renderers/wayland/window.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/renderers/wayland/window.c b/lib/renderers/wayland/window.c index 1890a60..2141eff 100644 --- a/lib/renderers/wayland/window.c +++ b/lib/renderers/wayland/window.c @@ -197,6 +197,7 @@ frame_callback(void *data, struct wl_callback *callback, uint32_t time) struct window *window = data; wl_callback_destroy(callback); window->frame_cb = NULL; + window->render_pending = true; } static const struct wl_callback_listener listener = { @@ -204,10 +205,21 @@ static const struct wl_callback_listener listener = { }; void +bm_wl_window_schedule_render(struct window *window) +{ + assert(window); + if (window->frame_cb) + return; + + window->frame_cb = wl_surface_frame(window->surface); + wl_callback_add_listener(window->frame_cb, &listener, window); + wl_surface_commit(window->surface); +} + +void bm_wl_window_render(struct window *window, struct wl_display *display, const struct bm_menu *menu) { assert(window && menu); - struct buffer *buffer; for (int tries = 0; tries < 2; ++tries) { if (!(buffer = next_buffer(window))) { @@ -232,13 +244,11 @@ bm_wl_window_render(struct window *window, struct wl_display *display, const str destroy_buffer(buffer); } - window->frame_cb = wl_surface_frame(window->surface); - wl_callback_add_listener(window->frame_cb, &listener, window); - wl_surface_damage(window->surface, 0, 0, buffer->width, buffer->height); wl_surface_attach(window->surface, buffer->buffer, 0, 0); wl_surface_commit(window->surface); buffer->busy = true; + window->render_pending = false; } void |