X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=c5b144c5f3cbd4f8104389cb7529c008a77c8fef;hb=6bad7e676ad841ffce8e2a05f0d8538f149454ea;hp=5bed5833428cc001ef0860cdecf0504096b5d4e8;hpb=6062fe404ce5f2505494132d5454370d696625ca;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index 5bed5833..c5b144c5 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -56,14 +56,11 @@ OBFrame::OBFrame(OBClient *client, otk::Style *style) otk::OtkWidget::unfocus(); // stuff starts out appearing focused in otk _plate.show(); // the other stuff is shown based on decor settings - - grabClient(); } OBFrame::~OBFrame() { - releaseClient(); } @@ -407,9 +404,16 @@ void OBFrame::grabClient() // reparent the client to the frame XReparentWindow(otk::OBDisplay::display, _client->window(), _plate.window(), 0, 0); - // this generates 2 unmap's that we catch, one to the window and one to root, - // but both have .window set to this window, so both need to be ignored - _client->ignore_unmaps+=2; + /* + When reparenting the client window, it is usually not mapped yet, since + this occurs from a MapRequest. However, in the case where Openbox is + starting up, the window is already mapped, so we'll see unmap events for + it. There are 2 unmap events generated that we see, one with the 'event' + member set the root window, and one set to the client, but both get handled + and need to be ignored. + */ + if (Openbox::instance->state() == Openbox::State_Starting) + _client->ignore_unmaps += 2; // select the event mask on the client's parent (to receive config req's) XSelectInput(otk::OBDisplay::display, _plate.window(), @@ -425,22 +429,21 @@ void OBFrame::grabClient() void OBFrame::releaseClient() { - // check if the app has already reparented its window to the root window XEvent ev; + + // check if the app has already reparented its window away if (XCheckTypedWindowEvent(otk::OBDisplay::display, _client->window(), ReparentNotify, &ev)) { - // XXX: ob2/bb didn't do this.. look up this process in other wm's! XPutBackEvent(otk::OBDisplay::display, &ev); + // re-map the window since the unmanaging process unmaps it + XMapWindow(otk::OBDisplay::display, _client->window()); } else { - // according to the ICCCM - if the client doesn't reparent to - // root, then we have to do it for them + // according to the ICCCM - if the client doesn't reparent itself, then we + // will reparent the window to root for them XReparentWindow(otk::OBDisplay::display, _client->window(), _screen->rootWindow(), _client->area().x(), _client->area().y()); } - - // do an extra map here .. ? XXX - XMapWindow(otk::OBDisplay::display, _client->window()); }