don't unmap/remap sticky windows on a workspace change, but still make sloppy focus work right.

This commit is contained in:
Dana Jansens 2002-08-24 08:09:35 +00:00
parent 0f4737f0f1
commit 81cdff0693
2 changed files with 34 additions and 11 deletions

View file

@ -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();
}

View file

@ -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();
}
}