Lines 57-58
Link Here
|
57 |
|
57 |
|
|
|
58 |
namespace { // anonymous |
59 |
|
60 |
int countTransients(const FluxboxWindow &win) { |
61 |
if (win.getTransients().size() == 0) |
62 |
return 0; |
63 |
// now go throu the entire tree and count transients |
64 |
size_t ret = win.getTransients().size(); |
65 |
std::list<FluxboxWindow *>::const_iterator it = win.getTransients().begin(); |
66 |
std::list<FluxboxWindow *>::const_iterator it_end = win.getTransients().end(); |
67 |
for (; it != it_end; ++it) |
68 |
ret += countTransients(*(*it)); |
69 |
|
70 |
return ret; |
71 |
} |
72 |
|
73 |
}; |
74 |
|
58 |
Workspace::GroupList Workspace::m_groups; |
75 |
Workspace::GroupList Workspace::m_groups; |
Lines 220-267
Link Here
|
220 |
void Workspace::raiseWindow(FluxboxWindow *w) { |
237 |
void Workspace::raiseWindow(FluxboxWindow *w) { |
221 |
FluxboxWindow *win = (FluxboxWindow *) 0, *bottom = w; |
238 |
FluxboxWindow *win = w; |
222 |
|
|
|
223 |
while (bottom->isTransient() && bottom->getTransientFor() && |
224 |
bottom->getTransientFor() != bottom) { //prevent infinite loop |
225 |
#ifdef DEBUG |
226 |
assert(bottom != bottom->getTransientFor()); |
227 |
#endif // DEBUG |
228 |
bottom = bottom->getTransientFor(); |
229 |
|
230 |
} |
231 |
|
232 |
int i = 1; |
233 |
win = bottom; |
234 |
while (win->hasTransient() && win->getTransient() && |
235 |
win->getTransient() != win) {//prevent infinite loop |
236 |
#ifdef DEBUG |
237 |
assert(win != win->getTransient()); |
238 |
#endif // DEBUG |
239 |
win = win->getTransient(); |
240 |
i++; |
241 |
} |
242 |
|
243 |
Window *nstack = new Window[i], *curr = nstack; |
244 |
Workspace *wkspc; |
245 |
|
239 |
|
246 |
win = bottom; |
240 |
while (win->isTransient() && win->getTransientFor()) |
247 |
while (1) { |
241 |
win = win->getTransientFor(); |
248 |
*(curr++) = win->getFrameWindow(); |
242 |
|
249 |
screen->updateNetizenWindowRaise(win->getClientWindow()); |
243 |
int i = 1 + countTransients(*win); |
250 |
|
|
|
251 |
if (! win->isIconic()) { |
252 |
wkspc = screen->getWorkspace(win->getWorkspaceNumber()); |
253 |
wkspc->stackingList.remove(win); |
254 |
wkspc->stackingList.push_front(win); |
255 |
} |
256 |
|
257 |
if (! win->hasTransient() || ! win->getTransient() || |
258 |
win->getTransient() == win) //prevent infinite loop |
259 |
break; |
260 |
|
261 |
win = win->getTransient(); |
262 |
} |
263 |
|
244 |
|
264 |
screen->raiseWindows(nstack, i); |
245 |
Stack nstack(i); |
|
|
246 |
Stack::iterator stackit = nstack.begin(); |
247 |
|
248 |
*(stackit++) = win->getFrameWindow(); |
249 |
screen->updateNetizenWindowRaise(win->getClientWindow()); |
250 |
if (! win->isIconic()) { |
251 |
Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber()); |
252 |
wkspc->stackingList.remove(win); |
253 |
wkspc->stackingList.push_front(win); |
254 |
} |
255 |
|
256 |
raiseAndFillStack(stackit, *win); |
265 |
|
257 |
|
266 |
delete [] nstack; |
258 |
screen->raiseWindows(nstack); |
267 |
} |
259 |
} |
Lines 275-313
Link Here
|
275 |
|
267 |
|
276 |
int i = 1; |
|
|
277 |
win = bottom; |
268 |
win = bottom; |
278 |
while (win->hasTransient() && win->getTransient() && |
269 |
int i = 1 + countTransients(*w); |
279 |
win->getTransient() != win) { //prevent infinite loop |
|
|
280 |
win = win->getTransient(); |
281 |
|
282 |
i++; |
283 |
} |
284 |
|
285 |
Window *nstack = new Window[i], *curr = nstack; |
286 |
Workspace *wkspc; |
287 |
|
288 |
while (True) { |
289 |
*(curr++) = win->getFrameWindow(); |
290 |
screen->updateNetizenWindowLower(win->getClientWindow()); |
291 |
|
292 |
if (! win->isIconic()) { |
293 |
wkspc = screen->getWorkspace(win->getWorkspaceNumber()); |
294 |
wkspc->stackingList.remove(win); |
295 |
wkspc->stackingList.push_back(win); |
296 |
} |
297 |
|
298 |
if (! win->getTransientFor() || |
299 |
win->getTransientFor() == win)//prevent infinite loop |
300 |
break; |
301 |
|
270 |
|
302 |
win = win->getTransientFor(); |
271 |
Stack st(i); |
|
|
272 |
Stack::iterator stackit = st.begin(); |
273 |
lowerAndFillStack(stackit, *win); |
274 |
(*stackit) = win->getFrameWindow(); |
275 |
|
276 |
screen->updateNetizenWindowLower(win->getClientWindow()); |
277 |
if (! win->isIconic()) { |
278 |
Workspace *wkspc = screen->getWorkspace(win->getWorkspaceNumber()); |
279 |
wkspc->stackingList.remove(win); |
280 |
wkspc->stackingList.push_back(win); |
303 |
} |
281 |
} |
304 |
|
282 |
|
305 |
Fluxbox::instance()->grab(); |
283 |
XLowerWindow(BaseDisplay::getXDisplay(), st.front()); |
|
|
284 |
XRestackWindows(BaseDisplay::getXDisplay(), &st[0], st.size()); |
306 |
|
285 |
|
307 |
XLowerWindow(screen->getBaseDisplay()->getXDisplay(), *nstack); |
|
|
308 |
XRestackWindows(screen->getBaseDisplay()->getXDisplay(), nstack, i); |
309 |
|
310 |
Fluxbox::instance()->ungrab(); |
311 |
|
312 |
delete [] nstack; |
313 |
} |
286 |
} |
Lines 810-811
Link Here
|
810 |
win->configure(place_x, place_y, win->getWidth(), win->getHeight()); |
783 |
win->configure(place_x, place_y, win->getWidth(), win->getHeight()); |
|
|
784 |
} |
785 |
|
786 |
|
787 |
void Workspace::raiseAndFillStack(Stack::iterator &stackit, const FluxboxWindow &w) { |
788 |
if (w.getTransients().empty()) |
789 |
return; |
790 |
|
791 |
std::list<FluxboxWindow *>::const_iterator it = w.getTransients().begin(); |
792 |
std::list<FluxboxWindow *>::const_iterator it_end = w.getTransients().end(); |
793 |
for (; it != it_end; ++it) { |
794 |
*stackit++ = (*it)->getFrameWindow(); |
795 |
|
796 |
screen->updateNetizenWindowRaise((*it)->getClientWindow()); |
797 |
|
798 |
if (! (*it)->isIconic()) { |
799 |
Workspace *wkspc = screen->getWorkspace((*it)->getWorkspaceNumber()); |
800 |
wkspc->stackingList.remove((*it)); |
801 |
wkspc->stackingList.push_front((*it)); |
802 |
} |
803 |
|
804 |
|
805 |
} |
806 |
|
807 |
it = w.getTransients().begin(); |
808 |
for (; it != it_end; ++it) |
809 |
raiseAndFillStack(stackit, *(*it)); |
810 |
|
811 |
|
812 |
} |
813 |
|
814 |
void Workspace::lowerAndFillStack(Stack::iterator &stackit, const FluxboxWindow &win) { |
815 |
if (win.getTransients().empty()) // nothing to lower and stack |
816 |
return; |
817 |
|
818 |
std::list<FluxboxWindow *>::const_reverse_iterator it = win.getTransients().rbegin(); |
819 |
std::list<FluxboxWindow *>::const_reverse_iterator it_end = win.getTransients().rend(); |
820 |
for (; it != it_end; ++it) |
821 |
lowerAndFillStack(stackit, *(*it)); |
822 |
|
823 |
it = win.getTransients().rbegin(); |
824 |
|
825 |
for (; it != it_end; ++it) { |
826 |
(*stackit) = (*it)->getFrameWindow(); |
827 |
++stackit; |
828 |
screen->updateNetizenWindowLower((*it)->getClientWindow()); |
829 |
if (! (*it)->isIconic()) { |
830 |
Workspace *wkspc = screen->getWorkspace((*it)->getWorkspaceNumber()); |
831 |
wkspc->stackingList.remove((*it)); |
832 |
wkspc->stackingList.push_back((*it)); |
833 |
} |
834 |
} |
835 |
|
811 |
} |
836 |
} |