<inner>/<outer> configure the size of snapping area on output edges with/without adjacent outputs.
edges of an output. Edge snapping causes a window to occupy half of its output,
extending outward from the snapped edge.
-*<snapping><range>*++
+*<snapping><range><inner>*++
+*<snapping><range><outer>*++
*<snapping><cornerRange>*
- If an interactive move ends with the cursor within *<range>* pixels of an
- output edge, the window is snapped to the edge. If it's also within
- *<cornerRange>* pixels of an output corner, the window is snapped to the
- corner instead. A *<range>* of 0 disables snapping.
- Default is 10 for *<range>* and 50 for *<cornerRange>*.
+ 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 *<cornerRange>* 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 *<range><inner>* and *<range><outer>*, and 50 for *<cornerRange>*.
*<snapping><overlay><enabled>* [yes|no]
Show an overlay when snapping to a window to an edge. Default is yes.
</focus>
<snapping>
- <!-- Set range to 0 to disable window snapping completely -->
- <range>10</range>
+ <!-- Set inner and outer range to 0 to disable window snapping completely -->
+ <range inner="10" outer="10" />
<cornerRange>50</cornerRange>
<overlay enabled="yes">
<delay inner="500" outer="500" />
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;
} 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, "<snapping><range> is deprecated. "
+ "Use <snapping><range inner=\"\" outer=\"\"> 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")) {
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;
return false;
}
- if (rc.snap_edge_range == 0) {
+ if (rc.snap_edge_range_inner == 0 && rc.snap_edge_range_outer == 0) {
return false;
}
}
*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);
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;