]> 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 0a0339329c70a1e1e74b93881a7e1ce28856655b..8df9ddfe733af2da1c99ded8fa80de0da9ef7e1a 100644 (file)
@@ -33,9 +33,9 @@
 #include <X11/Xatom.h>
 #include <X11/keysym.h>
 
-#ifdef    STDC_HEADERS
+#ifdef    HAVE_STRING_H
 #  include <string.h>
-#endif // STDC_HEADERS
+#endif // HAVE_STRING_H
 
 #ifdef    DEBUG
 #  ifdef    HAVE_STDIO_H
 #ifdef    SLIT
 #  include "Slit.h"
 #endif // SLIT
+#include "Util.h"
 
 /*
  * Initializes the class with default values/the window's set initial values.
  */
-OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
+OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) {
 #ifdef    DEBUG
   fprintf(stderr, i18n->getMessage(WindowSet, WindowCreating,
                     "OpenboxWindow::OpenboxWindow(): creating 0x%lx\n"),
@@ -66,10 +67,9 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
 #endif // DEBUG
 
   client.window = w;
-  openbox = b;
-  display = openbox->getXDisplay();
+  display = openbox.getXDisplay();
 
-  openbox->grab();
+  openbox.grab();
   if (! validateClient()) return;
 
   // fetch client size and placement
@@ -83,14 +83,14 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
               "failed\n"));
 #endif // DEBUG
 
-    b->ungrab();
+    openbox.ungrab();
     return;
   }
 
   if (s) {
     screen = s;
   } else {
-    screen = openbox->searchScreen(RootWindowOfScreen(wattrib.screen));
+    screen = openbox.searchScreen(RootWindowOfScreen(wattrib.screen));
     if (! screen) {
 #ifdef    DEBUG
       fprintf(stderr, i18n->getMessage(WindowSet, WindowCannotFindScreen,
@@ -99,7 +99,7 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
                      RootWindowOfScreen(wattrib.screen));
 #endif // DEBUG
 
-      b->ungrab();
+      openbox.ungrab();
       return;
     }
   }
@@ -152,8 +152,8 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
   lastButtonPressTime = 0;
   image_ctrl = screen->getImageControl();
 
-  timer = new BTimer(openbox, this);
-  timer->setTimeout(openbox->getAutoRaiseDelay());
+  timer = new BTimer(openbox, *this);
+  timer->setTimeout(openbox.getAutoRaiseDelay());
   timer->fireOnce(True);
 
   getOpenboxHints();
@@ -169,29 +169,28 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
 #ifdef    SLIT
   if (client.initial_state == WithdrawnState) {
     screen->getSlit()->addClient(client.window);
+    openbox.ungrab();
     delete this;
-
-    b->ungrab();
     return;
   }
 #endif // SLIT
 
   flags.managed = True;
-  openbox->saveWindowSearch(client.window, this);
+  openbox.saveWindowSearch(client.window, this);
 
   // determine if this is a transient window
   Window win;
   if (XGetTransientForHint(display, client.window, &win)) {
     if (win && (win != client.window)) {
       OpenboxWindow *tr;
-      if ((tr = openbox->searchWindow(win))) {
+      if ((tr = openbox.searchWindow(win))) {
        while (tr->client.transient) tr = tr->client.transient;
        client.transient_for = tr;
        tr->client.transient = this;
        flags.stuck = client.transient_for->flags.stuck;
        flags.transient = True;
       } else if (win == client.window_group) {
-       if ((tr = openbox->searchGroup(win, this))) {
+       if ((tr = openbox.searchGroup(win, this))) {
          while (tr->client.transient) tr = tr->client.transient;
          client.transient_for = tr;
          tr->client.transient = this;
@@ -218,58 +217,58 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
   upsize();
 
   Bool place_window = True;
-  if (openbox->isStartup() || flags.transient ||
+  if (openbox.isStartup() || flags.transient ||
       client.normal_hint_flags & (PPosition|USPosition)) {
     setGravityOffsets();
 
-    if ((openbox->isStartup()) ||
+    if ((openbox.isStartup()) ||
        (frame.x >= 0 &&
         (signed) (frame.y + frame.y_border) >= 0 &&
-        frame.x <= (signed) screen->getWidth() &&
-        frame.y <= (signed) screen->getHeight()))
+        frame.x <= (signed) screen->size().w() &&
+        frame.y <= (signed) screen->size().h()))
       place_window = False;
   }
 
   frame.window = createToplevelWindow(frame.x, frame.y, frame.width,
                                      frame.height,
                                      frame.border_w);
-  openbox->saveWindowSearch(frame.window, this);
+  openbox.saveWindowSearch(frame.window, this);
 
   frame.plate = createChildWindow(frame.window);
-  openbox->saveWindowSearch(frame.plate, this);
+  openbox.saveWindowSearch(frame.plate, this);
 
   if (decorations.titlebar) {
     frame.title = createChildWindow(frame.window);
     frame.label = createChildWindow(frame.title);
-    openbox->saveWindowSearch(frame.title, this);
-    openbox->saveWindowSearch(frame.label, this);
+    openbox.saveWindowSearch(frame.title, this);
+    openbox.saveWindowSearch(frame.label, this);
   }
 
   if (decorations.handle) {
     frame.handle = createChildWindow(frame.window);
-    openbox->saveWindowSearch(frame.handle, this);
+    openbox.saveWindowSearch(frame.handle, this);
 
     frame.left_grip =
-      createChildWindow(frame.handle, openbox->getLowerLeftAngleCursor());
-    openbox->saveWindowSearch(frame.left_grip, this);
+      createChildWindow(frame.handle, openbox.getLowerLeftAngleCursor());
+    openbox.saveWindowSearch(frame.left_grip, this);
 
     frame.right_grip =
-      createChildWindow(frame.handle, openbox->getLowerRightAngleCursor());
-    openbox->saveWindowSearch(frame.right_grip, this);
+      createChildWindow(frame.handle, openbox.getLowerRightAngleCursor());
+    openbox.saveWindowSearch(frame.right_grip, this);
   }
 
   associateClientWindow();
 
-  if (! screen->isSloppyFocus())
-    openbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
+  if (! screen->sloppyFocus())
+    openbox.grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
         GrabModeSync, GrabModeSync, None, None);
 
-  openbox->grabButton(Button1, Mod1Mask, frame.window, True,
+  openbox.grabButton(Button1, Mod1Mask, frame.window, True,
       ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
-      GrabModeAsync, None, openbox->getMoveCursor());
-  openbox->grabButton(Button2, Mod1Mask, frame.window, True,
+      GrabModeAsync, None, openbox.getMoveCursor());
+  openbox.grabButton(Button2, Mod1Mask, frame.window, True,
       ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None);
-  openbox->grabButton(Button3, Mod1Mask, frame.window, True,
+  openbox.grabButton(Button3, Mod1Mask, frame.window, True,
       ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
       GrabModeAsync, None, None);
 
@@ -280,7 +279,7 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
   XMapSubwindows(display, frame.window);
 
   if (decorations.menu)
-    windowmenu = new Windowmenu(this);
+    windowmenu = new Windowmenu(*this);
 
   decorate();
 
@@ -304,7 +303,7 @@ OpenboxWindow::OpenboxWindow(Openbox *b, Window w, BScreen *s) {
 
   setFocusFlag(False);
 
-  openbox->ungrab();
+  openbox.ungrab();
 }
 
 
@@ -339,7 +338,7 @@ OpenboxWindow::~OpenboxWindow(void) {
     XFree(client.openbox_hint);
 
   if (client.window_group)
-    openbox->removeGroupSearch(client.window_group);
+    openbox.removeGroupSearch(client.window_group);
 
   if (flags.transient && client.transient_for)
     client.transient_for->client.transient = client.transient;
@@ -347,17 +346,17 @@ OpenboxWindow::~OpenboxWindow(void) {
     client.transient->client.transient_for = client.transient_for;
 
   if (frame.close_button) {
-    openbox->removeWindowSearch(frame.close_button);
+    openbox.removeWindowSearch(frame.close_button);
     XDestroyWindow(display, frame.close_button);
   }
 
   if (frame.iconify_button) {
-    openbox->removeWindowSearch(frame.iconify_button);
+    openbox.removeWindowSearch(frame.iconify_button);
     XDestroyWindow(display, frame.iconify_button);
   }
 
   if (frame.maximize_button) {
-    openbox->removeWindowSearch(frame.maximize_button);
+    openbox.removeWindowSearch(frame.maximize_button);
     XDestroyWindow(display, frame.maximize_button);
   }
 
@@ -374,8 +373,8 @@ OpenboxWindow::~OpenboxWindow(void) {
     if( frame.ulabel)
       image_ctrl->removeImage(frame.ulabel);
 
-    openbox->removeWindowSearch(frame.label);
-    openbox->removeWindowSearch(frame.title);
+    openbox.removeWindowSearch(frame.label);
+    openbox.removeWindowSearch(frame.title);
     XDestroyWindow(display, frame.label);
     XDestroyWindow(display, frame.title);
   }
@@ -393,9 +392,9 @@ OpenboxWindow::~OpenboxWindow(void) {
     if (frame.ugrip)
       image_ctrl->removeImage(frame.ugrip);
 
-    openbox->removeWindowSearch(frame.handle);
-    openbox->removeWindowSearch(frame.right_grip);
-    openbox->removeWindowSearch(frame.left_grip);
+    openbox.removeWindowSearch(frame.handle);
+    openbox.removeWindowSearch(frame.right_grip);
+    openbox.removeWindowSearch(frame.left_grip);
     XDestroyWindow(display, frame.right_grip);
     XDestroyWindow(display, frame.left_grip);
     XDestroyWindow(display, frame.handle);
@@ -411,17 +410,17 @@ OpenboxWindow::~OpenboxWindow(void) {
     image_ctrl->removeImage(frame.pbutton);
 
   if (frame.plate) {
-    openbox->removeWindowSearch(frame.plate);
+    openbox.removeWindowSearch(frame.plate);
     XDestroyWindow(display, frame.plate);
   }
 
   if (frame.window) {
-    openbox->removeWindowSearch(frame.window);
+    openbox.removeWindowSearch(frame.window);
     XDestroyWindow(display, frame.window);
   }
 
   if (flags.managed) {
-    openbox->removeWindowSearch(client.window);
+    openbox.removeWindowSearch(client.window);
     screen->removeNetizen(client.window);
   }
 }
@@ -501,7 +500,7 @@ void OpenboxWindow::associateClientWindow(void) {
                           &attrib_set);
 
 #ifdef    SHAPE
-  if (openbox->hasShapeExtensions()) {
+  if (openbox.hasShapeExtensions()) {
     XShapeSelectInput(display, client.window, ShapeNotifyMask);
 
     int foo;
@@ -719,7 +718,7 @@ void OpenboxWindow::decorateLabel(void) {
 void OpenboxWindow::createCloseButton(void) {
   if (decorations.close && frame.title != None) {
     frame.close_button = createChildWindow(frame.title);
-    openbox->saveWindowSearch(frame.close_button, this);
+    openbox.saveWindowSearch(frame.close_button, this);
   }
 }
 
@@ -727,7 +726,7 @@ void OpenboxWindow::createCloseButton(void) {
 void OpenboxWindow::createIconifyButton(void) {
   if (decorations.iconify && frame.title != None) {
     frame.iconify_button = createChildWindow(frame.title);
-    openbox->saveWindowSearch(frame.iconify_button, this);
+    openbox.saveWindowSearch(frame.iconify_button, this);
   }
 }
 
@@ -735,13 +734,13 @@ void OpenboxWindow::createIconifyButton(void) {
 void OpenboxWindow::createMaximizeButton(void) {
   if (decorations.maximize && frame.title != None) {
     frame.maximize_button = createChildWindow(frame.title);
-    openbox->saveWindowSearch(frame.maximize_button, this);
+    openbox.saveWindowSearch(frame.maximize_button, this);
   }
 }
 
 
 void OpenboxWindow::positionButtons(Bool redecorate_label) {
-  const char *format = openbox->getTitleBarLayout();
+  const char *format = openbox.getTitleBarLayout();
   const unsigned int bw = frame.bevel_w + 1;
   const unsigned int by = frame.bevel_w + 1;
   unsigned int bx = frame.bevel_w + 1;
@@ -802,15 +801,15 @@ void OpenboxWindow::positionButtons(Bool redecorate_label) {
   }
 
   if (!hasclose) {
-      openbox->removeWindowSearch(frame.close_button);
+      openbox.removeWindowSearch(frame.close_button);
       XDestroyWindow(display, frame.close_button);     
   }
   if (!hasiconify) {
-      openbox->removeWindowSearch(frame.iconify_button);
+      openbox.removeWindowSearch(frame.iconify_button);
       XDestroyWindow(display, frame.iconify_button);
   }
   if (!hasmaximize) {
-      openbox->removeWindowSearch(frame.maximize_button);
+      openbox.removeWindowSearch(frame.maximize_button);
       XDestroyWindow(display, frame.maximize_button);                 
   }
   if (redecorate_label)
@@ -848,11 +847,11 @@ void OpenboxWindow::reconfigure(void) {
 
   configure(frame.x, frame.y, frame.width, frame.height);
 
-  if (! screen->isSloppyFocus())
-    openbox->grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
+  if (! screen->sloppyFocus())
+    openbox.grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
         GrabModeSync, GrabModeSync, None, None);
   else
-    openbox->ungrabButton(Button1, 0, frame.plate);
+    openbox.ungrabButton(Button1, 0, frame.plate);
 
   if (windowmenu) {
     windowmenu->move(windowmenu->getX(), frame.y + frame.title_h);
@@ -1000,12 +999,12 @@ void OpenboxWindow::getWMProtocols(void) {
 
   if (XGetWMProtocols(display, client.window, &proto, &num_return)) {
     for (int i = 0; i < num_return; ++i) {
-      if (proto[i] == openbox->getWMDeleteAtom())
+      if (proto[i] == openbox.getWMDeleteAtom())
        functions.close = decorations.close = True;
-      else if (proto[i] == openbox->getWMTakeFocusAtom())
+      else if (proto[i] == openbox.getWMTakeFocusAtom())
         flags.send_focus_message = True;
-      else if (proto[i] == openbox->getOpenboxStructureMessagesAtom())
-        screen->addNetizen(new Netizen(screen, client.window));
+      else if (proto[i] == openbox.getOpenboxStructureMessagesAtom())
+        screen->addNetizen(new Netizen(*screen, client.window));
     }
 
     XFree(proto);
@@ -1052,7 +1051,7 @@ void OpenboxWindow::getWMHints(void) {
   if (wmhint->flags & WindowGroupHint) {
     if (! client.window_group) {
       client.window_group = wmhint->window_group;
-      openbox->saveGroupSearch(client.window_group, this);
+      openbox.saveGroupSearch(client.window_group, this);
     }
   } else {
     client.window_group = None;
@@ -1072,8 +1071,8 @@ void OpenboxWindow::getWMNormalHints(void) {
   client.min_width = client.min_height =
     client.base_width = client.base_height =
     client.width_inc = client.height_inc = 1;
-  client.max_width = screen->getWidth();
-  client.max_height = screen->getHeight();
+  client.max_width = screen->size().w();
+  client.max_height = screen->size().h();
   client.min_aspect_x = client.min_aspect_y =
     client.max_aspect_x = client.max_aspect_y = 1;
   client.win_gravity = NorthWestGravity;
@@ -1128,9 +1127,9 @@ void OpenboxWindow::getMWMHints(void) {
   unsigned long num, len;
 
   int ret = XGetWindowProperty(display, client.window,
-                              openbox->getMotifWMHintsAtom(), 0,
+                              openbox.getMotifWMHintsAtom(), 0,
                               PropMwmHintsElements, False,
-                              openbox->getMotifWMHintsAtom(), &atom_return,
+                              openbox.getMotifWMHintsAtom(), &atom_return,
                               &format, &num, &len,
                               (unsigned char **) &client.mwm_hint);
 
@@ -1198,9 +1197,9 @@ void OpenboxWindow::getOpenboxHints(void) {
   unsigned long num, len;
 
   int ret = XGetWindowProperty(display, client.window,
-                              openbox->getOpenboxHintsAtom(), 0,
+                              openbox.getOpenboxHintsAtom(), 0,
                               PropOpenboxHintsElements, False,
-                              openbox->getOpenboxHintsAtom(), &atom_return,
+                              openbox.getOpenboxHintsAtom(), &atom_return,
                               &format, &num, &len,
                               (unsigned char **) &client.openbox_hint);
   if (ret != Success || !client.openbox_hint ||
@@ -1288,7 +1287,7 @@ void OpenboxWindow::configure(int dx, int dy,
     downsize();
 
 #ifdef    SHAPE
-    if (openbox->hasShapeExtensions() && flags.shaped) {
+    if (openbox.hasShapeExtensions() && flags.shaped) {
       XShapeCombineShape(display, frame.window, ShapeBounding,
                         frame.mwm_border_w, frame.y_border +
                         frame.mwm_border_w, client.window,
@@ -1358,25 +1357,25 @@ Bool OpenboxWindow::setInputFocus(void) {
   if (((signed) (frame.x + frame.width)) < 0) {
     if (((signed) (frame.y + frame.y_border)) < 0)
       configure(frame.border_w, frame.border_w, frame.width, frame.height);
-    else if (frame.y > (signed) screen->getHeight())
-      configure(frame.border_w, screen->getHeight() - frame.height,
+    else if (frame.y > (signed) screen->size().h())
+      configure(frame.border_w, screen->size().h() - frame.height,
                 frame.width, frame.height);
     else
       configure(frame.border_w, frame.y + frame.border_w,
                 frame.width, frame.height);
-  } else if (frame.x > (signed) screen->getWidth()) {
+  } else if (frame.x > (signed) screen->size().w()) {
     if (((signed) (frame.y + frame.y_border)) < 0)
-      configure(screen->getWidth() - frame.width, frame.border_w,
+      configure(screen->size().w() - frame.width, frame.border_w,
                 frame.width, frame.height);
-    else if (frame.y > (signed) screen->getHeight())
-      configure(screen->getWidth() - frame.width,
-               screen->getHeight() - frame.height, frame.width, frame.height);
+    else if (frame.y > (signed) screen->size().h())
+      configure(screen->size().w() - frame.width,
+               screen->size().h() - frame.height, frame.width, frame.height);
     else
-      configure(screen->getWidth() - frame.width,
+      configure(screen->size().w() - frame.width,
                 frame.y + frame.border_w, frame.width, frame.height);
   }
 
-  openbox->grab();
+  openbox.grab();
   if (! validateClient()) return False;
 
   Bool ret = False;
@@ -1391,30 +1390,30 @@ Bool OpenboxWindow::setInputFocus(void) {
       XSetInputFocus(display, screen->getRootWindow(),
                     RevertToNone, CurrentTime);
 
-    openbox->setFocusedWindow(this);
+    openbox.setFocusedWindow(this);
 
     if (flags.send_focus_message) {
       XEvent ce;
       ce.xclient.type = ClientMessage;
-      ce.xclient.message_type = openbox->getWMProtocolsAtom();
+      ce.xclient.message_type = openbox.getWMProtocolsAtom();
       ce.xclient.display = display;
       ce.xclient.window = client.window;
       ce.xclient.format = 32;
-      ce.xclient.data.l[0] = openbox->getWMTakeFocusAtom();
-      ce.xclient.data.l[1] = openbox->getLastTime();
+      ce.xclient.data.l[0] = openbox.getWMTakeFocusAtom();
+      ce.xclient.data.l[1] = openbox.getLastTime();
       ce.xclient.data.l[2] = 0l;
       ce.xclient.data.l[3] = 0l;
       ce.xclient.data.l[4] = 0l;
       XSendEvent(display, client.window, False, NoEventMask, &ce);
     }
 
-    if (screen->isSloppyFocus() && screen->doAutoRaise())
+    if (screen->sloppyFocus() && screen->autoRaise())
       timer->start();
 
     ret = True;
   }
 
-  openbox->ungrab();
+  openbox.ungrab();
 
   return ret;
 }
@@ -1466,7 +1465,25 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) {
   XMapSubwindows(display, frame.window);
   XMapWindow(display, frame.window);
 
-  if (flags.iconic && screen->doFocusNew()) setInputFocus();
+  // 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;
   flags.iconic = False;
@@ -1481,11 +1498,11 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) {
 void OpenboxWindow::close(void) {
   XEvent ce;
   ce.xclient.type = ClientMessage;
-  ce.xclient.message_type = openbox->getWMProtocolsAtom();
+  ce.xclient.message_type = openbox.getWMProtocolsAtom();
   ce.xclient.display = display;
   ce.xclient.window = client.window;
   ce.xclient.format = 32;
-  ce.xclient.data.l[0] = openbox->getWMDeleteAtom();
+  ce.xclient.data.l[0] = openbox.getWMDeleteAtom();
   ce.xclient.data.l[1] = CurrentTime;
   ce.xclient.data.l[2] = 0l;
   ce.xclient.data.l[3] = 0l;
@@ -1495,6 +1512,9 @@ void OpenboxWindow::close(void) {
 
 
 void OpenboxWindow::withdraw(void) {
+  if (flags.moving)
+    endMove();
+
   flags.visible = False;
   flags.iconic = False;
 
@@ -1534,29 +1554,24 @@ void OpenboxWindow::maximize(unsigned int button) {
     return;
   }
 
-  int dx = 0, dy = 0;
-  unsigned int dw, dh;
-
   openbox_attrib.premax_x = frame.x;
   openbox_attrib.premax_y = frame.y;
   openbox_attrib.premax_w = frame.width;
   openbox_attrib.premax_h = frame.height;
 
-  dw = screen->getWidth();
+  Rect space = screen->availableArea();
+  unsigned int dw = space.w(),
+               dh = space.h();
   dw -= frame.border_w * 2;
   dw -= frame.mwm_border_w * 2;
   dw -= client.base_width;
 
-  dh = screen->getHeight();
   dh -= frame.border_w * 2;
   dh -= frame.mwm_border_w * 2;
   dh -= ((frame.handle_h + frame.border_w) * decorations.handle);
   dh -= client.base_height;
   dh -= frame.y_border;
 
-  if (! screen->doFullMax())
-    dh -= screen->getToolbar()->getExposedHeight() + frame.border_w;
-
   if (dw < client.min_width) dw = client.min_width;
   if (dh < client.min_height) dh = client.min_height;
   if (dw > client.max_width) dw = client.max_width;
@@ -1572,23 +1587,8 @@ void OpenboxWindow::maximize(unsigned int button) {
   dh += ((frame.handle_h + frame.border_w) * decorations.handle);
   dh += frame.mwm_border_w * 2;
 
-  dx += ((screen->getWidth() - dw) / 2) - frame.border_w;
-
-  if (screen->doFullMax()) {
-    dy += ((screen->getHeight() - dh) / 2) - frame.border_w;
-  } else {
-    dy += (((screen->getHeight() - screen->getToolbar()->getExposedHeight())
-           - dh) / 2) - frame.border_w;
-
-    switch (screen->getToolbarPlacement()) {
-    case Toolbar::TopLeft:
-    case Toolbar::TopCenter:
-    case Toolbar::TopRight:
-      dy += screen->getToolbar()->getExposedHeight() +
-        frame.border_w;
-      break;
-    }
-  }
+  int dx = space.x() + ((space.w() - dw) / 2) - frame.border_w,
+      dy = space.y() + ((space.h() - dh) / 2) - frame.border_w;
 
   switch(button) {
   case 1:
@@ -1741,13 +1741,14 @@ void OpenboxWindow::setFocusFlag(Bool focus) {
       XSetWindowBorder(display, frame.plate, frame.uborder_pixel);
   }
 
-  if (screen->isSloppyFocus() && screen->doAutoRaise() && timer->isTiming())
+  if (screen->sloppyFocus() && screen->autoRaise() && timer->isTiming())
     timer->stop();
+
 }
 
 
 void OpenboxWindow::installColormap(Bool install) {
-  openbox->grab();
+  openbox.grab();
   if (! validateClient()) return;
 
   int i = 0, ncmap = 0;
@@ -1778,7 +1779,7 @@ void OpenboxWindow::installColormap(Bool install) {
     XFree(cmaps);
   }
 
-  openbox->ungrab();
+  openbox.ungrab();
 }
 
 
@@ -1788,13 +1789,13 @@ void OpenboxWindow::setState(unsigned long new_state) {
   unsigned long state[2];
   state[0] = (unsigned long) current_state;
   state[1] = (unsigned long) None;
-  XChangeProperty(display, client.window, openbox->getWMStateAtom(),
-                 openbox->getWMStateAtom(), 32, PropModeReplace,
+  XChangeProperty(display, client.window, openbox.getWMStateAtom(),
+                 openbox.getWMStateAtom(), 32, PropModeReplace,
                  (unsigned char *) state, 2);
 
   XChangeProperty(display, client.window,
-                 openbox->getOpenboxAttributesAtom(),
-                  openbox->getOpenboxAttributesAtom(), 32, PropModeReplace,
+                 openbox.getOpenboxAttributesAtom(),
+                  openbox.getOpenboxAttributesAtom(), 32, PropModeReplace,
                   (unsigned char *) &openbox_attrib,
                  PropOpenboxAttributesElements);
 }
@@ -1808,12 +1809,12 @@ Bool OpenboxWindow::getState(void) {
   int foo;
   unsigned long *state, ulfoo, nitems;
 
-  if ((XGetWindowProperty(display, client.window, openbox->getWMStateAtom(),
-                         0l, 2l, False, openbox->getWMStateAtom(),
+  if ((XGetWindowProperty(display, client.window, openbox.getWMStateAtom(),
+                         0l, 2l, False, openbox.getWMStateAtom(),
                          &atom_return, &foo, &nitems, &ulfoo,
                          (unsigned char **) &state) != Success) ||
       (! state)) {
-    openbox->ungrab();
+    openbox.ungrab();
     return False;
   }
 
@@ -1895,9 +1896,9 @@ void OpenboxWindow::restoreAttributes(void) {
 
   OpenboxAttributes *net;
   int ret = XGetWindowProperty(display, client.window,
-                              openbox->getOpenboxAttributesAtom(), 0l,
+                              openbox.getOpenboxAttributesAtom(), 0l,
                               PropOpenboxAttributesElements, False,
-                              openbox->getOpenboxAttributesAtom(),
+                              openbox.getOpenboxAttributesAtom(),
                               &atom_return, &foo, &nitems, &ulfoo,
                               (unsigned char **) &net);
   if (ret != Success || !net || nitems != PropOpenboxAttributesElements)
@@ -2211,11 +2212,11 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) {
             client.window);
 #endif // DEBUG
 
-    openbox->grab();
+    openbox.grab();
     if (! validateClient()) return;
 
     Bool get_state_ret = getState();
-    if (! (get_state_ret && openbox->isStartup())) {
+    if (! (get_state_ret && openbox.isStartup())) {
       if ((client.wm_hint_flags & StateHint) &&
           (! (current_state == NormalState || current_state == IconicState)))
         current_state = client.initial_state;
@@ -2242,7 +2243,7 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) {
       break;
     }
 
-    openbox->ungrab();
+    openbox.ungrab();
   }
 }
 
@@ -2250,7 +2251,7 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) {
 void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) {
   if ((ne->window == client.window) && (! ne->override_redirect)
       && (flags.visible)) {
-    openbox->grab();
+    openbox.grab();
     if (! validateClient()) return;
 
     if (decorations.titlebar) positionButtons();
@@ -2259,7 +2260,7 @@ void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) {
 
     redrawAllButtons();
 
-    if (flags.transient || screen->doFocusNew())
+    if (flags.transient || screen->focusNew())
       setInputFocus();
     else
       setFocusFlag(False);
@@ -2267,7 +2268,7 @@ void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) {
     flags.visible = True;
     flags.iconic = False;
 
-    openbox->ungrab();
+    openbox.ungrab();
   }
 }
 
@@ -2280,15 +2281,15 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) {
             client.window);
 #endif // DEBUG
 
-    openbox->grab();
+    openbox.grab();
     if (! validateClient()) return;
 
     XChangeSaveSet(display, client.window, SetModeDelete);
     XSelectInput(display, client.window, NoEventMask);
 
-    XDeleteProperty(display, client.window, openbox->getWMStateAtom());
+    XDeleteProperty(display, client.window, openbox.getWMStateAtom());
     XDeleteProperty(display, client.window,
-                   openbox->getOpenboxAttributesAtom());
+                   openbox.getOpenboxAttributesAtom());
 
     XUnmapWindow(display, frame.window);
     XUnmapWindow(display, client.window);
@@ -2309,7 +2310,7 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) {
 
     XFlush(display);
 
-    openbox->ungrab();
+    openbox.ungrab();
 
     delete this;
   }
@@ -2326,7 +2327,7 @@ void OpenboxWindow::destroyNotifyEvent(XDestroyWindowEvent *de) {
 
 
 void OpenboxWindow::propertyNotifyEvent(Atom atom) {
-  openbox->grab();
+  openbox.grab();
   if (! validateClient()) return;
 
   switch(atom) {
@@ -2340,13 +2341,13 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) {
     Window win;
     if (XGetTransientForHint(display, client.window, &win)) {
       if (win && (win != client.window)) {
-        if ((client.transient_for = openbox->searchWindow(win))) {
+        if ((client.transient_for = openbox.searchWindow(win))) {
           client.transient_for->client.transient = this;
           flags.stuck = client.transient_for->flags.stuck;
           flags.transient = True;
         } else if (win == client.window_group) {
          //jr This doesn't look quite right...
-          if ((client.transient_for = openbox->searchGroup(win, this))) {
+          if ((client.transient_for = openbox.searchGroup(win, this))) {
             client.transient_for->client.transient = this;
             flags.stuck = client.transient_for->flags.stuck;
             flags.transient = True;
@@ -2412,7 +2413,7 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) {
   }
 
   default:
-    if (atom == openbox->getWMProtocolsAtom()) {
+    if (atom == openbox.getWMProtocolsAtom()) {
       getWMProtocols();
 
       if (decorations.close && (! frame.close_button)) {
@@ -2425,7 +2426,7 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) {
     break;
   }
 
-  openbox->ungrab();
+  openbox.ungrab();
 }
 
 
@@ -2443,7 +2444,7 @@ void OpenboxWindow::exposeEvent(XExposeEvent *ee) {
 
 void OpenboxWindow::configureRequestEvent(XConfigureRequestEvent *cr) {
   if (cr->window == client.window) {
-    openbox->grab();
+    openbox.grab();
     if (! validateClient()) return;
 
     int cx = frame.x, cy = frame.y;
@@ -2487,13 +2488,13 @@ void OpenboxWindow::configureRequestEvent(XConfigureRequestEvent *cr) {
       }
     }
 
-    openbox->ungrab();
+    openbox.ungrab();
   }
 }
 
 
 void OpenboxWindow::buttonPressEvent(XButtonEvent *be) {
-  openbox->grab();
+  openbox.grab();
   if (! validateClient())
     return;
 
@@ -2504,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) {
@@ -2542,7 +2541,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) {
                be->window == frame.label) {
       // shade the window when the titlebar is double clicked
       if ( (be->time - lastButtonPressTime) <=
-            openbox->getDoubleClickInterval()) {
+            openbox.getDoubleClickInterval()) {
         lastButtonPressTime = 0;
         shade();
       } else {
@@ -2642,7 +2641,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) {
       shade();
   }
 
-  if (! (flags.focused || screen->isSloppyFocus()) ) {
+  if (! (flags.focused || screen->sloppyFocus()) ) {
     setInputFocus();  // any click focus' the window in 'click to focus'
   }
   if (stack_change < 0) {
@@ -2651,12 +2650,12 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) {
     screen->getWorkspace(workspace_number)->raiseWindow(this);
   }
  
-  openbox->ungrab();
+  openbox.ungrab();
 }
 
 
 void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) {
-  openbox->grab();
+  openbox.grab();
   if (! validateClient())
     return;
 
@@ -2720,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->doOpaqueMove()) {
-      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) {
@@ -2757,111 +2742,146 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) {
     configure(frame.resize_x, frame.resize_y,
               frame.resize_w - (frame.border_w * 2),
               frame.resize_h - (frame.border_w * 2));
-    openbox->ungrab();
+    openbox.ungrab();
     XUngrabPointer(display, CurrentTime);
     resize_zone = 0;
   }
 
-  openbox->ungrab();
+  openbox.ungrab();
 }
 
 
-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);
 
-      flags.moving = True;
+  if (windowmenu && windowmenu->isVisible())
+    windowmenu->hide();
 
-      openbox->maskWindowEvents(client.window, this);
+  flags.moving = True;
 
-      if (! screen->doOpaqueMove()) {
-        openbox->grab();
+  openbox.maskWindowEvents(client.window, this);
 
-        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);
+  if (! screen->opaqueMove()) {
+    openbox.grab();
 
-       screen->showPosition(frame.x, frame.y);
+    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);
 
-       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->getEdgeSnapThreshold();
-      // width/height of the snapping window
-      unsigned int snap_w = frame.width + (frame.border_w * 2);
-      unsigned int snap_h = getHeight() + (frame.border_w * 2);
-      if (snap_distance) {
-        int drx = screen->getWidth() - (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->getWidth() - snap_w;
-
-        int dtty, dbby, dty, dby;
-        switch (screen->getToolbarPlacement()) {
-        case Toolbar::TopLeft:
-        case Toolbar::TopCenter:
-        case Toolbar::TopRight:
-          dtty = screen->getToolbar()->getExposedHeight() +
-                frame.border_w;
-          dbby = screen->getHeight();
-          break;
-
-        default:
-          dtty = 0;
-         dbby = screen->getToolbar()->getY();
-          break;
-        }
+    screen->showPosition(frame.x, frame.y);
 
-        dty = dy - dtty;
-        dby = dbby - (dy + snap_h);
+    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;
+}
 
-        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->doOpaqueMove()) {
-       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);
+void OpenboxWindow::doMove(int x, int y) {
+  ASSERT(flags.moving);
 
-       frame.move_x = dx;
-       frame.move_y = dy;
+  int dx = x - frame.grab_x, dy = y - frame.grab_y;
 
-       XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(),
-                      frame.move_x, frame.move_y, frame.resize_w - 1,
-                      frame.resize_h - 1);
-      }
+  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;
 
-      screen->showPosition(dx, dy);
+    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) &&
@@ -2872,19 +2892,19 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
       Cursor cursor;
       if (resize_zone & ZoneTop)
         cursor = (resize_zone & ZoneLeft) ?
-          openbox->getUpperLeftAngleCursor() :
-          openbox->getUpperRightAngleCursor();
+          openbox.getUpperLeftAngleCursor() :
+          openbox.getUpperRightAngleCursor();
       else
         cursor = (resize_zone & ZoneLeft) ?
-          openbox->getLowerLeftAngleCursor() :
-          openbox->getLowerRightAngleCursor();
+          openbox.getLowerLeftAngleCursor() :
+          openbox.getLowerRightAngleCursor();
       XGrabPointer(display, me->window, False, ButtonMotionMask |
                    ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None,
                    cursor, CurrentTime);
 
       flags.resizing = True;
 
-      openbox->grab();
+      openbox.grab();
 
       int gx, gy;
       if (resize_zone & ZoneRight)
@@ -2948,9 +2968,9 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
 
 #ifdef    SHAPE
 void OpenboxWindow::shapeEvent(XShapeEvent *) {
-  if (openbox->hasShapeExtensions()) {
+  if (openbox.hasShapeExtensions()) {
     if (flags.shaped) {
-      openbox->grab();
+      openbox.grab();
       if (! validateClient()) return;
       XShapeCombineShape(display, frame.window, ShapeBounding,
                         frame.mwm_border_w, frame.y_border +
@@ -2973,7 +2993,7 @@ void OpenboxWindow::shapeEvent(XShapeEvent *) {
 
       XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0,
                              xrect, num, ShapeUnion, Unsorted);
-      openbox->ungrab();
+      openbox.ungrab();
     }
   }
 }
@@ -2987,7 +3007,7 @@ Bool OpenboxWindow::validateClient(void) {
   if (XCheckTypedWindowEvent(display, client.window, DestroyNotify, &e) ||
       XCheckTypedWindowEvent(display, client.window, UnmapNotify, &e)) {
     XPutBackEvent(display, &e);
-    openbox->ungrab();
+    openbox.ungrab();
 
     return False;
   }
This page took 0.055462 seconds and 4 git commands to generate.