From 8365749566bb1cb3ad5dcf91e533333d5e853888 Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Thu, 1 Oct 2015 19:34:53 +0900 Subject: [PATCH] pepper: Don't try to send input events when there's no focus Change-Id: I41a6b8a163c6faf0cc335ca7160b1fb76486455e --- src/lib/pepper/keyboard.c | 40 ++++++++++++++++++++++++++------- src/lib/pepper/pointer.c | 47 ++++++++++++++++++++++++++++++++------- 2 files changed, 71 insertions(+), 16 deletions(-) diff --git a/src/lib/pepper/keyboard.c b/src/lib/pepper/keyboard.c index e4a7965..8d77fab 100644 --- a/src/lib/pepper/keyboard.c +++ b/src/lib/pepper/keyboard.c @@ -187,8 +187,14 @@ PEPPER_API void pepper_keyboard_send_leave(pepper_keyboard_t *keyboard) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(keyboard->focus->surface->resource); - uint32_t serial = wl_display_next_serial(keyboard->seat->compositor->display); + struct wl_client *client; + uint32_t serial; + + if (!keyboard->focus) + return; + + client = wl_resource_get_client(keyboard->focus->surface->resource); + serial = wl_display_next_serial(keyboard->seat->compositor->display); wl_resource_for_each(resource, &keyboard->resource_list) { @@ -201,8 +207,14 @@ PEPPER_API void pepper_keyboard_send_enter(pepper_keyboard_t *keyboard) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(keyboard->focus->surface->resource); - uint32_t serial = wl_display_next_serial(keyboard->seat->compositor->display); + struct wl_client *client; + uint32_t serial; + + if (!keyboard->focus) + return; + + client = wl_resource_get_client(keyboard->focus->surface->resource); + serial = wl_display_next_serial(keyboard->seat->compositor->display); wl_resource_for_each(resource, &keyboard->resource_list) { @@ -218,8 +230,14 @@ PEPPER_API void pepper_keyboard_send_key(pepper_keyboard_t *keyboard, uint32_t time, uint32_t key, uint32_t state) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(keyboard->focus->surface->resource); - uint32_t serial = wl_display_next_serial(keyboard->seat->compositor->display); + struct wl_client *client; + uint32_t serial; + + if (!keyboard->focus) + return; + + client = wl_resource_get_client(keyboard->focus->surface->resource); + serial = wl_display_next_serial(keyboard->seat->compositor->display); wl_resource_for_each(resource, &keyboard->resource_list) { @@ -233,8 +251,14 @@ pepper_keyboard_send_modifiers(pepper_keyboard_t *keyboard, uint32_t depressed, uint32_t locked, uint32_t group) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(keyboard->focus->surface->resource); - uint32_t serial = wl_display_next_serial(keyboard->seat->compositor->display); + struct wl_client *client; + uint32_t serial; + + if (!keyboard->focus) + return; + + client = wl_resource_get_client(keyboard->focus->surface->resource); + serial = wl_display_next_serial(keyboard->seat->compositor->display); wl_resource_for_each(resource, &keyboard->resource_list) { diff --git a/src/lib/pepper/pointer.c b/src/lib/pepper/pointer.c index cf40c75..4dbd38c 100644 --- a/src/lib/pepper/pointer.c +++ b/src/lib/pepper/pointer.c @@ -336,6 +336,9 @@ pepper_pointer_get_position(pepper_pointer_t *pointer, double *x, double *y) PEPPER_API void pepper_pointer_set_focus(pepper_pointer_t *pointer, pepper_view_t *focus) { + if (!focus || !focus->surface) + focus = NULL; + if (pointer->focus == focus) return; @@ -369,8 +372,14 @@ PEPPER_API void pepper_pointer_send_leave(pepper_pointer_t *pointer) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(pointer->focus->surface->resource); - uint32_t serial = wl_display_next_serial(pointer->seat->compositor->display); + struct wl_client *client; + uint32_t serial; + + if (!pointer->focus) + return; + + client = wl_resource_get_client(pointer->focus->surface->resource); + serial = wl_display_next_serial(pointer->seat->compositor->display); wl_resource_for_each(resource, &pointer->resource_list) { @@ -383,10 +392,16 @@ PEPPER_API void pepper_pointer_send_enter(pepper_pointer_t *pointer, double x, double y) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(pointer->focus->surface->resource); - uint32_t serial = wl_display_next_serial(pointer->seat->compositor->display); wl_fixed_t fx = wl_fixed_from_double(x); wl_fixed_t fy = wl_fixed_from_double(y); + struct wl_client *client; + uint32_t serial; + + if (!pointer->focus) + return; + + client = wl_resource_get_client(pointer->focus->surface->resource); + serial = wl_display_next_serial(pointer->seat->compositor->display); wl_resource_for_each(resource, &pointer->resource_list) { @@ -399,9 +414,14 @@ PEPPER_API void pepper_pointer_send_motion(pepper_pointer_t *pointer, uint32_t time, double x, double y) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(pointer->focus->surface->resource); wl_fixed_t fx = wl_fixed_from_double(x); wl_fixed_t fy = wl_fixed_from_double(y); + struct wl_client *client; + + if (!pointer->focus) + return; + + client = wl_resource_get_client(pointer->focus->surface->resource); wl_resource_for_each(resource, &pointer->resource_list) { @@ -414,8 +434,14 @@ PEPPER_API void pepper_pointer_send_button(pepper_pointer_t *pointer, uint32_t time, uint32_t button, uint32_t state) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(pointer->focus->surface->resource); - uint32_t serial = wl_display_next_serial(pointer->seat->compositor->display); + struct wl_client *client; + uint32_t serial; + + if (!pointer->focus) + return; + + client = wl_resource_get_client(pointer->focus->surface->resource); + serial = wl_display_next_serial(pointer->seat->compositor->display); wl_resource_for_each(resource, &pointer->resource_list) { @@ -428,8 +454,13 @@ PEPPER_API void pepper_pointer_send_axis(pepper_pointer_t *pointer, uint32_t time, uint32_t axis, double value) { struct wl_resource *resource; - struct wl_client *client = wl_resource_get_client(pointer->focus->surface->resource); wl_fixed_t v = wl_fixed_from_double(value); + struct wl_client *client; + + if (!pointer->focus) + return; + + client = wl_resource_get_client(pointer->focus->surface->resource); wl_resource_for_each(resource, &pointer->resource_list) { -- 2.34.1