]> Dogcows Code - chaz/openbox/blobdiff - src/Window.cc
make all parents/transients that are related have the same sticky state.
[chaz/openbox] / src / Window.cc
index 840954ec0ab22555e55111e2b6ecee78c332306a..d33692449329e071432702f8407d03f3a5b6288a 100644 (file)
@@ -254,6 +254,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
               frame.rect.width(), frame.rect.height());
   }
 
+  // get sticky state from our parent window if we've got one
+  if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul &&
+      client.transient_for->isStuck() != flags.stuck)
+    stick();
+
   if (flags.shaded) {
     flags.shaded = False;
     shade();
@@ -1609,6 +1614,9 @@ void BlackboxWindow::shade(void) {
 }
 
 
+/*
+ * (Un)Sticks a window and its relatives.
+ */
 void BlackboxWindow::stick(void) {
   if (flags.stuck) {
     blackbox_attrib.flags ^= AttribOmnipresent;
@@ -1628,6 +1636,16 @@ void BlackboxWindow::stick(void) {
 
     setState(current_state);
   }
+  // go up the chain
+  if (isTransient() && client.transient_for != (BlackboxWindow *) ~0ul &&
+      client.transient_for->isStuck() != flags.stuck)
+    client.transient_for->stick();
+  // go down the chain
+  BlackboxWindowList::iterator it;
+  const BlackboxWindowList::iterator end = client.transientList.end();
+  for (it = client.transientList.begin(); it != end; ++it)
+    if ((*it)->isStuck() != flags.stuck)
+      (*it)->stick();
 }
 
 
@@ -2582,26 +2600,28 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
         else if (dbottom < snap_distance)
           dy = srect.bottom() - frame.rect.height() + 1;
 
-        srect = screen->getRect(); // now get the full screen
+        if (! screen->doFullMax()) {
+          srect = screen->getRect(); // now get the full screen
 
-        dleft = std::abs(wleft - srect.left()),
-        dright = std::abs(wright - srect.right()),
-        dtop = std::abs(wtop - srect.top()),
-        dbottom = std::abs(wbottom - srect.bottom());
+          dleft = std::abs(wleft - srect.left()),
+          dright = std::abs(wright - srect.right()),
+          dtop = std::abs(wtop - srect.top()),
+          dbottom = std::abs(wbottom - srect.bottom());
 
-        // snap left?
-        if (dleft < snap_distance && dleft <= dright)
-          dx = srect.left();
-        // snap right?
-        else if (dright < snap_distance)
-          dx = srect.right() - frame.rect.width() + 1;
+          // snap left?
+          if (dleft < snap_distance && dleft <= dright)
+            dx = srect.left();
+          // snap right?
+          else if (dright < snap_distance)
+            dx = srect.right() - frame.rect.width() + 1;
 
-        // snap top?
-        if (dtop < snap_distance && dtop <= dbottom)
-          dy = srect.top();
-        // snap bottom?
-        else if (dbottom < snap_distance)
-          dy = srect.bottom() - frame.rect.height() + 1;
+          // snap top?
+          if (dtop < snap_distance && dtop <= dbottom)
+            dy = srect.top();
+          // snap bottom?
+          else if (dbottom < snap_distance)
+            dy = srect.bottom() - frame.rect.height() + 1;
+        }
       }
 
       if (screen->doOpaqueMove()) {
This page took 0.022956 seconds and 4 git commands to generate.