]> Dogcows Code - chaz/openbox/blobdiff - src/Window.cc
window-to-window snapping is now a run-time option.
[chaz/openbox] / src / Window.cc
index 86898d542124bd2c36166873edd9dd35b04e91b0..be03e4aab012d3c1b7f9204668be3a5e36132138 100644 (file)
@@ -2525,74 +2525,84 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
         Workspace *w = screen->getWorkspace(getWorkspaceNumber());
         assert(w);
 
-        // try snap to another window
-        for (unsigned int i = 0, c = w->getCount(); i < c; ++i) {
-          BlackboxWindow *snapwin = w->getWindow(i);
-          if (snapwin == this)
-            continue;   // don't snap to self
-
-          const Rect &winrect = snapwin->frameRect();
-          int dleft = std::abs(wright - winrect.left()),
-             dright = std::abs(wleft - winrect.right()),
-               dtop = std::abs(wbottom - winrect.top()),
-            dbottom = std::abs(wtop - winrect.bottom());
-
-          // snap left of other window?
-          if (dleft < snap_distance && dleft <= dright) {
-            dx = winrect.left() - frame.rect.width();
-
-            // try corner-snap to its other sides
-            dtop = std::abs(wtop - winrect.top());
-            dbottom = std::abs(wbottom - winrect.bottom());
-            if (dtop < snap_distance && dtop <= dbottom)
-              dy = winrect.top();
-            else if (dbottom < snap_distance)
-              dy = winrect.bottom() - frame.rect.height();
-
-            continue;
-          }
-          // snap right of other window?
-          else if (dright < snap_distance) {
-            dx = winrect.right() + 1;
-
-            // try corner-snap to its other sides
-            dtop = std::abs(wtop - winrect.top());
-            dbottom = std::abs(wbottom - winrect.bottom());
-            if (dtop < snap_distance && dtop <= dbottom)
-              dy = winrect.top();
-            else if (dbottom < snap_distance)
-              dy = winrect.bottom() - frame.rect.height();
-
-            continue;
-          }
-
-          // snap top of other window?
-          if (dtop < snap_distance && dtop <= dbottom) {
-            dy = winrect.top() - frame.rect.height();
-
-            // try corner-snap to its other sides
-            dleft = std::abs(wleft - winrect.left());
-            dright = std::abs(wright - winrect.right());
-            if (dleft < snap_distance && dleft <= dright)
-              dx = winrect.left();
-            else if (dright < snap_distance)
-              dx = winrect.right() - frame.rect.width();
-
-            continue;
-          }
-          // snap bottom of other window?
-          else if (dbottom < snap_distance) {
-            dy = winrect.bottom() + 1;
-            
-            // try corner-snap to its other sides
-            dleft = std::abs(wleft - winrect.left());
-            dright = std::abs(wright - winrect.right());
-            if (dleft < snap_distance && dleft <= dright)
-              dx = winrect.left();
-            else if (dright < snap_distance)
-              dx = winrect.right() - frame.rect.width();
-
-            continue;
+        if (blackbox->getWindowToWindowSnap()) {
+          // try snap to another window
+          for (unsigned int i = 0, c = w->getCount(); i < c; ++i) {
+            BlackboxWindow *snapwin = w->getWindow(i);
+            if (snapwin == this)
+              continue;   // don't snap to self
+
+            const Rect &winrect = snapwin->frameRect();
+            int dleft = std::abs(wright - winrect.left()),
+               dright = std::abs(wleft - winrect.right()),
+                 dtop = std::abs(wbottom - winrect.top()),
+              dbottom = std::abs(wtop - winrect.bottom());
+
+            // snap left of other window?
+            if (dleft < snap_distance && dleft <= dright) {
+              dx = winrect.left() - frame.rect.width();
+
+              if (blackbox->getWindowCornerSnap()) {
+                // try corner-snap to its other sides
+                dtop = std::abs(wtop - winrect.top());
+                dbottom = std::abs(wbottom - winrect.bottom());
+                if (dtop < snap_distance && dtop <= dbottom)
+                  dy = winrect.top();
+                else if (dbottom < snap_distance)
+                  dy = winrect.bottom() - frame.rect.height();
+              }
+
+              continue;
+            }
+            // snap right of other window?
+            else if (dright < snap_distance) {
+              dx = winrect.right() + 1;
+
+              if (blackbox->getWindowCornerSnap()) {
+                // try corner-snap to its other sides
+                dtop = std::abs(wtop - winrect.top());
+                dbottom = std::abs(wbottom - winrect.bottom());
+                if (dtop < snap_distance && dtop <= dbottom)
+                  dy = winrect.top();
+                else if (dbottom < snap_distance)
+                  dy = winrect.bottom() - frame.rect.height();
+              }
+
+              continue;
+            }
+
+            // snap top of other window?
+            if (dtop < snap_distance && dtop <= dbottom) {
+              dy = winrect.top() - frame.rect.height();
+
+              if (blackbox->getWindowCornerSnap()) {
+                // try corner-snap to its other sides
+                dleft = std::abs(wleft - winrect.left());
+                dright = std::abs(wright - winrect.right());
+                if (dleft < snap_distance && dleft <= dright)
+                  dx = winrect.left();
+                else if (dright < snap_distance)
+                  dx = winrect.right() - frame.rect.width();
+              }
+
+              continue;
+            }
+            // snap bottom of other window?
+            else if (dbottom < snap_distance) {
+              dy = winrect.bottom() + 1;
+
+              if (blackbox->getWindowCornerSnap()) {
+                // try corner-snap to its other sides
+                dleft = std::abs(wleft - winrect.left());
+                dright = std::abs(wright - winrect.right());
+                if (dleft < snap_distance && dleft <= dright)
+                  dx = winrect.left();
+                else if (dright < snap_distance)
+                  dx = winrect.right() - frame.rect.width();
+              }
+
+              continue;
+            }
           }
         }
                 
This page took 0.02219 seconds and 4 git commands to generate.