X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FScreen.cc;h=235a04a78c788bd7e377633d607bd816e9f83ef0;hb=483b8496d615dc1ed6934fb685b904ad6923b8a1;hp=0290150d027fbba395f9e1a1972a6e0cd7b2246f;hpb=0f4737f0f1e1616e3649e117bd2f2e48499f1994;p=chaz%2Fopenbox diff --git a/src/Screen.cc b/src/Screen.cc index 0290150d..235a04a7 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1232,8 +1232,10 @@ void BScreen::changeWorkspaceID(unsigned int id) { 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); @@ -1248,11 +1250,43 @@ void BScreen::changeWorkspaceID(unsigned int id) { 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(); } @@ -1375,7 +1409,7 @@ void BScreen::manageWindow(Window w) { 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(); @@ -1426,7 +1460,7 @@ void BScreen::unmanageWindow(BlackboxWindow *w, bool remap) { 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(); @@ -2187,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(); }