From b29798bcab9625ce9b07bcf08333e8903cec2119 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Sat, 11 Aug 2012 14:56:08 -0400 Subject: [PATCH] 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. --- clients/window.c | 424 +++++++++++++++++++++++------------------------ 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/clients/window.c b/clients/window.c index d0b7a7d4..7c309554 100644 --- a/clients/window.c +++ b/clients/window.c @@ -1762,6 +1762,85 @@ input_set_focus_widget(struct input *input, struct widget *focus, } } +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 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer, 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 @@ pointer_handle_axis(void *data, struct wl_pointer *pointer, { } +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, @@ -1920,28 +2112,6 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard, } } -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, @@ -1954,176 +2124,6 @@ keyboard_handle_modifiers(void *data, struct wl_keyboard *keyboard, 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,