$NetBSD: patch-ag,v 1.5 2009/03/14 11:00:21 apb 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).
----------------------------

--- hw/xfree86/os-support/bsd/bsd_mouse.c.orig	2009-03-12 19:22:51.000000000 +0200
+++ hw/xfree86/os-support/bsd/bsd_mouse.c
@@ -55,12 +55,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 */
@@ -340,6 +343,25 @@
 }
 #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(WSCONS_SUPPORT)
 
 /* Only support wsmouse configuration for now */
@@ -430,6 +452,11 @@
 	    dz = event->value;
 	    break;
 #endif
+#ifdef WSCONS_EVENT_MOUSE_DELTA_W
+	case WSCONS_EVENT_MOUSE_DELTA_W:
+	    dw = event->value;
+	    break;
+#endif
 	default:
 	    xf86Msg(X_WARNING, "%s: bad wsmouse event type=%d\n", pInfo->name,
 		    event->type);
@@ -491,6 +518,7 @@
     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;		/* w (pan) locator item */
     hid_item_t loc_btn[MSE_MAXBUTTONS]; /* buttons locator items */
    unsigned char *buffer;
 } UsbMseRec, *UsbMsePtr;
@@ -610,6 +638,7 @@
     dx = hid_get_data(pBuf, &pUsbMse->loc_x);
     dy = hid_get_data(pBuf, &pUsbMse->loc_y);
     dz = hid_get_data(pBuf, &pUsbMse->loc_z);
+    dw = hid_get_data(pBuf, &pUsbMse->loc_w);
 
     buttons = 0;
     for (n = 0; n < pMse->buttons; n++) {
@@ -701,6 +730,9 @@
     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) {
@@ -713,6 +745,9 @@
     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++) {
@@ -783,6 +818,9 @@
     p->SetupAuto = SetupAuto;
     p->SetMiscRes = SetMouseRes;
 #endif
+#if defined(__NetBSD__)
+    p->SetupMouse = SetupMouse;
+#endif
 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__) || defined(__DragonFly__)
     p->FindDevice = FindDevice;
 #endif
