]> Dogcows Code - chaz/openbox/blobdiff - src/Workspace.cc
merge from netwm-merge2 to netwm-merge3. Basically, all of netwm that we intend to...
[chaz/openbox] / src / Workspace.cc
index 64710a59a999f86d14b089ef5600c22f2bbdf9da..50a9f4fbca28145bb46dd882c589d41989fd8543 100644 (file)
@@ -97,18 +97,39 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) {
 
   stackingList.remove(w);
 
-  if (w->isFocused() && ! screen->getBlackbox()->doShutdown()) {
+  // pass focus to the next appropriate window
+  if ((w->isFocused() || w == lastfocus) &&
+      ! screen->getBlackbox()->doShutdown()) {
     BlackboxWindow *newfocus = 0;
     if (w->isTransient())
       newfocus = w->getTransientFor();
     if (! newfocus && ! stackingList.empty())
       newfocus = stackingList.front();
-    if (! newfocus || ! newfocus->setInputFocus())
-      screen->getBlackbox()->setFocusedWindow(0);
-  }
 
-  if (lastfocus == w)
-    lastfocus = (BlackboxWindow *) 0;
+    assert(newfocus != w);  // this would be very wrong.
+
+    if (id == screen->getCurrentWorkspaceID()) {
+      /*
+        if the window is on the visible workspace, then try focus it, and fall
+        back to the default focus target if the window won't focus.
+      */
+      if (! newfocus || ! newfocus->setInputFocus())
+        screen->getBlackbox()->setFocusedWindow(0);
+    } else if (lastfocus == w) {
+      /*
+        If this workspace is not the current one do not assume that
+        w == lastfocus. If a sticky window is removed on a workspace other
+        than where it originated, it will fire the removeWindow on a
+        non-visible workspace.
+      */
+      
+      /*
+        If the window isn't on the visible workspace, don't focus the new one,
+        just mark it to be focused when the workspace comes into view.
+      */
+      setLastFocusedWindow(newfocus);
+    }
+  }
 
   windowList.remove(w);
   clientmenu->remove(w->getWindowNumber());
@@ -286,6 +307,7 @@ void Workspace::lowerWindow(BlackboxWindow *w) {
   XLowerWindow(screen->getBaseDisplay()->getXDisplay(), stack_vector.front());
   XRestackWindows(screen->getBaseDisplay()->getXDisplay(),
                   &stack_vector[0], stack_vector.size());
+  screen->lowerDesktops();
 }
 
 
@@ -356,6 +378,14 @@ unsigned int Workspace::getCount(void) const {
 }
 
 
+void Workspace::appendStackOrder(BlackboxWindowList &stack_order) const {
+  BlackboxWindowList::const_iterator it = stackingList.begin();
+  const BlackboxWindowList::const_iterator end = stackingList.end();
+  for (; it != end; ++it)
+    stack_order.push_back(*it);
+}
+  
+
 bool Workspace::isCurrent(void) const {
   return (id == screen->getCurrentWorkspaceID());
 }
This page took 0.02244 seconds and 4 git commands to generate.