X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=2722fe4bd28310f1336109fda1ddec2569e830ad;hb=5033ce0a24336668f4705a17063f27d842da461b;hp=1c9c347b7e44396f9a571aef0b04b1eb8cb8fa5b;hpb=23e92e110e467796437d981c0c5bc129c0e20b8e;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 1c9c347b..2722fe4b 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1268,12 +1268,24 @@ void BScreen::changeWorkspaceID(unsigned int id) { f = win->setInputFocus(); } - // If that fails, and we're doing focus_last, try to focus the last window. - if (! f && resource.focus_last && current_workspace->getLastFocusedWindow()) - f = current_workspace->getLastFocusedWindow()->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 that fails, then set focus to nothing. - if (! f) blackbox->setFocusedWindow((BlackboxWindow *) 0); + /* + 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(); } @@ -1339,7 +1351,7 @@ void BScreen::updateStackingList(void) { void BScreen::addSystrayWindow(Window window) { XGrabServer(blackbox->getXDisplay()); - XSelectInput(blackbox->getXDisplay(), window, SubstructureRedirectMask); + XSelectInput(blackbox->getXDisplay(), window, StructureNotifyMask); systrayWindowList.push_back(window); xatom->setValue(getRootWindow(), XAtom::kde_net_system_tray_windows, XAtom::window, @@ -2209,6 +2221,12 @@ void BScreen::shutdown(void) { while(! windowList.empty()) unmanageWindow(windowList.front(), True); + while(! desktopWindowList.empty()) { + BlackboxWindow *win = blackbox->searchWindow(desktopWindowList.front()); + assert(win); + unmanageWindow(win, True); + } + slit->shutdown(); }