Instead of actually processing input in the handler, raise just enough
of a dispatch exception to bomb out of request processing and handle input
instead.  This gets us back to exactly two input processing methods:

- input thread
- main loop dispatch

where the SIGIO handler is merely an optimization for the second case.

Signed-off-by: Adam Jackson <[email protected]>
---
 hw/xfree86/common/xf86Events.c |   28 ++++++++++++++++++----------
 1 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 5166adc..c42b5ce 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -302,29 +302,37 @@ xf86SigioReadInput(int fd, void *closure)
 }
 
 /*
- * xf86AddEnabledDevice --
- *
+ * The host OS may or may not have working SIGIO handlers.  If they don't,
+ * then the time_to_yield callback never gets called, and input will simply
+ * run out of the main loop whenever it gets around to it.
  */
+
+static void
+time_to_yield(int fd, void *closure)
+{
+    isItTimeToYield = 1;
+}
+
 void
 xf86AddEnabledDevice(InputInfoPtr pInfo)
 {
-    if (!xf86silkenMouseDisableFlag)
+    if (!xf86silkenMouseDisableFlag) {
        InputThreadRegisterDev(pInfo->fd, (void*) pInfo->read_input, pInfo);
-    else
+    } else {
+       xf86InstallSIGIOHandler(pInfo->fd, time_to_yield, NULL);
        AddEnabledDevice(pInfo->fd);
+    }
 }
 
-/*
- * xf86RemoveEnabledDevice --
- *
- */
 void
 xf86RemoveEnabledDevice(InputInfoPtr pInfo)
 {
-    if (!xf86silkenMouseDisableFlag)
+    if (!xf86silkenMouseDisableFlag) {
        InputThreadUnregisterDev(pInfo->fd);
-    else
+    } else {
+       xf86RemoveSIGIOHandler(pInfo->fd);
        RemoveEnabledDevice(pInfo->fd);
+    }
 }
 
 static int *xf86SignalIntercept = NULL;
-- 
1.7.3.2

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to