maps and unmaps windows!
This commit is contained in:
parent
a0cc4a7f23
commit
378ed4f520
1 changed files with 39 additions and 7 deletions
|
@ -173,14 +173,48 @@ static void manageWindow(Window window)
|
||||||
|
|
||||||
static void unmanageWindow(OBClient *client)
|
static void unmanageWindow(OBClient *client)
|
||||||
{
|
{
|
||||||
|
bool remap = false; // remap the window when we're done?
|
||||||
|
|
||||||
Window window = client->window();
|
Window window = client->window();
|
||||||
|
|
||||||
|
// XXX: pass around focus if this window was focused
|
||||||
|
|
||||||
|
// remove the window from our save set
|
||||||
|
XChangeSaveSet(otk::OBDisplay::display, window, SetModeDelete);
|
||||||
|
|
||||||
|
// we dont want events no more
|
||||||
|
XSelectInput(otk::OBDisplay::display, window, NoEventMask);
|
||||||
|
|
||||||
|
// XXX: XUnmapWindow(otk::OBDisplay::display, FRAME);
|
||||||
|
XUnmapWindow(otk::OBDisplay::display, window);
|
||||||
|
|
||||||
// we dont want a border on the client
|
// we dont want a border on the client
|
||||||
XSetWindowBorderWidth(otk::OBDisplay::display, window,client->borderWidth());
|
XSetWindowBorderWidth(otk::OBDisplay::display, window,client->borderWidth());
|
||||||
|
|
||||||
// remove the window from our save set
|
// remove the client class from the search list
|
||||||
XChangeSaveSet(otk::OBDisplay::display, window, SetModeDelete);
|
Openbox::instance->removeClient(window);
|
||||||
|
|
||||||
|
// check if the app has already reparented its window to the root window
|
||||||
|
XEvent ev;
|
||||||
|
if (XCheckTypedWindowEvent(otk::OBDisplay::display, 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, window,
|
||||||
|
RootWindow(otk::OBDisplay::display,
|
||||||
|
DefaultScreen(otk::OBDisplay::display)),
|
||||||
|
// XXX: screen->getRootWindow(),
|
||||||
|
client->area().x(), client->area().y());
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we want to remap the window, do so now
|
||||||
|
if (remap)
|
||||||
|
XMapWindow(otk::OBDisplay::display, window);
|
||||||
|
|
||||||
|
delete client;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OBXEventHandler::mapRequest(const XMapRequestEvent &e)
|
void OBXEventHandler::mapRequest(const XMapRequestEvent &e)
|
||||||
|
@ -254,8 +288,7 @@ void OBXEventHandler::unmapNotify(const XUnmapEvent &e)
|
||||||
OBClient *client = Openbox::instance->findClient(e.window);
|
OBClient *client = Openbox::instance->findClient(e.window);
|
||||||
if (!client) return;
|
if (!client) return;
|
||||||
|
|
||||||
// XXX: unmanage the window, i.e. ungrab events n reparent n shit
|
unmanageWindow(client);
|
||||||
Openbox::instance->removeClient(e.window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -266,8 +299,7 @@ void OBXEventHandler::destroyNotify(const XDestroyWindowEvent &e)
|
||||||
OBClient *client = Openbox::instance->findClient(e.window);
|
OBClient *client = Openbox::instance->findClient(e.window);
|
||||||
if (!client) return;
|
if (!client) return;
|
||||||
|
|
||||||
// XXX: unmanage the window, i.e. ungrab events n reparent n shit
|
unmanageWindow(client);
|
||||||
Openbox::instance->removeClient(e.window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue