]> Dogcows Code - chaz/openbox/blobdiff - src/Slit.cc
use drop shadow height in the font height.
[chaz/openbox] / src / Slit.cc
index 307430320921a27849648b852805d53dbe4a0477..c15f66c4b361ce336e51bfafb3689ffa210e383e 100644 (file)
@@ -133,6 +133,17 @@ void Slit::addClient(Window w) {
     client->rect.setSize(64, 64);
   }
 
+  Atom *proto;
+  int num_return = 0;
+  if (XGetWMProtocols(display, client->window, &proto, &num_return)) {
+    for (int i = 0; i < num_return; ++i) {
+      if (proto[i] ==
+          blackbox->getXAtom()->getAtom(XAtom::blackbox_structure_messages)) {
+        screen->addNetizen(new Netizen(screen, client->window));
+      }
+    }
+  }
+
   XSetWindowBorderWidth(display, client->window, 0);
 
   XGrabServer(display);
@@ -466,12 +477,17 @@ void Slit::updateStrut(void) {
       case TopCenter:
       case TopLeft:
       case TopRight:
-        strut.top = getExposedHeight() + border_width;
+        strut.top = frame.rect.top() + getExposedHeight() + border_width;
         break;
       case BottomCenter:
       case BottomLeft:
       case BottomRight:
-        strut.bottom = getExposedHeight() + border_width;
+        int pos;
+        if (do_auto_hide)
+          pos = frame.y_hidden;
+        else
+          pos = frame.rect.y();
+        strut.bottom = (screen->getRect().bottom() - pos);
         break;
       case CenterLeft:
         strut.left = getExposedWidth() + border_width;
@@ -490,106 +506,60 @@ void Slit::updateStrut(void) {
 
 
 void Slit::reposition(void) {
-  // place the slit in the appropriate place
+  int x = 0, y = 0;
+
   switch (placement) {
   case TopLeft:
-    frame.rect.setPos(0, 0);
-
-    if (direction == Vertical) {
-      frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
-                       - frame.rect.width();
-      frame.y_hidden = 0;
-    } else {
-      frame.x_hidden = 0;
-      frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
-                       - frame.rect.height();
-    }
-    break;
-
   case CenterLeft:
-    frame.rect.setPos(0, (screen->getHeight() - frame.rect.height()) / 2);
-
+  case BottomLeft:
+    x = 0;
     frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
-                     - frame.rect.width();
-    frame.y_hidden = frame.rect.y();
-    break;
+      - frame.rect.width();
 
-  case BottomLeft:
-    frame.rect.setPos(0, (screen->getHeight() - frame.rect.height()
-                          - (screen->getBorderWidth() * 2)));
+    if (placement == TopLeft)
+      y = 0;
+    else if (placement == CenterLeft)
+      y = (screen->getHeight() - frame.rect.height()) / 2;
+    else
+      y = screen->getHeight() - frame.rect.height()
+        - (screen->getBorderWidth() * 2);
 
-    if (direction == Vertical) {
-      frame.x_hidden = screen->getBevelWidth() - screen->getBorderWidth()
-                       - frame.rect.width();
-      frame.y_hidden = frame.rect.y();
-    } else {
-      frame.x_hidden = 0;
-      frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
-                       - screen->getBorderWidth();
-    }
     break;
 
   case TopCenter:
-    frame.rect.setPos((screen->getWidth() - frame.rect.width()) / 2, 0);
-
-    frame.x_hidden = frame.rect.x();
-    frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
-                     - frame.rect.height();
-    break;
-
   case BottomCenter:
-    frame.rect.setPos((screen->getWidth() - frame.rect.width()) / 2,
-                      (screen->getHeight() - frame.rect.height()
-                       - (screen->getBorderWidth() * 2)));
-    frame.x_hidden = frame.rect.x();
-    frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
-                     - screen->getBorderWidth();
-    break;
+    x = (screen->getWidth() - frame.rect.width()) / 2;
+    frame.x_hidden = x;
 
-  case TopRight:
-    frame.rect.setPos((screen->getWidth() - frame.rect.width()
-                       - (screen->getBorderWidth() * 2)), 0);
+    if (placement == TopCenter)
+      y = 0;
+    else
+      y = screen->getHeight() - frame.rect.height()
+        - (screen->getBorderWidth() * 2);
 
-    if (direction == Vertical) {
-      frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
-                       - screen->getBorderWidth();
-      frame.y_hidden = 0;
-    } else {
-      frame.x_hidden = frame.rect.x();
-      frame.y_hidden = screen->getBevelWidth() - screen->getBorderWidth()
-                       - frame.rect.height();
-    }
     break;
 
+  case TopRight:
   case CenterRight:
-  default:
-    frame.rect.setPos((screen->getWidth() - frame.rect.width()
-                       - (screen->getBorderWidth() * 2)),
-                      (screen->getHeight() - frame.rect.height()) / 2);
-
+  case BottomRight:
+    x = screen->getWidth() - frame.rect.width()
+      - (screen->getBorderWidth() * 2);
     frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
-                     - screen->getBorderWidth();
-    frame.y_hidden = frame.rect.y();
-    break;
+      - screen->getBorderWidth();
 
-  case BottomRight:
-    frame.rect.setPos((screen->getWidth() - frame.rect.width()
-                       - (screen->getBorderWidth() * 2)),
-                      (screen->getHeight() - frame.rect.height()
-                       - (screen->getBorderWidth() * 2)));
-
-    if (direction == Vertical) {
-      frame.x_hidden = screen->getWidth() - screen->getBevelWidth()
-                       - screen->getBorderWidth();
-      frame.y_hidden = frame.rect.y();
-    } else {
-      frame.x_hidden = frame.rect.x();
-      frame.y_hidden = screen->getHeight() - screen->getBevelWidth()
-                       - screen->getBorderWidth();
-    }
+    if (placement == TopRight)
+      y = 0;
+    else if (placement == CenterRight)
+      y = (screen->getHeight() - frame.rect.height()) / 2;
+    else
+      y = screen->getHeight() - frame.rect.height()
+  - (screen->getBorderWidth() * 2);
     break;
   }
 
+  frame.rect.setPos(x, y);
+
+  // we have to add the border to the rect as it is not accounted for
   Rect tbar_rect = screen->getToolbar()->getRect();
   tbar_rect.setSize(tbar_rect.width() + (screen->getBorderWidth() * 2),
                     tbar_rect.height() + (screen->getBorderWidth() * 2));
@@ -597,26 +567,33 @@ void Slit::reposition(void) {
   slit_rect.setSize(slit_rect.width() + (screen->getBorderWidth() * 2),
                     slit_rect.height() + (screen->getBorderWidth() * 2));
 
-  if (slit_rect.intersects(tbar_rect)) {
-    Toolbar *tbar = screen->getToolbar();
-    frame.y_hidden = frame.rect.y();
-
-    int delta = tbar->getExposedHeight() + (screen->getBorderWidth() * 2);
-    if (frame.rect.bottom() <= tbar_rect.bottom()) {
+  if (! screen->doHideToolbar() && slit_rect.intersects(tbar_rect)) {
+    int delta = screen->getToolbar()->getExposedHeight() +
+      screen->getBorderWidth();
+    if (frame.rect.bottom() <= tbar_rect.bottom())
       delta = -delta;
-    }
+
     frame.rect.setY(frame.rect.y() + delta);
-    if (direction == Vertical)
-      frame.y_hidden += delta;
   }
 
+  if (placement == TopCenter)
+    frame.y_hidden = 0 - frame.rect.height() + screen->getBorderWidth() 
+      + screen->getBevelWidth();
+  else if (placement == BottomCenter)
+    frame.y_hidden = screen->getHeight() - screen->getBorderWidth()
+      - screen->getBevelWidth();
+  else
+    frame.y_hidden = frame.rect.y();
+
   updateStrut();
 
   if (hidden)
-    XMoveResizeWindow(display, frame.window, frame.x_hidden,
-                      frame.y_hidden, frame.rect.width(), frame.rect.height());
+    XMoveResizeWindow(display, frame.window,
+                      frame.x_hidden, frame.y_hidden,
+                      frame.rect.width(), frame.rect.height());
   else
-    XMoveResizeWindow(display, frame.window, frame.rect.x(), frame.rect.y(),
+    XMoveResizeWindow(display, frame.window,
+                      frame.rect.x(), frame.rect.y(),
                       frame.rect.width(), frame.rect.height());
 }
 
This page took 0.027526 seconds and 4 git commands to generate.