X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=26b48e42f0f139055b0359f08f0b0ccdfc31d928;hb=256bcbed81015bafe8f89340e5cab9114c91b930;hp=586adbadcf3f3fa99a2dd790757aa00e58a5cc86;hpb=5cf86b186c89ffb87f02ab732aa113ce8025dc2a;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index 586adbad..26b48e42 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -79,22 +79,28 @@ void Workspace::addWindow(BlackboxWindow *w, bool place) { if (place) placeWindow(w); - w->setWorkspace(id); - w->setWindowNumber(windowList.size()); - stackingList.push_front(w); - windowList.push_back(w); + + if (w->isNormal()) { + w->setWorkspace(id); + w->setWindowNumber(windowList.size()); - clientmenu->insert(w->getTitle()); - clientmenu->update(); + windowList.push_back(w); - screen->updateNetizenWindowAdd(w->getClientWindow(), id); + clientmenu->insert(w->getTitle()); + clientmenu->update(); - raiseWindow(w); + screen->updateNetizenWindowAdd(w->getClientWindow(), id); + } + + if (! w->isDesktop()) + raiseWindow(w); + else + lowerWindow(w); } -unsigned int Workspace::removeWindow(BlackboxWindow *w) { +void Workspace::removeWindow(BlackboxWindow *w) { assert(w != 0); stackingList.remove(w); @@ -113,6 +119,8 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) { } } + if (! w->isNormal()) return; + windowList.remove(w); clientmenu->remove(w->getWindowNumber()); clientmenu->update(); @@ -127,8 +135,6 @@ unsigned int Workspace::removeWindow(BlackboxWindow *w) { if (i == 0) cascade_x = cascade_y = 32; - - return i; } @@ -154,7 +160,7 @@ void Workspace::focusFallback(const BlackboxWindow *old_window) { end = stackingList.end(); for (; it != end; ++it) { BlackboxWindow *tmp = *it; - if (tmp && tmp->setInputFocus()) { + if (tmp && tmp->isNormal() && tmp->setInputFocus()) { // we found our new focus target newfocus = tmp; break; @@ -178,20 +184,24 @@ void Workspace::focusFallback(const BlackboxWindow *old_window) { void Workspace::showAll(void) { - std::for_each(stackingList.begin(), stackingList.end(), - std::mem_fun(&BlackboxWindow::show)); + BlackboxWindowList::iterator it = stackingList.begin(); + const BlackboxWindowList::iterator end = stackingList.end(); + for (; it != end; ++it) { + BlackboxWindow *bw = *it; + if (! bw->isStuck()) + bw->show(); + } } void Workspace::hideAll(void) { // withdraw in reverse order to minimize the number of Expose events - - BlackboxWindowList lst(stackingList.rbegin(), stackingList.rend()); - - BlackboxWindowList::iterator it = lst.begin(); - const BlackboxWindowList::iterator end = lst.end(); - for (; it != end; ++it) { + BlackboxWindowList::reverse_iterator it = stackingList.rbegin(); + const BlackboxWindowList::reverse_iterator end = stackingList.rend(); + 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(); } @@ -278,8 +288,10 @@ void Workspace::lowerTransients(const BlackboxWindow * const win, void Workspace::raiseWindow(BlackboxWindow *w) { BlackboxWindow *win = w; + if (win->isDesktop()) return; + // walk up the transient_for's to the window that is not a transient - while (win->isTransient()) { + while (win->isTransient() && ! win->isDesktop()) { if (! win->getTransientFor()) break; win = win->getTransientFor(); } @@ -293,7 +305,7 @@ void Workspace::raiseWindow(BlackboxWindow *w) { *(stack++) = win->getFrameWindow(); screen->updateNetizenWindowRaise(win->getClientWindow()); - if (! win->isIconic()) { + if (! (win->isIconic() || win->isDesktop())) { Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber()); wkspc->stackingList.remove(win); wkspc->stackingList.push_front(win); @@ -309,7 +321,7 @@ void Workspace::lowerWindow(BlackboxWindow *w) { BlackboxWindow *win = w; // walk up the transient_for's to the window that is not a transient - while (win->isTransient()) { + while (win->isTransient() && ! win->isDesktop()) { if (! win->getTransientFor()) break; win = win->getTransientFor(); } @@ -325,7 +337,7 @@ void Workspace::lowerWindow(BlackboxWindow *w) { *(stack++) = win->getFrameWindow(); screen->updateNetizenWindowLower(win->getClientWindow()); - if (! win->isIconic()) { + if (! (win->isIconic() || win->isDesktop())) { Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber()); wkspc->stackingList.remove(win); wkspc->stackingList.push_back(win); @@ -400,7 +412,8 @@ void Workspace::appendStackOrder(BlackboxWindowList &stack_order) const { BlackboxWindowList::const_reverse_iterator it = stackingList.rbegin(); const BlackboxWindowList::const_reverse_iterator end = stackingList.rend(); for (; it != end; ++it) - stack_order.push_back(*it); + if ((*it)->isNormal()) + stack_order.push_back(*it); } @@ -691,6 +704,7 @@ void Workspace::placeWindow(BlackboxWindow *win) { placed = smartPlacement(new_win, availableArea); break; case BScreen::UnderMousePlacement: + case BScreen::ClickMousePlacement: placed = underMousePlacement(new_win, availableArea); default: break; // handled below