]> Dogcows Code - chaz/openbox/commitdiff
make focus work without races.
authorDana Jansens <danakj@orodu.net>
Wed, 8 Jan 2003 05:26:49 +0000 (05:26 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 8 Jan 2003 05:26:49 +0000 (05:26 +0000)
otk/display.cc
otk/eventdispatcher.cc
otk/eventdispatcher.hh

index 32674be9736787564ebb6799f33976a325741aca..6fc6117cd2e5a72af0a40de1523ff26201c2f642 100644 (file)
@@ -65,8 +65,8 @@ int OBDisplay::xerrorHandler(Display *d, XErrorEvent *e)
   {
     XGetErrorText(d, e->error_code, errtxt, 128);
     printf("X Error: %s\n", errtxt);
-//    if (e->error_code != BadWindow)
-//      abort();
+    if (e->error_code != BadWindow)
+      abort();
   }
 #else
   (void)d;
index 2ce13171f1238001c67ed99812e014259023501e..6beff8dc3bcc2019590f0d07dd5f6e480482397a 100644 (file)
 namespace otk {
 
 OtkEventDispatcher::OtkEventDispatcher()
-  : _fallback(0), _master(0), _focus(None)
+  : _fallback(0), _master(0)
 {
-  _focus_e.xfocus.display = OBDisplay::display;
-  _focus_e.xfocus.mode = NotifyNormal;
-  _focus_e.xfocus.detail = NotifyNonlinear;
-
-  _crossing_e.xcrossing.display = OBDisplay::display;
-  _crossing_e.xcrossing.mode = NotifyNormal;
-  _crossing_e.xcrossing.detail = NotifyNonlinear;
 }
 
 OtkEventDispatcher::~OtkEventDispatcher()
@@ -44,9 +37,6 @@ void OtkEventDispatcher::clearHandler(Window id)
 void OtkEventDispatcher::dispatchEvents(void)
 {
   XEvent e;
-  Window focus = None, unfocus = None;
-/*  Window enter = None, leave = None;
-  Window enter_root = None, leave_root = None;*/
 
   while (XPending(OBDisplay::display)) {
     XNextEvent(OBDisplay::display, &e);
@@ -98,98 +88,45 @@ void OtkEventDispatcher::dispatchEvents(void)
       break;
     }
 
-    // madly compress all focus events
-    if (e.type == FocusIn) {
-      // any other types are not ones we're interested in
-      if (e.xfocus.detail == NotifyNonlinear) {
-        focus = e.xfocus.window;
-        unfocus = None;
-        //printf("FocusIn focus=%lx unfocus=%lx\n", focus, unfocus);
-      }
-    } else if (e.type == FocusOut) {
-      // any other types are not ones we're interested in
-      if (e.xfocus.detail == NotifyNonlinear) {
-        unfocus = e.xfocus.window;
-        focus = None;
-        //printf("FocusOut focus=%lx unfocus=%lx\n", focus, unfocus);
-        }
-    /*
-    // madly compress all crossing events
-    } else if (e.type == EnterNotify) {
+    if (e.type == FocusIn || e.type == FocusOut)
       // any other types are not ones we're interested in
-      if (e.xcrossing.mode == NotifyNormal) {
+      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
-        enter = e.xcrossing.window;
-        enter_root = e.xcrossing.root;
-        //printf("Enter enter=%lx leave=%lx\n", enter, leave);
-      }
-    } else if (e.type == LeaveNotify) {
-      // any other types are not ones we're interested in
-      if (e.xcrossing.mode == NotifyNormal) {
-        leave = e.xcrossing.window;
-        leave_root = e.xcrossing.root;
-        //printf("Leave enter=%lx leave=%lx\n", enter, leave);
+        printf("found focusin\n");
+        if (fi.xfocus.detail == NotifyNonlinear) {
+          printf("sending focusin\n");
+          dispatch(fi.xfocus.window, fi);
+          break;
+        }
       }
-    */
-    } else {
-      // normal events
-      dispatch(win, e);
-    }
-  }
-
-  if (unfocus != None) {
-    // the last focus event was an FocusOut, so where the hell is the focus at?
-    //printf("UNFOCUSING: %lx\n", unfocus);
-    _focus_e.xfocus.type = FocusOut;
-    _focus_e.xfocus.window = unfocus;
-    dispatch(_focus_e.xfocus.window, _focus_e);
-
-    _focus = None;
-  } else if (focus != None && focus != _focus) {
-    // the last focus event was a FocusIn, so unfocus what used to be focus and
-    // focus this new target
-    //printf("FOCUSING: %lx\n", focus);
-    _focus_e.xfocus.type = FocusIn;
-    _focus_e.xfocus.window = focus;
-    dispatch(_focus_e.xfocus.window, _focus_e);
-
-    if (_focus != None) {
-      //printf("UNFOCUSING: %lx\n", _focus);
-      _focus_e.xfocus.type = FocusOut;
-      _focus_e.xfocus.window = _focus;
-      dispatch(_focus_e.xfocus.window, _focus_e);
     }
     
-    _focus = focus;
-  }
-  /*
-  if (leave != None) {
-    _crossing_e.xcrossing.type = LeaveNotify;
-    _crossing_e.xcrossing.window = leave;
-    _crossing_e.xcrossing.root = leave_root;
-    dispatch(_crossing_e.xcrossing.window, _crossing_e);
+    dispatch(win, e);
   }
-  if (enter != None) {
-    _crossing_e.xcrossing.type = EnterNotify;
-    _crossing_e.xcrossing.window = enter;
-    _crossing_e.xcrossing.root = enter_root;
-    dispatch(_crossing_e.xcrossing.window, _crossing_e);
-    }*/
 }
 
-void OtkEventDispatcher::dispatch(Window win, const XEvent &e) {
+void OtkEventDispatcher::dispatch(Window win, const XEvent &e)
+{
   OtkEventHandler *handler = 0;
   OtkEventMap::iterator it;
 
+  // master gets everything first
   if (_master)
     _master->handle(e);
 
+  // find handler for the chosen window
   it = _map.find(win);
-  
-  if (it != _map.end())
+
+  if (it != _map.end()) {
+    // if we found a handler
     handler = it->second;
-  // these ConfigureRequests require some special attention
-  else if (e.type == ConfigureRequest) {
+  } else if (e.type == ConfigureRequest) {
     // unhandled configure requests must be used to configure the window
     // directly
     XWindowChanges xwc;
@@ -204,8 +141,10 @@ void OtkEventDispatcher::dispatch(Window win, const XEvent &e) {
       
     XConfigureWindow(otk::OBDisplay::display, e.xconfigurerequest.window,
                      e.xconfigurerequest.value_mask, &xwc);
-  } else
+  } else {
+    // grab a falback if it exists
     handler = _fallback;
+  }
 
   if (handler)
     handler->handle(e);
index caf33ad0817b454e0f52f9ec41897082e046b0f9..97f86564ac6ff30f472bb74ac07d5597a66efbf0 100644 (file)
@@ -38,9 +38,6 @@ private:
   OtkEventMap _map;
   OtkEventHandler *_fallback;
   OtkEventHandler *_master;
-  Window _focus;
-  XEvent _focus_e;
-  XEvent _crossing_e;
 
   //! The time at which the last XEvent with a time was received
   Time _lasttime;
This page took 0.03079 seconds and 4 git commands to generate.