X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWorkspace.cc;h=4f84cfa7e306587dbae4deb72a9dd9ec39226c7c;hb=ea02ab8caeb7ddde971f4553ff3589e17d19421f;hp=ac8b9edbfeed442eb9de64e5de77fab688a3e656;hpb=270981e6d7b2c59efebb1ceb7cbb7c119b280df4;p=chaz%2Fopenbox diff --git a/src/Workspace.cc b/src/Workspace.cc index ac8b9edb..4f84cfa7 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -78,7 +78,7 @@ 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); if (place) placeWindow(w); @@ -86,24 +86,31 @@ void Workspace::addWindow(BlackboxWindow *w, bool place) { stackingList.push_front(w); 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; + } } } @@ -114,7 +121,7 @@ void Workspace::addWindow(BlackboxWindow *w, bool place) { } -void Workspace::removeWindow(BlackboxWindow *w) { +void Workspace::removeWindow(BlackboxWindow *w, bool sticky) { assert(w != 0); stackingList.remove(w); @@ -123,29 +130,30 @@ void Workspace::removeWindow(BlackboxWindow *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 (! 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,12 +209,27 @@ 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; + // if its == end, then a window thats not in the windowList + // got focused, such as a !isNormal() window. + if (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()) + // not normal windows cant focus from mouse enters anyways, so we dont + // need to unmap/remap them on workspace changes + if (! bw->isStuck() || bw->isNormal()) bw->show(); } } @@ -220,7 +243,9 @@ void Workspace::hideAll(void) { BlackboxWindow *bw = *it; ++it; // withdraw removes the current item from the list so we need the next // iterator before that happens - if (! bw->isStuck()) + // not normal windows cant focus from mouse enters anyways, so we dont + // need to unmap/remap them on workspace changes + if (! bw->isStuck() || bw->isNormal()) bw->withdraw(); } } @@ -615,8 +640,12 @@ bool Workspace::smartPlacement(Rect& win) { for (; wit != end; ++wit) { const BlackboxWindow* const curr = *wit; - if (curr->isShaded() && screen->getPlaceIgnoreShaded()) continue; - if (curr->isMaximizedFull() && screen->getPlaceIgnoreMaximized()) continue; + // watch for shaded windows and full-maxed windows + if (curr->isShaded()) { + if (screen->getPlaceIgnoreShaded()) continue; + } else if (curr->isMaximizedFull()) { + if (screen->getPlaceIgnoreMaximized()) continue; + } tmp.setRect(curr->frameRect().x(), curr->frameRect().y(), curr->frameRect().width() + screen->getBorderWidth(), @@ -681,7 +710,7 @@ bool Workspace::smartPlacement(Rect& win) { } -bool Workspace::underMousePlacement(Rect &win) const { +bool Workspace::underMousePlacement(Rect &win) { int x, y, rx, ry; Window c, r; unsigned int m; @@ -781,8 +810,10 @@ void Workspace::placeWindow(BlackboxWindow *win) { cascadePlacement(new_win, (win->getTitleHeight() + screen->getBorderWidth() * 2)); - // make sure the placement was valid - assert(screen->availableArea().contains(new_win)); + if (new_win.right() > screen->availableArea().right()) + new_win.setX(screen->availableArea().left()); + if (new_win.bottom() > screen->availableArea().bottom()) + new_win.setY(screen->availableArea().top()); win->configure(new_win.x(), new_win.y(), new_win.width(), new_win.height()); }