X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fframe.cc;h=555f5c6e3142163d3fe3ad7455669888328c7b27;hb=889df8a74da733c849cb52c3a76ae59956755882;hp=7a99f9a06e20652e2612eae73c81c4f3d88094e6;hpb=dd7af2419a4e59f8048e74db775a1673b27bc708;p=chaz%2Fopenbox diff --git a/src/frame.cc b/src/frame.cc index 7a99f9a0..555f5c6e 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(false); } @@ -364,13 +361,13 @@ void OBFrame::adjustShape() if (!_client->shaped()) { // clear the shape on the frame window - XShapeCombineMask(otk::OBDisplay::display, window(), ShapeBounding, + XShapeCombineMask(otk::OBDisplay::display, _window, ShapeBounding, _innersize.left, _innersize.top, None, ShapeSet); } else { // make the frame's shape match the clients - XShapeCombineShape(otk::OBDisplay::display, window(), ShapeBounding, + XShapeCombineShape(otk::OBDisplay::display, _window, ShapeBounding, _innersize.left, _innersize.top, _client->window(), ShapeBounding, ShapeSet); @@ -404,11 +401,19 @@ void OBFrame::adjustShape() void OBFrame::grabClient() { - // reparent the client to the frame XReparentWindow(otk::OBDisplay::display, _client->window(), _plate.window(), 0, 0); - _client->ignore_unmaps++; + /* + 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(), @@ -422,25 +427,21 @@ void OBFrame::grabClient() } -void OBFrame::releaseClient(bool remap) +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)) { - remap = true; // XXX: why do we remap the window if they already - // reparented to root? + XPutBackEvent(otk::OBDisplay::display, &ev); } 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()); } - - // if we want to remap the window, do so now - if (remap) - XMapWindow(otk::OBDisplay::display, _client->window()); }