XWMHints *wmhint;
XSetWindowAttributes attrib_set;
+ otk::OBDisplay::grab();
+
// is the window a docking app
if ((wmhint = XGetWMHints(otk::OBDisplay::display, window))) {
if ((wmhint->flags & StateHint) &&
wmhint->initial_state == WithdrawnState) {
//slit->addClient(w); // XXX: make dock apps work!
+ otk::OBDisplay::ungrab();
+
XFree(wmhint);
return;
}
XFree(wmhint);
}
- otk::OBDisplay::grab();
-
// choose the events we want to receive on the CLIENT window
attrib_set.event_mask = OBClient::event_mask;
attrib_set.do_not_propagate_mask = OBClient::no_propagate_mask;
// reparented back to root automatically
XChangeSaveSet(otk::OBDisplay::display, window, SetModeInsert);
- if (!client->positionRequested()) {
- // XXX: position the window intelligenty
+ if (!(Openbox::instance->state() == Openbox::State_Starting ||
+ client->positionRequested())) {
+ // position the window intelligenty .. hopefully :)
+ // call the python PLACEWINDOW binding
+ EventData *data = new_event_data(_number, window, EventPlaceWindow, 0);
+ Openbox::instance->bindings()->fireEvent(data);
+ Py_DECREF((PyObject*)data);
}
// create the decoration frame for the client window
Openbox::instance->addClient(client->frame->grip_left(), client);
Openbox::instance->addClient(client->frame->grip_right(), client);
- bool shown = false;
-
+ // reparent the client to the frame
+ client->frame->grabClient();
+
// if on the current desktop.. (or all desktops)
if (client->desktop() == _desktop ||
client->desktop() == (signed)0xffffffff) {
- shown = true;
client->frame->show();
}
}
-void OBScreen::unmanageWindow(OBClient *client)
+void OBScreen::unmanageWindow(OBClient *client, bool reparented)
{
OBFrame *frame = client->frame;
// give the client its border back
client->toggleClientBorder(true);
+ if (!reparented)
+ // reparent the window out of the frame
+ frame->releaseClient();
+ else
+ // the client is already reparented, so, since we unmapped the window
+ // above, we remap it here. aren't we nice? :)
+ XMapWindow(otk::OBDisplay::display, client->window());
+
delete client->frame;
client->frame = 0;
}
// force the callbacks to fire
- Openbox::instance->setFocusedClient(0);
+ if (!Openbox::instance->focusedClient())
+ Openbox::instance->setFocusedClient(0);
}
void OBScreen::changeNumDesktops(long num)