summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2002-08-24 08:09:35 +0000
committerDana Jansens <danakj@orodu.net>2002-08-24 08:09:35 +0000
commit81cdff06930cb38f2138d7b41187d1e516b9e379 (patch)
tree70ab42c73254a4c1edce6a89d606e4abea89af6a /src
parent0f4737f0f1e1616e3649e117bd2f2e48499f1994 (diff)
don't unmap/remap sticky windows on a workspace change, but still make sloppy focus work right.
Diffstat (limited to 'src')
-rw-r--r--src/Screen.cc32
-rw-r--r--src/Workspace.cc13
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();
}
}