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,7 +1232,9 @@ void BScreen::changeWorkspaceID(unsigned int id) {
|
|||
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
|
||||
// to be unmapped
|
||||
if (focused && ! focused->isStuck())
|
||||
blackbox->setFocusedWindow((BlackboxWindow *) 0);
|
||||
|
||||
current_workspace->hideAll();
|
||||
|
@ -1248,11 +1250,31 @@ void BScreen::changeWorkspaceID(unsigned int id) {
|
|||
|
||||
current_workspace->showAll();
|
||||
|
||||
if (resource.focus_last && current_workspace->getLastFocusedWindow()) {
|
||||
int x, y, rx, ry;
|
||||
Window c, r;
|
||||
unsigned int m;
|
||||
BlackboxWindow *win = (BlackboxWindow *) 0;
|
||||
bool f = False;
|
||||
|
||||
XSync(blackbox->getXDisplay(), False);
|
||||
current_workspace->getLastFocusedWindow()->setInputFocus();
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue