diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index fa4f7e58..74442362 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -498,13 +498,16 @@ activated with SnapToEdge actions or, optionally, by dragging windows to the edges of an output. Edge snapping causes a window to occupy half of its output, extending outward from the snapped edge. -**++ +**++ +**++ ** - If an interactive move ends with the cursor within ** pixels of an - output edge, the window is snapped to the edge. If it's also within - ** pixels of an output corner, the window is snapped to the - corner instead. A ** of 0 disables snapping. - Default is 10 for ** and 50 for **. + If an interactive move ends with the cursor within *inner* or *outer* pixels + of an output edge, the window is snapped to the edge. *inner* edges are edges + with an adjacent output and *outer* edges are edges without an adjacent output. + If it's also within ** pixels of an output corner, the window is + snapped to the corner instead. + If *inner* and *outer* is 0, snapping is disabled. + Default is 10 for ** and **, and 50 for **. ** [yes|no] Show an overlay when snapping to a window to an edge. Default is yes. diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 13f4c8df..f3d046d4 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -161,8 +161,8 @@ - - 10 + + 50 diff --git a/include/config/rcxml.h b/include/config/rcxml.h index 55c0f877..3e4f15a2 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -151,7 +151,8 @@ struct rcxml { int unmaximize_threshold; /* window snapping */ - int snap_edge_range; + int snap_edge_range_inner; + int snap_edge_range_outer; int snap_edge_corner_range; bool snap_overlay_enabled; int snap_overlay_delay_inner; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 84054e82..b54e528a 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -1180,7 +1180,14 @@ entry(xmlNode *node, char *nodename, char *content) } else if (!strcasecmp(nodename, "unMaximizeThreshold.resistance")) { rc.unmaximize_threshold = atoi(content); } else if (!strcasecmp(nodename, "range.snapping")) { - rc.snap_edge_range = atoi(content); + rc.snap_edge_range_inner = atoi(content); + rc.snap_edge_range_outer = atoi(content); + wlr_log(WLR_ERROR, " is deprecated. " + "Use instead."); + } else if (!strcasecmp(nodename, "inner.range.snapping")) { + rc.snap_edge_range_inner = atoi(content); + } else if (!strcasecmp(nodename, "outer.range.snapping")) { + rc.snap_edge_range_outer = atoi(content); } else if (!strcasecmp(nodename, "cornerRange.snapping")) { rc.snap_edge_corner_range = atoi(content); } else if (!strcasecmp(nodename, "enabled.overlay.snapping")) { @@ -1459,7 +1466,8 @@ rcxml_init(void) rc.unsnap_threshold = 20; rc.unmaximize_threshold = 150; - rc.snap_edge_range = 10; + rc.snap_edge_range_inner = 10; + rc.snap_edge_range_outer = 10; rc.snap_edge_corner_range = 50; rc.snap_overlay_enabled = true; rc.snap_overlay_delay_inner = 500; diff --git a/src/interactive.c b/src/interactive.c index df32f46f..03c4ad53 100644 --- a/src/interactive.c +++ b/src/interactive.c @@ -186,7 +186,7 @@ edge_from_cursor(struct seat *seat, struct output **dest_output, return false; } - if (rc.snap_edge_range == 0) { + if (rc.snap_edge_range_inner == 0 && rc.snap_edge_range_outer == 0) { return false; } @@ -197,9 +197,31 @@ edge_from_cursor(struct seat *seat, struct output **dest_output, } *dest_output = output; - /* Translate into output local coordinates */ double cursor_x = seat->cursor->x; double cursor_y = seat->cursor->y; + + int top_range = rc.snap_edge_range_outer; + int bottom_range = rc.snap_edge_range_outer; + int left_range = rc.snap_edge_range_outer; + int right_range = rc.snap_edge_range_outer; + if (wlr_output_layout_adjacent_output(seat->server->output_layout, WLR_DIRECTION_UP, + output->wlr_output, cursor_x, cursor_y)) { + top_range = rc.snap_edge_range_inner; + } + if (wlr_output_layout_adjacent_output(seat->server->output_layout, WLR_DIRECTION_DOWN, + output->wlr_output, cursor_x, cursor_y)) { + bottom_range = rc.snap_edge_range_inner; + } + if (wlr_output_layout_adjacent_output(seat->server->output_layout, WLR_DIRECTION_LEFT, + output->wlr_output, cursor_x, cursor_y)) { + left_range = rc.snap_edge_range_inner; + } + if (wlr_output_layout_adjacent_output(seat->server->output_layout, WLR_DIRECTION_RIGHT, + output->wlr_output, cursor_x, cursor_y)) { + right_range = rc.snap_edge_range_inner; + } + + /* Translate into output local coordinates */ wlr_output_layout_output_coords(seat->server->output_layout, output->wlr_output, &cursor_x, &cursor_y); @@ -210,13 +232,13 @@ edge_from_cursor(struct seat *seat, struct output **dest_output, int left = cursor_x - area->x; int right = area->x + area->width - cursor_x; - if (top < rc.snap_edge_range) { + if (top < top_range) { *edge1 = LAB_EDGE_TOP; - } else if (bottom < rc.snap_edge_range) { + } else if (bottom < bottom_range) { *edge1 = LAB_EDGE_BOTTOM; - } else if (left < rc.snap_edge_range) { + } else if (left < left_range) { *edge1 = LAB_EDGE_LEFT; - } else if (right < rc.snap_edge_range) { + } else if (right < right_range) { *edge1 = LAB_EDGE_RIGHT; } else { return false;