]> Dogcows Code - chaz/openbox/blobdiff - src/Window.cc
when Image Dither is changed in the menu, make ob reconfigure so it uses the dithering
[chaz/openbox] / src / Window.cc
index 56487e0bd99c2674394bdae38f26993810b4d86a..f768f6c15e90ad088401ce6071e1b7055c04535d 100644 (file)
@@ -54,6 +54,7 @@
 #ifdef    SLIT
 #  include "Slit.h"
 #endif // SLIT
+#include "Util.h"
 
 /*
  * Initializes the class with default values/the window's set initial values.
@@ -1532,29 +1533,123 @@ void OpenboxWindow::maximize(unsigned int button) {
     return;
   }
 
-  int dx = 0, dy = 0;
-  unsigned int dw, dh;
+  // 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 && slit_y + slit->area().h() < tbarh) {
+        space.setY(space.y() + tbarh);
+        space.setH(space.h() - tbarh);
+      } else {
+        space.setY(space.y() + (slit_y + slit->area().h() +
+                                screen->getBorderWidth() * 2));
+        space.setH(space.h() - (slit_y + slit->area().h() +
+                                screen->getBorderWidth() * 2));
+        if (!tbartop)
+          space.setH(space.h() - tbarh);
+      }
+    } 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));
+      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
+      if (!tbartop && (screen->size().h() - slit_y) < tbarh) {
+        space.setH(space.h() - tbarh);
+      } else {
+        space.setH(space.h() - (screen->size().h() - slit_y));
+        if (tbartop) {
+          space.setY(space.y() + tbarh);
+          space.setH(space.h() - 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;
 
-  dw = screen->size().w();
+  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->size().h();
   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->fullMax())
-    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;
@@ -1570,23 +1665,8 @@ void OpenboxWindow::maximize(unsigned int button) {
   dh += ((frame.handle_h + frame.border_w) * decorations.handle);
   dh += frame.mwm_border_w * 2;
 
-  dx += ((screen->size().w() - dw) / 2) - frame.border_w;
-
-  if (screen->fullMax()) {
-    dy += ((screen->size().h() - dh) / 2) - frame.border_w;
-  } else {
-    dy += (((screen->size().h() - screen->getToolbar()->getExposedHeight())
-           - dh) / 2) - frame.border_w;
-
-    switch (screen->getToolbar()->placement()) {
-    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:
@@ -2804,7 +2884,7 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
       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 = size().h() + (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);
 
@@ -2827,7 +2907,7 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) {
 
         default:
           dtty = 0;
-         dbby = screen->getToolbar()->getY();
+         dbby = screen->getToolbar()->area().y();
           break;
         }
 
This page took 0.027471 seconds and 4 git commands to generate.