+ if (id == screen->getCurrentWorkspaceID()) {
+ // The window is on the visible workspace.
+
+ // if it's a transient, then try to focus its parent
+ if (old_window && old_window->isTransient()) {
+ newfocus = old_window->getTransientFor();
+
+ if (! newfocus ||
+ newfocus->isIconic() || // do not focus icons
+ newfocus->getWorkspaceNumber() != id || // or other workspaces
+ ! newfocus->setInputFocus())
+ newfocus = 0;
+ }
+
+ if (! newfocus) {
+ BlackboxWindowList::iterator it = stackingList.begin(),
+ end = stackingList.end();
+ for (; it != end; ++it) {
+ BlackboxWindow *tmp = *it;
+ if (tmp && tmp->isNormal() && tmp->setInputFocus()) {
+ // we found our new focus target
+ newfocus = tmp;
+ break;
+ }
+ }
+ }
+
+ screen->getBlackbox()->setFocusedWindow(newfocus);
+ } else {
+ // The window is not on the visible workspace.
+
+ if (old_window && lastfocus == old_window) {
+ // The window was the last-focus target, so we need to replace it.
+ BlackboxWindow *win = (BlackboxWindow*) 0;
+ if (! stackingList.empty())
+ win = stackingList.front();
+ setLastFocusedWindow(win);
+ }
+ }
+}
+
+
+void Workspace::setFocused(const BlackboxWindow *w, bool focused) {
+ BlackboxWindowList::iterator it, end = windowList.end();
+ int i;
+ for (i = 0, it = windowList.begin(); it != end; ++it, ++i)
+ if (*it == w)
+ break;
+ // if its == end, then a window thats not in the windowList
+ // got focused, such as a !isNormal() window.
+ if (it != end)
+ clientmenu->setItemSelected(i, focused);