aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFurkan Sahin <furkan-dev@proton.me>2019-09-05 07:36:09 +0300
committerFurkan Sahin <furkan-dev@proton.me>2019-09-05 07:36:09 +0300
commitbcc3309bba98fd5078b65dd89ad48217867aa041 (patch)
treefbc36fafba191cdd6cc8cca791b8eafe46a10e3c
parent6f95cdf78fb8db8913121d8d8e375c96d9f2ffde (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.
-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 &&