diff options
author | Versus Void <chaoskeeper@mail.ru> | 2019-09-05 07:36:09 +0300 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-09-05 17:41:23 +0300 |
commit | 2c1a11016ccb7646a74de51eff003c18e5aa7902 (patch) | |
tree | fbc36fafba191cdd6cc8cca791b8eafe46a10e3c /sway | |
parent | 1fd2c6ba498e61f4fe823bf552f9d2fce8612de4 (diff) |
Do not search for edges on subsurfaces, fix #4381
Subsurfaces (in most cases popups) aren't decorated by sway
and will never have any borders, but may be drawn beyond container
boundaries producing false positive when searching for edge.
So we want to skip edge search when handling mouse event on subsurface.
Diffstat (limited to 'sway')
-rw-r--r-- | sway/input/seatop_default.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/sway/input/seatop_default.c b/sway/input/seatop_default.c index 9087434c..68c617e4 100644 --- a/sway/input/seatop_default.c +++ b/sway/input/seatop_default.c @@ -58,8 +58,8 @@ static bool edge_is_external(struct sway_container *cont, enum wlr_edges edge) { } static enum wlr_edges find_edge(struct sway_container *cont, - struct sway_cursor *cursor) { - if (!cont->view) { + struct wlr_surface *surface, struct sway_cursor *cursor) { + if (!cont->view || cont->view->surface != surface) { return WLR_EDGE_NONE; } if (cont->border == B_NONE || !cont->border_thickness || @@ -89,8 +89,8 @@ static enum wlr_edges find_edge(struct sway_container *cont, * Edges that can't be resized are edges of the workspace. */ static enum wlr_edges find_resize_edge(struct sway_container *cont, - struct sway_cursor *cursor) { - enum wlr_edges edge = find_edge(cont, cursor); + struct wlr_surface *surface, struct sway_cursor *cursor) { + enum wlr_edges edge = find_edge(cont, surface, cursor); if (edge && !container_is_floating(cont) && edge_is_external(cont, edge)) { return WLR_EDGE_NONE; } @@ -199,7 +199,7 @@ static void cursor_do_rebase(struct sway_cursor *cursor, uint32_t time_msec, } } else if (node && node->type == N_CONTAINER) { // Try a node's resize edge - enum wlr_edges edge = find_resize_edge(node->sway_container, cursor); + enum wlr_edges edge = find_resize_edge(node->sway_container, surface, cursor); if (edge == WLR_EDGE_NONE) { cursor_set_image(cursor, "left_ptr", NULL); } else if (container_is_floating(node->sway_container)) { @@ -235,14 +235,15 @@ static void handle_button(struct sway_seat *seat, uint32_t time_msec, double sx, sy; struct sway_node *node = node_at_coords(seat, cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); + struct sway_container *cont = node && node->type == N_CONTAINER ? node->sway_container : NULL; bool is_floating = cont && container_is_floating(cont); bool is_floating_or_child = cont && container_is_floating_or_child(cont); bool is_fullscreen_or_child = cont && container_is_fullscreen_or_child(cont); - enum wlr_edges edge = cont ? find_edge(cont, cursor) : WLR_EDGE_NONE; + enum wlr_edges edge = cont ? find_edge(cont, surface, cursor) : WLR_EDGE_NONE; enum wlr_edges resize_edge = cont && edge ? - find_resize_edge(cont, cursor) : WLR_EDGE_NONE; + find_resize_edge(cont, surface, cursor) : WLR_EDGE_NONE; bool on_border = edge != WLR_EDGE_NONE; bool on_contents = cont && !on_border && surface; bool on_workspace = node && node->type == N_WORKSPACE; @@ -505,7 +506,7 @@ static void handle_axis(struct sway_seat *seat, cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); struct sway_container *cont = node && node->type == N_CONTAINER ? node->sway_container : NULL; - enum wlr_edges edge = cont ? find_edge(cont, cursor) : WLR_EDGE_NONE; + enum wlr_edges edge = cont ? find_edge(cont, surface, cursor) : WLR_EDGE_NONE; bool on_border = edge != WLR_EDGE_NONE; bool on_titlebar = cont && !on_border && !surface; bool on_titlebar_border = cont && on_border && |