$NetBSD: patch-ac,v 1.3 2012/09/26 14:11:26 liamjfoy Exp $

Changes from NetBSD xsrc/external/mit/xorg-server/dist/\
hw/xfree86/os-support/bsd/bsd_mouse.c

----------------------------
revision 1.5
date: 2009/02/09 09:49:39;  author: plunky;  state: Exp;  lines: +16 -0
add horizontal mouse-wheel functionality to USB and WSMOUSE drivers
----------------------------
revision 1.4
date: 2009/02/02 03:06:37;  author: christos;  state: Exp;  lines: +7 -11
add a SetupMouse proc to condition the fd. Convert NetBSD's SetupAuto to
SetupMouse.
----------------------------
revision 1.3
date: 2009/01/19 00:54:29;  author: christos;  state: Exp;  lines: +2 -1
fix ioctl.
----------------------------
revision 1.2
date: 2009/01/13 18:43:46;  author: christos;  state: Exp;  lines: +25 -0
Set the mouse event protocol version. (untested, but head will be broken
unless I add this).
----------------------------

Changes from NetBSD xsrc/external/mit/xf86-input-mouse/dist/\
src/bsd_mouse.c

----------------------------
revision 1.3
date: 2012/01/26 23:43:06;  author: christos;  state: Exp;  lines: +25 -1
PR/45853: Pierre Pronchery: Add support for absolute positioning (tablets)
----------------------------

--- src/bsd_mouse.c.orig	2012-03-16 06:34:27.000000000 +0000
+++ src/bsd_mouse.c	2012-09-26 13:26:54.000000000 +0000
@@ -53,12 +53,15 @@
 
 #define HUP_GENERIC_DESKTOP     0x0001
 #define HUP_BUTTON              0x0009
+#define HUP_CONSUMER            0x000c
 
 #define HUG_X                   0x0030
 #define HUG_Y                   0x0031
 #define HUG_Z                   0x0032
 #define HUG_WHEEL               0x0038
 
+#define HUC_AC_PAN              0x0238
+
 #define HID_USAGE2(p,u) (((p) << 16) | u)
 
 /* The UMS mices have middle button as number 3 */
@@ -98,7 +101,7 @@ static int
 SupportedInterfaces(void)
 {
 #if defined(__NetBSD__)
-    return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO;
+    return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO | MSE_MISC;
 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
     return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO | MSE_MISC;
 #else
@@ -339,6 +342,23 @@ FindDevice(InputInfoPtr pInfo, const cha
 }
 #endif
 
+#if defined(__NetBSD__)
+static Bool
+SetupMouse(InputInfoPtr pInfo)
+{
+#ifdef WSCONS_SUPPORT
+#ifdef WSMOUSEIO_SETVERSION
+        int version = WSMOUSE_EVENT_VERSION;
+        if (ioctl(pInfo->fd, WSMOUSEIO_SETVERSION, &version) == -1) {
+            xf86Msg(X_WARNING, "%s: cannot set version\n", pInfo->name);
+            return FALSE;
+        }
+#endif
+#endif
+        return TRUE;
+}
+#endif
+
 #if (defined(__OpenBSD__) || defined(__NetBSD__)) && defined(WSCONS_SUPPORT)
 
 /* Only support wsmouse configuration for now */
@@ -409,7 +429,7 @@ wsconsReadInput(InputInfoPtr pInfo)
     n /= sizeof(struct wscons_event);
     while( n-- ) {
 	int buttons = pMse->lastButtons;
-	int dx = 0, dy = 0, dz = 0, dw = 0;
+	int dx = 0, dy = 0, dz = 0, dw = 0, x, y;
 	switch (event->type) {
 	case WSCONS_EVENT_MOUSE_UP:
 #define BUTBIT (1 << (event->value <= 2 ? 2 - event->value : event->value))
@@ -434,6 +454,30 @@ wsconsReadInput(InputInfoPtr pInfo)
 	    dw = event->value;
 	    break;
 #endif
+	case WSCONS_EVENT_MOUSE_ABSOLUTE_X:
+	    miPointerGetPosition (pInfo->dev, &x, &y);
+	    x = event->value;
+	    miPointerSetPosition (pInfo->dev, &x, &y);
+	    xf86PostMotionEvent(pInfo->dev, TRUE, 0, 2, x, y);
+	    ++event;
+	    continue;
+	case WSCONS_EVENT_MOUSE_ABSOLUTE_Y:
+	    miPointerGetPosition (pInfo->dev, &x, &y);
+	    y = event->value;
+	    miPointerSetPosition (pInfo->dev, &x, &y);
+	    xf86PostMotionEvent(pInfo->dev, TRUE, 0, 2, x, y);
+	    ++event;
+	    continue;
+#ifdef WSCONS_EVENT_MOUSE_ABSOLUTE_Z
+	case WSCONS_EVENT_MOUSE_ABSOLUTE_Z:
+	    ++event;
+	    continue;
+#endif
+#ifdef WSCONS_EVENT_MOUSE_ABSOLUTE_W
+	case WSCONS_EVENT_MOUSE_ABSOLUTE_W:
+	    ++event;
+	    continue;
+#endif
 	default:
 	    xf86Msg(X_WARNING, "%s: bad wsmouse event type=%d\n", pInfo->name,
 		    event->type);
@@ -473,7 +517,7 @@ typedef struct _UsbMseRec {
     hid_item_t loc_x;		/* x locator item */
     hid_item_t loc_y;		/* y locator item */
     hid_item_t loc_z;		/* z (wheel) locator item */
-    hid_item_t loc_w;		/* z (wheel) locator item */
+    hid_item_t loc_w;		/* w (pan) locator item */
     hid_item_t loc_btn[MSE_MAXBUTTONS]; /* buttons locator items */
    unsigned char *buffer;
 } UsbMseRec, *UsbMsePtr;
@@ -688,6 +732,9 @@ usbPreInit(InputInfoPtr pInfo, const cha
     if (hid_locate(reportDesc, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_WHEEL),
 		   hid_input, &pUsbMse->loc_z, pUsbMse->iid) < 0) {
     }
+    if (hid_locate(reportDesc, HID_USAGE2(HUP_CONSUMER, HUC_AC_PAN),
+		   hid_input, &pUsbMse->loc_w, pUsbMse->iid) < 0) {
+    }
 #else
     if (hid_locate(reportDesc, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X),
 		   hid_input, &pUsbMse->loc_x) < 0) {
@@ -700,6 +747,9 @@ usbPreInit(InputInfoPtr pInfo, const cha
     if (hid_locate(reportDesc, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_WHEEL),
 		   hid_input, &pUsbMse->loc_z) < 0) {
     }
+    if (hid_locate(reportDesc, HID_USAGE2(HUP_CONSUMER, HUC_AC_PAN),
+		   hid_input, &pUsbMse->loc_w) < 0) {
+    }
 #endif
     /* Probe for number of buttons */
     for (i = 1; i <= MSE_MAXBUTTONS; i++) {
@@ -772,6 +822,9 @@ OSMouseInit(int flags)
     p->SetupAuto = SetupAuto;
     p->SetMiscRes = SetMouseRes;
 #endif
+#if defined(__NetBSD__)
+    p->SetupMouse = SetupMouse;
+#endif
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__NetBSD__)
     p->FindDevice = FindDevice;
 #endif
