X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=e626081ce19e871a2fe37e25653f5f257ee69ed0;hb=4721c53868187d10e3732cea63efa9fbd352178d;hp=2f966cee0a72fe12bc66607ee9682deebf682f3a;hpb=2ae2b257d39ea62640c2590f794e4275c6db1cd4;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index 2f966cee..e626081c 100644 --- a/src/client.cc +++ b/src/client.cc @@ -866,15 +866,30 @@ void OBClient::close() bool OBClient::focus() { - if (!_can_focus) return false; + if (!_can_focus || _focused) return false; XSetInputFocus(otk::OBDisplay::display, _window, RevertToNone, CurrentTime); return true; } -void OBClient::focusHandler(const XFocusChangeEvent &) +void OBClient::unfocus() { + if (!_focused) return; + + assert(Openbox::instance->focusedClient() == this); + Openbox::instance->setFocusedClient(0); +} + + +void OBClient::focusHandler(const XFocusChangeEvent &e) +{ +#ifdef DEBUG + printf("FocusIn for 0x%lx\n", e.window); +#endif // DEBUG + + OtkEventHandler::focusHandler(e); + frame->focus(); _focused = true; @@ -882,21 +897,30 @@ void OBClient::focusHandler(const XFocusChangeEvent &) } -void OBClient::unfocusHandler(const XFocusChangeEvent &) +void OBClient::unfocusHandler(const XFocusChangeEvent &e) { +#ifdef DEBUG + printf("FocusOut for 0x%lx\n", e.window); +#endif // DEBUG + + OtkEventHandler::unfocusHandler(e); + frame->unfocus(); _focused = false; if (Openbox::instance->focusedClient() == this) { - printf("UNFOCUSING\n"); - Openbox::instance->setFocusedClient(0); - } else - printf("UNFOCUSED ALREADY COULDNT UNFOCUS\n"); + printf("UNFOCUSED!\n"); + Openbox::instance->setFocusedClient(this); + } } void OBClient::configureRequestHandler(const XConfigureRequestEvent &e) { +#ifdef DEBUG + printf("ConfigureRequest for 0x%lx\n", e.window); +#endif // DEBUG + OtkEventHandler::configureRequestHandler(e); // XXX: if we are iconic (or shaded? (fvwm does that)) ignore the event @@ -983,4 +1007,26 @@ void OBClient::destroyHandler(const XDestroyWindowEvent &e) } +void OBClient::reparentHandler(const XReparentEvent &e) +{ + // this is when the client is first taken captive in the frame + if (e.parent == frame->plate()) return; + +#ifdef DEBUG + printf("ReparentNotify for 0x%lx\n", e.window); +#endif // DEBUG + + OtkEventHandler::reparentHandler(e); + + /* + This event is quite rare and is usually handled in unmapHandler. + However, if the window is unmapped when the reparent event occurs, + the window manager never sees it because an unmap event is not sent + to an already unmapped window. + */ + + // this deletes us etc + Openbox::instance->screen(_screen)->unmanageWindow(this); +} + }