From 7794867005b9fe72e58af8c8d3c8cd36ad02c038 Mon Sep 17 00:00:00 2001 From: fluxgen Date: Wed, 14 Jul 2004 18:28:05 +0000 Subject: improved algoritm for transient_for in initWindows --- src/Screen.cc | 128 ++++++++++++++++++++++++++++------------------------------ 1 file changed, 62 insertions(+), 66 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 41f9ec5..ace87d9 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -22,7 +22,7 @@ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// $Id: Screen.cc,v 1.284 2004/07/14 12:13:29 fluxgen Exp $ +// $Id: Screen.cc,v 1.285 2004/07/14 18:28:05 fluxgen Exp $ #include "Screen.hh" @@ -436,26 +436,13 @@ void BScreen::initWindows() { Display *disp = FbTk::App::instance()->display(); XQueryTree(disp, rootWindow().window(), &r, &p, &children, &nchild); - // Count number of windows created and when this counter reaches zero - // we've created all windows. - // We need to do this because sometimes the transient windows are - // before the transient_for windows in the list and we need to - // postpone the creation of transient windows until the transient_for - // is created (see: WinClient::updateTransientInfo()) - // - // - Henrik - int created = nchild; // number of created/managed windows - Fluxbox *fluxbox = Fluxbox::instance(); // preen the window list of all icon windows... for better dockapp support for (int i = 0; i < (int) nchild; i++) { - if (children[i] == None) { - // we dont use this window, decrease counter - created--; + if (children[i] == None) continue; - } XWMHints *wmhints = XGetWMHints(disp, children[i]); @@ -464,6 +451,10 @@ void BScreen::initWindows() { (wmhints->icon_window != children[i])) for (int j = 0; j < (int) nchild; j++) { if (children[j] == wmhints->icon_window) { +#ifdef DEBUG + cerr<<"BScreen::initWindows(): children[j] = 0x"<validateWindow(children[i]))) - created--; } // manage shown windows - Window transient_for = 0; - int safety_counter = nchild*nchild; - while (created > 0) { - - if (--safety_counter < 0) { - cerr<<"BScreen::initWindows() Warning!!! Safety counter reached!"<validateWindow(children[i])) { +#ifdef DEBUG + cerr<<"BScreen::initWindows(): not valid window = "<validateWindow(children[i]))) { + // if we have a transient_for window and it isn't created yet... + // postpone creation of this window and find transient_for window + // in the list and swap place with it so we can create transient_for window + // first + if (XGetTransientForHint(disp, children[i], &transient_for) && + fluxbox->searchWindow(transient_for) == 0) { + // search forward for transient_for + // and swap place with it so it gets created first + int j = i + 1; + for (; j < nchild; ++j) { + if (children[j] == transient_for) { + swap(children[i], children[j]); + break; + } + } + // reevaluate window + if (!fluxbox->validateWindow(children[i])) + continue; + #ifdef DEBUG - cerr<<"BScreen::initWindows(): created = "<mapRequestEvent(mre); - } + if (win) { + XMapRequestEvent mre; + mre.window = children[i]; + win->mapRequestEvent(mre); } } - children[i] = None; // we dont need this anymore, since we already created a window for it - // we created a window...decrease creation counter - if (--created <= 0) - break; // end for-loop - } + children[i] = None; // we dont need this anymore, since we already created a window for it } + XFree(children); } -- cgit v0.11.2