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);
}
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);
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(),
}
-void OBFrame::releaseClient(bool remap)
+void OBFrame::releaseClient()
{
- // check if the app has already reparented its window to the root window
- XEvent ev;
- if (XCheckTypedWindowEvent(otk::OBDisplay::display, _client->window(),
- ReparentNotify, &ev)) {
- remap = true; // XXX: why do we remap the window if they already
- // reparented to root?
- } else {
- // according to the ICCCM - if the client doesn't reparent to
- // root, then we have to do it 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());
+ // XXX: check for a reparent before reparenting?
+
+ // according to the ICCCM - if the client doesn't reparent to
+ // root, then we have to do it for them
+ XReparentWindow(otk::OBDisplay::display, _client->window(),
+ _screen->rootWindow(),
+ _client->area().x(), _client->area().y());
}