Openbox::instance->registerHandler(_info->rootWindow(), this);
// call the python Startup callbacks
- EventData *data = new_event_data(_number, 0, EventShutdown, 0);
- Openbox::instance->bindings()->fireEvent(data);
- Py_XDECREF((PyObject*)data);
+ EventData data(_number, 0, EventShutdown, 0);
+ Openbox::instance->bindings()->fireEvent(&data);
}
unmanageWindow(clients.front());
// call the python Shutdown callbacks
- EventData *data = new_event_data(_number, 0, EventShutdown, 0);
- Openbox::instance->bindings()->fireEvent(data);
- Py_XDECREF((PyObject*)data);
+ EventData data(_number, 0, EventShutdown, 0);
+ Openbox::instance->bindings()->fireEvent(&data);
XDestroyWindow(otk::OBDisplay::display, _focuswindow);
XDestroyWindow(otk::OBDisplay::display, _supportwindow);
_supportwindow = XCreateSimpleWindow(otk::OBDisplay::display,
_info->rootWindow(),
0, 0, 1, 1, 0, 0, 0);
- assert(_supportwindow != None);
// set supporting window
Openbox::instance->property()->set(_info->rootWindow(),
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;
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);
+ EventData data(_number, client, EventPlaceWindow, 0);
+ Openbox::instance->bindings()->fireEvent(&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();
}
Openbox::instance->bindings()->grabButtons(true, client);
// call the python NEWWINDOW binding
- EventData *data = new_event_data(_number, window, EventNewWindow, 0);
- Openbox::instance->bindings()->fireEvent(data);
- Py_DECREF((PyObject*)data);
+ EventData data(_number, client, EventNewWindow, 0);
+ Openbox::instance->bindings()->fireEvent(&data);
+#ifdef DEBUG
printf("Managed window 0x%lx\n", window);
+#endif
}
OBFrame *frame = client->frame;
// call the python CLOSEWINDOW binding
- EventData *data = new_event_data(_number, client->window(),
- EventCloseWindow, 0);
- Openbox::instance->bindings()->fireEvent(data);
- Py_DECREF((PyObject*)data);
+ EventData data(_number, client, EventCloseWindow, 0);
+ Openbox::instance->bindings()->fireEvent(&data);
Openbox::instance->bindings()->grabButtons(false, client);
// give the client its border back
client->toggleClientBorder(true);
+ // reparent the window out of the frame
+ frame->releaseClient();
+
delete client->frame;
client->frame = 0;
// unfocus the client (calls the focus callbacks)
client->unfocus();
+#ifdef DEBUG
+ printf("Unmanaged window 0x%lx\n", client->window());
+#endif
+
delete client;
// update the root properties
OBClient *c = Openbox::instance->findClient(e.window);
if (c) {
- if (c->shaded())
- c->shade(false);
- // XXX: uniconify the window
- c->focus();
+ // send a net_active_window message
+ XEvent ce;
+ ce.xclient.type = ClientMessage;
+ ce.xclient.message_type =
+ Openbox::instance->property()->atom(otk::OBProperty::net_active_window);
+ ce.xclient.display = otk::OBDisplay::display;
+ ce.xclient.window = c->window();
+ ce.xclient.format = 32;
+ ce.xclient.data.l[0] = 0l;
+ ce.xclient.data.l[1] = 0l;
+ ce.xclient.data.l[2] = 0l;
+ ce.xclient.data.l[3] = 0l;
+ ce.xclient.data.l[4] = 0l;
+ XSendEvent(otk::OBDisplay::display, _info->rootWindow(), false,
+ SubstructureRedirectMask | SubstructureNotifyMask,
+ &ce);
} else
manageWindow(e.window);
}