<raiseOnFocus>no</raiseOnFocus>
</focus>
+ <!--
+ Set range to 0 to disable window snapping completely
+ -->
+ <snapping>
+ <range>1</range>
+ <topMaximize>yes</topMaximize>
+ </snapping>
+
<!--
Keybind actions are specified in labwc-actions(5)
The following keybind modifiers are supported:
rc.repeat_delay = atoi(content);
} else if (!strcasecmp(nodename, "screenEdgeStrength.resistance")) {
rc.screen_edge_strength = atoi(content);
+ } else if (!strcasecmp(nodename, "range.snapping")) {
+ rc.snap_edge_range = atoi(content);
+ } else if (!strcasecmp(nodename, "topMaximize.snapping")) {
+ rc.snap_top_maximize = get_bool(content);
}
}
rc.repeat_rate = 25;
rc.repeat_delay = 600;
rc.screen_edge_strength = 20;
+ rc.snap_edge_range = 1;
+ rc.snap_top_maximize = true;
}
static struct {
damage_all_outputs(server);
if (server->input_mode != LAB_INPUT_STATE_PASSTHROUGH) {
/* Exit interactive move/resize/menu mode. */
- server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
- server->grabbed_view = NULL;
+ if (server->grabbed_view == view) {
+ interactive_end(view);
+ } else {
+ server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
+ server->grabbed_view = NULL;
+ }
cursor_rebase(&server->seat, event->time_msec);
}
interactive_end(struct view *view)
{
if (view->server->grabbed_view == view) {
+ bool should_snap = view->server->input_mode == LAB_INPUT_STATE_MOVE
+ && rc.snap_edge_range;
view->server->input_mode = LAB_INPUT_STATE_PASSTHROUGH;
view->server->grabbed_view = NULL;
+ if (should_snap) {
+ int snap_range = rc.snap_edge_range;
+ struct wlr_box *area = &view->output->usable_area;
+
+ /* Translate into output local coordinates */
+ double cursor_x = view->server->seat.cursor->x;
+ double cursor_y = view->server->seat.cursor->y;
+ wlr_output_layout_output_coords(view->server->output_layout,
+ view->output->wlr_output, &cursor_x, &cursor_y);
+
+ if (cursor_x <= area->x + snap_range) {
+ view_snap_to_edge(view, "left");
+ } else if (cursor_x >= area->x + area->width - snap_range) {
+ view_snap_to_edge(view, "right");
+ } else if (cursor_y <= area->y + snap_range) {
+ if (rc.snap_top_maximize) {
+ view_maximize(view, true);
+ /* When unmaximizing later on restore original position */
+ view->unmaximized_geometry.x = view->server->grab_box.x;
+ view->unmaximized_geometry.y = view->server->grab_box.y;
+ } else {
+ view_snap_to_edge(view, "up");
+ }
+ } else if (cursor_y >= area->y + area->height - snap_range) {
+ view_snap_to_edge(view, "down");
+ }
+ }
}
}