From 1843e60a74863ee817959f60a91ddd687336b4dd Mon Sep 17 00:00:00 2001 From: ArenM Date: Tue, 5 Jul 2022 12:54:33 -0400 Subject: [PATCH] only commit surface when it changed Previously wvkbd would commit an (usually) unchanged surface at the framerate of the compositor, this only commits the buffer when we render something new. Signed-off-by: Maarten van Gompel --- drw.c | 18 ------------------ drw.h | 1 - keyboard.c | 6 ++++++ main.c | 7 ++----- 4 files changed, 8 insertions(+), 24 deletions(-) diff --git a/drw.c b/drw.c index a7cfd20..6ea904e 100644 --- a/drw.c +++ b/drw.c @@ -20,30 +20,12 @@ drwsurf_resize(struct drwsurf *ds, uint32_t w, uint32_t h, uint32_t s) { setup_buffer(ds); } -static void surface_frame_callback(void *data, struct wl_callback *cb, - uint32_t time); - -static struct wl_callback_listener frame_listener = {.done = - surface_frame_callback}; - void drwsurf_flip(struct drwsurf *ds) { - ds->cb = wl_surface_frame(ds->surf); - wl_callback_add_listener(ds->cb, &frame_listener, (void *)ds); - wl_surface_attach(ds->surf, ds->buf, 0, 0); wl_surface_commit(ds->surf); } -void -surface_frame_callback(void *data, struct wl_callback *cb, uint32_t time) { - struct drwsurf *ds = (struct drwsurf *)data; - wl_callback_destroy(cb); - ds->cb = NULL; - - drwsurf_flip(ds); -} - void drw_draw_text(struct drwsurf *d, Color color, uint32_t x, uint32_t y, uint32_t w, uint32_t h, const char *label) { diff --git a/drw.h b/drw.h index fb3df1c..c1139f4 100644 --- a/drw.h +++ b/drw.h @@ -15,7 +15,6 @@ struct drwsurf { struct wl_surface *surf; struct wl_buffer *buf; struct wl_shm *shm; - struct wl_callback *cb; unsigned char *pool_data; cairo_t *cairo; diff --git a/keyboard.c b/keyboard.c index 365a096..1353f74 100644 --- a/keyboard.c +++ b/keyboard.c @@ -207,6 +207,8 @@ kbd_release_key(struct kbd *kb, uint32_t time) { kbd_draw_layout(kb); kb->last_swipe = NULL; } + + drwsurf_flip(kb->surf); } void @@ -230,6 +232,8 @@ kbd_motion_key(struct kbd *kb, uint32_t time, uint32_t x, uint32_t y) { } else { kbd_unpress_key(kb, time); } + + drwsurf_flip(kb->surf); } void @@ -336,6 +340,8 @@ kbd_press_key(struct kbd *kb, struct key *k, uint32_t time) { default: break; } + + drwsurf_flip(kb->surf); } void diff --git a/main.c b/main.c index fc5def6..de5a9a5 100644 --- a/main.c +++ b/main.c @@ -341,6 +341,8 @@ layer_surface_configure(void *data, struct zwlr_layer_surface_v1 *surface, } zwlr_layer_surface_v1_ack_configure(surface, serial); + + drwsurf_flip(&draw_surf); } void @@ -376,11 +378,6 @@ hide() { zwlr_layer_surface_v1_destroy(layer_surface); wl_surface_destroy(draw_surf.surf); layer_surface = NULL; - if (draw_surf.cb) { - wl_callback_destroy(draw_surf.cb); - draw_surf.cb = NULL; - } - hidden = true; }