summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2012-02-23 09:59:05 -0500
committerKristian Høgsberg <krh@bitplanet.net>2012-02-23 09:59:05 -0500
commit06d58b74afc55866fda0d93fc630e96bb4594962 (patch)
tree1a64303f57a7fd88493bc5b835f70b7d1f3c93c8
parent88277d1422b75a67b40c8809949fb71bd5ca31c0 (diff)
Update to enter/leave events for pointer and keyboard
-rw-r--r--clients/window.c62
-rw-r--r--src/compositor-wayland.c61
2 files changed, 75 insertions, 48 deletions
diff --git a/clients/window.c b/clients/window.c
index ac26f52..8c5d17b 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1575,7 +1575,7 @@ input_remove_pointer_focus(struct input *input, uint32_t time)
}
static void
-input_handle_pointer_focus(void *data,
+input_handle_pointer_enter(void *data,
struct wl_input_device *input_device,
uint32_t time, struct wl_surface *surface,
int32_t sx, int32_t sy)
@@ -1584,20 +1584,24 @@ input_handle_pointer_focus(void *data,
struct window *window;
struct widget *widget;
+ input->pointer_focus = wl_surface_get_user_data(surface);
window = input->pointer_focus;
- if (window && window->surface != surface)
- input_remove_pointer_focus(input, time);
- if (surface) {
- input->pointer_focus = wl_surface_get_user_data(surface);
- window = input->pointer_focus;
+ input->sx = sx;
+ input->sy = sy;
- input->sx = sx;
- input->sy = sy;
+ widget = widget_find_widget(window->widget, sx, sy);
+ input_set_focus_widget(input, widget, time, sx, sy);
+}
- widget = widget_find_widget(window->widget, sx, sy);
- input_set_focus_widget(input, widget, time, sx, sy);
- }
+static void
+input_handle_pointer_leave(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, struct wl_surface *surface)
+{
+ struct input *input = data;
+
+ input_remove_pointer_focus(input, time);
}
static void
@@ -1617,7 +1621,7 @@ input_remove_keyboard_focus(struct input *input)
}
static void
-input_handle_keyboard_focus(void *data,
+input_handle_keyboard_enter(void *data,
struct wl_input_device *input_device,
uint32_t time,
struct wl_surface *surface,
@@ -1628,10 +1632,7 @@ input_handle_keyboard_focus(void *data,
struct display *d = input->display;
uint32_t *k, *end;
- input_remove_keyboard_focus(input);
-
- if (surface)
- input->keyboard_focus = wl_surface_get_user_data(surface);
+ input->keyboard_focus = wl_surface_get_user_data(surface);
end = keys->data + keys->size;
input->modifiers = 0;
@@ -1639,13 +1640,22 @@ input_handle_keyboard_focus(void *data,
input->modifiers |= d->xkb->map->modmap[*k];
window = input->keyboard_focus;
- if (window) {
- window->keyboard_device = input;
- if (window->keyboard_focus_handler)
- (*window->keyboard_focus_handler)(window,
- window->keyboard_device,
- window->user_data);
- }
+ window->keyboard_device = input;
+ if (window->keyboard_focus_handler)
+ (*window->keyboard_focus_handler)(window,
+ window->keyboard_device,
+ window->user_data);
+}
+
+static void
+input_handle_keyboard_leave(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ struct wl_surface *surface)
+{
+ struct input *input = data;
+
+ input_remove_keyboard_focus(input);
}
static void
@@ -1686,8 +1696,10 @@ static const struct wl_input_device_listener input_device_listener = {
input_handle_motion,
input_handle_button,
input_handle_key,
- input_handle_pointer_focus,
- input_handle_keyboard_focus,
+ input_handle_pointer_enter,
+ input_handle_pointer_leave,
+ input_handle_keyboard_enter,
+ input_handle_keyboard_leave,
input_handle_touch_down,
input_handle_touch_up,
input_handle_touch_motion,
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index d6757f0..386f9b6 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -531,7 +531,7 @@ input_handle_key(void *data, struct wl_input_device *input_device,
}
static void
-input_handle_pointer_focus(void *data,
+input_handle_pointer_enter(void *data,
struct wl_input_device *input_device,
uint32_t time, struct wl_surface *surface,
int32_t sx, int32_t sy)
@@ -540,43 +540,58 @@ input_handle_pointer_focus(void *data,
struct wayland_output *output;
struct wayland_compositor *c = input->compositor;
- if (surface) {
- output = wl_surface_get_user_data(surface);
- notify_pointer_focus(c->base.input_device,
- time, &output->base, sx, sy);
+ output = wl_surface_get_user_data(surface);
+ notify_pointer_focus(c->base.input_device,
+ time, &output->base, sx, sy);
+ wl_input_device_attach(input->input_device, time, NULL, 0, 0);
+}
- wl_input_device_attach(input->input_device, time, NULL, 0, 0);
- } else {
- notify_pointer_focus(c->base.input_device, time, NULL, 0, 0);
- }
+static void
+input_handle_pointer_leave(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time, struct wl_surface *surface)
+{
+ struct wayland_input *input = data;
+ struct wayland_compositor *c = input->compositor;
+
+ notify_pointer_focus(c->base.input_device, time, NULL, 0, 0);
}
static void
-input_handle_keyboard_focus(void *data,
- struct wl_input_device *input_device,
- uint32_t time,
- struct wl_surface *surface,
- struct wl_array *keys)
+input_handle_keyboard_enter(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ struct wl_surface *surface,
+ struct wl_array *keys)
{
struct wayland_input *input = data;
struct wayland_compositor *c = input->compositor;
struct wayland_output *output;
- if (surface) {
- output = wl_surface_get_user_data(surface);
- notify_keyboard_focus(c->base.input_device,
- time, &output->base, keys);
- } else {
- notify_keyboard_focus(c->base.input_device, time, NULL, NULL);
- }
+ output = wl_surface_get_user_data(surface);
+ notify_keyboard_focus(c->base.input_device, time, &output->base, keys);
+}
+
+static void
+input_handle_keyboard_leave(void *data,
+ struct wl_input_device *input_device,
+ uint32_t time,
+ struct wl_surface *surface)
+{
+ struct wayland_input *input = data;
+ struct wayland_compositor *c = input->compositor;
+
+ notify_keyboard_focus(c->base.input_device, time, NULL, NULL);
}
static const struct wl_input_device_listener input_device_listener = {
input_handle_motion,
input_handle_button,
input_handle_key,
- input_handle_pointer_focus,
- input_handle_keyboard_focus,
+ input_handle_pointer_enter,
+ input_handle_pointer_leave,
+ input_handle_keyboard_enter,
+ input_handle_keyboard_leave,
};
static void