X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Feventdispatcher.cc;h=1b90dbc0d3f9a813b2bf94f19ec4400bdcdd9575;hb=648c55b829e09c66222a9bbf08d10434622feae2;hp=d4a565bb874a4c3d3f59fa4b91e9e0b09a8a9c8c;hpb=a8a5b519b0304d36f413fe2808acb82f19539b06;p=chaz%2Fopenbox diff --git a/otk/eventdispatcher.cc b/otk/eventdispatcher.cc index d4a565bb..1b90dbc0 100644 --- a/otk/eventdispatcher.cc +++ b/otk/eventdispatcher.cc @@ -1,11 +1,11 @@ // -*- 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 { @@ -34,11 +34,32 @@ void EventDispatcher::clearHandler(Window id) _map.erase(id); } -void EventDispatcher::dispatchEvents(void) +void EventDispatcher::dispatchEvents(bool remote) { XEvent e; - while (XPending(**display)) { + while (true) { + /* + There are slightly different event retrieval semantics here for local (or + high bandwidth) versus remote (or low bandwidth) connections to the + display/Xserver. + */ + if (remote) { + if (!XPending(**display)) + return; + } else { + /* + This XSync allows for far more compression of events, which makes + things like Motion events perform far far better. Since it also means + network traffic for every event instead of every X events (where X is + the number retrieved at a time), it probably should not be used for + setups where Openbox is running on a remote/low bandwidth + display/Xserver. + */ + XSync(**display, false); + if (!XEventsQueued(**display, QueuedAlready)) + return; + } XNextEvent(**display, &e); #if 0//defined(DEBUG) @@ -105,7 +126,7 @@ void EventDispatcher::dispatchFocus(const XEvent &e) // (e.xfocus.type == FocusIn ? "IN" : "OUT"), // e.xfocus.detail, e.xfocus.window); // ignore focus changes from grabs - if (e.xfocus.mode != NotifyNormal) //|| e.xfocus.mode == NotifyUngrab || + 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 @@ -165,9 +186,17 @@ void EventDispatcher::dispatch(Window win, const XEvent &e) xwc.border_width = e.xconfigurerequest.border_width; xwc.sibling = e.xconfigurerequest.above; xwc.stack_mode = e.xconfigurerequest.detail; - + +#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;