X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=otk%2Feventdispatcher.cc;h=6c15a60bcf8d0aa9be411a517971eaf42b24630b;hb=915b171befc55dc12daffe5814cdf6332083f2ad;hp=b3c8a587cb4e690b1e801d060f361df676e4727c;hpb=bd748f74022019c4c9ee3e078afcef14cf47d370;p=chaz%2Fopenbox diff --git a/otk/eventdispatcher.cc b/otk/eventdispatcher.cc index b3c8a587..6c15a60b 100644 --- a/otk/eventdispatcher.cc +++ b/otk/eventdispatcher.cc @@ -11,7 +11,7 @@ namespace otk { OtkEventDispatcher::OtkEventDispatcher() - : _fallback(0), _master(0), _focus(None) + : _fallback(0), _master(0) { } @@ -99,65 +99,33 @@ void OtkEventDispatcher::dispatchEvents(void) void OtkEventDispatcher::dispatchFocus(const XEvent &e) { - Window newfocus = None; - - // any other types are not ones we're interested in - if (e.xfocus.detail != NotifyNonlinear) - 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"); + // ignore FocusOut changes from grabs + if (e.xfocus.mode == NotifyGrab) + return; + // 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(OBDisplay::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); } }