X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=1d07a5bea12daa5db632dc0b88df2d931f646ac3;hb=1766453ca2ce30adf84798cb504e8b4d258bd08f;hp=64710a59a999f86d14b089ef5600c22f2bbdf9da;hpb=aad50046de0b1971f869ee95a0f80267c74a1fd3;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index 64710a59..1d07a5be 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -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());