X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.cc;h=e97c05b295236b7e2bde13a0e1e4b8275ec6ed55;hb=bc88d310fea71823fb2c61d071ff499579bffaba;hp=09f57d64ebde4200b24e0593844da1b4cded300e;hpb=f11bd1b0cc5973590d1ee547736ac00f50447efa;p=chaz%2Fopenbox diff --git a/src/screen.cc b/src/screen.cc index 09f57d64..e97c05b2 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -140,9 +140,8 @@ OBScreen::OBScreen(int screen) 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); } @@ -157,9 +156,8 @@ OBScreen::~OBScreen() 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); @@ -284,7 +282,6 @@ void OBScreen::changeSupportedAtoms() _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(), @@ -498,9 +495,8 @@ void OBScreen::manageWindow(Window window) 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 @@ -543,23 +539,22 @@ void OBScreen::manageWindow(Window window) 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 } -void OBScreen::unmanageWindow(OBClient *client, bool reparented) +void OBScreen::unmanageWindow(OBClient *client) { 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); @@ -590,14 +585,9 @@ void OBScreen::unmanageWindow(OBClient *client, bool reparented) // 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()); - + // reparent the window out of the frame + frame->releaseClient(); + delete client->frame; client->frame = 0; @@ -610,6 +600,10 @@ void OBScreen::unmanageWindow(OBClient *client, bool reparented) // 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 @@ -789,10 +783,22 @@ void OBScreen::mapRequestHandler(const XMapRequestEvent &e) 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); }