]> Dogcows Code - chaz/openbox/blobdiff - src/Window.cc
properly handle placing a window while another window is still placing.
[chaz/openbox] / src / Window.cc
index 6d9d8859baad3a97d5a235ced4e0daa8b4b13310..8df9ddfe733af2da1c99ded8fa80de0da9ef7e1a 100644 (file)
@@ -1465,6 +1465,24 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) {
   XMapSubwindows(display, frame.window);
   XMapWindow(display, frame.window);
 
+  // if we're using the click to place placement type, then immediately
+  // after the window is mapped, we need to start interactively moving it
+  if (!(flags.iconic || reassoc) &&
+      screen->placementPolicy() == BScreen::ClickMousePlacement) {
+    // if the last window wasn't placed yet, or we're just moving a window
+    // already, finish off that move cleanly
+    OpenboxWindow *w = openbox.getFocusedWindow();
+    if (w != (OpenboxWindow *) 0 && w->flags.moving)
+      w->endMove();
+
+    int x, y, rx, ry;
+    Window c, r;
+    unsigned int m;
+    XQueryPointer(openbox.getXDisplay(), screen->getRootWindow(),
+                  &r, &c, &rx, &ry, &x, &y, &m);
+    startMove(rx, ry);
+  }
+  
   if (flags.iconic && screen->focusNew()) setInputFocus();
 
   flags.visible = True;
@@ -1494,6 +1512,9 @@ void OpenboxWindow::close(void) {
 
 
 void OpenboxWindow::withdraw(void) {
+  if (flags.moving)
+    endMove();
+
   flags.visible = False;
   flags.iconic = False;
 
@@ -1533,102 +1554,12 @@ void OpenboxWindow::maximize(unsigned int button) {
     return;
   }
 
-  // the following code is temporary and will be taken care of by Screen in the
-  // future (with the NETWM 'strut')
-  Rect space(0, 0, screen->size().w(), screen->size().h());
-  if (! screen->fullMax()) {
-#ifdef    SLIT
-    Slit *slit = screen->getSlit();
-    int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(),
-        slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y();
-    Toolbar *toolbar = screen->getToolbar();
-    int tbarh = screen->hideToolbar() ? 0 :
-      toolbar->getExposedHeight() + screen->getBorderWidth() * 2;
-    bool tbartop;
-    switch (toolbar->placement()) {
-    case Toolbar::TopLeft:
-    case Toolbar::TopCenter:
-    case Toolbar::TopRight:
-      tbartop = true;
-      break;
-    case Toolbar::BottomLeft:
-    case Toolbar::BottomCenter:
-    case Toolbar::BottomRight:
-      tbartop = false;
-      break;
-    default:
-      ASSERT(false);      // unhandled placement
-    }
-    if ((slit->direction() == Slit::Horizontal &&
-         (slit->placement() == Slit::TopLeft ||
-          slit->placement() == Slit::TopRight)) ||
-        slit->placement() == Slit::TopCenter) {
-      // exclude top
-      if (tbartop)
-        space.setH(space.h() - slit_y);
-      else
-        space.setH(space.h() - tbarh);
-      space.setY(space.y() + slit_y + slit->area().h() +
-                 screen->getBorderWidth() * 2);
-      space.setH(space.h() - (slit_y + slit->area().h() +
-                              screen->getBorderWidth() * 2));
-    } else if ((slit->direction() == Slit::Vertical &&
-              (slit->placement() == Slit::TopRight ||
-               slit->placement() == Slit::BottomRight)) ||
-             slit->placement() == Slit::CenterRight) {
-      // exclude right
-      space.setW(space.w() - (screen->size().w() - slit_x +
-                              screen->getBorderWidth() * 2));
-      if (tbartop)
-        space.setY(space.y() + tbarh);
-      space.setH(space.h() - tbarh);
-    } else if ((slit->direction() == Slit::Horizontal &&
-              (slit->placement() == Slit::BottomLeft ||
-               slit->placement() == Slit::BottomRight)) ||
-             slit->placement() == Slit::BottomCenter) {
-      // exclude bottom
-      space.setH(space.h() - ((screen->size().h() - slit_y) > tbarh ?
-                              screen->size().h() - slit_y : tbarh));
-    } else {// if ((slit->direction() == Slit::Vertical &&
-      //      (slit->placement() == Slit::TopLeft ||
-      //       slit->placement() == Slit::BottomLeft)) ||
-      //     slit->placement() == Slit::CenterLeft)
-      // exclude left
-      space.setX(slit_x + slit->area().w() +
-                 screen->getBorderWidth() * 2);
-      space.setW(space.w() - (slit_x + slit->area().w() +
-                              screen->getBorderWidth() * 2));
-      if (tbartop)
-        space.setY(space.y() + tbarh);
-      space.setH(space.h() - tbarh);
-    }
-#else // !SLIT
-    Toolbar *toolbar = screen->getToolbar();
-    int tbarh = screen->hideToolbar() ? 0 :
-      toolbar->getExposedHeight() + screen->getBorderWidth() * 2;
-    switch (toolbar->placement()) {
-    case Toolbar::TopLeft:
-    case Toolbar::TopCenter:
-    case Toolbar::TopRight:
-      space.setY(toolbar->getExposedHeight());
-      space.setH(space.h() - toolbar->getExposedHeight());
-      break;
-    case Toolbar::BottomLeft:
-    case Toolbar::BottomCenter:
-    case Toolbar::BottomRight:
-      space.setH(space.h() - tbarh);
-      break;
-    default:
-      ASSERT(false);      // unhandled placement
-    }
-#endif // SLIT
-  }
-
   openbox_attrib.premax_x = frame.x;
   openbox_attrib.premax_y = frame.y;
   openbox_attrib.premax_w = frame.width;
   openbox_attrib.premax_h = frame.height;
 
+  Rect space = screen->availableArea();
   unsigned int dw = space.w(),
                dh = space.h();
   dw -= frame.border_w * 2;
@@ -1812,6 +1743,7 @@ void OpenboxWindow::setFocusFlag(Bool focus) {
 
   if (screen->sloppyFocus() && screen->autoRaise() && timer->isTiming())
     timer->stop();
+
 }
 
 
@@ -2573,8 +2505,6 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) {
   // alt + left/right click begins interactively moving/resizing the window
   // when the mouse is moved
   if (be->state == Mod1Mask && (be->button == 1 || be->button == 3)) {
-    frame.grab_x = be->x_root - frame.x - frame.border_w;
-    frame.grab_y = be->y_root - frame.y - frame.border_w;
     if (be->button == 3) {
       if (screen->getWindowZones() == 4 &&
           be->y < (signed) frame.height / 2) {
@@ -2789,21 +2719,7 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) {
   // when the window is being interactively moved, a button release stops the
   // move where it is
   if (flags.moving) {
-    flags.moving = False;
-
-    openbox.maskWindowEvents(0, (OpenboxWindow *) 0);
-    if (!screen->opaqueMove()) {
-      XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
-                     frame.move_x, frame.move_y, frame.resize_w - 1,
-                     frame.resize_h - 1);
-
-      configure(frame.move_x, frame.move_y, frame.width, frame.height);
-      openbox.ungrab();
-    } else {
-      configure(frame.x, frame.y, frame.width, frame.height);
-    }
-    screen->hideGeometry();
-    XUngrabPointer(display, CurrentTime);
+    endMove();
   // when the window is being interactively resized, a button release stops the
   // resizing
   } else if (flags.resizing) {
@@ -2835,102 +2751,137 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) {
 }
 
 
-void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
-  if (!flags.resizing && (me->state & Button1Mask) && functions.move &&
-      (frame.title == me->window || frame.label == me->window ||
-       frame.handle == me->window || frame.window == me->window)) {
-    if (! flags.moving) {
-      XGrabPointer(display, me->window, False, Button1MotionMask |
-                   ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
-                   None, openbox.getMoveCursor(), CurrentTime);
+void OpenboxWindow::startMove(int x, int y) {
+  ASSERT(!flags.moving);
 
-      if (windowmenu && windowmenu->isVisible())
-        windowmenu->hide();
+  XGrabPointer(display, frame.window, False, PointerMotionMask |
+               ButtonReleaseMask, GrabModeAsync, GrabModeAsync,
+               None, openbox.getMoveCursor(), CurrentTime);
+
+  if (windowmenu && windowmenu->isVisible())
+    windowmenu->hide();
 
-      flags.moving = True;
+  flags.moving = True;
 
-      openbox.maskWindowEvents(client.window, this);
+  openbox.maskWindowEvents(client.window, this);
 
-      if (! screen->opaqueMove()) {
-        openbox.grab();
+  if (! screen->opaqueMove()) {
+    openbox.grab();
 
-        frame.move_x = frame.x;
-       frame.move_y = frame.y;
-        frame.resize_w = frame.width + (frame.border_w * 2);
-        frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) +
-          (frame.border_w * 2);
+    frame.move_x = frame.x;
+    frame.move_y = frame.y;
+    frame.resize_w = frame.width + (frame.border_w * 2);
+    frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) +
+      (frame.border_w * 2);
 
-       screen->showPosition(frame.x, frame.y);
+    screen->showPosition(frame.x, frame.y);
 
-       XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
-                      frame.move_x, frame.move_y,
-                      frame.resize_w - 1, frame.resize_h - 1);
-      }
-    } else {
-      int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y;
-
-      dx -= frame.border_w;
-      dy -= frame.border_w;
-
-      int snap_distance = screen->edgeSnapThreshold();
-      // width/height of the snapping window
-      unsigned int snap_w = frame.width + (frame.border_w * 2);
-      unsigned int snap_h = area().h() + (frame.border_w * 2);
-      if (snap_distance) {
-        int drx = screen->size().w() - (dx + snap_w);
-
-        if (dx < drx && (dx > 0 && dx < snap_distance) ||
-                        (dx < 0 && dx > -snap_distance) )
-          dx = 0;
-        else if ( (drx > 0 && drx < snap_distance) ||
-                  (drx < 0 && drx > -snap_distance) )
-          dx = screen->size().w() - snap_w;
-
-        int dtty, dbby, dty, dby;
-        switch (screen->getToolbar()->placement()) {
-        case Toolbar::TopLeft:
-        case Toolbar::TopCenter:
-        case Toolbar::TopRight:
-          dtty = screen->getToolbar()->getExposedHeight() +
-                frame.border_w;
-          dbby = screen->size().h();
-          break;
-
-        default:
-          dtty = 0;
-         dbby = screen->getToolbar()->area().y();
-          break;
-        }
+    XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+                   frame.move_x, frame.move_y,
+                   frame.resize_w - 1, frame.resize_h - 1);
+  }
+  frame.grab_x = x - frame.x - frame.border_w;
+  frame.grab_y = y - frame.y - frame.border_w;
+}
 
-        dty = dy - dtty;
-        dby = dbby - (dy + snap_h);
 
-        if ( (dy > 0 && dty < snap_distance) ||
-            (dy < 0 && dty > -snap_distance) )
-          dy = dtty;
-        else if ( (dby > 0 && dby < snap_distance) ||
-                 (dby < 0 && dby > -snap_distance) )
-          dy = dbby - snap_h;
-      }
+void OpenboxWindow::doMove(int x, int y) {
+  ASSERT(flags.moving);
 
-      if (screen->opaqueMove()) {
-       configure(dx, dy, frame.width, frame.height);
-      } else {
-       XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
-                      frame.move_x, frame.move_y, frame.resize_w - 1,
-                      frame.resize_h - 1);
+  int dx = x - frame.grab_x, dy = y - frame.grab_y;
 
-       frame.move_x = dx;
-       frame.move_y = dy;
+  dx -= frame.border_w;
+  dy -= frame.border_w;
 
-       XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
-                      frame.move_x, frame.move_y, frame.resize_w - 1,
-                      frame.resize_h - 1);
-      }
+  int snap_distance = screen->edgeSnapThreshold();
+  // width/height of the snapping window
+  unsigned int snap_w = frame.width + (frame.border_w * 2);
+  unsigned int snap_h = area().h() + (frame.border_w * 2);
+  if (snap_distance) {
+    int drx = screen->size().w() - (dx + snap_w);
 
-      screen->showPosition(dx, dy);
+    if (dx < drx && (dx > 0 && dx < snap_distance) ||
+        (dx < 0 && dx > -snap_distance) )
+      dx = 0;
+    else if ( (drx > 0 && drx < snap_distance) ||
+             (drx < 0 && drx > -snap_distance) )
+      dx = screen->size().w() - snap_w;
+
+    int dtty, dbby, dty, dby;
+    switch (screen->getToolbar()->placement()) {
+    case Toolbar::TopLeft:
+    case Toolbar::TopCenter:
+    case Toolbar::TopRight:
+      dtty = screen->getToolbar()->getExposedHeight() +
+        frame.border_w;
+      dbby = screen->size().h();
+      break;
+
+    default:
+      dtty = 0;
+      dbby = screen->getToolbar()->area().y();
+      break;
     }
-  } else if (functions.resize &&
+
+    dty = dy - dtty;
+    dby = dbby - (dy + snap_h);
+
+    if ( (dy > 0 && dty < snap_distance) ||
+        (dy < 0 && dty > -snap_distance) )
+      dy = dtty;
+    else if ( (dby > 0 && dby < snap_distance) ||
+             (dby < 0 && dby > -snap_distance) )
+      dy = dbby - snap_h;
+  }
+
+  if (screen->opaqueMove()) {
+    configure(dx, dy, frame.width, frame.height);
+  } else {
+    XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+                   frame.move_x, frame.move_y, frame.resize_w - 1,
+                   frame.resize_h - 1);
+
+    frame.move_x = dx;
+    frame.move_y = dy;
+
+    XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+                   frame.move_x, frame.move_y, frame.resize_w - 1,
+                   frame.resize_h - 1);
+  }
+
+  screen->showPosition(dx, dy);
+}
+
+
+void OpenboxWindow::endMove() {
+  ASSERT(flags.moving);
+
+  flags.moving = False;
+
+  openbox.maskWindowEvents(0, (OpenboxWindow *) 0);
+  if (!screen->opaqueMove()) {
+    XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
+                   frame.move_x, frame.move_y, frame.resize_w - 1,
+                   frame.resize_h - 1);
+
+    configure(frame.move_x, frame.move_y, frame.width, frame.height);
+    openbox.ungrab();
+  } else {
+    configure(frame.x, frame.y, frame.width, frame.height);
+  }
+  screen->hideGeometry();
+  XUngrabPointer(display, CurrentTime);
+}
+
+
+void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
+  if (flags.moving)
+      doMove(me->x_root, me->y_root);
+  else if (!flags.resizing && (me->state & Button1Mask) && functions.move &&
+      (frame.title == me->window || frame.label == me->window ||
+       frame.handle == me->window || frame.window == me->window))
+    startMove(me->x_root, me->y_root);
+  else if (functions.resize &&
             (((me->state & Button1Mask) && (me->window == frame.right_grip ||
                                             me->window == frame.left_grip)) ||
              (me->state & (Mod1Mask | Button3Mask) &&
This page took 0.029076 seconds and 4 git commands to generate.