]> Dogcows Code - chaz/openbox/blobdiff - src/client.cc
try use the gravity in the WM_NORMAL hint, and fall back to the attribute
[chaz/openbox] / src / client.cc
index f564786f24cc0d26b8a1c530151e7ac5d92c8065..829bec3649bfa38e087b1130ff43765e26694176 100644 (file)
@@ -47,6 +47,7 @@ Client::Client(int screen, Window window)
   // pick a layer to start from
   _layer = Layer_Normal;
   
+  getGravity();
   getArea();
   getDesktop();
 
@@ -60,7 +61,6 @@ Client::Client(int screen, Window window)
   getShaped();
 
   updateProtocols();
-  updateNormalHints();
   updateWMHints();
   updateTitle();
   updateIconTitle();
@@ -91,6 +91,25 @@ Client::~Client()
 }
 
 
+void Client::getGravity()
+{
+  XSizeHints size;
+  XWindowAttributes wattrib;
+  Status ret;
+  long junk;
+
+  if (XGetWMNormalHints(**otk::display, _window, &size, &junk) &&
+      size.flags & PWinGravity)
+    // first try the normal hints
+    _gravity = size.win_gravity;
+  else {
+    // then fall back to the attribute
+    ret = XGetWindowAttributes(**otk::display, _window, &wattrib);
+    assert(ret != BadWindow);
+    _gravity = wattrib.win_gravity;
+  }
+}
+
 void Client::getDesktop()
 {
   // defaults to the current desktop
@@ -339,7 +358,7 @@ void Client::calcLayer() {
         if we don't have a frame, then we aren't mapped yet (and this would
         SIGSEGV :)
       */
-      openbox->screen(_screen)->restack(true, this); // raise
+      openbox->screen(_screen)->raiseWindow(this);
     }
   }
 }
@@ -378,7 +397,6 @@ void Client::updateNormalHints()
   int oldgravity = _gravity;
 
   // defaults
-  _gravity = NorthWestGravity;
   _size_inc.setPoint(1, 1);
   _base_size.setPoint(0, 0);
   _min_size.setPoint(0, 0);
@@ -391,8 +409,18 @@ void Client::updateNormalHints()
   if (XGetWMNormalHints(**otk::display, _window, &size, &ret)) {
     _positioned = (size.flags & (PPosition|USPosition));
 
-    if (size.flags & PWinGravity)
+    if (size.flags & PWinGravity) {
       _gravity = size.win_gravity;
+      
+      // if the client has a frame, i.e. has already been mapped and is
+      // changing its gravity
+      if (_gravity != oldgravity) {
+        // move our idea of the client's position based on its new gravity
+        int x, y;
+        frame->frameGravity(x, y);
+        _area.setPos(x, y);
+      }
+    }
 
     if (size.flags & PMinSize)
       _min_size.setPoint(size.min_width, size.min_height);
@@ -406,15 +434,6 @@ void Client::updateNormalHints()
     if (size.flags & PResizeInc)
       _size_inc.setPoint(size.width_inc, size.height_inc);
   }
-
-  // if the client has a frame, i.e. has already been mapped and is
-  // changing its gravity
-  if (frame && _gravity != oldgravity) {
-    // move our idea of the client's position based on its new gravity
-    int x, y;
-    frame->frameGravity(x, y);
-    _area.setPos(x, y);
-  }
 }
 
 
@@ -756,9 +775,13 @@ void Client::toggleClientBorder(bool addborder)
   // reversed.
   int x = _area.x(), y = _area.y();
   switch(_gravity) {
+  default:
   case NorthWestGravity:
   case WestGravity:
   case SouthWestGravity:
+  case NorthGravity:
+  case CenterGravity:
+  case SouthGravity:
     break;
   case NorthEastGravity:
   case EastGravity:
@@ -766,11 +789,20 @@ void Client::toggleClientBorder(bool addborder)
     if (addborder) x -= _border_width * 2;
     else           x += _border_width * 2;
     break;
+  case ForgetGravity:
+  case StaticGravity:
+    if (addborder) x -= _border_width;
+    else           x += _border_width;
+    break;
   }
   switch(_gravity) {
+  default:
   case NorthWestGravity:
+  case WestGravity:
   case NorthGravity:
+  case CenterGravity:
   case NorthEastGravity:
+  case EastGravity:
     break;
   case SouthWestGravity:
   case SouthGravity:
@@ -778,8 +810,10 @@ void Client::toggleClientBorder(bool addborder)
     if (addborder) y -= _border_width * 2;
     else           y += _border_width * 2;
     break;
-  default:
-    // no change for StaticGravity etc.
+  case ForgetGravity:
+  case StaticGravity:
+    if (addborder) y -= _border_width;
+    else           y += _border_width;
     break;
   }
   _area.setPos(x, y);
@@ -856,7 +890,7 @@ void Client::clientMessageHandler(const XClientMessageEvent &e)
       shade(false);
     // XXX: deiconify
     focus();
-    openbox->screen(_screen)->restack(true, this); // raise
+    openbox->screen(_screen)->raiseWindow(this);
   }
 }
 
@@ -1165,13 +1199,13 @@ void Client::configureRequestHandler(const XConfigureRequestEvent &e)
     switch (e.detail) {
     case Below:
     case BottomIf:
-      openbox->screen(_screen)->restack(false, this); // lower
+      openbox->screen(_screen)->lowerWindow(this);
       break;
 
     case Above:
     case TopIf:
     default:
-      openbox->screen(_screen)->restack(true, this); // raise
+      openbox->screen(_screen)->raiseWindow(this);
       break;
     }
   }
This page took 0.026555 seconds and 4 git commands to generate.