all repos — openbox @ 5ec63388b8fbbdffc0999ba727ad718f87d683fc

openbox fork - make it a bit more like ryudo

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.
Dana Jansens danakj@orodu.net
commit

5ec63388b8fbbdffc0999ba727ad718f87d683fc

parent

3816b6a25701983efc92dcadb04937006e4506cf

4 files changed, 85 insertions(+), 43 deletions(-)

jump to
M src/Screen.ccsrc/Screen.cc

@@ -1516,6 +1516,8 @@ if (w->isIconic()) {

removeIcon(w); getWorkspace(wkspc_id)->addWindow(w); } else if (ignore_sticky || ! w->isStuck()) { + if (w->isStuck()) + w->stick(); getWorkspace(w->getWorkspaceNumber())->removeWindow(w); getWorkspace(wkspc_id)->addWindow(w); }
M src/Window.ccsrc/Window.cc

@@ -1963,6 +1963,10 @@ if (flags.stuck) {

blackbox_attrib.flags ^= 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; if (! flags.iconic)

@@ -1972,11 +1976,6 @@ // actually hold in our data.

xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal, 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); } else { flags.stuck = True;

@@ -1988,6 +1987,10 @@ // temporary fix since sticky windows suck. set the hint to a different

// value than that contained in the class' data. xatom->setValue(client.window, XAtom::net_wm_desktop, XAtom::cardinal, 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); }

@@ -2102,9 +2105,11 @@ blackbox->setFocusedWindow(this);

if (! flags.iconic) { // iconic windows arent in a workspace menu! - Clientmenu *menu = - screen->getWorkspace(blackbox_attrib.workspace)->getMenu(); - menu->setItemSelected(window_number, isFocused()); + if (flags.stuck) + screen->getCurrentWorkspace()->setFocused(this, isFocused()); + else + screen->getWorkspace(blackbox_attrib.workspace)-> + setFocused(this, flags.focused); } }
M src/Workspace.ccsrc/Workspace.cc

@@ -78,32 +78,47 @@ readName();

} -void Workspace::addWindow(BlackboxWindow *w, bool place) { +void Workspace::addWindow(BlackboxWindow *w, bool place, bool sticky) { assert(w != 0); if (place) placeWindow(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()) { - w->setWorkspace(id); - w->setWindowNumber(windowList.size()); + if (! sticky) { + w->setWorkspace(id); + w->setWindowNumber(windowList.size()); + } windowList.push_back(w); clientmenu->insert(w->getTitle()); clientmenu->update(); - screen->updateNetizenWindowAdd(w->getClientWindow(), id); + if (! sticky) + screen->updateNetizenWindowAdd(w->getClientWindow(), id); - if (id != screen->getCurrentWorkspaceID() && - screen->doFocusNew()) { - /* - 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 - when this workspace does become focused. - */ - lastfocus = w; + if (screen->doFocusNew() || (w->isTransient() && w->getTransientFor() && + w->getTransientFor()->isFocused())) { + if (id == screen->getCurrentWorkspaceID()) + w->setInputFocus(); + else { + /* + 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 + when this workspace does become focused. + */ + lastfocus = w; + } } }

@@ -114,7 +129,7 @@ lowerWindow(w);

} -void Workspace::removeWindow(BlackboxWindow *w) { +void Workspace::removeWindow(BlackboxWindow *w, bool sticky) { assert(w != 0); stackingList.remove(w);

@@ -123,29 +138,38 @@ // pass focus to the next appropriate window

if ((w->isFocused() || w == lastfocus) && ! screen->getBlackbox()->doShutdown()) { focusFallback(w); - - // if the window is sticky, then it needs to be removed on all other - // workspaces too! - if (w->isStuck()) { - for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i) - if (i != id) - screen->getWorkspace(i)->focusFallback(w); - } + } + + // if the window is sticky, then it needs to be removed on all other + // workspaces too! + if (! sticky && w->isStuck()) { + for (unsigned int i = 0; i < screen->getWorkspaceCount(); ++i) + if (i != id) + screen->getWorkspace(i)->removeWindow(w, True); } if (! w->isNormal()) return; - windowList.remove(w); - clientmenu->remove(w->getWindowNumber()); + 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); + + windowList.erase(it); + clientmenu->remove(i); clientmenu->update(); - screen->updateNetizenWindowDel(w->getClientWindow()); + if (! sticky) { + screen->updateNetizenWindowDel(w->getClientWindow()); - BlackboxWindowList::iterator it = windowList.begin(); - const BlackboxWindowList::iterator end = windowList.end(); - unsigned int i = 0; - for (; it != end; ++it, ++i) - (*it)->setWindowNumber(i); + BlackboxWindowList::iterator it = windowList.begin(); + const BlackboxWindowList::iterator end = windowList.end(); + unsigned int i = 0; + for (; it != end; ++it, ++i) + (*it)->setWindowNumber(i); + } if (i == 0) { cascade_x = cascade_y = 0;

@@ -201,13 +225,24 @@ }

} +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) { BlackboxWindowList::iterator it = stackingList.begin(); const BlackboxWindowList::iterator end = stackingList.end(); for (; it != end; ++it) { BlackboxWindow *bw = *it; - if (! bw->isStuck()) - bw->show(); + bw->show(); } }

@@ -220,8 +255,7 @@ while (it != end) {

BlackboxWindow *bw = *it; ++it; // withdraw removes the current item from the list so we need the next // iterator before that happens - if (! bw->isStuck()) - bw->withdraw(); + bw->withdraw(); } }
M src/Workspace.hhsrc/Workspace.hh

@@ -91,12 +91,13 @@ BlackboxWindow* getPrevWindowInList(BlackboxWindow *w);

BlackboxWindow* getTopWindowOnStack(void) const; void sendWindowList(Netizen &n); void focusFallback(const BlackboxWindow *old_window); + void setFocused(const BlackboxWindow *w, bool focused); bool isCurrent(void) const; bool isLastWindow(const BlackboxWindow* w) const; - void addWindow(BlackboxWindow *w, bool place = False); - void removeWindow(BlackboxWindow *w); + void addWindow(BlackboxWindow *w, bool place = False, bool sticky = False); + void removeWindow(BlackboxWindow *w, bool sticky = False); unsigned int getCount(void) const; void appendStackOrder(BlackboxWindowList &stack_order) const;