xserver: Branch 'master' - 3 commits

Daniel Stone daniels at kemper.freedesktop.org
Wed Mar 21 00:20:14 EET 2007


 hw/xfree86/common/xf86DGA.c         |  178 ++++++++++++++++++++++++++----------
 hw/xfree86/common/xf86Helper.c      |   13 ++
 hw/xfree86/common/xf86Xinput.c      |   40 ++++++++
 hw/xfree86/common/xf86Xinput.h      |    8 +
 hw/xfree86/dixmods/extmod/dgaproc.h |    5 -
 mi/mi.h                             |    3 
 mi/mieq.c                           |   24 ++++
 7 files changed, 223 insertions(+), 48 deletions(-)

New commits:
diff-tree 9398d62f27ee1b287e4458fd8b011c10f7b59efd (from 0f75c47e0c5f4b2778930a6fabf894fc1dffd9d3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Mar 21 00:18:24 2007 +0200

    XFree86 input: Add backwards compatibility for motion history
    Add the old motion history API back, as a shim around the new mi API.

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 93c89fd..913735b 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -2981,3 +2981,16 @@ xf86IsUnblank(int mode)
 	return TRUE;
     }
 }
+
+_X_EXPORT void
+xf86MotionHistoryAllocate(LocalDevicePtr local)
+{
+    AllocateMotionHistory(local->dev);
+}
+
+_X_EXPORT int
+xf86GetMotionEvents(DeviceIntPtr pDev, xTimecoord *buff, unsigned long start,
+                    unsigned long stop, ScreenPtr pScreen)
+{
+    return GetMotionHistory(pDev, buff, start, stop, pScreen);
+}
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index b8f4b69..c9c8059 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -132,6 +132,9 @@ xf86ProcessCommonOptions(LocalDevicePtr 
     } else {
         xf86Msg(X_CONFIG, "%s: doesn't report drag events\n", local->name);
     }
+
+    /* Backwards compatibility. */
+    local->history_size = GetMotionHistorySize();
 }
 
 /***********************************************************************
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 47dbc70..b2bc8de 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -86,6 +86,9 @@
 #define XI_PRIVATE(dev) \
 	(((LocalDevicePtr)((dev)->public.devicePrivate))->private)
 
+/* Stupid API backwards-compatibility. */
+#define TS_Raw 60
+#define TS_Scaled 61
 
 #ifdef XINPUT
 /* This holds the input driver entry and module information. */
@@ -144,6 +147,7 @@ typedef struct _LocalDeviceRec {
     InputDriverPtr	    drv;
     pointer		    module;
     pointer		    options;
+    unsigned int            history_size;
 } LocalDeviceRec, *LocalDevicePtr, InputInfoRec, *InputInfoPtr;
 
 typedef struct _DeviceAssocRec 
diff-tree 0f75c47e0c5f4b2778930a6fabf894fc1dffd9d3 (from 80d29475b9a2ebbb303a8e324e09a15c528d5556)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Mar 21 00:12:02 2007 +0200

    xfree86 input: Re-enable DGA support
    Re-enable DGA support for relative mouse motion.

diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 204457f..28058b5 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -51,11 +51,14 @@
 
 static unsigned long DGAGeneration = 0;
 static int DGAScreenIndex = -1;
+static int mieq_installed = 0;
 
 static Bool DGACloseScreen(int i, ScreenPtr pScreen);
 static void DGADestroyColormap(ColormapPtr pmap);
 static void DGAInstallColormap(ColormapPtr pmap);
 static void DGAUninstallColormap(ColormapPtr pmap);
+static void DGAHandleEvent(int screen_num, xEvent *event,
+                           DeviceIntPtr device, int nevents);
 
 static void
 DGACopyModeInfo(
@@ -96,7 +99,6 @@ typedef struct {
    Bool			grabKeyboard;
 } DGAScreenRec, *DGAScreenPtr;
 
-
 _X_EXPORT Bool
 DGAInit(
    ScreenPtr pScreen,
@@ -146,7 +148,6 @@ DGAInit(
 	    modes[i].flags &= ~DGA_PIXMAP_AVAILABLE;
 #endif
 
-
     pScreen->devPrivates[DGAScreenIndex].ptr = (pointer)pScreenPriv;
     pScreenPriv->CloseScreen = pScreen->CloseScreen;
     pScreen->CloseScreen = DGACloseScreen;
@@ -157,11 +158,6 @@ DGAInit(
     pScreenPriv->UninstallColormap = pScreen->UninstallColormap;
     pScreen->UninstallColormap = DGAUninstallColormap;
 
-    /*
-     * This is now set in InitOutput().
-     *
-    pScrn->SetDGAMode = xf86SetDGAMode;
-     */
 
     return TRUE;
 }
@@ -247,12 +243,22 @@ FreeMarkedVisuals(ScreenPtr pScreen)
     }
 }
 
-
 static Bool 
 DGACloseScreen(int i, ScreenPtr pScreen)
 {
    DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
 
+   if (XDGAEventBase) {
+       OsBlockSignals();
+       ProcessInputEvents();
+       mieqSetHandler(*XDGAEventBase + MotionNotify, NULL);
+       mieqSetHandler(*XDGAEventBase + ButtonPress, NULL);
+       mieqSetHandler(*XDGAEventBase + ButtonRelease, NULL);
+       mieqSetHandler(*XDGAEventBase + KeyPress, NULL);
+       mieqSetHandler(*XDGAEventBase + KeyRelease, NULL);
+       OsReleaseSignals();
+    }
+
    FreeMarkedVisuals(pScreen);
 
    pScreen->CloseScreen = pScreenPriv->CloseScreen;
@@ -462,6 +468,15 @@ DGASetInputMode(int index, Bool keyboard
    {
       pScreenPriv->grabMouse = mouse;
       pScreenPriv->grabKeyboard = keyboard;
+
+      if (!mieq_installed) {
+          mieqSetHandler(*XDGAEventBase + MotionNotify, DGAHandleEvent);
+          mieqSetHandler(*XDGAEventBase + ButtonPress, DGAHandleEvent);
+          mieqSetHandler(*XDGAEventBase + ButtonRelease, DGAHandleEvent);
+          mieqSetHandler(*XDGAEventBase + KeyPress, DGAHandleEvent);
+          mieqSetHandler(*XDGAEventBase + KeyRelease, DGAHandleEvent);
+          mieq_installed = 1;
+      }
    }
 }
 
@@ -903,21 +918,93 @@ DGAVTSwitch(void)
    return TRUE;
 }
 
+Bool
+DGAStealKeyEvent(int index, int key_code, int is_down)
+{
+   DGAScreenPtr pScreenPriv;
+   dgaEvent    de;
+    
+   if(DGAScreenIndex < 0) /* no DGA */
+        return FALSE;
+
+   pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
 
-/* We have the power to steal or modify events that are about to get queued */
+   if(!pScreenPriv || !pScreenPriv->grabKeyboard) /* no direct mode */
+        return FALSE; 
+
+    de.u.u.type = *XDGAEventBase + (is_down ? KeyPress : KeyRelease);
+    de.u.u.detail = key_code;
+    de.u.event.time = GetTimeInMillis();
+    mieqEnqueue (inputInfo.keyboard, (xEvent *) &de);
+
+   return TRUE;
+}  
+
+static int  DGAMouseX, DGAMouseY;
 
 Bool
-DGAStealKeyEvent(int index, xEvent *e)
+DGAStealMotionEvent(int index, int dx, int dy)
 {
-}
+   DGAScreenPtr pScreenPriv;
+    dgaEvent    de;
 
-static int  DGAMouseX, DGAMouseY;
+   if(DGAScreenIndex < 0) /* no DGA */
+        return FALSE;
+    
+   pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
+
+   if(!pScreenPriv || !pScreenPriv->grabMouse) /* no direct mode */
+        return FALSE;
+
+    DGAMouseX += dx;
+    if (DGAMouseX < 0)
+        DGAMouseX = 0;
+    else if (DGAMouseX > screenInfo.screens[index]->width)
+        DGAMouseX = screenInfo.screens[index]->width;
+    DGAMouseY += dy;
+    if (DGAMouseY < 0)
+        DGAMouseY = 0;
+    else if (DGAMouseY > screenInfo.screens[index]->height)
+        DGAMouseY = screenInfo.screens[index]->height;
+    de.u.u.type = *XDGAEventBase + MotionNotify;
+    de.u.u.detail = 0;
+    de.u.event.time = GetTimeInMillis();
+    de.u.event.dx = dx;
+    de.u.event.dy = dy;
+    de.u.event.pad1 = DGAMouseX;
+    de.u.event.pad2 = DGAMouseY;
+    mieqEnqueue (inputInfo.pointer, (xEvent *) &de);
+    return TRUE;
+}
 
 Bool
-DGAStealMouseEvent(int index, xEvent *e, int dx, int dy)
+DGAStealButtonEvent(int index, int button, int is_down)
 {
+    DGAScreenPtr pScreenPriv;
+    dgaEvent de;
+
+    if (DGAScreenIndex < 0)
+        return FALSE;
+    
+    pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
+
+    if (!pScreenPriv || !pScreenPriv->grabMouse)
+        return FALSE;
+
+    de.u.u.type = *XDGAEventBase + (is_down ? ButtonPress : ButtonRelease);
+    de.u.u.detail = button;
+    de.u.event.time = GetTimeInMillis();
+    de.u.event.dx = 0;
+    de.u.event.dy = 0;
+    de.u.event.pad1 = DGAMouseX;
+    de.u.event.pad2 = DGAMouseY;
+    mieqEnqueue (inputInfo.pointer, (xEvent *) &de);
+
+    return TRUE;
 }
 
+/* We have the power to steal or modify events that are about to get queued */
+
 Bool
 DGAIsDgaEvent (xEvent *e)
 {
@@ -1124,39 +1211,6 @@ DGAProcessPointerEvent (ScreenPtr pScree
     }
 }
 
-Bool
-DGADeliverEvent (ScreenPtr pScreen, xEvent *e)
-{
-    dgaEvent	    *de = (dgaEvent *) e;
-    DGAScreenPtr    pScreenPriv;
-    int		    coreEquiv;
-
-    /* no DGA */
-    if (DGAScreenIndex < 0 || XDGAEventBase == 0)
-	return FALSE;
-    pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
-    
-    /* DGA not initialized on this screen */
-    if (!pScreenPriv)
-	return FALSE;
-    
-    coreEquiv = de->u.u.type - *XDGAEventBase;
-    /* Not a DGA event */
-    if (coreEquiv < KeyPress || coreEquiv > MotionNotify)
-	return FALSE;
-    
-    switch (coreEquiv) {
-    case KeyPress:
-    case KeyRelease:
-	DGAProcessKeyboardEvent (pScreen, de, inputInfo.keyboard);
-	break;
-    default:
-	DGAProcessPointerEvent (pScreen, de, inputInfo.pointer);
-	break;
-    }
-    return TRUE;
-}
-
 _X_EXPORT Bool 
 DGAOpenFramebuffer(
    int index,
@@ -1215,3 +1269,35 @@ DGAGetOldDGAMode(int index)
    return 0;
 }
 
+static void
+DGAHandleEvent(int screen_num, xEvent *event, DeviceIntPtr device, int nevents)
+{
+    dgaEvent	    *de = (dgaEvent *) event;
+    ScreenPtr       pScreen = screenInfo.screens[screen_num];
+    DGAScreenPtr    pScreenPriv;
+    int		    coreEquiv;
+
+    /* no DGA */
+    if (DGAScreenIndex < 0 || XDGAEventBase == 0)
+	return;
+    pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen);
+    
+    /* DGA not initialized on this screen */
+    if (!pScreenPriv)
+	return;
+    
+    coreEquiv = de->u.u.type - *XDGAEventBase;
+    /* Not a DGA event; shouldn't happen, but you never know. */
+    if (coreEquiv < KeyPress || coreEquiv > MotionNotify)
+	return;
+    
+    switch (coreEquiv) {
+    case KeyPress:
+    case KeyRelease:
+	DGAProcessKeyboardEvent (pScreen, de, inputInfo.keyboard);
+	break;
+    default:
+	DGAProcessPointerEvent (pScreen, de, inputInfo.pointer);
+	break;
+    }
+}
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 16e330d..b8f4b69 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -90,6 +90,10 @@
 
 #include "mi.h"
 
+#ifdef XFreeXDGA
+#include "dgaproc.h"
+#endif
+
 xEvent *xf86Events = NULL;
 
 static Bool
@@ -395,10 +399,12 @@ xf86PostMotionEvent(DeviceIntPtr	device,
 {
     va_list var;
     int i = 0, nevents = 0;
+    int dx, dy;
     Bool drag = xf86SendDragEvents(device);
     int *valuators = NULL;
     int flags = 0;
     xEvent *xE = NULL;
+    int index;
 
     if (is_absolute)
         flags = POINTER_ABSOLUTE;
@@ -412,6 +418,22 @@ xf86PostMotionEvent(DeviceIntPtr	device,
         valuators[i] = va_arg(var, int);
     va_end(var);
 
+#if XFreeXDGA
+    if (first_valuator == 0 && num_valuators >= 2) {
+        index = miPointerGetScreen(inputInfo.pointer)->myNum;
+        if (is_absolute) {
+            dx = valuators[0] - device->valuator->lastx;
+            dy = valuators[1] - device->valuator->lasty;
+        }
+        else {
+            dx = valuators[0];
+            dy = valuators[1];
+        }
+        if (DGAStealMotionEvent(index, dx, dy))
+            goto out;
+    }
+#endif
+
     if (!xf86Events)
         xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
     if (!xf86Events)
@@ -430,6 +452,7 @@ xf86PostMotionEvent(DeviceIntPtr	device,
         }
     }
 
+out:
     xfree(valuators);
 }
 
@@ -476,6 +499,13 @@ xf86PostButtonEvent(DeviceIntPtr	device,
     va_list var;
     int *valuators = NULL;
     int i = 0, nevents = 0;
+    int index;
+
+#if XFreeXDGA
+    index = miPointerGetScreen(inputInfo.pointer)->myNum;
+    if (DGAStealButtonEvent(index, button, is_down))
+        return;
+#endif
     
     valuators = xcalloc(sizeof(int), num_valuators);
 
@@ -552,6 +582,13 @@ xf86PostKeyboardEvent(DeviceIntPtr      
                       int               is_down)
 {
     int nevents = 0, i = 0;
+    int index;
+
+#if XFreeXDGA
+    index = miPointerGetScreen(inputInfo.pointer)->myNum;
+    if (DGAStealKeyEvent(index, key_code, is_down))
+        return;
+#endif
 
     if (!xf86Events)
         xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index fe65643..47dbc70 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -191,6 +191,10 @@ InputInfoPtr xf86AllocateInput(InputDriv
 InputDriverPtr xf86LookupInputDriver(const char *name);
 InputInfoPtr xf86LookupInput(const char *name);
 void xf86DeleteInput(InputInfoPtr pInp, int flags);
+void xf86MotionHistoryAllocate(LocalDevicePtr local);
+int xf86GetMotionEvents(DeviceIntPtr dev, xTimecoord *buff,
+                        unsigned long start, unsigned long stop,
+                        ScreenPtr pScreen);
 
 /* xf86Option.c */
 void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts,
diff --git a/hw/xfree86/dixmods/extmod/dgaproc.h b/hw/xfree86/dixmods/extmod/dgaproc.h
index 5e424af..aaea4e2 100644
--- a/hw/xfree86/dixmods/extmod/dgaproc.h
+++ b/hw/xfree86/dixmods/extmod/dgaproc.h
@@ -120,8 +120,9 @@ int DGAGetOldDGAMode(int Index);
 int DGAGetModeInfo(int Index, XDGAModePtr mode, int num);
 
 Bool DGAVTSwitch(void);
-Bool DGAStealMouseEvent(int Index, xEvent *e, int dx, int dy);
-Bool DGAStealKeyEvent(int Index, xEvent *e);
+Bool DGAStealButtonEvent(int Index, int button, int is_down);
+Bool DGAStealMotionEvent(int Index, int dx, int dy);
+Bool DGAStealKeyEvent(int Index, int key_code, int is_down);
 Bool DGAIsDgaEvent (xEvent *e);
 
 Bool DGADeliverEvent (ScreenPtr pScreen, xEvent *e);
diff-tree 80d29475b9a2ebbb303a8e324e09a15c528d5556 (from b8df961843a95b29258ae9c5d46ccfc620d8de1c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Mar 21 00:10:38 2007 +0200

    mieq: Allow event handlers for arbitrary events to be set
    Allow arbitrary events to use mieq by letting custom handlers be set.

diff --git a/mi/mi.h b/mi/mi.h
index 8d9d120..53b5c44 100644
--- a/mi/mi.h
+++ b/mi/mi.h
@@ -186,6 +186,9 @@ extern void mieqProcessInputEvents(
     void
 );
 
+typedef void (*mieqHandler)(int, xEventPtr, DeviceIntPtr, int);
+void mieqSetHandler(int event, mieqHandler handler);
+
 /* miexpose.c */
 
 extern RegionPtr miHandleExposures(
diff --git a/mi/mieq.c b/mi/mieq.c
index 507cdd3..5bd87eb 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -74,6 +74,7 @@ typedef struct _EventQueue {
     EventRec         events[QUEUE_SIZE]; /* static allocation for signals */
     ScreenPtr        pEnqueueScreen;     /* screen events are being delivered to */
     ScreenPtr        pDequeueScreen;     /* screen events are being dispatched to */
+    mieqHandler      handlers[128];      /* custom event handler */
 } EventQueueRec, *EventQueuePtr;
 
 static EventQueueRec miEventQueue;
@@ -81,11 +82,15 @@ static EventQueueRec miEventQueue;
 Bool
 mieqInit()
 {
+    int i;
+
     miEventQueue.head = miEventQueue.tail = 0;
     miEventQueue.lastEventTime = GetTimeInMillis ();
     miEventQueue.lastMotion = FALSE;
     miEventQueue.pEnqueueScreen = screenInfo.screens[0];
     miEventQueue.pDequeueScreen = miEventQueue.pEnqueueScreen;
+    for (i = 0; i < 128; i++)
+        miEventQueue.handlers[i] = NULL;
     SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
     return TRUE;
 }
@@ -178,6 +183,16 @@ mieqSwitchScreen(ScreenPtr pScreen, Bool
 	miEventQueue.pDequeueScreen = pScreen;
 }
 
+void
+mieqSetHandler(int event, mieqHandler handler)
+{
+    if (handler && miEventQueue.handlers[event])
+        ErrorF("mieq: warning: overriding existing handler %p with %p for "
+               "event %d\n", miEventQueue.handlers[event], handler, event);
+
+    miEventQueue.handlers[event] = handler;
+}
+
 /* Call this from ProcessInputEvents(). */
 void
 mieqProcessInputEvents()
@@ -215,6 +230,15 @@ mieqProcessInputEvents()
             else
                 ++miEventQueue.head;
 
+            /* If someone's registered a custom event handler, let them
+             * steal it. */
+            if (miEventQueue.handlers[e->event->u.u.type]) {
+                miEventQueue.handlers[e->event->u.u.type](miEventQueue.pDequeueScreen->myNum,
+                                                          e->event, dev,
+                                                          e->nevents);
+                return;
+            }
+
             /* If this is a core event, make sure our keymap, et al, is
              * changed to suit. */
             if (e->event[0].u.u.type == KeyPress ||



More information about the xorg-commit mailing list