don't unmap/remap sticky windows on a workspace change, but still make sloppy focus work right.
This commit is contained in:
parent
0f4737f0f1
commit
81cdff0693
2 changed files with 34 additions and 11 deletions
|
@ -1232,8 +1232,10 @@ void BScreen::changeWorkspaceID(unsigned int id) {
|
||||||
current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
|
current_workspace->setLastFocusedWindow((BlackboxWindow *) 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// when we switch workspaces, unfocus whatever was focused
|
// when we switch workspaces, unfocus whatever was focused if it is going
|
||||||
blackbox->setFocusedWindow((BlackboxWindow *) 0);
|
// to be unmapped
|
||||||
|
if (focused && ! focused->isStuck())
|
||||||
|
blackbox->setFocusedWindow((BlackboxWindow *) 0);
|
||||||
|
|
||||||
current_workspace->hideAll();
|
current_workspace->hideAll();
|
||||||
workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
|
workspacemenu->setItemSelected(current_workspace->getID() + 2, False);
|
||||||
|
@ -1248,11 +1250,31 @@ void BScreen::changeWorkspaceID(unsigned int id) {
|
||||||
|
|
||||||
current_workspace->showAll();
|
current_workspace->showAll();
|
||||||
|
|
||||||
if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
|
int x, y, rx, ry;
|
||||||
XSync(blackbox->getXDisplay(), False);
|
Window c, r;
|
||||||
current_workspace->getLastFocusedWindow()->setInputFocus();
|
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();
|
updateNetizenCurrentWorkspace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -237,9 +237,10 @@ void Workspace::showAll(void) {
|
||||||
const BlackboxWindowList::iterator end = stackingList.end();
|
const BlackboxWindowList::iterator end = stackingList.end();
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
BlackboxWindow *bw = *it;
|
BlackboxWindow *bw = *it;
|
||||||
// not normal windows cant focus from mouse enters anyways, so we dont
|
// sticky windows arent unmapped on a workspace change so we don't have ot
|
||||||
// need to unmap/remap them on workspace changes
|
// map them, but sometimes on a restart, another app can unmap our sticky
|
||||||
if (! bw->isStuck() || bw->isNormal())
|
// windows, so we map on startup always
|
||||||
|
if (! bw->isStuck() || screen->getBlackbox()->isStartup())
|
||||||
bw->show();
|
bw->show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -254,9 +255,9 @@ void Workspace::hideAll(void) {
|
||||||
const BlackboxWindowList::iterator end = lst.end();
|
const BlackboxWindowList::iterator end = lst.end();
|
||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
BlackboxWindow *bw = *it;
|
BlackboxWindow *bw = *it;
|
||||||
// not normal windows cant focus from mouse enters anyways, so we dont
|
// don't hide sticky windows, or they'll end up flickering on a workspace
|
||||||
// need to unmap/remap them on workspace changes
|
// change
|
||||||
if (! bw->isStuck() || bw->isNormal())
|
if (! bw->isStuck())
|
||||||
bw->withdraw();
|
bw->withdraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue