namespace otk {
OtkEventDispatcher::OtkEventDispatcher()
- : _fallback(0), _master(0)
+ : _fallback(0), _master(0), _focus(None)
{
}
printf("Event %d window %lx\n", e.type, e.xany.window);
#endif
- Window win;
-
- // pick a window
- switch (e.type) {
- case UnmapNotify:
- win = e.xunmap.window;
- break;
- case DestroyNotify:
- win = e.xdestroywindow.window;
- break;
- case ConfigureRequest:
- win = e.xconfigurerequest.window;
- break;
- default:
- win = e.xany.window;
- }
+ if (e.type == FocusIn || e.type == FocusOut) {
+ // focus events are a beast all their own.. yuk, hate, etc.
+ dispatchFocus(e);
+ } else {
+ Window win;
+
+ // pick a window
+ switch (e.type) {
+ case UnmapNotify:
+ win = e.xunmap.window;
+ break;
+ case DestroyNotify:
+ win = e.xdestroywindow.window;
+ break;
+ case ConfigureRequest:
+ win = e.xconfigurerequest.window;
+ break;
+ default:
+ win = e.xany.window;
+ }
- // grab the lasttime and hack up the modifiers
- switch (e.type) {
- case ButtonPress:
- case ButtonRelease:
- _lasttime = e.xbutton.time;
- e.xbutton.state &= ~(LockMask | OBDisplay::numLockMask() |
- OBDisplay::scrollLockMask());
- break;
- case KeyPress:
- e.xkey.state &= ~(LockMask | OBDisplay::numLockMask() |
- OBDisplay::scrollLockMask());
- break;
- case MotionNotify:
- _lasttime = e.xmotion.time;
- e.xmotion.state &= ~(LockMask | OBDisplay::numLockMask() |
- OBDisplay::scrollLockMask());
- break;
- case PropertyNotify:
- _lasttime = e.xproperty.time;
- break;
- case EnterNotify:
- case LeaveNotify:
- _lasttime = e.xcrossing.time;
- break;
+ // grab the lasttime and hack up the modifiers
+ switch (e.type) {
+ case ButtonPress:
+ case ButtonRelease:
+ _lasttime = e.xbutton.time;
+ e.xbutton.state &= ~(LockMask | OBDisplay::numLockMask() |
+ OBDisplay::scrollLockMask());
+ break;
+ case KeyPress:
+ e.xkey.state &= ~(LockMask | OBDisplay::numLockMask() |
+ OBDisplay::scrollLockMask());
+ break;
+ case MotionNotify:
+ _lasttime = e.xmotion.time;
+ e.xmotion.state &= ~(LockMask | OBDisplay::numLockMask() |
+ OBDisplay::scrollLockMask());
+ break;
+ case PropertyNotify:
+ _lasttime = e.xproperty.time;
+ break;
+ case EnterNotify:
+ case LeaveNotify:
+ _lasttime = e.xcrossing.time;
+ break;
+ }
+
+ dispatch(win, e);
}
+ }
+}
+
+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);
+ }
- if (e.type == FocusIn || e.type == FocusOut)
- // any other types are not ones we're interested in
- if (e.xfocus.detail != NotifyNonlinear)
- continue;
-
- if (e.type == FocusOut) {
- XEvent fi;
- // send a FocusIn first if one exists
- while (XCheckTypedEvent(OBDisplay::display, FocusIn, &fi)) {
- // any other types are not ones we're interested in
- if (fi.xfocus.detail == NotifyNonlinear) {
- dispatch(fi.xfocus.window, fi);
- break;
- }
+ // 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");
+
+ // 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;
}
}
-
- dispatch(win, e);
+ 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;
+ }
}
}
PyObject *resultobj;
ob::OBScreen *arg1 = (ob::OBScreen *) 0 ;
ob::OBClient *arg2 = (ob::OBClient *) 0 ;
- bool arg3 = (bool) false ;
PyObject * obj0 = 0 ;
PyObject * obj1 = 0 ;
- PyObject * obj2 = 0 ;
- if(!PyArg_ParseTuple(args,(char *)"OO|O:OBScreen_unmanageWindow",&obj0,&obj1,&obj2)) goto fail;
+ if(!PyArg_ParseTuple(args,(char *)"OO:OBScreen_unmanageWindow",&obj0,&obj1)) goto fail;
if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_ob__OBScreen,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
if ((SWIG_ConvertPtr(obj1,(void **) &arg2, SWIGTYPE_p_ob__OBClient,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail;
- if (obj2) {
- arg3 = (bool) PyInt_AsLong(obj2);
- if (PyErr_Occurred()) SWIG_fail;
- }
- (arg1)->unmanageWindow(arg2,arg3);
+ (arg1)->unmanageWindow(arg2);
Py_INCREF(Py_None); resultobj = Py_None;
return resultobj;