X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.cc;h=e2bab5c8efa48796b3071cb03a9f0cfa56f16bcd;hb=6c5c7fd04b2f9aca24b4ff7ee1db86064dcc63ef;hp=d82464dca16b9ab3154a98a3c841d38054fe0c2d;hpb=406c79aea1b6f9c8bd1bbeb253ebc7cb97fc7e25;p=chaz%2Fopenbox diff --git a/src/screen.cc b/src/screen.cc index d82464dc..e2bab5c8 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -134,7 +134,7 @@ Screen::Screen(int screen) openbox->registerHandler(_info->rootWindow(), this); // call the python Startup callbacks - EventData data(_number, 0, EventShutdown, 0); + EventData data(_number, 0, EventAction::Shutdown, 0); openbox->bindings()->fireEvent(&data); } @@ -150,7 +150,7 @@ Screen::~Screen() unmanageWindow(clients.front()); // call the python Shutdown callbacks - EventData data(_number, 0, EventShutdown, 0); + EventData data(_number, 0, EventAction::Shutdown, 0); openbox->bindings()->fireEvent(&data); XDestroyWindow(**otk::display, _focuswindow); @@ -224,7 +224,7 @@ void Screen::updateStrut() void Screen::calcArea() { - otk::Rect old_area = _area; +// otk::Rect old_area = _area; /* #ifdef XINERAMA @@ -261,7 +261,7 @@ void Screen::calcArea() #endif // XINERAMA */ - if (old_area != _area) + //if (old_area != _area) // XXX: re-maximize windows changeWorkArea(); @@ -433,16 +433,34 @@ void Screen::manageWindow(Window window) Client *client = 0; XWMHints *wmhint; XSetWindowAttributes attrib_set; + XEvent e; + XWindowAttributes attrib; otk::display->grab(); + // check if it has already been unmapped by the time we started mapping + // the grab does a sync so we don't have to here + if (XCheckTypedWindowEvent(**otk::display, window, DestroyNotify, &e) || + XCheckTypedWindowEvent(**otk::display, window, UnmapNotify, &e)) { + XPutBackEvent(**otk::display, &e); + + otk::display->ungrab(); + return; // don't manage it + } + + if (!XGetWindowAttributes(**otk::display, window, &attrib) || + attrib.override_redirect) { + otk::display->ungrab(); + return; // don't manage it + } + // is the window a docking app if ((wmhint = XGetWMHints(**otk::display, window))) { if ((wmhint->flags & StateHint) && wmhint->initial_state == WithdrawnState) { //slit->addClient(w); // XXX: make dock apps work! - otk::display->ungrab(); + otk::display->ungrab(); XFree(wmhint); return; } @@ -498,7 +516,7 @@ void Screen::manageWindow(Window window) client->positionRequested())) { // position the window intelligenty .. hopefully :) // call the python PLACEWINDOW binding - EventData data(_number, client, EventPlaceWindow, 0); + EventData data(_number, client, EventAction::PlaceWindow, 0); openbox->bindings()->fireEvent(&data); } @@ -523,7 +541,7 @@ void Screen::manageWindow(Window window) openbox->bindings()->grabButtons(true, client); // call the python NEWWINDOW binding - EventData data(_number, client, EventNewWindow, 0); + EventData data(_number, client, EventAction::NewWindow, 0); openbox->bindings()->fireEvent(&data); #ifdef DEBUG @@ -538,7 +556,7 @@ void Screen::unmanageWindow(Client *client) Frame *frame = client->frame; // call the python CLOSEWINDOW binding - EventData data(_number, client, EventCloseWindow, 0); + EventData data(_number, client, EventAction::CloseWindow, 0); openbox->bindings()->fireEvent(&data); openbox->bindings()->grabButtons(false, client); @@ -589,7 +607,7 @@ void Screen::unmanageWindow(Client *client) client->unfocus(); #ifdef DEBUG - printf("Unmanaged window 0x%lx frame %lx\n", client->window(), framewin); + printf("Unmanaged window 0x%lx frame 0x%lx\n", client->window(), framewin); #endif delete client; @@ -775,7 +793,13 @@ void Screen::mapRequestHandler(const XMapRequestEvent &e) printf("MapRequest for 0x%lx\n", e.window); #endif // DEBUG - manageWindow(e.window); + Client *c = openbox->findClient(e.window); + if (c) { +#ifdef DEBUG + printf("DEBUG: MAP REQUEST CAUGHT IN SCREEN. IGNORED.\n"); +#endif + } else + manageWindow(e.window); } }