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)
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;
// 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);
}
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);
}
}
}
-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 (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 (! sticky)
+ screen->updateNetizenWindowAdd(w->getClientWindow(), id);
+
+ 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;
+ }
}
}
}
-void Workspace::removeWindow(BlackboxWindow *w) {
+void Workspace::removeWindow(BlackboxWindow *w, bool sticky) {
assert(w != 0);
stackingList.remove(w);
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;
}
+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();
}
}
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();
}
}
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;