X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Feventdispatcher.cc;h=0560eec8609e27b21c56233e5f53dad9a96a4e15;hb=e451c08ac5a103362adbece9b8a11a16ade739c1;hp=b3c8a587cb4e690b1e801d060f361df676e4727c;hpb=bd748f74022019c4c9ee3e078afcef14cf47d370;p=chaz%2Fopenbox diff --git a/otk/eventdispatcher.cc b/otk/eventdispatcher.cc index b3c8a587..0560eec8 100644 --- a/otk/eventdispatcher.cc +++ b/otk/eventdispatcher.cc @@ -1,45 +1,45 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- -#ifdef HAVE_CONFIG_H -# include "../config.h" -#endif +#include "config.h" #include "eventdispatcher.hh" #include "display.hh" + +#include #include namespace otk { -OtkEventDispatcher::OtkEventDispatcher() - : _fallback(0), _master(0), _focus(None) +EventDispatcher::EventDispatcher() + : _fallback(0), _master(0) { } -OtkEventDispatcher::~OtkEventDispatcher() +EventDispatcher::~EventDispatcher() { } -void OtkEventDispatcher::clearAllHandlers(void) +void EventDispatcher::clearAllHandlers(void) { _map.clear(); } -void OtkEventDispatcher::registerHandler(Window id, OtkEventHandler *handler) +void EventDispatcher::registerHandler(Window id, EventHandler *handler) { - _map.insert(std::pair(id, handler)); + _map.insert(std::pair(id, handler)); } -void OtkEventDispatcher::clearHandler(Window id) +void EventDispatcher::clearHandler(Window id) { _map.erase(id); } -void OtkEventDispatcher::dispatchEvents(void) +void EventDispatcher::dispatchEvents(void) { XEvent e; - while (XPending(OBDisplay::display)) { - XNextEvent(OBDisplay::display, &e); + while (XPending(**display)) { + XNextEvent(**display, &e); #if 0//defined(DEBUG) printf("Event %d window %lx\n", e.type, e.xany.window); @@ -71,17 +71,17 @@ void OtkEventDispatcher::dispatchEvents(void) case ButtonPress: case ButtonRelease: _lasttime = e.xbutton.time; - e.xbutton.state &= ~(LockMask | OBDisplay::numLockMask() | - OBDisplay::scrollLockMask()); + e.xbutton.state &= ~(LockMask | display->numLockMask() | + display->scrollLockMask()); break; case KeyPress: - e.xkey.state &= ~(LockMask | OBDisplay::numLockMask() | - OBDisplay::scrollLockMask()); + e.xkey.state &= ~(LockMask | display->numLockMask() | + display->scrollLockMask()); break; case MotionNotify: _lasttime = e.xmotion.time; - e.xmotion.state &= ~(LockMask | OBDisplay::numLockMask() | - OBDisplay::scrollLockMask()); + e.xmotion.state &= ~(LockMask | display->numLockMask() | + display->scrollLockMask()); break; case PropertyNotify: _lasttime = e.xproperty.time; @@ -89,6 +89,8 @@ void OtkEventDispatcher::dispatchEvents(void) case EnterNotify: case LeaveNotify: _lasttime = e.xcrossing.time; + if (e.xcrossing.mode != NotifyNormal) + continue; // skip me! break; } @@ -97,74 +99,49 @@ void OtkEventDispatcher::dispatchEvents(void) } } -void OtkEventDispatcher::dispatchFocus(const XEvent &e) +void EventDispatcher::dispatchFocus(const XEvent &e) { - Window newfocus = None; - - // any other types are not ones we're interested in - if (e.xfocus.detail != NotifyNonlinear) +// printf("focus %s detail %d -> 0x%lx\n", +// (e.xfocus.type == FocusIn ? "IN" : "OUT"), +// e.xfocus.detail, e.xfocus.window); + // ignore focus changes from grabs + if (e.xfocus.mode == NotifyGrab) //|| e.xfocus.mode == NotifyUngrab || + // From Metacity, from WindowMaker, ignore all funky pointer root events + // its commented out cuz I don't think we need this at all. If problems + // arise we can look into it + //e.xfocus.detail > NotifyNonlinearVirtual) return; if (e.type == FocusIn) { - printf("---\n"); - printf("Got FocusIn!\n"); - printf("Using FocusIn\n"); - newfocus = e.xfocus.window; - - if (newfocus != _focus) { - // send a FocusIn to whatever was just focused - dispatch(newfocus, e); - printf("Sent FocusIn 0x%lx\n", newfocus); - - // send a FocusOut to whatever used to be focused - if (_focus) { - XEvent ev; - ev.xfocus = e.xfocus; - ev.xfocus.window = _focus; - ev.type = FocusOut; - dispatch(_focus, ev); - printf("Sent FocusOut 0x%lx\n", _focus); - } + //printf("Got FocusIn!\n"); + + // send a FocusIn to whatever was just focused + dispatch(e.xfocus.window, e); + //printf("Sent FocusIn 0x%lx\n", e.xfocus.window); - // store the new focused window - _focus = newfocus; - } - } else if (e.type == FocusOut) { - bool focused = false; // found a new focus target? - printf("---\n"); - printf("Got FocusOut!\n"); + //printf("Got FocusOut!\n"); // FocusOut events just make us look for FocusIn events. They are ignored // otherwise. XEvent fi; - while (XCheckTypedEvent(OBDisplay::display, FocusIn, &fi)) { - if (e.xfocus.detail == NotifyNonlinear) { - printf("Found FocusIn\n"); - dispatchFocus(fi); - focused = true; - break; - } - } - if (!focused) { - // send a FocusOut to whatever used to be focused - if (_focus) { - XEvent ev; - ev.xfocus = e.xfocus; - ev.xfocus.window = _focus; - dispatch(_focus, ev); - printf("Sent FocusOut 0x%lx\n", _focus); - } - // store that no window has focus anymore - _focus = None; + if (XCheckTypedEvent(**display, FocusIn, &fi)) { + //printf("Found FocusIn\n"); + dispatchFocus(fi); + // dont unfocus the window we just focused! + if (fi.xfocus.window == e.xfocus.window) + return; } + + dispatch(e.xfocus.window, e); + //printf("Sent FocusOut 0x%lx\n", e.xfocus.window); } } -void OtkEventDispatcher::dispatch(Window win, const XEvent &e) +void EventDispatcher::dispatch(Window win, const XEvent &e) { - OtkEventHandler *handler = 0; - OtkEventMap::iterator it; + EventHandler *handler = 0; + EventMap::iterator it; // master gets everything first if (_master) @@ -188,9 +165,17 @@ void OtkEventDispatcher::dispatch(Window win, const XEvent &e) xwc.border_width = e.xconfigurerequest.border_width; xwc.sibling = e.xconfigurerequest.above; xwc.stack_mode = e.xconfigurerequest.detail; - - XConfigureWindow(otk::OBDisplay::display, e.xconfigurerequest.window, + +#ifdef DEBUG + printf("Proxying configure event for 0x%lx\n", e.xconfigurerequest.window); +#endif + + // we are not to be held responsible if someone sends us an invalid + // request! + display->setIgnoreErrors(true); + XConfigureWindow(**display, e.xconfigurerequest.window, e.xconfigurerequest.value_mask, &xwc); + display->setIgnoreErrors(false); } else { // grab a falback if it exists handler = _fallback; @@ -200,9 +185,9 @@ void OtkEventDispatcher::dispatch(Window win, const XEvent &e) handler->handle(e); } -OtkEventHandler *OtkEventDispatcher::findHandler(Window win) +EventHandler *EventDispatcher::findHandler(Window win) { - OtkEventMap::iterator it = _map.find(win); + EventMap::iterator it = _map.find(win); if (it != _map.end()) return it->second; return 0;