diff options
author | Derek Foreman <derekf@osg.samsung.com> | 2015-07-31 16:55:32 -0500 |
---|---|---|
committer | Bryce Harrington <bryce@osg.samsung.com> | 2015-07-31 15:16:09 -0700 |
commit | 1281a36e3bcd27345bd4a107f282213ecca56f0e (patch) | |
tree | 5d797ffcd96f5542da153bec095a1c7800ce9cda /desktop-shell | |
parent | b41b59e2fae83124f90ce54b6ae3f088bfec3338 (diff) |
input: Don't test keyboard/pointer/touch pointers
Keyboards and pointers aren't freed when devices are removed, so we should
really be testing keyboard_device_count and pointer_device_count in most
cases, not the actual pointers. Otherwise we end up with different
behaviour after removing a device than we had before it was inserted.
This commit renames the touch/keyboard/pointer pointers and adds helper
functions to get them that hide this complexity and return NULL when
*_device_count is 0.
Signed-off-by: Derek Foreman <derekf@osg.samsung.com>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
Diffstat (limited to 'desktop-shell')
-rw-r--r-- | desktop-shell/exposay.c | 34 | ||||
-rw-r--r-- | desktop-shell/input-panel.c | 7 | ||||
-rw-r--r-- | desktop-shell/shell.c | 191 |
3 files changed, 142 insertions, 90 deletions
diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c index 3d5d0c33..109f8e33 100644 --- a/desktop-shell/exposay.c +++ b/desktop-shell/exposay.c @@ -525,14 +525,16 @@ static enum exposay_layout_state exposay_set_inactive(struct desktop_shell *shell) { struct weston_seat *seat = shell->exposay.seat; + struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); + struct weston_pointer *pointer = weston_seat_get_pointer(seat); - if (seat->pointer_device_count) - weston_pointer_end_grab(seat->pointer); + if (pointer) + weston_pointer_end_grab(pointer); - if (seat->keyboard_device_count) { - weston_keyboard_end_grab(seat->keyboard); - if (seat->keyboard->input_method_resource) - seat->keyboard->grab = &seat->keyboard->input_method_grab; + if (keyboard) { + weston_keyboard_end_grab(keyboard); + if (keyboard->input_method_resource) + keyboard->grab = &keyboard->input_method_grab; } return EXPOSAY_LAYOUT_INACTIVE; @@ -566,28 +568,30 @@ static enum exposay_layout_state exposay_transition_active(struct desktop_shell *shell) { struct weston_seat *seat = shell->exposay.seat; + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); struct shell_output *shell_output; bool animate = false; shell->exposay.workspace = get_current_workspace(shell); - shell->exposay.focus_prev = get_default_view (seat->keyboard->focus); - shell->exposay.focus_current = get_default_view (seat->keyboard->focus); + shell->exposay.focus_prev = get_default_view(keyboard->focus); + shell->exposay.focus_current = get_default_view(keyboard->focus); shell->exposay.clicked = NULL; wl_list_init(&shell->exposay.surface_list); lower_fullscreen_layer(shell, NULL); shell->exposay.grab_kbd.interface = &exposay_kbd_grab; - weston_keyboard_start_grab(seat->keyboard, + weston_keyboard_start_grab(keyboard, &shell->exposay.grab_kbd); - weston_keyboard_set_focus(seat->keyboard, NULL); + weston_keyboard_set_focus(keyboard, NULL); shell->exposay.grab_ptr.interface = &exposay_ptr_grab; - if (seat->pointer_device_count) { - weston_pointer_start_grab(seat->pointer, + if (pointer) { + weston_pointer_start_grab(pointer, &shell->exposay.grab_ptr); - weston_pointer_set_focus(seat->pointer, NULL, - seat->pointer->x, - seat->pointer->y); + weston_pointer_set_focus(pointer, NULL, + pointer->x, + pointer->y); } wl_list_for_each(shell_output, &shell->output_list, link) { enum exposay_layout_state state; diff --git a/desktop-shell/input-panel.c b/desktop-shell/input-panel.c index 1028df13..251d0449 100644 --- a/desktop-shell/input-panel.c +++ b/desktop-shell/input-panel.c @@ -68,9 +68,12 @@ show_input_panel_surface(struct input_panel_surface *ipsurf) float x, y; wl_list_for_each(seat, &shell->compositor->seat_list, link) { - if (!seat->keyboard || !seat->keyboard->focus) + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(seat); + + if (!keyboard || !keyboard->focus) continue; - focus = weston_surface_get_main_surface(seat->keyboard->focus); + focus = weston_surface_get_main_surface(keyboard->focus); ipsurf->output = focus->output; x = ipsurf->output->x + (ipsurf->output->width - ipsurf->surface->width) / 2; y = ipsurf->output->y + ipsurf->output->height - ipsurf->surface->height; diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 009e6710..487c3e73 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -378,10 +378,11 @@ shell_grab_start(struct shell_grab *grab, enum desktop_shell_cursor cursor) { struct desktop_shell *shell = shsurf->shell; + struct weston_touch *touch = weston_seat_get_touch(pointer->seat); popup_grab_end(pointer); - if (pointer->seat->touch) - touch_popup_grab_end(pointer->seat->touch); + if (touch) + touch_popup_grab_end(touch); grab->grab.interface = interface; grab->shsurf = shsurf; @@ -546,10 +547,11 @@ shell_touch_grab_start(struct shell_touch_grab *grab, struct weston_touch *touch) { struct desktop_shell *shell = shsurf->shell; + struct weston_pointer *pointer = weston_seat_get_pointer(touch->seat); touch_popup_grab_end(touch); - if (touch->seat->pointer) - popup_grab_end(touch->seat->pointer); + if (pointer) + popup_grab_end(pointer); grab->grab.interface = interface; grab->shsurf = shsurf; @@ -900,27 +902,33 @@ restore_focus_state(struct desktop_shell *shell, struct workspace *ws) wl_list_init(&shell->compositor->seat_list); wl_list_for_each_safe(state, next, &ws->focus_list, link) { + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(state->seat); + wl_list_remove(&state->seat->link); wl_list_insert(&shell->compositor->seat_list, &state->seat->link); - if (state->seat->keyboard == NULL) + if (!keyboard) continue; surface = state->keyboard_focus; - weston_keyboard_set_focus(state->seat->keyboard, surface); + weston_keyboard_set_focus(keyboard, surface); } /* For any remaining seats that we don't have a focus state * for we'll reset the keyboard focus to NULL */ wl_list_for_each_safe(seat, next_seat, &pending_seat_list, link) { + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(seat); + wl_list_insert(&shell->compositor->seat_list, &seat->link); - if (seat->keyboard == NULL) + if (!keyboard) continue; - weston_keyboard_set_focus(seat->keyboard, NULL); + weston_keyboard_set_focus(keyboard, NULL); } } @@ -928,11 +936,12 @@ static void replace_focus_state(struct desktop_shell *shell, struct workspace *ws, struct weston_seat *seat) { + struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); struct focus_state *state; wl_list_for_each(state, &ws->focus_list, link) { if (state->seat == seat) { - focus_state_set_focus(state, seat->keyboard->focus); + focus_state_set_focus(state, keyboard->focus); return; } } @@ -1431,12 +1440,15 @@ move_surface_to_workspace(struct desktop_shell *shell, drop_focus_state(shell, from, view->surface); wl_list_for_each(seat, &shell->compositor->seat_list, link) { - if (!seat->keyboard) + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(seat); + + if (!keyboard) continue; - focus = weston_surface_get_main_surface(seat->keyboard->focus); + focus = weston_surface_get_main_surface(keyboard->focus); if (focus == view->surface) - weston_keyboard_set_focus(seat->keyboard, NULL); + weston_keyboard_set_focus(keyboard, NULL); } weston_view_damage_below(view); @@ -1447,6 +1459,7 @@ take_surface_to_workspace_by_seat(struct desktop_shell *shell, struct weston_seat *seat, unsigned int index) { + struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); struct weston_surface *surface; struct weston_view *view; struct shell_surface *shsurf; @@ -1454,7 +1467,7 @@ take_surface_to_workspace_by_seat(struct desktop_shell *shell, struct workspace *to; struct focus_state *state; - surface = weston_surface_get_main_surface(seat->keyboard->focus); + surface = weston_surface_get_main_surface(keyboard->focus); view = get_default_view(surface); if (view == NULL || index == shell->workspaces.current || @@ -1782,23 +1795,25 @@ common_surface_move(struct wl_resource *resource, struct wl_resource *seat_resource, uint32_t serial) { struct weston_seat *seat = wl_resource_get_user_data(seat_resource); + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + struct weston_touch *touch = weston_seat_get_touch(seat); struct shell_surface *shsurf = wl_resource_get_user_data(resource); struct weston_surface *surface; - if (seat->pointer && - seat->pointer->focus && - seat->pointer->button_count > 0 && - seat->pointer->grab_serial == serial) { - surface = weston_surface_get_main_surface(seat->pointer->focus->surface); + if (pointer && + pointer->focus && + pointer->button_count > 0 && + pointer->grab_serial == serial) { + surface = weston_surface_get_main_surface(pointer->focus->surface); if ((surface == shsurf->surface) && - (surface_move(shsurf, seat->pointer, true) < 0)) + (surface_move(shsurf, pointer, true) < 0)) wl_resource_post_no_memory(resource); - } else if (seat->touch && - seat->touch->focus && - seat->touch->grab_serial == serial) { - surface = weston_surface_get_main_surface(seat->touch->focus->surface); + } else if (touch && + touch->focus && + touch->grab_serial == serial) { + surface = weston_surface_get_main_surface(touch->focus->surface); if ((surface == shsurf->surface) && - (surface_touch_move(shsurf, seat->touch) < 0)) + (surface_touch_move(shsurf, touch) < 0)) wl_resource_post_no_memory(resource); } } @@ -1986,20 +2001,21 @@ common_surface_resize(struct wl_resource *resource, uint32_t edges) { struct weston_seat *seat = wl_resource_get_user_data(seat_resource); + struct weston_pointer *pointer = weston_seat_get_pointer(seat); struct shell_surface *shsurf = wl_resource_get_user_data(resource); struct weston_surface *surface; - if (seat->pointer == NULL || - seat->pointer->button_count == 0 || - seat->pointer->grab_serial != serial || - seat->pointer->focus == NULL) + if (!pointer || + pointer->button_count == 0 || + pointer->grab_serial != serial || + pointer->focus == NULL) return; - surface = weston_surface_get_main_surface(seat->pointer->focus->surface); + surface = weston_surface_get_main_surface(pointer->focus->surface); if (surface != shsurf->surface) return; - if (surface_resize(shsurf, seat->pointer, edges) < 0) + if (surface_resize(shsurf, pointer, edges) < 0) wl_resource_post_no_memory(resource); } @@ -2096,10 +2112,12 @@ end_busy_cursor(struct weston_compositor *compositor, struct wl_client *client) struct weston_seat *seat; wl_list_for_each(seat, &compositor->seat_list, link) { - if (seat->pointer == NULL) + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + + if (!pointer) continue; - grab = (struct shell_grab *) seat->pointer->grab; + grab = (struct shell_grab *) pointer->grab; if (grab->grab.interface == &busy_cursor_grab_interface && wl_resource_get_client(grab->shsurf->resource) == client) { shell_grab_end(grab); @@ -2121,15 +2139,17 @@ xdg_ping_timeout_handler(void *data) /* Client is not responding */ sc->unresponsive = 1; wl_list_for_each(seat, &sc->shell->compositor->seat_list, link) { - if (seat->pointer == NULL || seat->pointer->focus == NULL) - continue; - if (seat->pointer->focus->surface->resource == NULL) + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + + if (!pointer || + !pointer->focus || + !pointer->focus->surface->resource) continue; - shsurf = get_shell_surface(seat->pointer->focus->surface); + shsurf = get_shell_surface(pointer->focus->surface); if (shsurf && wl_resource_get_client(shsurf->resource) == sc->client) - set_busy_cursor(shsurf, seat->pointer); + set_busy_cursor(shsurf, pointer); } return 1; @@ -2684,11 +2704,14 @@ set_minimized(struct weston_surface *surface) drop_focus_state(shsurf->shell, current_ws, view->surface); wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) { - if (!seat->keyboard) + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(seat); + + if (!keyboard) continue; - focus = weston_surface_get_main_surface(seat->keyboard->focus); + focus = weston_surface_get_main_surface(keyboard->focus); if (focus == view->surface) - weston_keyboard_set_focus(seat->keyboard, NULL); + weston_keyboard_set_focus(keyboard, NULL); } shell_surface_update_child_surface_layers(shsurf); @@ -3020,17 +3043,22 @@ get_focused_output(struct weston_compositor *compositor) struct weston_output *output = NULL; wl_list_for_each(seat, &compositor->seat_list, link) { + struct weston_touch *touch = weston_seat_get_touch(seat); + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(seat); + /* Priority has touch focus, then pointer and * then keyboard focus. We should probably have * three for loops and check frist for touch, * then for pointer, etc. but unless somebody has some * objections, I think this is sufficient. */ - if (seat->touch && seat->touch->focus) - output = seat->touch->focus->output; - else if (seat->pointer && seat->pointer->focus) - output = seat->pointer->focus->output; - else if (seat->keyboard && seat->keyboard->focus) - output = seat->keyboard->focus->output; + if (touch && touch->focus) + output = touch->focus->output; + else if (pointer && pointer->focus) + output = pointer->focus->output; + else if (keyboard && keyboard->focus) + output = keyboard->focus->output; if (output) break; @@ -3061,7 +3089,7 @@ shell_interface_set_maximized(struct shell_surface *shsurf) static int shell_interface_move(struct shell_surface *shsurf, struct weston_seat *ws) { - return surface_move(shsurf, ws->pointer, true); + return surface_move(shsurf, weston_seat_get_pointer(ws), true); } static int @@ -3069,7 +3097,7 @@ shell_interface_resize(struct shell_surface *shsurf, struct weston_seat *ws, uint32_t edges) { - return surface_resize(shsurf, ws->pointer, edges); + return surface_resize(shsurf, weston_seat_get_pointer(ws), edges); } static const struct weston_pointer_grab_interface popup_grab_interface; @@ -3101,24 +3129,28 @@ destroy_shell_seat(struct wl_listener *listener, void *data) static void shell_seat_caps_changed(struct wl_listener *listener, void *data) { + struct weston_keyboard *keyboard; + struct weston_pointer *pointer; struct shell_seat *seat; seat = container_of(listener, struct shell_seat, caps_changed_listener); + keyboard = weston_seat_get_keyboard(seat->seat); + pointer = weston_seat_get_pointer(seat->seat); - if (seat->seat->keyboard_device_count && + if (keyboard && wl_list_empty(&seat->keyboard_focus_listener.link)) { - wl_signal_add(&seat->seat->keyboard->focus_signal, + wl_signal_add(&keyboard->focus_signal, &seat->keyboard_focus_listener); - } else if (!seat->seat->keyboard_device_count) { + } else if (!keyboard) { wl_list_remove(&seat->keyboard_focus_listener.link); wl_list_init(&seat->keyboard_focus_listener.link); } - if (seat->seat->pointer_device_count && + if (pointer && wl_list_empty(&seat->pointer_focus_listener.link)) { - wl_signal_add(&seat->seat->pointer->focus_signal, + wl_signal_add(&pointer->focus_signal, &seat->pointer_focus_listener); - } else if (!seat->seat->pointer_device_count) { + } else if (!pointer) { wl_list_remove(&seat->pointer_focus_listener.link); wl_list_init(&seat->pointer_focus_listener.link); } @@ -3415,6 +3447,8 @@ add_popup_grab(struct shell_surface *shsurf, { struct weston_seat *seat = shseat->seat; struct shell_surface *parent, *top_surface; + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + struct weston_touch *touch = weston_seat_get_touch(seat); parent = get_shell_surface(shsurf->parent); top_surface = get_top_popup(shseat); @@ -3441,7 +3475,7 @@ add_popup_grab(struct shell_surface *shsurf, /* We must make sure here that this popup was opened * after a mouse press, and not just by moving around * with other popups already open. */ - if (shseat->seat->pointer->button_count > 0) + if (pointer->button_count > 0) shseat->popup_grab.initial_up = 0; } else if (type == TOUCH) { shseat->popup_grab.touch_grab.interface = @@ -3452,10 +3486,10 @@ add_popup_grab(struct shell_surface *shsurf, &shsurf->popup.grab_link); if (type == POINTER) { - weston_pointer_start_grab(seat->pointer, + weston_pointer_start_grab(pointer, &shseat->popup_grab.grab); } else if (type == TOUCH) { - weston_touch_start_grab(seat->touch, + weston_touch_start_grab(touch, &shseat->popup_grab.touch_grab); } } else { @@ -3498,6 +3532,8 @@ shell_map_popup(struct shell_surface *shsurf) { struct shell_seat *shseat = shsurf->popup.shseat; struct weston_view *parent_view = get_default_view(shsurf->parent); + struct weston_pointer *pointer = weston_seat_get_pointer(shseat->seat); + struct weston_touch *touch = weston_seat_get_touch(shseat->seat); shsurf->surface->output = parent_view->output; shsurf->view->output = parent_view->output; @@ -3506,12 +3542,12 @@ shell_map_popup(struct shell_surface *shsurf) weston_view_set_position(shsurf->view, shsurf->popup.x, shsurf->popup.y); weston_view_update_transform(shsurf->view); - if (shseat->seat->pointer && - shseat->seat->pointer->grab_serial == shsurf->popup.serial) { + if (pointer && + pointer->grab_serial == shsurf->popup.serial) { if (add_popup_grab(shsurf, shseat, POINTER) != 0) return -1; - } else if (shseat->seat->touch && - shseat->seat->touch->grab_serial == shsurf->popup.serial) { + } else if (touch && + touch->grab_serial == shsurf->popup.serial) { if (add_popup_grab(shsurf, shseat, TOUCH) != 0) return -1; } else { @@ -4776,18 +4812,19 @@ do_zoom(struct weston_seat *seat, uint32_t time, uint32_t key, uint32_t axis, wl_fixed_t value) { struct weston_compositor *compositor = seat->compositor; + struct weston_pointer *pointer = weston_seat_get_pointer(seat); struct weston_output *output; float increment; - if (!seat->pointer) { + if (!pointer) { weston_log("Zoom hotkey pressed but seat '%s' contains no pointer.\n", seat->seat_name); return; } wl_list_for_each(output, &compositor->output_list, link) { if (pixman_region32_contains_point(&output->region, - wl_fixed_to_double(seat->pointer->x), - wl_fixed_to_double(seat->pointer->y), + wl_fixed_to_double(pointer->x), + wl_fixed_to_double(pointer->y), NULL)) { if (key == KEY_PAGEUP) increment = output->zoom.increment; @@ -5168,10 +5205,13 @@ unfocus_all_seats(struct desktop_shell *shell) struct weston_seat *seat, *next; wl_list_for_each_safe(seat, next, &shell->compositor->seat_list, link) { - if (seat->keyboard == NULL) + struct weston_keyboard *keyboard = + weston_seat_get_keyboard(seat); + + if (!keyboard) continue; - weston_keyboard_set_focus(seat->keyboard, NULL); + weston_keyboard_set_focus(keyboard, NULL); } } @@ -5405,10 +5445,13 @@ idle_handler(struct wl_listener *listener, void *data) struct weston_seat *seat; wl_list_for_each(seat, &shell->compositor->seat_list, link) { - if (seat->pointer) - popup_grab_end(seat->pointer); - if (seat->touch) - touch_popup_grab_end(seat->touch); + struct weston_touch *touch = weston_seat_get_touch(seat); + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + + if (pointer) + popup_grab_end(pointer); + if (touch) + touch_popup_grab_end(touch); } shell_fade(shell, FADE_OUT); @@ -5456,9 +5499,11 @@ weston_view_set_initial_position(struct weston_view *view, * TODO: Do something clever for touch too? */ wl_list_for_each(seat, &compositor->seat_list, link) { - if (seat->pointer) { - ix = wl_fixed_to_int(seat->pointer->x); - iy = wl_fixed_to_int(seat->pointer->y); + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + + if (pointer) { + ix = wl_fixed_to_int(pointer->x); + iy = wl_fixed_to_int(pointer->y); break; } } |