+ // This now waits until either an X event is received,
+ // or the select times out. So we should now process
+ // wxTimers in a reasonably timely fashion. However it
+ // does also mean that idle processing will happen more
+ // often, so we should probably limit idle processing to
+ // not be repeated more than every N milliseconds.
+
+ if (XPending( wxGlobalDisplay() ) == 0)
+ {
+#if wxUSE_NANOX
+ GR_TIMEOUT timeout = 10; // Milliseconds
+ // Wait for next event, or timeout
+ GrGetNextEventTimeout(& event, timeout);
+
+ // Fall through to ProcessEvent.
+ // we'll assume that ProcessEvent will just ignore
+ // the event if there was a timeout and no event.
+
+#else
+ struct timeval tv;
+ tv.tv_sec=0;
+ tv.tv_usec=10000; // TODO make this configurable
+ int fd = ConnectionNumber( wxGlobalDisplay() );
+
+ fd_set readset;
+ fd_set writeset;
+ wxFD_ZERO(&readset);
+ wxFD_ZERO(&writeset);
+ wxFD_SET(fd, &readset);
+
+ if (select( fd+1, &readset, &writeset, NULL, &tv ) != 0)
+ {
+ // An X11 event was pending, get it
+ if (wxFD_ISSET( fd, &readset ))
+ XNextEvent( wxGlobalDisplay(), &event );
+ }
+#endif
+ }
+ else
+ {
+ XNextEvent( wxGlobalDisplay(), &event );
+ }
+
+#if wxUSE_SOCKETS
+ // handle any pending socket events:
+ wxSelectDispatcher::DispatchPending();
+#endif