]> Dogcows Code - chaz/openbox/blobdiff - src/client.cc
let you optionally avoid focusing windows which have specified to not be displayed...
[chaz/openbox] / src / client.cc
index e9136df4d0324c3294869e8af44d6cee9ef56af1..d2a75b6a4d0a152867aeca5d154cf973685c3ff7 100644 (file)
@@ -51,6 +51,8 @@ Client::Client(int screen, Window window)
   _urgent = false;
   // not positioned unless specified
   _positioned = false;
+  // nothing is disabled unless specified
+  _disabled_decorations = 0;
   
   getArea();
   getDesktop();
@@ -64,12 +66,14 @@ Client::Client(int screen, Window window)
 
   updateProtocols();
 
-  // got the type, the mwmhints, and the protocols, so we're ready to set up
+  getGravity();        // get the attribute gravity
+  updateNormalHints(); // this may override the attribute gravity
+
+  // got the type, the mwmhints, the protocols, and the normal hints (min/max
+  // sizes), so we're ready to set up
   // the decorations/functions
   setupDecorAndFunctions();
   
-  getGravity();        // get the attribute gravity
-  updateNormalHints(); // this may override the attribute gravity
   // also get the initial_state and set _iconic if we aren't "starting"
   // when we're "starting" that means we should use whatever state was already
   // on the window over the initial map state, because it was already mapped
@@ -218,8 +222,8 @@ void Client::setupDecorAndFunctions()
     _functions |= Func_Close;
   }
 
-  if (_min_size.x() > _max_size.x() || _min_size.y() > _max_size.y()) {
-    _decorations &= ~Decor_Maximize;
+  if (!(_min_size.x() < _max_size.x() || _min_size.y() < _max_size.y())) {
+    _decorations &= ~(Decor_Maximize | Decor_Handle);
     _functions &= ~(Func_Resize | Func_Maximize);
   }
   
@@ -305,7 +309,17 @@ void Client::setupDecorAndFunctions()
   if (_disabled_decorations & Decor_Close)
     _decorations &= ~Decor_Close;
 
+  // You can't shade without a titlebar
+  if (!(_decorations & Decor_Titlebar))
+    _functions &= ~Func_Shade;
+  
   changeAllowedActions();
+
+  if (frame) {
+    frame->adjustSize(); // change the decors on the frame
+    frame->adjustPosition(); // with more/less decorations, we may need to be
+                             // moved
+  }
 }
 
 
@@ -624,8 +638,11 @@ void Client::updateStrut()
     _strut.right = data[1];
     _strut.top = data[2];
     _strut.bottom = data[3]; 
-   
-    openbox->screen(_screen)->updateStrut();
+
+    // updating here is pointless while we're being mapped cuz we're not in
+    // the screen's client list yet
+    if (frame)
+      openbox->screen(_screen)->updateStrut();
   }
 
   delete [] data;
@@ -695,7 +712,6 @@ void Client::propertyHandler(const XPropertyEvent &e)
     getType();
     calcLayer(); // type may have changed, so update the layer
     setupDecorAndFunctions();
-    frame->adjustSize(); // this updates the frame for any new decor settings
   }
   else if (e.atom == otk::Property::atoms.net_wm_name ||
            e.atom == otk::Property::atoms.wm_name)
@@ -708,7 +724,6 @@ void Client::propertyHandler(const XPropertyEvent &e)
   else if (e.atom == otk::Property::atoms.wm_protocols) {
     updateProtocols();
     setupDecorAndFunctions();
-    frame->adjustSize(); // update the decorations
   }
   else if (e.atom == otk::Property::atoms.net_wm_strut)
     updateStrut();
@@ -878,6 +893,7 @@ void Client::setState(StateAction action, long data1, long data2)
   if (shadestate != _shaded)
     shade(shadestate);
   calcLayer();
+  changeState(); // change the hint to relect these changes
 }
 
 
@@ -888,7 +904,8 @@ void Client::toggleClientBorder(bool addborder)
   // different position.
   // when re-adding the border to the client, the same operation needs to be
   // reversed.
-  int x = _area.x(), y = _area.y();
+  int oldx = _area.x(), oldy = _area.y();
+  int x = oldx, y = oldy;
   switch(_gravity) {
   default:
   case NorthWestGravity:
@@ -937,7 +954,8 @@ void Client::toggleClientBorder(bool addborder)
     XSetWindowBorderWidth(**otk::display, _window, _border_width);
 
     // move the client so it is back it the right spot _with_ its border!
-    XMoveWindow(**otk::display, _window, x, y);
+    if (x != oldx || y != oldy)
+      XMoveWindow(**otk::display, _window, x, y);
   } else
     XSetWindowBorderWidth(**otk::display, _window, 0);
 }
@@ -1131,15 +1149,23 @@ void Client::internal_move(int x, int y)
     event.xconfigure.display = **otk::display;
     event.xconfigure.event = _window;
     event.xconfigure.window = _window;
-    event.xconfigure.x = x;
-    event.xconfigure.y = y;
+    
+    // root window coords with border in mind
+    event.xconfigure.x = x - _border_width + frame->size().left;
+    event.xconfigure.y = y - _border_width + frame->size().top;
+    
     event.xconfigure.width = _area.width();
     event.xconfigure.height = _area.height();
     event.xconfigure.border_width = _border_width;
-    event.xconfigure.above = frame->window();
+    event.xconfigure.above = frame->plate();
     event.xconfigure.override_redirect = False;
     XSendEvent(event.xconfigure.display, event.xconfigure.window, False,
                StructureNotifyMask, &event);
+#if 0//def DEBUG
+    printf("Sent synthetic ConfigureNotify %d,%d %d,%d to 0x%lx\n",
+           event.xconfigure.x, event.xconfigure.y, event.xconfigure.width,
+           event.xconfigure.height, event.xconfigure.window);
+#endif
   }
 }
 
@@ -1343,8 +1369,6 @@ void Client::disableDecorations(DecorationFlags flags)
 {
   _disabled_decorations = flags;
   setupDecorAndFunctions();
-  if (frame)
-    frame->adjustSize(); // change the decors on the frame
 }
 
 
This page took 0.023734 seconds and 4 git commands to generate.