]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Allow mouse movements to trigger SnapToEdge
authorConsolatis <35009135+Consolatis@users.noreply.github.com>
Sat, 8 Jan 2022 10:25:18 +0000 (11:25 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Sat, 8 Jan 2022 10:30:03 +0000 (10:30 +0000)
docs/rc.xml.all
include/config/rcxml.h
src/config/rcxml.c
src/cursor.c
src/interactive.c

index d95e9c06710d3b596697cb7a46097ad010eb0cef..0f724dfde8a04a676583f211316c22ede2b38e21 100644 (file)
     <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:
index 6fb1fd47b8b6e5e2ceb66a8634103ab30657bea1..42d662836d6fd77506de67b213335b30fe3a8c88 100644 (file)
@@ -44,6 +44,10 @@ struct rcxml {
 
        /* resistance */
        int screen_edge_strength;
+
+       /* window snapping */
+       int snap_edge_range;
+       bool snap_top_maximize;
 };
 
 extern struct rcxml rc;
index b2e543af3bd6b5c9785c38661c1b071205191b0b..5bf6e8114dfbb0daef466caa476ae99fd1f083fd 100644 (file)
@@ -374,6 +374,10 @@ entry(xmlNode *node, char *nodename, char *content)
                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);
        }
 }
 
@@ -470,6 +474,8 @@ rcxml_init()
        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 {
index fd9b6e31c0e9180f6ecf04c74dc73dc01cb74e02..6e4475d12206f98f906021c3bca19bc12a5eae7d 100644 (file)
@@ -607,8 +607,12 @@ cursor_button(struct wl_listener *listener, void *data)
                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);
                }
 
index 3fc25d937477bb17b810b82e695a45960b5f7fca..be5e54d1c792711f26c9bacdccc7a6f7bb54b72f 100644 (file)
@@ -76,7 +76,36 @@ void
 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");
+                       }
+               }
        }
 }