[RFC weston] clients: Don't attach a buffer if mouse cursor surface is unchanged
Derek Foreman
derekf at osg.samsung.com
Thu Feb 22 22:15:46 UTC 2018
Keep track of what cusor image buffer is attached to the cursor
surface and avoid re-attaching it if we don't have to.
This isn't just an obviously pointless optimization, it turns all
of toy toolkit into a test case for handling this properly.
Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---
Continuing my streak of posting unpopular patches, this patch breaks
weston, so I'm not pushing for inclusion, but I think we need to
resolve why it breaks, and fix either weston or wayland documentation
to reflect expected behaviour.
I think this can be attributed to a weston bug, and we should be able to
expect that the compositor will be able to redisplay the surface without
needing to attach a new buffer, and that if the compositor has released
the buffer then it has a kept copy somewhere...
Any other opinions?
clients/window.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/clients/window.c b/clients/window.c
index 15a86e15..81417bd2 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -353,6 +353,7 @@ struct input {
bool cursor_timer_running;
struct task cursor_task;
struct wl_surface *pointer_surface;
+ struct wl_buffer *current_cursor_buffer;
uint32_t modifiers;
uint32_t pointer_enter_serial;
uint32_t cursor_serial;
@@ -3769,10 +3770,14 @@ input_set_pointer_image_index(struct input *input, int index)
if (!buffer)
return;
- wl_surface_attach(input->pointer_surface, buffer, 0, 0);
- wl_surface_damage(input->pointer_surface, 0, 0,
- image->width, image->height);
- wl_surface_commit(input->pointer_surface);
+ if (buffer != input->current_cursor_buffer) {
+ wl_surface_attach(input->pointer_surface, buffer, 0, 0);
+ wl_surface_damage(input->pointer_surface, 0, 0,
+ image->width, image->height);
+ wl_surface_commit(input->pointer_surface);
+ }
+
+ input->current_cursor_buffer = buffer;
wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial,
input->pointer_surface,
image->hotspot_x, image->hotspot_y);
--
2.14.3
More information about the wayland-devel
mailing list