fixes to make sticky windows work better. they appear in all workspace lists, they get focus when switching workspaces properly, their workspace menus show their focus properly.
This commit is contained in:
parent
3816b6a257
commit
5ec63388b8
4 changed files with 85 additions and 43 deletions
|
@ -1516,6 +1516,8 @@ void BScreen::reassociateWindow(BlackboxWindow *w, unsigned int wkspc_id,
|
||||||
removeIcon(w);
|
removeIcon(w);
|
||||||
getWorkspace(wkspc_id)->addWindow(w);
|
getWorkspace(wkspc_id)->addWindow(w);
|
||||||
} else if (ignore_sticky || ! w->isStuck()) {
|
} else if (ignore_sticky || ! w->isStuck()) {
|
||||||
|
if (w->isStuck())
|
||||||
|
w->stick();
|
||||||
getWorkspace(w->getWorkspaceNumber())->removeWindow(w);
|
getWorkspace(w->getWorkspaceNumber())->removeWindow(w);
|
||||||
getWorkspace(wkspc_id)->addWindow(w);
|
getWorkspace(wkspc_id)->addWindow(w);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1963,6 +1963,10 @@ void BlackboxWindow::stick(void) {
|
||||||
blackbox_attrib.flags ^= AttribOmnipresent;
|
blackbox_attrib.flags ^= AttribOmnipresent;
|
||||||
blackbox_attrib.attrib ^= AttribOmnipresent;
|
blackbox_attrib.attrib ^= AttribOmnipresent;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < screen->getNumberOfWorkspaces(); ++i)
|
||||||
|
if (i != blackbox_attrib.workspace)
|
||||||
|
screen->getWorkspace(i)->removeWindow(this, True);
|
||||||
|
|
||||||
flags.stuck = False;
|
flags.stuck = False;
|
||||||
|
|
||||||
if (! flags.iconic)
|
if (! flags.iconic)
|
||||||
|
@ -1972,11 +1976,6 @@ void BlackboxWindow::stick(void) {
|
||||||
xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal,
|
xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal,
|
||||||
blackbox_attrib.workspace);
|
blackbox_attrib.workspace);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < screen->getNumberOfWorkspaces(); ++i)
|
|
||||||
if (i != blackbox_attrib.workspace)
|
|
||||||
if (screen->getWorkspace(i)->getLastFocusedWindow() == this)
|
|
||||||
screen->getWorkspace(i)->focusFallback(this);
|
|
||||||
|
|
||||||
setState(current_state);
|
setState(current_state);
|
||||||
} else {
|
} else {
|
||||||
flags.stuck = True;
|
flags.stuck = True;
|
||||||
|
@ -1989,6 +1988,10 @@ void BlackboxWindow::stick(void) {
|
||||||
xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal,
|
xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal,
|
||||||
0xffffffff);
|
0xffffffff);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < screen->getNumberOfWorkspaces(); ++i)
|
||||||
|
if (i != blackbox_attrib.workspace)
|
||||||
|
screen->getWorkspace(i)->addWindow(this, False, True);
|
||||||
|
|
||||||
setState(current_state);
|
setState(current_state);
|
||||||
}
|
}
|
||||||
// go up the chain
|
// go up the chain
|
||||||
|
@ -2102,9 +2105,11 @@ void BlackboxWindow::setFocusFlag(bool focus) {
|
||||||
|
|
||||||
if (! flags.iconic) {
|
if (! flags.iconic) {
|
||||||
// iconic windows arent in a workspace menu!
|
// iconic windows arent in a workspace menu!
|
||||||
Clientmenu *menu =
|
if (flags.stuck)
|
||||||
screen->getWorkspace(blackbox_attrib.workspace)->getMenu();
|
screen->getCurrentWorkspace()->setFocused(this, isFocused());
|
||||||
menu->setItemSelected(window_number, isFocused());
|
else
|
||||||
|
screen->getWorkspace(blackbox_attrib.workspace)->
|
||||||
|
setFocused(this, flags.focused);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,26 +78,40 @@ Workspace::Workspace(BScreen *scrn, unsigned int i) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Workspace::addWindow(BlackboxWindow *w, bool place) {
|
void Workspace::addWindow(BlackboxWindow *w, bool place, bool sticky) {
|
||||||
assert(w != 0);
|
assert(w != 0);
|
||||||
|
|
||||||
if (place) placeWindow(w);
|
if (place) placeWindow(w);
|
||||||
|
|
||||||
stackingList.push_front(w);
|
stackingList.push_front(w);
|
||||||
|
|
||||||
|
// if the window is sticky, then it needs to be added on all other
|
||||||
|
// workspaces too!
|
||||||
|
if (! sticky && w->isStuck()) {
|
||||||
|
for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i)
|
||||||
|
if (i != id)
|
||||||
|
screen->getWorkspace(i)->addWindow(w, place, True);
|
||||||
|
}
|
||||||
|
|
||||||
if (w->isNormal()) {
|
if (w->isNormal()) {
|
||||||
|
if (! sticky) {
|
||||||
w->setWorkspace(id);
|
w->setWorkspace(id);
|
||||||
w->setWindowNumber(windowList.size());
|
w->setWindowNumber(windowList.size());
|
||||||
|
}
|
||||||
|
|
||||||
windowList.push_back(w);
|
windowList.push_back(w);
|
||||||
|
|
||||||
clientmenu->insert(w->getTitle());
|
clientmenu->insert(w->getTitle());
|
||||||
clientmenu->update();
|
clientmenu->update();
|
||||||
|
|
||||||
|
if (! sticky)
|
||||||
screen->updateNetizenWindowAdd(w->getClientWindow(), id);
|
screen->updateNetizenWindowAdd(w->getClientWindow(), id);
|
||||||
|
|
||||||
if (id != screen->getCurrentWorkspaceID() &&
|
if (screen->doFocusNew() || (w->isTransient() && w->getTransientFor() &&
|
||||||
screen->doFocusNew()) {
|
w->getTransientFor()->isFocused())) {
|
||||||
|
if (id == screen->getCurrentWorkspaceID())
|
||||||
|
w->setInputFocus();
|
||||||
|
else {
|
||||||
/*
|
/*
|
||||||
not on the focused workspace, so the window is not going to get focus
|
not on the focused workspace, so the window is not going to get focus
|
||||||
but if the user wants new windows focused, then it should get focus
|
but if the user wants new windows focused, then it should get focus
|
||||||
|
@ -106,6 +120,7 @@ void Workspace::addWindow(BlackboxWindow *w, bool place) {
|
||||||
lastfocus = w;
|
lastfocus = w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (! w->isDesktop())
|
if (! w->isDesktop())
|
||||||
raiseWindow(w);
|
raiseWindow(w);
|
||||||
|
@ -114,7 +129,7 @@ void Workspace::addWindow(BlackboxWindow *w, bool place) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Workspace::removeWindow(BlackboxWindow *w) {
|
void Workspace::removeWindow(BlackboxWindow *w, bool sticky) {
|
||||||
assert(w != 0);
|
assert(w != 0);
|
||||||
|
|
||||||
stackingList.remove(w);
|
stackingList.remove(w);
|
||||||
|
@ -123,22 +138,30 @@ void Workspace::removeWindow(BlackboxWindow *w) {
|
||||||
if ((w->isFocused() || w == lastfocus) &&
|
if ((w->isFocused() || w == lastfocus) &&
|
||||||
! screen->getBlackbox()->doShutdown()) {
|
! screen->getBlackbox()->doShutdown()) {
|
||||||
focusFallback(w);
|
focusFallback(w);
|
||||||
|
}
|
||||||
|
|
||||||
// if the window is sticky, then it needs to be removed on all other
|
// if the window is sticky, then it needs to be removed on all other
|
||||||
// workspaces too!
|
// workspaces too!
|
||||||
if (w->isStuck()) {
|
if (! sticky && w->isStuck()) {
|
||||||
for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i)
|
for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i)
|
||||||
if (i != id)
|
if (i != id)
|
||||||
screen->getWorkspace(i)->focusFallback(w);
|
screen->getWorkspace(i)->removeWindow(w, True);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! w->isNormal()) return;
|
if (! w->isNormal()) return;
|
||||||
|
|
||||||
windowList.remove(w);
|
BlackboxWindowList::iterator it, end = windowList.end();
|
||||||
clientmenu->remove(w->getWindowNumber());
|
int i;
|
||||||
|
for (i = 0, it = windowList.begin(); it != end; ++it, ++i)
|
||||||
|
if (*it == w)
|
||||||
|
break;
|
||||||
|
assert(it != end);
|
||||||
|
|
||||||
|
windowList.erase(it);
|
||||||
|
clientmenu->remove(i);
|
||||||
clientmenu->update();
|
clientmenu->update();
|
||||||
|
|
||||||
|
if (! sticky) {
|
||||||
screen->updateNetizenWindowDel(w->getClientWindow());
|
screen->updateNetizenWindowDel(w->getClientWindow());
|
||||||
|
|
||||||
BlackboxWindowList::iterator it = windowList.begin();
|
BlackboxWindowList::iterator it = windowList.begin();
|
||||||
|
@ -146,6 +169,7 @@ void Workspace::removeWindow(BlackboxWindow *w) {
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
for (; it != end; ++it, ++i)
|
for (; it != end; ++it, ++i)
|
||||||
(*it)->setWindowNumber(i);
|
(*it)->setWindowNumber(i);
|
||||||
|
}
|
||||||
|
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
cascade_x = cascade_y = 0;
|
cascade_x = cascade_y = 0;
|
||||||
|
@ -201,12 +225,23 @@ void Workspace::focusFallback(const BlackboxWindow *old_window) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Workspace::setFocused(const BlackboxWindow *w, bool focused) {
|
||||||
|
BlackboxWindowList::iterator it, end = windowList.end();
|
||||||
|
int i;
|
||||||
|
for (i = 0, it = windowList.begin(); it != end; ++it, ++i)
|
||||||
|
if (*it == w)
|
||||||
|
break;
|
||||||
|
assert(it != end);
|
||||||
|
|
||||||
|
clientmenu->setItemSelected(i, focused);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Workspace::showAll(void) {
|
void Workspace::showAll(void) {
|
||||||
BlackboxWindowList::iterator it = stackingList.begin();
|
BlackboxWindowList::iterator it = stackingList.begin();
|
||||||
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;
|
||||||
if (! bw->isStuck())
|
|
||||||
bw->show();
|
bw->show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -220,7 +255,6 @@ void Workspace::hideAll(void) {
|
||||||
BlackboxWindow *bw = *it;
|
BlackboxWindow *bw = *it;
|
||||||
++it; // withdraw removes the current item from the list so we need the next
|
++it; // withdraw removes the current item from the list so we need the next
|
||||||
// iterator before that happens
|
// iterator before that happens
|
||||||
if (! bw->isStuck())
|
|
||||||
bw->withdraw();
|
bw->withdraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,12 +91,13 @@ public:
|
||||||
BlackboxWindow* getTopWindowOnStack(void) const;
|
BlackboxWindow* getTopWindowOnStack(void) const;
|
||||||
void sendWindowList(Netizen &n);
|
void sendWindowList(Netizen &n);
|
||||||
void focusFallback(const BlackboxWindow *old_window);
|
void focusFallback(const BlackboxWindow *old_window);
|
||||||
|
void setFocused(const BlackboxWindow *w, bool focused);
|
||||||
|
|
||||||
bool isCurrent(void) const;
|
bool isCurrent(void) const;
|
||||||
bool isLastWindow(const BlackboxWindow* w) const;
|
bool isLastWindow(const BlackboxWindow* w) const;
|
||||||
|
|
||||||
void addWindow(BlackboxWindow *w, bool place = False);
|
void addWindow(BlackboxWindow *w, bool place = False, bool sticky = False);
|
||||||
void removeWindow(BlackboxWindow *w);
|
void removeWindow(BlackboxWindow *w, bool sticky = False);
|
||||||
unsigned int getCount(void) const;
|
unsigned int getCount(void) const;
|
||||||
void appendStackOrder(BlackboxWindowList &stack_order) const;
|
void appendStackOrder(BlackboxWindowList &stack_order) const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue