]> Dogcows Code - chaz/openbox/commitdiff
snap window-to-window
authorDana Jansens <danakj@orodu.net>
Fri, 21 Mar 2003 08:37:22 +0000 (08:37 +0000)
committerDana Jansens <danakj@orodu.net>
Fri, 21 Mar 2003 08:37:22 +0000 (08:37 +0000)
openbox/snap.c

index bd9b3d50c2a6a64ee0e4d99eb8a0d523a9efef25..02bb5bb5fe015f1a7b098c7c126fc28b96fb5542 100644 (file)
@@ -4,6 +4,8 @@
 #include "screen.h"
 
 static int resistance = 10;
+static gboolean edge_resistance = TRUE; /* window-to-edge */
+static gboolean window_resistance = TRUE; /* window-to-window */
 
 void snap_move(Client *c, int *x, int *y, int w, int h)
 {
@@ -12,6 +14,9 @@ void snap_move(Client *c, int *x, int *y, int w, int h)
     int l, t, r, b; /* requested edges */
     int al, at, ar, ab; /* screen area edges */
     int cl, ct, cr, cb; /* current edges */
+    gboolean snapx = FALSE, snapy = FALSE;
+
+    if (!edge_resistance) return;
 
     /* add the frame to the dimensions */
     l = *x;
@@ -25,9 +30,33 @@ void snap_move(Client *c, int *x, int *y, int w, int h)
     cb = ct + c->frame->area.height - 1;
     
     /* snap to other clients */
-    for (it = stacking_list; it != NULL; it = it->next) {
-        /* XXX foo */
-    }
+    if (window_resistance)
+        for (it = stacking_list; it != NULL; it = it->next) {
+            Client *target;
+            int tl, tt, tr, tb; /* 1 past the target's edges on each side */
+
+            target = it->data;
+
+            tl = target->frame->area.x - 1;
+            tt = target->frame->area.y - 1;
+            tr = tl + target->frame->area.width + 1;
+            tb = tt + target->frame->area.height + 1;
+
+            /* snapx and snapy ensure that the window snaps to the top-most
+               window edge available, without going all the way from
+               bottom-to-top in the stacking list
+            */
+            if (!snapx && cl >= tr && l < tr && l >= tr - resistance)
+                *x = tr, snapx = TRUE;
+            else if (!snapx && cr <= tl && r > tl && r <= tl + resistance)
+                *x = tl - w + 1, snapx = TRUE;
+            else if (!snapy && ct >= tb && t < tb && t >= tb - resistance)
+                *y = tb, snapy = TRUE;
+            else if (!snapy && cb <= tt && b > tt && b <= tt + resistance)
+                *y = tt - h + 1, snapy = TRUE;
+
+            if (snapx && snapy) break;
+        }
 
     /* get the screen boundaries */
     area = screen_area(c->desktop);
This page took 0.027744 seconds and 4 git commands to generate.