raise and lower transient stacks and minor identation
This commit is contained in:
parent
fb83f64a32
commit
1cdc741cc4
1 changed files with 123 additions and 91 deletions
214
src/Workspace.cc
214
src/Workspace.cc
|
@ -22,7 +22,7 @@
|
|||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
// $Id: Workspace.cc,v 1.26 2002/08/31 10:40:50 fluxgen Exp $
|
||||
// $Id: Workspace.cc,v 1.27 2002/09/08 19:38:48 fluxgen Exp $
|
||||
|
||||
#include "Workspace.hh"
|
||||
|
||||
|
@ -55,6 +55,23 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
namespace { // anonymous
|
||||
|
||||
int countTransients(const FluxboxWindow &win) {
|
||||
if (win.getTransients().size() == 0)
|
||||
return 0;
|
||||
// now go throu the entire tree and count transients
|
||||
size_t ret = win.getTransients().size();
|
||||
std::list<FluxboxWindow *>::const_iterator it = win.getTransients().begin();
|
||||
std::list<FluxboxWindow *>::const_iterator it_end = win.getTransients().end();
|
||||
for (; it != it_end; ++it)
|
||||
ret += countTransients(*(*it));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
Workspace::GroupList Workspace::m_groups;
|
||||
|
||||
Workspace::Workspace(BScreen *scrn, unsigned int i):
|
||||
|
@ -76,7 +93,7 @@ Workspace::~Workspace() {
|
|||
|
||||
|
||||
int Workspace::addWindow(FluxboxWindow *w, bool place) {
|
||||
if (! w)
|
||||
if (w == 0)
|
||||
return -1;
|
||||
|
||||
if (place)
|
||||
|
@ -129,7 +146,7 @@ int Workspace::addWindow(FluxboxWindow *w, bool place) {
|
|||
|
||||
|
||||
int Workspace::removeWindow(FluxboxWindow *w) {
|
||||
if (! w)
|
||||
if (w == 0)
|
||||
return -1;
|
||||
|
||||
stackingList.remove(w);
|
||||
|
@ -193,7 +210,11 @@ void Workspace::showAll(void) {
|
|||
WindowStack::iterator it = stackingList.begin();
|
||||
WindowStack::iterator it_end = stackingList.end();
|
||||
for (; it != it_end; ++it) {
|
||||
(*it)->deiconify(False, False);
|
||||
if ((*it) == 0) {
|
||||
stackingList.erase(it);
|
||||
} else {
|
||||
(*it)->deiconify(False, False);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -218,52 +239,28 @@ void Workspace::removeAll(void) {
|
|||
|
||||
|
||||
void Workspace::raiseWindow(FluxboxWindow *w) {
|
||||
FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w;
|
||||
FluxboxWindow *win = w;
|
||||
|
||||
while (bottom->isTransient() && bottom->getTransientFor() &&
|
||||
bottom->getTransientFor() != bottom) { //prevent infinite loop
|
||||
#ifdef DEBUG
|
||||
assert(bottom != bottom->getTransientFor());
|
||||
#endif // DEBUG
|
||||
bottom = bottom->getTransientFor();
|
||||
|
||||
}
|
||||
while (win->isTransient() && win->getTransientFor())
|
||||
win = win->getTransientFor();
|
||||
|
||||
int i = 1 + countTransients(*win);
|
||||
|
||||
int i = 1;
|
||||
win = bottom;
|
||||
while (win->hasTransient() && win->getTransient() &&
|
||||
win->getTransient() != win) {//prevent infinite loop
|
||||
#ifdef DEBUG
|
||||
assert(win != win->getTransient());
|
||||
#endif // DEBUG
|
||||
win = win->getTransient();
|
||||
i++;
|
||||
}
|
||||
Stack nstack(i);
|
||||
Stack::iterator stackit = nstack.begin();
|
||||
|
||||
*(stackit++) = win->getFrameWindow();
|
||||
screen->updateNetizenWindowRaise(win->getClientWindow());
|
||||
if (! win->isIconic()) {
|
||||
Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber());
|
||||
wkspc->stackingList.remove(win);
|
||||
wkspc->stackingList.push_front(win);
|
||||
}
|
||||
|
||||
raiseAndFillStack(stackit, *win);
|
||||
|
||||
Window *nstack = new Window[i], *curr = nstack;
|
||||
Workspace *wkspc;
|
||||
|
||||
win = bottom;
|
||||
while (1) {
|
||||
*(curr++) = win->getFrameWindow();
|
||||
screen->updateNetizenWindowRaise(win->getClientWindow());
|
||||
|
||||
if (! win->isIconic()) {
|
||||
wkspc = screen->getWorkspace(win->getWorkspaceNumber());
|
||||
wkspc->stackingList.remove(win);
|
||||
wkspc->stackingList.push_front(win);
|
||||
}
|
||||
|
||||
if (! win->hasTransient() || ! win->getTransient() ||
|
||||
win->getTransient() == win) //prevent infinite loop
|
||||
break;
|
||||
|
||||
win = win->getTransient();
|
||||
}
|
||||
|
||||
screen->raiseWindows(nstack, i);
|
||||
|
||||
delete [] nstack;
|
||||
screen->raiseWindows(nstack);
|
||||
|
||||
}
|
||||
|
||||
void Workspace::lowerWindow(FluxboxWindow *w) {
|
||||
|
@ -273,43 +270,24 @@ void Workspace::lowerWindow(FluxboxWindow *w) {
|
|||
&& bottom->getTransientFor() != bottom) //prevent infinite loop
|
||||
bottom = bottom->getTransientFor();
|
||||
|
||||
int i = 1;
|
||||
int i = 1 + countTransients(*w);
|
||||
win = bottom;
|
||||
while (win->hasTransient() && win->getTransient() &&
|
||||
win->getTransient() != win) { //prevent infinite loop
|
||||
win = win->getTransient();
|
||||
|
||||
i++;
|
||||
Stack st(i);
|
||||
Stack::iterator stackit = st.begin();
|
||||
lowerAndFillStack(stackit, *win);
|
||||
(*stackit) = win->getFrameWindow();
|
||||
|
||||
screen->updateNetizenWindowLower(win->getClientWindow());
|
||||
if (! win->isIconic()) {
|
||||
Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber());
|
||||
wkspc->stackingList.remove(win);
|
||||
wkspc->stackingList.push_back(win);
|
||||
}
|
||||
|
||||
Window *nstack = new Window[i], *curr = nstack;
|
||||
Workspace *wkspc;
|
||||
XLowerWindow(BaseDisplay::getXDisplay(), st.front());
|
||||
XRestackWindows(BaseDisplay::getXDisplay(), &st[0], st.size());
|
||||
|
||||
while (True) {
|
||||
*(curr++) = win->getFrameWindow();
|
||||
screen->updateNetizenWindowLower(win->getClientWindow());
|
||||
|
||||
if (! win->isIconic()) {
|
||||
wkspc = screen->getWorkspace(win->getWorkspaceNumber());
|
||||
wkspc->stackingList.remove(win);
|
||||
wkspc->stackingList.push_back(win);
|
||||
}
|
||||
|
||||
if (! win->getTransientFor() ||
|
||||
win->getTransientFor() == win)//prevent infinite loop
|
||||
break;
|
||||
|
||||
win = win->getTransientFor();
|
||||
}
|
||||
|
||||
Fluxbox::instance()->grab();
|
||||
|
||||
XLowerWindow(screen->getBaseDisplay()->getXDisplay(), *nstack);
|
||||
XRestackWindows(screen->getBaseDisplay()->getXDisplay(), nstack, i);
|
||||
|
||||
Fluxbox::instance()->ungrab();
|
||||
|
||||
delete [] nstack;
|
||||
}
|
||||
|
||||
|
||||
|
@ -583,19 +561,21 @@ void Workspace::placeWindow(FluxboxWindow *win) {
|
|||
if ((*it)->hasTab()) {
|
||||
if (! (*it)->isShaded()) { // not shaded window
|
||||
switch(screen->getTabPlacement()) {
|
||||
case Tab::PTOP:
|
||||
curr_y -= screen->getTabHeight();
|
||||
case Tab::PBOTTOM:
|
||||
curr_h += screen->getTabHeight();
|
||||
case Tab::PTOP:
|
||||
curr_y -= screen->getTabHeight();
|
||||
case Tab::PBOTTOM:
|
||||
curr_h += screen->getTabHeight();
|
||||
break;
|
||||
case Tab::PLEFT:
|
||||
curr_x -= (screen->isTabRotateVertical())
|
||||
? screen->getTabHeight()
|
||||
: screen->getTabWidth();
|
||||
case Tab::PRIGHT:
|
||||
curr_w += (screen->isTabRotateVertical())
|
||||
? screen->getTabHeight()
|
||||
: screen->getTabWidth();
|
||||
case Tab::PLEFT:
|
||||
curr_x -= (screen->isTabRotateVertical())
|
||||
? screen->getTabHeight()
|
||||
: screen->getTabWidth();
|
||||
case Tab::PRIGHT:
|
||||
curr_w += (screen->isTabRotateVertical())
|
||||
? screen->getTabHeight()
|
||||
: screen->getTabWidth();
|
||||
break;
|
||||
case Tab::PNONE:
|
||||
break;
|
||||
}
|
||||
} else { // shaded window
|
||||
|
@ -809,3 +789,55 @@ void Workspace::placeWindow(FluxboxWindow *win) {
|
|||
|
||||
win->configure(place_x, place_y, win->getWidth(), win->getHeight());
|
||||
}
|
||||
|
||||
|
||||
void Workspace::raiseAndFillStack(Stack::iterator &stackit, const FluxboxWindow &w) {
|
||||
if (w.getTransients().empty())
|
||||
return;
|
||||
|
||||
std::list<FluxboxWindow *>::const_iterator it = w.getTransients().begin();
|
||||
std::list<FluxboxWindow *>::const_iterator it_end = w.getTransients().end();
|
||||
for (; it != it_end; ++it) {
|
||||
*stackit++ = (*it)->getFrameWindow();
|
||||
|
||||
screen->updateNetizenWindowRaise((*it)->getClientWindow());
|
||||
|
||||
if (! (*it)->isIconic()) {
|
||||
Workspace *wkspc = screen->getWorkspace((*it)->getWorkspaceNumber());
|
||||
wkspc->stackingList.remove((*it));
|
||||
wkspc->stackingList.push_front((*it));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
it = w.getTransients().begin();
|
||||
for (; it != it_end; ++it)
|
||||
raiseAndFillStack(stackit, *(*it));
|
||||
|
||||
|
||||
}
|
||||
|
||||
void Workspace::lowerAndFillStack(Stack::iterator &stackit, const FluxboxWindow &win) {
|
||||
if (win.getTransients().empty()) // nothing to lower and stack
|
||||
return;
|
||||
|
||||
std::list<FluxboxWindow *>::const_reverse_iterator it = win.getTransients().rbegin();
|
||||
std::list<FluxboxWindow *>::const_reverse_iterator it_end = win.getTransients().rend();
|
||||
for (; it != it_end; ++it)
|
||||
lowerAndFillStack(stackit, *(*it));
|
||||
|
||||
it = win.getTransients().rbegin();
|
||||
|
||||
for (; it != it_end; ++it) {
|
||||
(*stackit) = (*it)->getFrameWindow();
|
||||
++stackit;
|
||||
screen->updateNetizenWindowLower((*it)->getClientWindow());
|
||||
if (! (*it)->isIconic()) {
|
||||
Workspace *wkspc = screen->getWorkspace((*it)->getWorkspaceNumber());
|
||||
wkspc->stackingList.remove((*it));
|
||||
wkspc->stackingList.push_back((*it));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue