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:
Dana Jansens 2002-07-27 18:17:45 +00:00
parent 3816b6a257
commit 5ec63388b8
4 changed files with 85 additions and 43 deletions

View file

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

View file

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

View file

@ -78,32 +78,47 @@ 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()) {
w->setWorkspace(id); if (! sticky) {
w->setWindowNumber(windowList.size()); w->setWorkspace(id);
w->setWindowNumber(windowList.size());
}
windowList.push_back(w); windowList.push_back(w);
clientmenu->insert(w->getTitle()); clientmenu->insert(w->getTitle());
clientmenu->update(); clientmenu->update();
screen->updateNetizenWindowAdd(w->getClientWindow(), id); if (! sticky)
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())
not on the focused workspace, so the window is not going to get focus w->setInputFocus();
but if the user wants new windows focused, then it should get focus else {
when this workspace does become focused. /*
*/ not on the focused workspace, so the window is not going to get focus
lastfocus = w; but if the user wants new windows focused, then it should get focus
when this workspace does become focused.
*/
lastfocus = 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,29 +138,38 @@ 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();
screen->updateNetizenWindowDel(w->getClientWindow()); if (! sticky) {
screen->updateNetizenWindowDel(w->getClientWindow());
BlackboxWindowList::iterator it = windowList.begin(); BlackboxWindowList::iterator it = windowList.begin();
const BlackboxWindowList::iterator end = windowList.end(); const BlackboxWindowList::iterator end = windowList.end();
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,13 +225,24 @@ 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,8 +255,7 @@ 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();
} }
} }

View file

@ -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;