window.c: Rearrange input handlers so they appear in the right order
They were all over the place before, now they appear in protocol order.
diff --git a/clients/window.c b/clients/window.c
index d0b7a7d..7c30955 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1762,6 +1762,85 @@
}
}
+void
+input_grab(struct input *input, struct widget *widget, uint32_t button)
+{
+ input->grab = widget;
+ input->grab_button = button;
+}
+
+void
+input_ungrab(struct input *input)
+{
+ struct widget *widget;
+
+ input->grab = NULL;
+ if (input->pointer_focus) {
+ widget = widget_find_widget(input->pointer_focus->widget,
+ input->sx, input->sy);
+ input_set_focus_widget(input, widget, input->sx, input->sy);
+ }
+}
+
+static void
+input_remove_pointer_focus(struct input *input)
+{
+ struct window *window = input->pointer_focus;
+
+ if (!window)
+ return;
+
+ input_set_focus_widget(input, NULL, 0, 0);
+
+ input->pointer_focus = NULL;
+ input->current_cursor = CURSOR_UNSET;
+}
+
+static void
+pointer_handle_enter(void *data, struct wl_pointer *pointer,
+ uint32_t serial, struct wl_surface *surface,
+ wl_fixed_t sx_w, wl_fixed_t sy_w)
+{
+ struct input *input = data;
+ struct window *window;
+ struct widget *widget;
+ float sx = wl_fixed_to_double(sx_w);
+ float sy = wl_fixed_to_double(sy_w);
+
+ if (!surface) {
+ /* enter event for a window we've just destroyed */
+ return;
+ }
+
+ input->display->serial = serial;
+ input->pointer_enter_serial = serial;
+ input->pointer_focus = wl_surface_get_user_data(surface);
+ window = input->pointer_focus;
+
+ if (window->pool) {
+ shm_pool_destroy(window->pool);
+ window->pool = NULL;
+ /* Schedule a redraw to free the pool */
+ window_schedule_redraw(window);
+ }
+
+ input->sx = sx;
+ input->sy = sy;
+
+ widget = widget_find_widget(window->widget, sx, sy);
+ input_set_focus_widget(input, widget, sx, sy);
+}
+
+static void
+pointer_handle_leave(void *data, struct wl_pointer *pointer,
+ uint32_t serial, struct wl_surface *surface)
+{
+ struct input *input = data;
+
+ input->display->serial = serial;
+ input_remove_pointer_focus(input);
+}
+
static void
pointer_handle_motion(void *data, struct wl_pointer *pointer,
uint32_t time, wl_fixed_t sx_w, wl_fixed_t sy_w)
@@ -1793,26 +1872,6 @@
input_set_pointer_image(input, cursor);
}
-void
-input_grab(struct input *input, struct widget *widget, uint32_t button)
-{
- input->grab = widget;
- input->grab_button = button;
-}
-
-void
-input_ungrab(struct input *input)
-{
- struct widget *widget;
-
- input->grab = NULL;
- if (input->pointer_focus) {
- widget = widget_find_widget(input->pointer_focus->widget,
- input->sx, input->sy);
- input_set_focus_widget(input, widget, input->sx, input->sy);
- }
-}
-
static void
pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
uint32_t time, uint32_t button, uint32_t state_w)
@@ -1844,6 +1903,139 @@
{
}
+static const struct wl_pointer_listener pointer_listener = {
+ pointer_handle_enter,
+ pointer_handle_leave,
+ pointer_handle_motion,
+ pointer_handle_button,
+ pointer_handle_axis,
+};
+
+static void
+input_remove_keyboard_focus(struct input *input)
+{
+ struct window *window = input->keyboard_focus;
+ struct itimerspec its;
+
+ its.it_interval.tv_sec = 0;
+ its.it_interval.tv_nsec = 0;
+ its.it_value.tv_sec = 0;
+ its.it_value.tv_nsec = 0;
+ timerfd_settime(input->repeat_timer_fd, 0, &its, NULL);
+
+ if (!window)
+ return;
+
+ window->keyboard_device = NULL;
+ if (window->keyboard_focus_handler)
+ (*window->keyboard_focus_handler)(window, NULL,
+ window->user_data);
+
+ input->keyboard_focus = NULL;
+}
+
+static void
+keyboard_repeat_func(struct task *task, uint32_t events)
+{
+ struct input *input =
+ container_of(task, struct input, repeat_task);
+ struct window *window = input->keyboard_focus;
+ uint64_t exp;
+
+ if (read(input->repeat_timer_fd, &exp, sizeof exp) != sizeof exp)
+ /* If we change the timer between the fd becoming
+ * readable and getting here, there'll be nothing to
+ * read and we get EAGAIN. */
+ return;
+
+ if (window && window->key_handler) {
+ (*window->key_handler)(window, input, input->repeat_time,
+ input->repeat_key, input->repeat_sym,
+ WL_KEYBOARD_KEY_STATE_PRESSED,
+ window->user_data);
+ }
+}
+
+static void
+keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
+ uint32_t format, int fd, uint32_t size)
+{
+ struct input *input = data;
+ char *map_str;
+
+ if (!data) {
+ close(fd);
+ return;
+ }
+
+ if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
+ close(fd);
+ return;
+ }
+
+ map_str = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+ if (map_str == MAP_FAILED) {
+ close(fd);
+ return;
+ }
+
+ input->xkb.keymap = xkb_map_new_from_string(input->display->xkb_context,
+ map_str,
+ XKB_KEYMAP_FORMAT_TEXT_V1,
+ 0);
+ munmap(map_str, size);
+ close(fd);
+
+ if (!input->xkb.keymap) {
+ fprintf(stderr, "failed to compile keymap\n");
+ return;
+ }
+
+ input->xkb.state = xkb_state_new(input->xkb.keymap);
+ if (!input->xkb.state) {
+ fprintf(stderr, "failed to create XKB state\n");
+ xkb_map_unref(input->xkb.keymap);
+ input->xkb.keymap = NULL;
+ return;
+ }
+
+ input->xkb.control_mask =
+ 1 << xkb_map_mod_get_index(input->xkb.keymap, "Control");
+ input->xkb.alt_mask =
+ 1 << xkb_map_mod_get_index(input->xkb.keymap, "Mod1");
+ input->xkb.shift_mask =
+ 1 << xkb_map_mod_get_index(input->xkb.keymap, "Shift");
+}
+
+static void
+keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
+ uint32_t serial, struct wl_surface *surface,
+ struct wl_array *keys)
+{
+ struct input *input = data;
+ struct window *window;
+
+ input->display->serial = serial;
+ input->keyboard_focus = wl_surface_get_user_data(surface);
+
+ window = input->keyboard_focus;
+ window->keyboard_device = input;
+ if (window->keyboard_focus_handler)
+ (*window->keyboard_focus_handler)(window,
+ window->keyboard_device,
+ window->user_data);
+}
+
+static void
+keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
+ uint32_t serial, struct wl_surface *surface)
+{
+ struct input *input = data;
+
+ input->display->serial = serial;
+ input_remove_keyboard_focus(input);
+}
+
static void
keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
uint32_t serial, uint32_t time, uint32_t key,
@@ -1921,28 +2113,6 @@
}
static void
-keyboard_repeat_func(struct task *task, uint32_t events)
-{
- struct input *input =
- container_of(task, struct input, repeat_task);
- struct window *window = input->keyboard_focus;
- uint64_t exp;
-
- if (read(input->repeat_timer_fd, &exp, sizeof exp) != sizeof exp)
- /* If we change the timer between the fd becoming
- * readable and getting here, there'll be nothing to
- * read and we get EAGAIN. */
- return;
-
- if (window && window->key_handler) {
- (*window->key_handler)(window, input, input->repeat_time,
- input->repeat_key, input->repeat_sym,
- WL_KEYBOARD_KEY_STATE_PRESSED,
- window->user_data);
- }
-}
-
-static void
keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard,
uint32_t serial, uint32_t mods_depressed,
uint32_t mods_latched, uint32_t mods_locked,
@@ -1954,176 +2124,6 @@
mods_locked, 0, 0, group);
}
-static void
-input_remove_pointer_focus(struct input *input)
-{
- struct window *window = input->pointer_focus;
-
- if (!window)
- return;
-
- input_set_focus_widget(input, NULL, 0, 0);
-
- input->pointer_focus = NULL;
- input->current_cursor = CURSOR_UNSET;
-}
-
-static void
-pointer_handle_enter(void *data, struct wl_pointer *pointer,
- uint32_t serial, struct wl_surface *surface,
- wl_fixed_t sx_w, wl_fixed_t sy_w)
-{
- struct input *input = data;
- struct window *window;
- struct widget *widget;
- float sx = wl_fixed_to_double(sx_w);
- float sy = wl_fixed_to_double(sy_w);
-
- if (!surface) {
- /* enter event for a window we've just destroyed */
- return;
- }
-
- input->display->serial = serial;
- input->pointer_enter_serial = serial;
- input->pointer_focus = wl_surface_get_user_data(surface);
- window = input->pointer_focus;
-
- if (window->pool) {
- shm_pool_destroy(window->pool);
- window->pool = NULL;
- /* Schedule a redraw to free the pool */
- window_schedule_redraw(window);
- }
-
- input->sx = sx;
- input->sy = sy;
-
- widget = widget_find_widget(window->widget, sx, sy);
- input_set_focus_widget(input, widget, sx, sy);
-}
-
-static void
-pointer_handle_leave(void *data, struct wl_pointer *pointer,
- uint32_t serial, struct wl_surface *surface)
-{
- struct input *input = data;
-
- input->display->serial = serial;
- input_remove_pointer_focus(input);
-}
-
-static void
-input_remove_keyboard_focus(struct input *input)
-{
- struct window *window = input->keyboard_focus;
- struct itimerspec its;
-
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = 0;
- its.it_value.tv_sec = 0;
- its.it_value.tv_nsec = 0;
- timerfd_settime(input->repeat_timer_fd, 0, &its, NULL);
-
- if (!window)
- return;
-
- window->keyboard_device = NULL;
- if (window->keyboard_focus_handler)
- (*window->keyboard_focus_handler)(window, NULL,
- window->user_data);
-
- input->keyboard_focus = NULL;
-}
-
-static void
-keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
- uint32_t serial, struct wl_surface *surface,
- struct wl_array *keys)
-{
- struct input *input = data;
- struct window *window;
-
- input->display->serial = serial;
- input->keyboard_focus = wl_surface_get_user_data(surface);
-
- window = input->keyboard_focus;
- window->keyboard_device = input;
- if (window->keyboard_focus_handler)
- (*window->keyboard_focus_handler)(window,
- window->keyboard_device,
- window->user_data);
-}
-
-static void
-keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
- uint32_t serial, struct wl_surface *surface)
-{
- struct input *input = data;
-
- input->display->serial = serial;
- input_remove_keyboard_focus(input);
-}
-
-static void
-keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
- uint32_t format, int fd, uint32_t size)
-{
- struct input *input = data;
- char *map_str;
-
- if (!data) {
- close(fd);
- return;
- }
-
- if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1) {
- close(fd);
- return;
- }
-
- map_str = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
- if (map_str == MAP_FAILED) {
- close(fd);
- return;
- }
-
- input->xkb.keymap = xkb_map_new_from_string(input->display->xkb_context,
- map_str,
- XKB_KEYMAP_FORMAT_TEXT_V1,
- 0);
- munmap(map_str, size);
- close(fd);
-
- if (!input->xkb.keymap) {
- fprintf(stderr, "failed to compile keymap\n");
- return;
- }
-
- input->xkb.state = xkb_state_new(input->xkb.keymap);
- if (!input->xkb.state) {
- fprintf(stderr, "failed to create XKB state\n");
- xkb_map_unref(input->xkb.keymap);
- input->xkb.keymap = NULL;
- return;
- }
-
- input->xkb.control_mask =
- 1 << xkb_map_mod_get_index(input->xkb.keymap, "Control");
- input->xkb.alt_mask =
- 1 << xkb_map_mod_get_index(input->xkb.keymap, "Mod1");
- input->xkb.shift_mask =
- 1 << xkb_map_mod_get_index(input->xkb.keymap, "Shift");
-}
-
-static const struct wl_pointer_listener pointer_listener = {
- pointer_handle_enter,
- pointer_handle_leave,
- pointer_handle_motion,
- pointer_handle_button,
- pointer_handle_axis,
-};
-
static const struct wl_keyboard_listener keyboard_listener = {
keyboard_handle_keymap,
keyboard_handle_enter,