diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 27f10d1e..427659af 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -498,15 +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 - the left/right output edge, or ** of the top/bottom 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. - If ** and ** is 0, snapping is disabled. - Default is 10 for ** and **, 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 7066695a..f0865a49 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -161,9 +161,8 @@ - - 10 - 10 + + 50 diff --git a/include/config/rcxml.h b/include/config/rcxml.h index 2e5a6170..8273ba5e 100644 --- a/include/config/rcxml.h +++ b/include/config/rcxml.h @@ -151,8 +151,8 @@ struct rcxml { int unmaximize_threshold; /* window snapping */ - int snap_edge_horizontal_range; - int snap_edge_vertical_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 a6a5fdeb..ff7a8e16 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -1177,12 +1177,12 @@ 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_horizontal_range = atoi(content); - rc.snap_edge_vertical_range = atoi(content); - } else if (!strcasecmp(nodename, "horizontalRange.snapping")) { - rc.snap_edge_horizontal_range = atoi(content); - } else if (!strcasecmp(nodename, "verticalRange.snapping")) { - rc.snap_edge_vertical_range = atoi(content); + rc.snap_edge_range_inner = atoi(content); + rc.snap_edge_range_outer = atoi(content); + } 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")) { @@ -1461,8 +1461,8 @@ rcxml_init(void) rc.unsnap_threshold = 20; rc.unmaximize_threshold = 150; - rc.snap_edge_horizontal_range = 10; - rc.snap_edge_vertical_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 dda93919..efcf4e54 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_horizontal_range == 0 && rc.snap_edge_vertical_range == 0) { + if (rc.snap_edge_range_inner == 0 && rc.snap_edge_range_outer == 0) { return false; } @@ -197,9 +197,36 @@ 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, bottom_range, left_range, right_range; + 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; + } else { + top_range = rc.snap_edge_range_outer; + } + 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; + } else { + bottom_range = rc.snap_edge_range_outer; + } + 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; + } else { + left_range = rc.snap_edge_range_outer; + } + 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; + } else { + right_range = rc.snap_edge_range_outer; + } + + /* Translate into output local coordinates */ wlr_output_layout_output_coords(seat->server->output_layout, output->wlr_output, &cursor_x, &cursor_y); @@ -210,13 +237,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_vertical_range) { + if (top < top_range) { *edge1 = LAB_EDGE_TOP; - } else if (bottom < rc.snap_edge_vertical_range) { + } else if (bottom < bottom_range) { *edge1 = LAB_EDGE_BOTTOM; - } else if (left < rc.snap_edge_horizontal_range) { + } else if (left < left_range) { *edge1 = LAB_EDGE_LEFT; - } else if (right < rc.snap_edge_horizontal_range) { + } else if (right < right_range) { *edge1 = LAB_EDGE_RIGHT; } else { return false;