]> Dogcows Code - chaz/openbox/commitdiff
workspace warping. this needs to be optional! also motion events are retarded!
authorDana Jansens <danakj@orodu.net>
Tue, 23 Jul 2002 03:56:29 +0000 (03:56 +0000)
committerDana Jansens <danakj@orodu.net>
Tue, 23 Jul 2002 03:56:29 +0000 (03:56 +0000)
src/Window.cc

index 722409f97ca7d0d1ea0fc183cc6638b53929c782..4b730d34396b6e4bf5815ac6e6bf6b5e5ded0dc7 100644 (file)
@@ -2962,6 +2962,57 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
   dx -= frame.border_w;
   dy -= frame.border_w;
 
+  // workspace warping
+  bool warp = False;
+  unsigned int dest = screen->getCurrentWorkspaceID();
+  if (x_root <= 0) {
+    warp = True;
+
+    if (dest > 0) dest--;
+    else dest = screen->getNumberOfWorkspaces() - 1;
+
+  } else if (x_root >= screen->getRect().right()) {
+    warp = True;
+
+    if (dest < screen->getNumberOfWorkspaces() - 1) dest++;
+    else dest = 0;
+  }
+  if (warp) {
+    endMove();
+    bool focus = flags.focused; // had focus while moving?
+    if (! flags.stuck)
+      screen->reassociateWindow(this, dest, False);
+    screen->changeWorkspaceID(dest);
+    if (focus)
+      setInputFocus();
+    /*
+       If the XWarpPointer is done after the configure, we can end up
+       grabbing another window, so made sure you do it first.
+    */
+    int dest_x;
+    if (x_root <= 0) {
+      dest_x = screen->getRect().right() - 1;
+      XWarpPointer(blackbox->getXDisplay(), None, 
+                   screen->getRootWindow(), 0, 0, 0, 0,
+                   dest_x, y_root);
+
+      configure(dx + (screen->getRect().width() - 1), dy,
+                frame.rect.width(), frame.rect.height());
+    } else {
+      dest_x = 0;
+      XWarpPointer(blackbox->getXDisplay(), None, 
+                   screen->getRootWindow(), 0, 0, 0, 0,
+                   dest_x, y_root);
+
+      configure(dx - (screen->getRect().width() - 1), dy,
+                frame.rect.width(), frame.rect.height());
+    }
+
+    beginMove(dest_x, y_root);
+    return;
+  }
+
   const int snap_distance = screen->getEdgeSnapThreshold();
 
   if (snap_distance) {
This page took 0.029962 seconds and 4 git commands to generate.