aboutsummaryrefslogtreecommitdiff
path: root/sway
diff options
context:
space:
mode:
authorVersus Void <chaoskeeper@mail.ru>2019-09-05 07:36:09 +0300
committerSimon Ser <contact@emersion.fr>2019-09-05 17:41:23 +0300
commit2c1a11016ccb7646a74de51eff003c18e5aa7902 (patch)
treefbc36fafba191cdd6cc8cca791b8eafe46a10e3c /sway
parent1fd2c6ba498e61f4fe823bf552f9d2fce8612de4 (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.c17
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 &&