From 1e4807efa0647b2d856a4c8e9b23aff35625d1d8 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 2 Jul 2018 22:16:20 +1000 Subject: Don't return pending children in seat_get_active_current_child Fixes #2192. seat_get_active_current_child is intended to return a child of the given container which has finished its mapping transaction and is able to be rendered on screen. The previous implementation was capable of returning a pending child, which caused a child of a tabbed or stacked view to be rendered prematurely while it was mapping. --- sway/input/seat.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 2c2087da..a934d4a8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -832,12 +832,12 @@ struct sway_container *seat_get_active_child(struct sway_seat *seat, struct sway_container *seat_get_active_current_child(struct sway_seat *seat, struct sway_container *container) { - struct sway_container *child = seat_get_active_child(seat, container); - if (child) { - return child; - } - if (container->current.children->length == 1) { - return container->current.children->items[0]; + struct sway_seat_container *current = NULL; + wl_list_for_each(current, &seat->focus_stack, link) { + if (current->container->current.parent == container && + current->container->current.layout != L_FLOATING) { + return current->container; + } } return NULL; } -- cgit v1.2.3 From 0bd41a0daecfb2da34ea52f6a46b9fc0d162a47a Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 4 Jul 2018 15:38:08 +1000 Subject: Fix focus related damage When you have an unfocused container (so one view is focused_inactive), and you focus any other view in that container, the view with focused_inactive was not damaged. This is because we damaged the previous focus and new focus, but needed to damage the parent of the new focus. --- sway/input/seat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index a934d4a8..6c5abcd8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -663,7 +663,7 @@ void seat_set_focus_warp(struct sway_seat *seat, } seat_send_focus(container, seat); - container_damage_whole(container); + container_damage_whole(container->parent); } // clean up unfocused empty workspace on new output -- cgit v1.2.3 From 63b4bf500020cf35cebfdce2d73f8e359ff495c2 Mon Sep 17 00:00:00 2001 From: emersion Date: Mon, 9 Jul 2018 22:54:30 +0100 Subject: Update for swaywm/wlroots#1126 --- sway/input/seat.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 6c5abcd8..5dadb31d 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -75,7 +75,7 @@ static void seat_send_activate(struct sway_container *con, struct sway_seat *seat) { if (con->type == C_VIEW) { if (!seat_is_input_allowed(seat, con->sway_view->surface)) { - wlr_log(L_DEBUG, "Refusing to set focus, input is inhibited"); + wlr_log(WLR_DEBUG, "Refusing to set focus, input is inhibited"); return; } view_set_activated(con->sway_view, true); @@ -219,7 +219,7 @@ static struct sway_seat_container *seat_container_from_container( seat_con = calloc(1, sizeof(struct sway_seat_container)); if (seat_con == NULL) { - wlr_log(L_ERROR, "could not allocate seat container"); + wlr_log(WLR_ERROR, "could not allocate seat container"); return NULL; } @@ -301,7 +301,7 @@ static void handle_new_drag_icon(struct wl_listener *listener, void *data) { struct sway_drag_icon *icon = calloc(1, sizeof(struct sway_drag_icon)); if (icon == NULL) { - wlr_log(L_ERROR, "Allocation failed"); + wlr_log(WLR_ERROR, "Allocation failed"); return; } icon->seat = seat; @@ -391,7 +391,7 @@ static void seat_apply_input_config(struct sway_seat *seat, struct input_config *ic = input_device_get_config( sway_device->input_device); if (ic != NULL) { - wlr_log(L_DEBUG, "Applying input config to %s", + wlr_log(WLR_DEBUG, "Applying input config to %s", sway_device->input_device->identifier); mapped_to_output = ic->mapped_to_output; @@ -401,7 +401,7 @@ static void seat_apply_input_config(struct sway_seat *seat, mapped_to_output = sway_device->input_device->wlr_device->output_name; } if (mapped_to_output != NULL) { - wlr_log(L_DEBUG, "Mapping input device %s to output %s", + wlr_log(WLR_DEBUG, "Mapping input device %s to output %s", sway_device->input_device->identifier, mapped_to_output); struct sway_container *output = NULL; for (int i = 0; i < root_container.children->length; ++i) { @@ -415,7 +415,7 @@ static void seat_apply_input_config(struct sway_seat *seat, wlr_cursor_map_input_to_output(seat->cursor->cursor, sway_device->input_device->wlr_device, output->sway_output->wlr_output); - wlr_log(L_DEBUG, "Mapped to output %s", output->name); + wlr_log(WLR_DEBUG, "Mapped to output %s", output->name); } } } @@ -495,7 +495,7 @@ void seat_configure_device(struct sway_seat *seat, seat_configure_tablet_tool(seat, seat_device); break; case WLR_INPUT_DEVICE_TABLET_PAD: - wlr_log(L_DEBUG, "TODO: configure tablet pad"); + wlr_log(WLR_DEBUG, "TODO: configure tablet pad"); break; } } @@ -510,11 +510,11 @@ void seat_add_device(struct sway_seat *seat, struct sway_seat_device *seat_device = calloc(1, sizeof(struct sway_seat_device)); if (!seat_device) { - wlr_log(L_DEBUG, "could not allocate seat device"); + wlr_log(WLR_DEBUG, "could not allocate seat device"); return; } - wlr_log(L_DEBUG, "adding device %s to seat %s", + wlr_log(WLR_DEBUG, "adding device %s to seat %s", input_device->identifier, seat->wlr_seat->name); seat_device->sway_seat = seat; @@ -533,7 +533,7 @@ void seat_remove_device(struct sway_seat *seat, return; } - wlr_log(L_DEBUG, "removing device %s from seat %s", + wlr_log(WLR_DEBUG, "removing device %s from seat %s", input_device->identifier, seat->wlr_seat->name); seat_device_destroy(seat_device); @@ -752,7 +752,7 @@ void seat_set_focus_layer(struct sway_seat *seat, struct sway_container *previous = seat_get_focus_inactive(seat, &root_container); if (previous) { - wlr_log(L_DEBUG, "Returning focus to %p %s '%s'", previous, + wlr_log(WLR_DEBUG, "Returning focus to %p %s '%s'", previous, container_type_to_str(previous->type), previous->name); // Hack to get seat to re-focus the return value of get_focus seat_set_focus(seat, previous->parent); -- cgit v1.2.3 From 15dc5286e280ddd06e845dc57115243e72f2339e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Wed, 11 Jul 2018 19:50:02 +1000 Subject: Move floating windows to front when focused --- sway/input/seat.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 5dadb31d..bf4e8876 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -666,6 +666,14 @@ void seat_set_focus_warp(struct sway_seat *seat, container_damage_whole(container->parent); } + // If we've focused a floating container, bring it to the front. + // We do this by putting it at the end of the floating list. + // This must happen for both the pending and current children lists. + if (container_is_floating(container)) { + list_move_to_end(container->parent->children, container); + list_move_to_end(container->parent->current.children, container); + } + // clean up unfocused empty workspace on new output if (new_output_last_ws) { if (!workspace_is_visible(new_output_last_ws) -- cgit v1.2.3 From 600c1261509b5849562b7e2238c1363c9950ac35 Mon Sep 17 00:00:00 2001 From: dudemanguy Date: Wed, 11 Jul 2018 10:08:33 -0500 Subject: fix crash on floating windows --- sway/input/seat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index bf4e8876..be37258f 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -671,7 +671,9 @@ void seat_set_focus_warp(struct sway_seat *seat, // This must happen for both the pending and current children lists. if (container_is_floating(container)) { list_move_to_end(container->parent->children, container); - list_move_to_end(container->parent->current.children, container); + if (container_has_ancestor(container, container->current.parent)) { + list_move_to_end(container->parent->current.children, container); + } } // clean up unfocused empty workspace on new output -- cgit v1.2.3 From ee0e1b170ec1fce2c92a495293ff8aced83b0cb1 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 12 Jul 2018 14:43:08 +1000 Subject: Fix crash in seat code Container will be NULL if launching swaylock. --- sway/input/seat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index be37258f..5e65ca70 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -669,7 +669,7 @@ void seat_set_focus_warp(struct sway_seat *seat, // If we've focused a floating container, bring it to the front. // We do this by putting it at the end of the floating list. // This must happen for both the pending and current children lists. - if (container_is_floating(container)) { + if (container && container_is_floating(container)) { list_move_to_end(container->parent->children, container); if (container_has_ancestor(container, container->current.parent)) { list_move_to_end(container->parent->current.children, container); -- cgit v1.2.3 From a120d4c79f9406a2f7cc38c60069d3183c98ea87 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 15 Jul 2018 15:20:21 +1000 Subject: Make focus part of transactions Rather than maintain copies of the entire focus stack, this PR transactionises the focus by introducing two new properties to the container state and using those when rendering. * `bool focused` means this container has actual focus. Only one container should have this equalling true in its current state. * `struct sway_container *focus_inactive_child` points to the immediate child that was most recently focused (eg. for tabbed and stacked containers). --- sway/input/seat.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 5e65ca70..74f1375e 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -661,9 +661,13 @@ void seat_set_focus_warp(struct sway_seat *seat, if (last_focus) { seat_send_unfocus(last_focus, seat); } - seat_send_focus(container, seat); - container_damage_whole(container->parent); + + container_set_dirty(container); + container_set_dirty(container->parent); // for focused_inactive_child + if (last_focus) { + container_set_dirty(last_focus); + } } // If we've focused a floating container, bring it to the front. @@ -717,10 +721,6 @@ void seat_set_focus_warp(struct sway_seat *seat, } } - if (last_focus) { - container_damage_whole(last_focus); - } - if (last_workspace && last_workspace != new_workspace) { cursor_send_pointer_motion(seat->cursor, 0, true); } @@ -840,18 +840,6 @@ struct sway_container *seat_get_active_child(struct sway_seat *seat, return NULL; } -struct sway_container *seat_get_active_current_child(struct sway_seat *seat, - struct sway_container *container) { - struct sway_seat_container *current = NULL; - wl_list_for_each(current, &seat->focus_stack, link) { - if (current->container->current.parent == container && - current->container->current.layout != L_FLOATING) { - return current->container; - } - } - return NULL; -} - struct sway_container *seat_get_focus(struct sway_seat *seat) { if (!seat->has_focus) { return NULL; -- cgit v1.2.3 From 315d5311b2004b9e148e7b52a7de161b6dfe3878 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 15 Jul 2018 22:43:33 +1000 Subject: Implement urgency base functionality Introduces a command to manually set urgency, as well as rendering of urgent views, sending the IPC event, removing urgency after focused for one second, and matching urgent views via criteria. --- sway/input/seat.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 74f1375e..7058cc92 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -594,6 +594,12 @@ static void seat_send_unfocus(struct sway_container *container, } } +static int handle_urgent_timeout(void *data) { + struct sway_view *view = data; + view_set_urgent(view, false); + return 0; +} + void seat_set_focus_warp(struct sway_seat *seat, struct sway_container *container, bool warp) { if (seat->focused_layer) { @@ -670,6 +676,16 @@ void seat_set_focus_warp(struct sway_seat *seat, } } + // If urgent, start a timer to unset it + if (container && container->type == C_VIEW && + view_is_urgent(container->sway_view) && + !container->sway_view->urgent_timer) { + struct sway_view *view = container->sway_view; + view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, + handle_urgent_timeout, view); + wl_event_source_timer_update(view->urgent_timer, 1000); + } + // If we've focused a floating container, bring it to the front. // We do this by putting it at the end of the floating list. // This must happen for both the pending and current children lists. -- cgit v1.2.3 From 9ca5cb7fafcea3671107eebc1a9fd6d46b1ffd9e Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Mon, 16 Jul 2018 18:09:35 +1000 Subject: Fix tab split focus bug Fixes a bug where if you have a tab containing a split, then switch from a non-split tab to the split tab, focus is not changed properly. --- sway/input/seat.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 74f1375e..85321dbe 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -649,6 +649,7 @@ void seat_set_focus_warp(struct sway_seat *seat, while (parent) { wl_list_remove(&parent->link); wl_list_insert(&seat->focus_stack, &parent->link); + container_set_dirty(parent->container); parent = seat_container_from_container(seat, -- cgit v1.2.3 From 03d49490ccff3c5c81bea73622c8616fa61eb3dd Mon Sep 17 00:00:00 2001 From: emersion Date: Tue, 17 Jul 2018 23:04:55 +0100 Subject: Update cursor on focus change This allows to send wl_pointer.enter when switching between views in a split/tabbed layout for instance. This (1) updates the cursor image accordingly (2) makes it unnecessary to move the mouse before scrolling. It's harmless to always call cursor_send_pointer_motion because in case the focused surface hasn't changed this is a no-op. The `last_focus != NULL` condition is required otherwise cursor_send_pointer_motion will crash when sway starts up (the sway_output doesn't yet have a workspace). --- sway/input/seat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 12b1fab5..8ed4a3fe 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -738,7 +738,7 @@ void seat_set_focus_warp(struct sway_seat *seat, } } - if (last_workspace && last_workspace != new_workspace) { + if (last_focus != NULL) { cursor_send_pointer_motion(seat->cursor, 0, true); } -- cgit v1.2.3 From 747725b8bb35bf3fd38d442f5bb565e7a4b11ec4 Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 18 Jul 2018 20:00:48 +0100 Subject: Don't unfocus when an override redirect window is mapped --- sway/input/seat.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 8ed4a3fe..eadf3b26 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -753,11 +753,11 @@ void seat_set_focus(struct sway_seat *seat, } void seat_set_focus_surface(struct sway_seat *seat, - struct wlr_surface *surface) { + struct wlr_surface *surface, bool unfocus) { if (seat->focused_layer != NULL) { return; } - if (seat->has_focus) { + if (seat->has_focus && unfocus) { struct sway_container *focus = seat_get_focus(seat); seat_send_unfocus(focus, seat); seat->has_focus = false; @@ -789,7 +789,7 @@ void seat_set_focus_layer(struct sway_seat *seat, } else if (!layer || seat->focused_layer == layer) { return; } - seat_set_focus_surface(seat, layer->surface); + seat_set_focus_surface(seat, layer->surface, true); if (layer->layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) { seat->focused_layer = layer; } -- cgit v1.2.3 From c2ed3d8bd6e2ec12f2ce70d7e106c09a7078e91f Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 20 Jul 2018 19:37:27 +1000 Subject: Implement force_display_urgency_hint The directive sets the timeout before an urgent view becomes normal again after switching to it from another workspace. Also: * When an xwayland surface removes the urgent hint while the timer is active, we now ignore the request. This happens as soon as the view receives focus, so it was effectively making the timer pointless. * The timeout is now only applied when switching to it from another workspace. --- sway/input/seat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index eadf3b26..816429d3 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -679,12 +679,14 @@ void seat_set_focus_warp(struct sway_seat *seat, // If urgent, start a timer to unset it if (container && container->type == C_VIEW && + last_workspace && last_workspace != new_workspace && view_is_urgent(container->sway_view) && + config->urgent_timeout > 0 && !container->sway_view->urgent_timer) { struct sway_view *view = container->sway_view; view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, handle_urgent_timeout, view); - wl_event_source_timer_update(view->urgent_timer, 1000); + wl_event_source_timer_update(view->urgent_timer, config->urgent_timeout); } // If we've focused a floating container, bring it to the front. -- cgit v1.2.3 From 37b33f92e8cd94984c4e3c8c851f5dfdacbe14f5 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 21 Jul 2018 10:27:40 +1000 Subject: Fix urgent timer logic and remove unnecessary header includes --- sway/input/seat.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 816429d3..e77d88a8 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -677,16 +677,20 @@ void seat_set_focus_warp(struct sway_seat *seat, } } - // If urgent, start a timer to unset it + // If urgent, either unset the urgency or start a timer to unset it if (container && container->type == C_VIEW && - last_workspace && last_workspace != new_workspace && view_is_urgent(container->sway_view) && - config->urgent_timeout > 0 && !container->sway_view->urgent_timer) { struct sway_view *view = container->sway_view; - view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, - handle_urgent_timeout, view); - wl_event_source_timer_update(view->urgent_timer, config->urgent_timeout); + if (last_workspace && last_workspace != new_workspace && + config->urgent_timeout > 0) { + view->urgent_timer = wl_event_loop_add_timer(server.wl_event_loop, + handle_urgent_timeout, view); + wl_event_source_timer_update(view->urgent_timer, + config->urgent_timeout); + } else { + view_set_urgent(view, false); + } } // If we've focused a floating container, bring it to the front. -- cgit v1.2.3 From ff445cc85597ee6bfae01f03d3c246e2326f3981 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Fri, 20 Jul 2018 09:28:22 +1000 Subject: Implement xdg shell request_move and request_resize events Also does a few other related things: * Now uses enum wlr_edges instead of our own enum resize_edge * Now uses wlr_xcursor_get_resize_name and removes our own find_resize_edge_name * Renames drag to move for consistency --- sway/input/seat.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index e77d88a8..cc5b2e0f 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1,6 +1,11 @@ #define _XOPEN_SOURCE 700 #define _POSIX_C_SOURCE 199309L #include +#ifdef __linux__ +#include +#elif __FreeBSD__ +#include +#endif #include #include #include @@ -348,6 +353,7 @@ struct sway_seat *seat_create(struct sway_input_manager *input, free(seat); return NULL; } + seat->wlr_seat->data = seat; seat->cursor = sway_cursor_create(seat); if (!seat->cursor) { @@ -894,3 +900,35 @@ struct seat_config *seat_get_config(struct sway_seat *seat) { return NULL; } + +void seat_begin_move(struct sway_seat *seat, struct sway_container *con) { + if (!seat->cursor) { + wlr_log(WLR_DEBUG, "Ignoring move request due to no cursor device"); + return; + } + seat->operation = OP_MOVE; + seat->op_container = con; + seat->op_button = BTN_LEFT; +} + +void seat_begin_resize(struct sway_seat *seat, struct sway_container *con, + uint32_t button, enum wlr_edges edge) { + if (!seat->cursor) { + wlr_log(WLR_DEBUG, "Ignoring resize request due to no cursor device"); + return; + } + struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat->wlr_seat); + seat->operation = OP_RESIZE; + seat->op_container = con; + seat->op_resize_preserve_ratio = keyboard && + (wlr_keyboard_get_modifiers(keyboard) & WLR_MODIFIER_SHIFT); + seat->op_resize_edge = edge == WLR_EDGE_NONE ? + RESIZE_EDGE_BOTTOM | RESIZE_EDGE_RIGHT : edge; + seat->op_button = button; + seat->op_ref_lx = seat->cursor->cursor->x; + seat->op_ref_ly = seat->cursor->cursor->y; + seat->op_ref_con_lx = con->x; + seat->op_ref_con_ly = con->y; + seat->op_ref_width = con->width; + seat->op_ref_height = con->height; +} -- cgit v1.2.3 From 0c87bff5d1ce686afdc25d37eee4bdd8f08abdd3 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 21 Jul 2018 10:40:12 +1000 Subject: Replace static handle_end_operation with seat_end_mouse_operation --- sway/input/seat.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index cc5b2e0f..3a3350e1 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -932,3 +932,22 @@ void seat_begin_resize(struct sway_seat *seat, struct sway_container *con, seat->op_ref_width = con->width; seat->op_ref_height = con->height; } + +void seat_end_mouse_operation(struct sway_seat *seat) { + switch (seat->operation) { + case OP_MOVE: + { + // We "move" the container to its own location so it discovers its + // output again. + struct sway_container *con = seat->op_container; + container_floating_move_to(con, con->x, con->y); + } + case OP_RESIZE: + // Don't need to do anything here. + break; + case OP_NONE: + break; + } + seat->operation = OP_NONE; + seat->op_container = NULL; +} -- cgit v1.2.3 From 9df660ee3188386c907d8feb999636ce8d61d095 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sat, 21 Jul 2018 11:23:48 +1000 Subject: Store last button and use it when views request to move or resize --- sway/input/seat.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 3a3350e1..4e803efd 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -901,14 +901,15 @@ struct seat_config *seat_get_config(struct sway_seat *seat) { return NULL; } -void seat_begin_move(struct sway_seat *seat, struct sway_container *con) { +void seat_begin_move(struct sway_seat *seat, struct sway_container *con, + uint32_t button) { if (!seat->cursor) { wlr_log(WLR_DEBUG, "Ignoring move request due to no cursor device"); return; } seat->operation = OP_MOVE; seat->op_container = con; - seat->op_button = BTN_LEFT; + seat->op_button = button; } void seat_begin_resize(struct sway_seat *seat, struct sway_container *con, @@ -951,3 +952,10 @@ void seat_end_mouse_operation(struct sway_seat *seat) { seat->operation = OP_NONE; seat->op_container = NULL; } + +void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec, + uint32_t button, enum wlr_button_state state) { + seat->last_button = button; + seat->last_button_serial = wlr_seat_pointer_notify_button(seat->wlr_seat, + time_msec, button, state); +} -- cgit v1.2.3 From d21d4b83a3effc56b177f5d505aedfdf2ddbbbd5 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Sun, 22 Jul 2018 23:10:06 +1000 Subject: Set cursor when beginning resize and move operations --- sway/input/seat.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 4e803efd..273223db 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -910,6 +910,7 @@ void seat_begin_move(struct sway_seat *seat, struct sway_container *con, seat->operation = OP_MOVE; seat->op_container = con; seat->op_button = button; + cursor_set_image(seat->cursor, "grab", NULL); } void seat_begin_resize(struct sway_seat *seat, struct sway_container *con, @@ -932,6 +933,10 @@ void seat_begin_resize(struct sway_seat *seat, struct sway_container *con, seat->op_ref_con_ly = con->y; seat->op_ref_width = con->width; seat->op_ref_height = con->height; + + const char *image = edge == WLR_EDGE_NONE ? + "se-resize" : wlr_xcursor_get_resize_name(edge); + cursor_set_image(seat->cursor, image, NULL); } void seat_end_mouse_operation(struct sway_seat *seat) { @@ -951,6 +956,7 @@ void seat_end_mouse_operation(struct sway_seat *seat) { } seat->operation = OP_NONE; seat->op_container = NULL; + cursor_set_image(seat->cursor, "left_ptr", NULL); } void seat_pointer_notify_button(struct sway_seat *seat, uint32_t time_msec, -- cgit v1.2.3 From 44e218574f96d46f36f6bd6e0b7625ae3c97593f Mon Sep 17 00:00:00 2001 From: Brian Ashworth Date: Mon, 23 Jul 2018 15:40:05 -0400 Subject: Add missing checks to fix 2339 --- sway/input/seat.c | 1 + 1 file changed, 1 insertion(+) (limited to 'sway/input/seat.c') diff --git a/sway/input/seat.c b/sway/input/seat.c index 273223db..fc9e54b6 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -628,6 +628,7 @@ void seat_set_focus_warp(struct sway_seat *seat, if (last_workspace && last_workspace == new_workspace && last_workspace->sway_workspace->fullscreen + && container && container->type == C_VIEW && !container->sway_view->is_fullscreen) { return; } -- cgit v1.2.3