X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=026f4f2f8bd6b7aad78f12ded2fda0c7a52dab0b;hb=f11bd1b0cc5973590d1ee547736ac00f50447efa;hp=b4015aae63227c877d492dffac86f4cb03d87799;hpb=a93f06f5b3162e59c04074a14bd3702e4bb82133;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index b4015aae..026f4f2f 100644 --- a/src/client.cc +++ b/src/client.cc @@ -72,6 +72,10 @@ OBClient::~OBClient() { const otk::OBProperty *property = Openbox::instance->property(); + // clean up parents reference to this + if (_transient_for) + _transient_for->_transients.remove(this); // remove from old parent + if (Openbox::instance->state() != Openbox::State_Exiting) { // these values should not be persisted across a window unmapping/mapping property->erase(_window, otk::OBProperty::net_wm_desktop); @@ -85,11 +89,17 @@ void OBClient::getDesktop() const otk::OBProperty *property = Openbox::instance->property(); // defaults to the current desktop - _desktop = 0; // XXX: change this to the current desktop! - - property->get(_window, otk::OBProperty::net_wm_desktop, - otk::OBProperty::Atom_Cardinal, - &_desktop); + _desktop = Openbox::instance->screen(_screen)->desktop(); + + if (!property->get(_window, otk::OBProperty::net_wm_desktop, + otk::OBProperty::Atom_Cardinal, + (long unsigned*)&_desktop)) { + // make sure the hint exists + Openbox::instance->property()->set(_window, + otk::OBProperty::net_wm_desktop, + otk::OBProperty::Atom_Cardinal, + (unsigned)_desktop); + } } @@ -134,6 +144,8 @@ void OBClient::getType() // property->atom(otk::OBProperty::kde_net_wm_window_type_override)) // mwm_decorations = 0; // prevent this window from getting any decor // XXX: make this work again + if (_type != (WindowType) -1) + break; // grab the first known type } delete val; } @@ -237,7 +249,7 @@ void OBClient::getMwmHints() (unsigned long **)&hints)) return; - if (num == MwmHints::elements) { + if (num >= MwmHints::elements) { // retrieved the hints _mwmhints.flags = hints[0]; _mwmhints.functions = hints[1]; @@ -608,6 +620,7 @@ void OBClient::propertyHandler(const XPropertyEvent &e) getType(); calcLayer(); // type may have changed, so update the layer setupDecorAndFunctions(); + frame->adjustSize(); // this updates the frame for any new decor settings } else if (e.atom == property->atom(otk::OBProperty::net_wm_name) || e.atom == property->atom(otk::OBProperty::wm_name)) @@ -642,12 +655,25 @@ 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); - // XXX: move the window to the new desktop (and set root property) + if (!(target >= 0 || target == (signed)0xffffffff)) return; + _desktop = target; + + Openbox::instance->property()->set(_window, + otk::OBProperty::net_wm_desktop, + otk::OBProperty::Atom_Cardinal, + (unsigned)_desktop); + + // 'move' the window to the new desktop + if (_desktop == Openbox::instance->screen(_screen)->desktop() || + _desktop == (signed)0xffffffff) + frame->show(); + else + frame->hide(); } @@ -870,15 +896,23 @@ void OBClient::clientMessageHandler(const XClientMessageEvent &e) setDesktop(e.data.l[0]); // use the original event } 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); +#endif setState((StateAction)e.data.l[0], e.data.l[1], e.data.l[2]); } else if (e.message_type == property->atom(otk::OBProperty::net_close_window)) { +#ifdef DEBUG + printf("net_close_window for 0x%lx\n", _window); +#endif close(); } else if (e.message_type == property->atom(otk::OBProperty::net_active_window)) { +#ifdef DEBUG + printf("net_active_window for 0x%lx\n", _window); +#endif focus(); Openbox::instance->screen(_screen)->restack(true, this); // raise - } else { } } @@ -887,9 +921,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 @@ -961,7 +997,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(); } @@ -1034,21 +1071,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 @@ -1062,10 +1084,12 @@ void OBClient::shade(bool shade) bool OBClient::focus() { - if (!(_can_focus || _focus_notify) || _focused) return false; + if (!(_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; @@ -1100,7 +1124,7 @@ void OBClient::unfocus() void OBClient::focusHandler(const XFocusChangeEvent &e) { #ifdef DEBUG - printf("FocusIn for 0x%lx\n", e.window); +// printf("FocusIn for 0x%lx\n", e.window); #endif // DEBUG OtkEventHandler::focusHandler(e); @@ -1115,7 +1139,7 @@ void OBClient::focusHandler(const XFocusChangeEvent &e) void OBClient::unfocusHandler(const XFocusChangeEvent &e) { #ifdef DEBUG - printf("FocusOut for 0x%lx\n", e.window); +// printf("FocusOut for 0x%lx\n", e.window); #endif // DEBUG OtkEventHandler::unfocusHandler(e); @@ -1123,10 +1147,8 @@ void OBClient::unfocusHandler(const XFocusChangeEvent &e) frame->unfocus(); _focused = false; - if (Openbox::instance->focusedClient() == this) { - printf("UNFOCUSED!\n"); - Openbox::instance->setFocusedClient(this); - } + if (Openbox::instance->focusedClient() == this) + Openbox::instance->setFocusedClient(0); } @@ -1197,15 +1219,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 @@ -1245,20 +1270,7 @@ void OBClient::reparentHandler(const XReparentEvent &e) */ // this deletes us etc - Openbox::instance->screen(_screen)->unmanageWindow(this); -} - - -void OBClient::mapRequestHandler(const XMapRequestEvent &e) -{ - printf("\nMAP REQUEST\n\n"); - - otk::OtkEventHandler::mapRequestHandler(e); - - if (_shaded) - shade(false); - // XXX: uniconify the window - focus(); + Openbox::instance->screen(_screen)->unmanageWindow(this, true); } }