From 81cdff06930cb38f2138d7b41187d1e516b9e379 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 24 Aug 2002 08:09:35 +0000 Subject: [PATCH] don't unmap/remap sticky windows on a workspace change, but still make sloppy focus work right. --- src/Screen.cc | 32 +++++++++++++++++++++++++++----- src/Workspace.cc | 13 +++++++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 0290150d..bdae4dac 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,31 @@ 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 && current_workspace->getLastFocusedWindow()) + f = current_workspace->getLastFocusedWindow()->setInputFocus(); + + // If that fails, then set focus to nothing. + if (! f) blackbox->setFocusedWindow((BlackboxWindow *) 0); + updateNetizenCurrentWorkspace(); } diff --git a/src/Workspace.cc b/src/Workspace.cc index f4fab1cd..b943bc3a 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -237,9 +237,10 @@ void Workspace::showAll(void) { const BlackboxWindowList::iterator end = stackingList.end(); for (; it != end; ++it) { BlackboxWindow *bw = *it; - // not normal windows cant focus from mouse enters anyways, so we dont - // need to unmap/remap them on workspace changes - if (! bw->isStuck() || bw->isNormal()) + // sticky windows arent unmapped on a workspace change so we don't have ot + // map them, but sometimes on a restart, another app can unmap our sticky + // windows, so we map on startup always + if (! bw->isStuck() || screen->getBlackbox()->isStartup()) bw->show(); } } @@ -254,9 +255,9 @@ void Workspace::hideAll(void) { const BlackboxWindowList::iterator end = lst.end(); for (; it != end; ++it) { BlackboxWindow *bw = *it; - // not normal windows cant focus from mouse enters anyways, so we dont - // need to unmap/remap them on workspace changes - if (! bw->isStuck() || bw->isNormal()) + // don't hide sticky windows, or they'll end up flickering on a workspace + // change + if (! bw->isStuck()) bw->withdraw(); } } -- 2.45.2