current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
}
- // when we switch workspaces, unfocus whatever was focused
- blackbox->setFocusedWindow((BlackboxWindow *) 0);
+ // when we switch workspaces, unfocus whatever was focused if it is going
+ // to be unmapped
+ if (focused && ! focused->isStuck())
+ blackbox->setFocusedWindow((BlackboxWindow *) 0);
current_workspace->hideAll();
workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
current_workspace->showAll();
- if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
- XSync(blackbox->getXDisplay(), False);
- current_workspace->getLastFocusedWindow()->setInputFocus();
+ int x, y, rx, ry;
+ Window c, r;
+ unsigned int m;
+ BlackboxWindow *win = (BlackboxWindow *) 0;
+ bool f = False;
+
+ XSync(blackbox->getXDisplay(), False);
+
+ // If sloppy focus and we can find the client window under the pointer,
+ // try to focus it.
+ if (resource.sloppy_focus &&
+ XQueryPointer(blackbox->getXDisplay(), getRootWindow(), &r, &c,
+ &rx, &ry, &x, &y, &m) &&
+ c != None) {
+ if ( (win = blackbox->searchWindow(c)) )
+ f = win->setInputFocus();
}
+ // If that fails, and we're doing focus_last, try to focus the last window.
+ if (! f && resource.focus_last &&
+ (win = current_workspace->getLastFocusedWindow()))
+ f = win->setInputFocus();
+
+ /*
+ if we found a focus target, then we set the focused window explicitly
+ because it is possible to switch off this workspace before the x server
+ generates the FocusIn event for the window. if that happens, openbox would
+ lose track of what window was the 'LastFocused' window on the workspace.
+
+ if we did not find a focus target, then set the current focused window to
+ nothing.
+ */
+ if (f)
+ blackbox->setFocusedWindow(win);
+ else
+ blackbox->setFocusedWindow((BlackboxWindow *) 0);
+
updateNetizenCurrentWorkspace();
}
if (win->isDesktop()) {
desktopWindowList.push_back(win->getFrameWindow());
- } else {
+ } else { // if (win->isNormal()) {
// don't list desktop windows as managed windows
windowList.push_back(win);
updateClientList();
break;
}
assert(it != end); // the window wasnt a desktop window?
- } else {
+ } else { // if (w->isNormal()) {
// we don't list desktop windows as managed windows
windowList.remove(w);
updateClientList();
while(! windowList.empty())
unmanageWindow(windowList.front(), True);
+ while(! desktopWindowList.empty()) {
+ BlackboxWindow *win = blackbox->searchWindow(desktopWindowList.front());
+ assert(win);
+ unmanageWindow(win, True);
+ }
+
slit->shutdown();
}