summaryrefslogtreecommitdiff
path: root/lib/renderers/wayland/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/renderers/wayland/window.c')
-rw-r--r--lib/renderers/wayland/window.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/renderers/wayland/window.c b/lib/renderers/wayland/window.c
index 4282e13..057863d 100644
--- a/lib/renderers/wayland/window.c
+++ b/lib/renderers/wayland/window.c
@@ -246,11 +246,27 @@ static const struct xdg_surface_listener xdg_surface_listener = {
.close = xdg_surface_close,
};
+static void
+frame_callback(void *data, struct wl_callback *callback, uint32_t time)
+{
+ (void)time;
+ struct window *window = data;
+ wl_callback_destroy(callback);
+ window->frame_cb = NULL;
+}
+
+static const struct wl_callback_listener listener = {
+ frame_callback
+};
+
void
bm_wl_window_render(struct window *window, const struct bm_menu *menu, uint32_t lines)
{
assert(window && menu);
+ if (window->frame_cb)
+ return;
+
struct buffer *buffer;
if (!(buffer = next_buffer(window)))
return;
@@ -265,6 +281,9 @@ bm_wl_window_render(struct window *window, const struct bm_menu *menu, uint32_t
if (window->notify.render)
window->displayed = window->notify.render(&buffer->cairo, buffer->width, buffer->height, menu);
+ 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);