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();
}
void BScreen::addSystrayWindow(Window window) {
+ XGrabServer(blackbox->getXDisplay());
+
+ XSelectInput(blackbox->getXDisplay(), window, SubstructureRedirectMask);
systrayWindowList.push_back(window);
xatom->setValue(getRootWindow(), XAtom::kde_net_system_tray_windows,
XAtom::window,
&systrayWindowList[0], systrayWindowList.size());
blackbox->saveSystrayWindowSearch(window, this);
+
+ XUngrabServer(blackbox->getXDisplay());
}
void BScreen::removeSystrayWindow(Window window) {
+ XGrabServer(blackbox->getXDisplay());
+
WindowList::iterator it = systrayWindowList.begin();
const WindowList::iterator end = systrayWindowList.end();
for (; it != end; ++it)
XAtom::window,
&systrayWindowList[0], systrayWindowList.size());
blackbox->removeSystrayWindowSearch(window);
+ XSelectInput(blackbox->getXDisplay(), window, NoEventMask);
break;
}
+
+ assert(it != end); // not a systray window
+
+ XUngrabServer(blackbox->getXDisplay());
}
if (! win)
return;
-
- if (win->isNormal()) {
- // don't list non-normal windows as managed windows
+ if (win->isDesktop()) {
+ desktopWindowList.push_back(win->getFrameWindow());
+ } else { // if (win->isNormal()) {
+ // don't list desktop windows as managed windows
windowList.push_back(win);
updateClientList();
if (win->isTopmost())
specialWindowList.push_back(win->getFrameWindow());
- } else if (win->isDesktop()) {
- desktopWindowList.push_back(win->getFrameWindow());
}
-
+
XMapRequestEvent mre;
mre.window = w;
if (blackbox->isStartup() && win->isNormal()) win->restoreAttributes();
} else if (w->isIconic())
removeIcon(w);
- if (w->isNormal()) {
- // we don't list non-normal windows as managed windows
+ if (w->isDesktop()) {
+ WindowList::iterator it = desktopWindowList.begin();
+ const WindowList::iterator end = desktopWindowList.end();
+ for (; it != end; ++it)
+ if (*it == w->getFrameWindow()) {
+ desktopWindowList.erase(it);
+ break;
+ }
+ assert(it != end); // the window wasnt a desktop window?
+ } else { // if (w->isNormal()) {
+ // we don't list desktop windows as managed windows
windowList.remove(w);
updateClientList();
}
assert(it != end); // the window wasnt a special window?
}
- } else if (w->isDesktop()) {
- WindowList::iterator it = desktopWindowList.begin();
- const WindowList::iterator end = desktopWindowList.end();
- for (; it != end; ++it)
- if (*it == w->getFrameWindow()) {
- desktopWindowList.erase(it);
- break;
- }
- assert(it != end); // the window wasnt a desktop window?
}
if (blackbox->getFocusedWindow() == w)
while(! windowList.empty())
unmanageWindow(windowList.front(), True);
+ while(! desktopWindowList.empty()) {
+ BlackboxWindow *win = blackbox->searchWindow(desktopWindowList.front());
+ assert(win);
+ unmanageWindow(win, True);
+ }
+
slit->shutdown();
}