X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=cdcbfbcc14bb1d8d7f5416d276c20c3ae811a60b;hb=9dd52dfcc3cebd39580db8e0b72e294c67a847d9;hp=c3ab3c63a8740f25f677c38aa7c977fae1195b9b;hpb=7175ac2b5aec7aface6a2f86df32dd0386e0cc05;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index c3ab3c63..cdcbfbcc 100644 --- a/src/client.cc +++ b/src/client.cc @@ -655,9 +655,9 @@ void OBClient::setWMState(long state) void OBClient::setDesktop(long target) { + if (target == _desktop) return; + printf("Setting desktop %ld\n", target); - assert(target >= 0 || target == (signed)0xffffffff); - //assert(target == 0xffffffff || target < MAX); if (!(target >= 0 || target == (signed)0xffffffff)) return; @@ -668,8 +668,12 @@ void OBClient::setDesktop(long target) otk::OBProperty::Atom_Cardinal, (unsigned)_desktop); - - // XXX: move the window to the new desktop + // 'move' the window to the new desktop + if (_desktop == Openbox::instance->screen(_screen)->desktop() || + _desktop == (signed)0xffffffff) + frame->show(); + else + frame->hide(); } @@ -893,7 +897,10 @@ void OBClient::clientMessageHandler(const XClientMessageEvent &e) } else if (e.message_type == property->atom(otk::OBProperty::net_wm_state)) { // can't compress these #ifdef DEBUG - printf("net_wm_state for 0x%lx\n", _window); + printf("net_wm_state %s %ld %ld for 0x%lx\n", + (e.data.l[0] == 0 ? "Remove" : e.data.l[0] == 1 ? "Add" : + e.data.l[0] == 2 ? "Toggle" : "INVALID"), + e.data.l[1], e.data.l[2], _window); #endif setState((StateAction)e.data.l[0], e.data.l[1], e.data.l[2]); } else if (e.message_type == @@ -917,9 +924,11 @@ void OBClient::clientMessageHandler(const XClientMessageEvent &e) void OBClient::shapeHandler(const XShapeEvent &e) { otk::OtkEventHandler::shapeHandler(e); - - _shaped = e.shaped; - frame->adjustShape(); + + if (e.kind == ShapeBounding) { + _shaped = e.shaped; + frame->adjustShape(); + } } #endif @@ -991,7 +1000,8 @@ void OBClient::move(int x, int y) _area.setPos(x, y); // move the frame to be in the requested position - frame->adjustPosition(); + if (frame) // this can be called while mapping, before frame exists + frame->adjustPosition(); } @@ -1064,21 +1074,6 @@ void OBClient::changeState() } -void OBClient::setStackLayer(int l) -{ - if (l == 0) - _above = _below = false; // normal - else if (l > 0) { - _above = true; - _below = false; // above - } else { - _above = false; - _below = true; // below - } - changeState(); -} - - void OBClient::shade(bool shade) { if (shade == _shaded) return; // already done @@ -1090,12 +1085,17 @@ void OBClient::shade(bool shade) } -bool OBClient::focus() +bool OBClient::focus() const { - if (!(_can_focus || _focus_notify) || _focused) return false; + // won't try focus if the client doesn't want it, or if the window isn't + // visible on the screen + if (!(frame->isVisible() && (_can_focus || _focus_notify))) return false; + + if (_focused) return true; if (_can_focus) - XSetInputFocus(otk::OBDisplay::display, _window, RevertToNone, CurrentTime); + XSetInputFocus(otk::OBDisplay::display, _window, + RevertToNone, CurrentTime); if (_focus_notify) { XEvent ce; @@ -1118,7 +1118,7 @@ bool OBClient::focus() } -void OBClient::unfocus() +void OBClient::unfocus() const { if (!_focused) return; @@ -1225,15 +1225,18 @@ void OBClient::configureRequestHandler(const XConfigureRequestEvent &e) void OBClient::unmapHandler(const XUnmapEvent &e) { + if (ignore_unmaps) { #ifdef DEBUG - printf("UnmapNotify for 0x%lx\n", e.window); + printf("Ignored UnmapNotify for 0x%lx (event 0x%lx)\n", e.window, e.event); #endif // DEBUG - - if (ignore_unmaps) { ignore_unmaps--; return; } +#ifdef DEBUG + printf("UnmapNotify for 0x%lx\n", e.window); +#endif // DEBUG + OtkEventHandler::unmapHandler(e); // this deletes us etc @@ -1272,6 +1275,12 @@ void OBClient::reparentHandler(const XReparentEvent &e) to an already unmapped window. */ + // we don't want the reparent event, put it back on the stack for the X + // server to deal with after we unmanage the window + XEvent ev; + ev.xreparent = e; + XPutBackEvent(otk::OBDisplay::display, &ev); + // this deletes us etc Openbox::instance->screen(_screen)->unmanageWindow(this); }