[PATCH weston] window: Fix crash in input_set_pointer_image when cursor is special
Pekka Paalanen
ppaalanen at gmail.com
Thu Mar 5 00:15:45 PST 2015
On Wed, 4 Mar 2015 16:26:25 -0600
Derek Foreman <derekf at osg.samsung.com> wrote:
> Certain circumstances may lead to the "force" clause in
> input_set_pointer_image() being reached when the current cursor
> is blank or unset. These are special cursors that don't have
> images, and they need to be handled differently than image cursors.
>
> This patch puts the special cursor handling in its own function and calls
> it from both places that need it. Previously only the frame callback
> handler did this correctly.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
> ---
> clients/window.c | 27 +++++++++++++++++++--------
> 1 file changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/clients/window.c b/clients/window.c
> index a04cef9..1399fa4 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -38,6 +38,7 @@
> #include <sys/mman.h>
> #include <sys/epoll.h>
> #include <sys/timerfd.h>
> +#include <stdbool.h>
>
> #ifdef HAVE_CAIRO_EGL
> #include <wayland-egl.h>
> @@ -3524,6 +3525,22 @@ input_set_pointer_image_index(struct input *input, int index)
>
> static const struct wl_callback_listener pointer_surface_listener;
>
> +static bool
> +input_set_pointer_special(struct input *input)
> +{
> + if (input->current_cursor == CURSOR_BLANK) {
> + wl_pointer_set_cursor(input->pointer,
> + input->pointer_enter_serial,
> + NULL, 0, 0);
> + return true;
> + }
> +
> + if (input->current_cursor == CURSOR_UNSET)
> + return true;
> +
> + return false;
> +}
> +
> static void
> pointer_surface_frame_callback(void *data, struct wl_callback *callback,
> uint32_t time)
> @@ -3541,15 +3558,9 @@ pointer_surface_frame_callback(void *data, struct wl_callback *callback,
> if (!input->pointer)
> return;
>
> - if (input->current_cursor == CURSOR_BLANK) {
> - wl_pointer_set_cursor(input->pointer,
> - input->pointer_enter_serial,
> - NULL, 0, 0);
> + if (input_set_pointer_special(input))
> return;
> - }
>
> - if (input->current_cursor == CURSOR_UNSET)
> - return;
> cursor = input->display->cursors[input->current_cursor];
> if (!cursor)
> return;
> @@ -3598,7 +3609,7 @@ input_set_pointer_image(struct input *input, int pointer)
> input->cursor_serial = input->pointer_enter_serial;
> if (!input->cursor_frame_cb)
> pointer_surface_frame_callback(input, NULL, 0);
> - else if (force) {
> + else if (force && !input_set_pointer_special(input)) {
> /* The current frame callback may be stuck if, for instance,
> * the set cursor request was processed by the server after
> * this client lost the focus. In this case the cursor surface
I can certainly see how calling input_set_pointer_image_index() with a
non-image cursor would not do what was intended, as far as I can
understand.
R-b me then.
fa79b1d..493d979 master -> master
Would've been nice to how I could trigger the crash, but if it's
complicated, nevermind.
Thanks,
pq
More information about the wayland-devel
mailing list