pkgsrc-WIP-changes archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
xf86-input-mouse-dfbsd: Replace xf86-input-mouse Free/DragonFlyBSD libusb
Module Name: pkgsrc-wip
Committed By: David Shao <davshao%gmail.com@localhost>
Pushed By: dshao
Date: Tue Jan 17 00:48:53 2017 -0800
Changeset: fb923a2fd0528b8f72393e35e04326488dfb31ba
Modified Files:
Makefile
Added Files:
xf86-input-mouse-dfbsd/DESCR
xf86-input-mouse-dfbsd/Makefile
xf86-input-mouse-dfbsd/PLIST
xf86-input-mouse-dfbsd/TODO
xf86-input-mouse-dfbsd/distinfo
xf86-input-mouse-dfbsd/options.mk
xf86-input-mouse-dfbsd/patch-src_bsd__mouse.c
xf86-input-mouse-dfbsd/patches/patch-src_bsd__mouse.c
xf86-input-mouse-dfbsd/patches/patch-src_mouse.c
xf86-input-mouse-dfbsd/patches/patch-src_mouse.h
xf86-input-mouse-dfbsd/patches/patch-src_mousePriv.h
xf86-input-mouse-dfbsd/patches/patch-src_sun__mouse.c
Log Message:
xf86-input-mouse-dfbsd: Replace xf86-input-mouse Free/DragonFlyBSD libusb
Implements patches from FreeBSD ports / DragonFly dports
discussed in pkg/50068
(x11/xf86-input-mouse dports patches for DragonFly and FreeBSD)
To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=fb923a2fd0528b8f72393e35e04326488dfb31ba
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
diffstat:
Makefile | 1 +
xf86-input-mouse-dfbsd/DESCR | 1 +
xf86-input-mouse-dfbsd/Makefile | 26 +
xf86-input-mouse-dfbsd/PLIST | 5 +
xf86-input-mouse-dfbsd/TODO | 5 +
xf86-input-mouse-dfbsd/distinfo | 11 +
xf86-input-mouse-dfbsd/options.mk | 45 +
xf86-input-mouse-dfbsd/patch-src_bsd__mouse.c | 1272 +++++++++++++++++++
.../patches/patch-src_bsd__mouse.c | 1286 ++++++++++++++++++++
xf86-input-mouse-dfbsd/patches/patch-src_mouse.c | 227 ++++
xf86-input-mouse-dfbsd/patches/patch-src_mouse.h | 51 +
.../patches/patch-src_mousePriv.h | 33 +
.../patches/patch-src_sun__mouse.c | 27 +
13 files changed, 2990 insertions(+)
diffs:
diff --git a/Makefile b/Makefile
index 95c7a0d..de34447 100644
--- a/Makefile
+++ b/Makefile
@@ -4352,6 +4352,7 @@ SUBDIR+= xdotool
SUBDIR+= xebece
SUBDIR+= xerces-c-2.8.0
SUBDIR+= xesam-glib
+SUBDIR+= xf86-input-mouse-dfbsd
SUBDIR+= xf86-input-synaptics
SUBDIR+= xf86-input-vboxmouse
SUBDIR+= xf86-video-geode
diff --git a/xf86-input-mouse-dfbsd/DESCR b/xf86-input-mouse-dfbsd/DESCR
new file mode 100644
index 0000000..3a741cf
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/DESCR
@@ -0,0 +1 @@
+This is the mouse driver for the modular Xorg server.
diff --git a/xf86-input-mouse-dfbsd/Makefile b/xf86-input-mouse-dfbsd/Makefile
new file mode 100644
index 0000000..0ac6246
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/Makefile
@@ -0,0 +1,26 @@
+# $NetBSD: Makefile,v 1.27 2016/11/17 08:06:52 wiz Exp $
+
+DISTNAME= xf86-input-mouse-1.9.2
+CATEGORIES= x11
+MASTER_SITES= ${MASTER_SITE_XORG:=driver/}
+EXTRACT_SUFX= .tar.bz2
+
+MAINTAINER= joerg%NetBSD.org@localhost
+HOMEPAGE= http://xorg.freedesktop.org/
+COMMENT= Modular Xorg mouse driver
+
+USE_LIBTOOL= YES
+GNU_CONFIGURE= YES
+USE_TOOLS+= pkg-config
+
+CONFIGURE_ENV.SunOS+= DRIVER_MAN_SUFFIX=4
+
+.include "options.mk"
+
+.include "../../x11/randrproto/buildlink3.mk"
+.include "../../x11/inputproto/buildlink3.mk"
+.include "../../x11/kbproto/buildlink3.mk"
+.include "../../x11/xproto/buildlink3.mk"
+.include "../../x11/modular-xorg-server/buildlink3.mk"
+
+.include "../../mk/bsd.pkg.mk"
diff --git a/xf86-input-mouse-dfbsd/PLIST b/xf86-input-mouse-dfbsd/PLIST
new file mode 100644
index 0000000..f41ae1c
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/PLIST
@@ -0,0 +1,5 @@
+@comment $NetBSD: PLIST,v 1.3 2013/05/16 05:53:59 richard Exp $
+include/xorg/xf86-mouse-properties.h
+lib/pkgconfig/xorg-mouse.pc
+lib/xorg/modules/input/mouse_drv.la
+man/man4/mousedrv.4
diff --git a/xf86-input-mouse-dfbsd/TODO b/xf86-input-mouse-dfbsd/TODO
new file mode 100644
index 0000000..fa30aa8
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/TODO
@@ -0,0 +1,5 @@
+Copy port to x11/xf86-input-mouse, do not install from wip.
+
+Implements patches from FreeBSD ports / DragonFly dports
+discussed in pkg/50068
+(x11/xf86-input-mouse dports patches for DragonFly and FreeBSD)
diff --git a/xf86-input-mouse-dfbsd/distinfo b/xf86-input-mouse-dfbsd/distinfo
new file mode 100644
index 0000000..e5669ca
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/distinfo
@@ -0,0 +1,11 @@
+$NetBSD: distinfo,v 1.19 2016/11/17 08:06:52 wiz Exp $
+
+SHA1 (xf86-input-mouse-1.9.2.tar.bz2) = d3a0839ad5a33665bb261a4fba33e3a6271817dc
+RMD160 (xf86-input-mouse-1.9.2.tar.bz2) = c7d68c0de19787ceda4e4307b113b6d74e0cb62d
+SHA512 (xf86-input-mouse-1.9.2.tar.bz2) = 30fdc4f699d434e2fb4a9f8d2f4f980538d646a6e4d2d572737fc5498c0bce0fb1ba080173ea0aa3480f574dde3f58d5a7ac837afdb29640ccb092b3f18ff209
+Size (xf86-input-mouse-1.9.2.tar.bz2) = 377685 bytes
+SHA1 (patch-src_bsd__mouse.c) = fe3ab90a099583a881cddbd1f7da0e689de2253a
+SHA1 (patch-src_mouse.c) = a9ecfd46516fbab2dc4d8e395748a0b6312a24c7
+SHA1 (patch-src_mouse.h) = 2c663b40f8c845ed0f03998edf6d5ddaf4876b71
+SHA1 (patch-src_mousePriv.h) = 20400aecdff2255b0bbf1e42a3d813054814acda
+SHA1 (patch-src_sun__mouse.c) = e23157bc9bdb5840ac008648d1c9a894e7a900cc
diff --git a/xf86-input-mouse-dfbsd/options.mk b/xf86-input-mouse-dfbsd/options.mk
new file mode 100644
index 0000000..b9e8688
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/options.mk
@@ -0,0 +1,45 @@
+PKG_OPTIONS_VAR= PKG_OPTIONS.xf86-input-mouse
+# dflyu4b is for DragonFly BSD newer USB stack, ported from newer FreeBSD
+# #include <bus/u4b/usb.h>
+# dflyusb is for DragonFly BSD older USB stack, OS version < 300703
+# #include <bus/usb/usb.h>
+# fbsdusb is for FreeBSD USB stack
+# #include <dev/usb/usb.h>
+PKG_SUPPORTED_OPTIONS= dflyu4b dflyusb fbsdusb
+PKG_SUGGESTED_OPTIONS=
+
+.include "../../mk/bsd.options.mk"
+
+.if ${OPSYS} == "DragonFly"
+.if !empty(OS_VERSION:M[0-2].*) || !empty(OS_VERSION:M3.0*)
+PKG_SUGGESTED_OPTIONS+= dflyusb
+.else
+# Assume Dragonfly 3.1 - 3.6 users built U4B stack
+# 3.8 and after U4B is the default
+PKG_SUGGESTED_OPTIONS+= dflyu4b
+.endif
+.endif
+
+.if ${OPSYS} == "FreeBSD"
+PKG_SUGGESTED_OPTIONS+= fbsdusb
+.endif
+
+.if !empty(PKG_OPTIONS:Mdflyu4b) || !empty(PKG_OPTIONS:Mdflyusb) || !empty(PKG_OPTIONS:Mfbsdusb)
+CPPFLAGS+= -DFREEBSD_USB
+.endif
+
+.if !empty(PKG_OPTIONS:Mdflyu4b)
+CPPFLAGS+= -DDRAGONFLY_U4B
+.endif
+
+.if !empty(PKG_OPTIONS:Mdflyusb)
+CPPFLAGS+= -DDRAGONFLY_USB
+.endif
+
+.if !empty(PKG_OPTIONS:Mdflyu4b) || !empty(PKG_OPTIONS:Mdflyusb) || !empty(PKG_OPTIONS:Mfbsdusb)
+SUBST_CLASSES+= freebsdusb
+SUBST_STAGE.freebsdusb= post-extract
+SUBST_MESSAGE.freebsdusb= Patching src/Makefile.in for DragonFly or FreeBSD compatible USB
+SUBST_FILES.freebsdusb+= src/Makefile.in
+SUBST_SED.freebsdusb+= -e 's|-module -avoid-version|-module -avoid-version -lusbhid|'
+.endif
diff --git a/xf86-input-mouse-dfbsd/patch-src_bsd__mouse.c b/xf86-input-mouse-dfbsd/patch-src_bsd__mouse.c
new file mode 100644
index 0000000..d07560a
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/patch-src_bsd__mouse.c
@@ -0,0 +1,1272 @@
+$NetBSD$
+
+Patches from FreeBSD ports / DragonFly dports with include guards.
+Support for different versions of system libusb headers.
+
+--- src/bsd_mouse.c.orig 2015-04-20 01:07:33.000000000 +0000
++++ src/bsd_mouse.c
+@@ -26,6 +26,41 @@
+ * authorization from the copyright holder(s) and author(s).
+ */
+
++/* PKGSRC note: To support newer versions of DragonFly and FreeBSD,
++ * this file is patched using DragonFly dports
++ * x11-drivers/xf86-input-mouse/files/patch-src-bsd_mouse.c and
++ * x11-drivers/xf86-input-mouse/dragonfly/patch-src_bsd__mouse.c
++ * as of master commit 4f04bfe0ea83 ... Tue Jul 14 22:56:44 2015 -0700
++ * The patch's code is enclosed in include defined(FREEBSD_USB) while the
++ * original code is enclosed in include !defined(FREEBSD_USB).
++ */
++
++/* DRAGONFLY_U4B is the usb system after OS version 300703
++ * DRAGONFLY_USB is the usb system before OS version 300703
++ * FREEBSD_USB must be defined if either DRAGONFLY_U4B or DRAGONFLY_USB are.
++ */
++
++#if defined(FREEBSD_USB)
++
++/*
++ * XXX - Should this be autoconf'd instead?
++ */
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
++
++#if !defined(USBMOUSE_SUPPORT)
++#define USBMOUSE_SUPPORT
++#endif
++#if !defined(HAS_LIB_USB_HID)
++#define HAS_LIB_USB_HID
++#endif
++#if !defined(XPS2_SUPPORT)
++#define XPS2_SUPPORT
++#endif
++
++#endif /* defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) */
++
++#endif /* defined(FREEBSD_USB) */
++
+ #include <xorg-server.h>
+
+ #include <X11/X.h>
+@@ -33,12 +68,33 @@
+ #include "xf86Priv.h"
+ #include "xf86_OSlib.h"
+ #include "xf86Xinput.h"
++#if defined(FREEBSD_USB)
++#include <exevents.h>
++#endif
+ #include "mouse.h"
+ #include "xisb.h"
+ #include "mipointer.h"
++
++#if defined(FREEBSD_USB)
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
++#define HAVE_PROPERTIES 1
++#endif
++#ifdef HAVE_PROPERTIES
++#include <X11/Xatom.h>
++#include <xserver-properties.h>
++/* 1.6 has properties, but no labels */
++#ifdef AXIS_LABEL_PROP
++#define HAVE_LABELS
++#else
++#undef HAVE_LABELS
++#endif
++#endif
++#endif /* defined(FREEBSD_USB) */
++
+ #ifdef WSCONS_SUPPORT
+ #include <dev/wscons/wsconsio.h>
+ #endif
++
+ #ifdef USBMOUSE_SUPPORT
+ #ifdef HAS_LIB_USB_HID
+ #include <usbhid.h>
+@@ -46,10 +102,25 @@
+ #include "usb.h"
+ #endif
+
++#if defined(FREEBSD_USB)
++
++#if defined(DRAGONFLY_U4B)
++#include <sys/param.h>
++#include <bus/u4b/usb.h>
++#elif defined(DRAGONFLY_USB)
++#include <sys/param.h>
++#include <bus/usb/usb.h>
++#else
+ #include <dev/usb/usb.h>
++#endif
++
++#endif /* defined(FREEBSD_USB) */
++
++#if !defined(FREEBSD_USB)
+ #ifdef USB_GET_REPORT_ID
+ #define USB_NEW_HID
+ #endif
++#endif /* !defined(FREEBSD_USB) */
+
+ #define HUP_GENERIC_DESKTOP 0x0001
+ #define HUP_BUTTON 0x0009
+@@ -76,10 +147,17 @@ static const char *FindDevice(InputInfoP
+ #define DEFAULT_SYSMOUSE_DEV "/dev/sysmouse"
+ #define DEFAULT_PS2_DEV "/dev/psm0"
+
++#if defined(FREEBSD_USB)
++#define DEFAULT_USB_DEV "/dev/ums0"
++#endif
++
+ static const char *mouseDevs[] = {
+ DEFAULT_MOUSE_DEV,
+ DEFAULT_SYSMOUSE_DEV,
+ DEFAULT_PS2_DEV,
++#if defined(FREEBSD_USB)
++ DEFAULT_USB_DEV,
++#endif
+ NULL
+ };
+ #elif (defined(__OpenBSD__) || defined(__NetBSD__)) && defined(WSCONS_SUPPORT)
+@@ -97,11 +175,23 @@ static const char *mouseDevs[] = {
+ static int
+ SupportedInterfaces(void)
+ {
++#if !defined(FREEBSD_USB)
++
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__NetBSD__)
+ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO | MSE_MISC;
+ #else
+ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_AUTO | MSE_MISC;
+ #endif
++
++#else /* defined(FREEBSD_USB) */
++
++#if defined(__NetBSD__)
++ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO | MSE_MISC;
++#else
++ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_AUTO | MSE_MISC;
++#endif
++
++#endif /* !defined(FREEBSD_USB) */
+ }
+
+ /* Names of protocols that are handled internally here. */
+@@ -178,9 +268,34 @@ static struct {
+ { MOUSE_PROTO_SYSMOUSE, "SysMouse" }
+ };
+
++#if defined(FREEBSD_USB)
++#ifdef XPS2_SUPPORT
++static struct {
++ int dmodel;
++ const char *name;
++} ps2proto[] = {
++ { MOUSE_MODEL_NETSCROLL, "NetScrollPS/2" },
++ { MOUSE_MODEL_NET, "NetMousePS/2" },
++ { MOUSE_MODEL_GLIDEPOINT, "GlidePointPS/2" },
++ { MOUSE_MODEL_THINK, "ThinkingMousePS/2" },
++ { MOUSE_MODEL_INTELLI, "IMPS/2" },
++ { MOUSE_MODEL_MOUSEMANPLUS, "MouseManPlusPS/2" },
++ { MOUSE_MODEL_EXPLORER, "ExplorerPS/2" },
++ { MOUSE_MODEL_4D, "IMPS/2" },
++ { MOUSE_MODEL_4DPLUS, "IMPS/2" },
++};
++#endif
++#endif /* defined(FREEBSD_USB) */
++
+ static const char *
+ SetupAuto(InputInfoPtr pInfo, int *protoPara)
+ {
++#if defined(FREEBSD_USB)
++#ifdef XPS2_SUPPORT
++ const char *dev;
++#endif
++ const char *proto;
++#endif /* defined(FREEBSD_USB) */
+ int i;
+ mousehw_t hw;
+ mousemode_t mode;
+@@ -189,6 +304,14 @@ SetupAuto(InputInfoPtr pInfo, int *proto
+ return NULL;
+
+ /* set the driver operation level, if applicable */
++#if defined (FREEBSD_USB)
++#ifdef XPS2_SUPPORT
++ dev = xf86FindOptionValue(pInfo->options, "Device");
++ if (dev != NULL && !strncmp(dev, DEFAULT_PS2_DEV, 8))
++ i = 2;
++ else
++#endif
++#endif /* defined(FREEBSD_USB) */
+ i = 1;
+ ioctl(pInfo->fd, MOUSE_SETLEVEL, &i);
+
+@@ -207,9 +330,27 @@ SetupAuto(InputInfoPtr pInfo, int *proto
+ protoPara[0] = mode.syncmask[0];
+ protoPara[1] = mode.syncmask[1];
+ }
++#if defined(FREEBSD_USB)
++ proto = devproto[i].name;
++#ifdef XPS2_SUPPORT
++ if (mode.protocol == MOUSE_PROTO_PS2)
++ for (i = 0; i < sizeof(ps2proto)/sizeof(ps2proto[0]); ++i)
++ if (hw.model == ps2proto[i].dmodel) {
++ proto = ps2proto[i].name;
++ break;
++ }
++#endif
++#endif /* defined(FREEBSD_USB) */
++
++#if !defined(FREEBSD_USB)
+ xf86MsgVerb(X_INFO, 3, "%s: SetupAuto: protocol is %s\n",
+ pInfo->name, devproto[i].name);
+ return devproto[i].name;
++#else /* defined(FREEBSD_USB) */
++ xf86MsgVerb(X_INFO, 3, "%s: SetupAuto: protocol is %s\n",
++ pInfo->name, proto);
++ return proto;
++#endif /* !defined(FREEBSD_USB) */
+ }
+ }
+ }
+@@ -227,6 +368,9 @@ SetSysMouseRes(InputInfoPtr pInfo, const
+ mode.rate = rate > 0 ? rate : -1;
+ mode.resolution = res > 0 ? res : -1;
+ mode.accelfactor = -1;
++
++#if !defined(FREEBSD_USB)
++
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+ if (pMse->autoProbe ||
+ (protocol && xf86NameCmp(protocol, "SysMouse") == 0)) {
+@@ -241,13 +385,35 @@ SetSysMouseRes(InputInfoPtr pInfo, const
+ #else
+ mode.level = -1;
+ #endif
++
++#else /* defined(FREEBSD_USB) */
++
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
++ if (pMse->autoProbe ||
++ (protocol && xf86NameCmp(protocol, "SysMouse") == 0)) {
++ /*
++ * As the FreeBSD sysmouse driver defaults to protocol level 0
++ * everytime it is closed we enforce protocol level 1 again at
++ * this point.
++ */
++ mode.level = 1;
++ } else
++#endif
++ mode.level = -1;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ ioctl(pInfo->fd, MOUSE_SETMODE, &mode);
+ }
+ #endif
+
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+
++#if !defined(FREEBSD_USB)
+ #define MOUSED_PID_FILE "/var/run/moused.pid"
++#endif
++
++#if !defined(FREEBSD_USB)
+
+ /*
+ * Try to check if moused is running. DEFAULT_SYSMOUSE_DEV is useless without
+@@ -271,20 +437,66 @@ MousedRunning(void)
+ return FALSE;
+ }
+
++#else /* defined(FREEBSD_USB) */
++
++/*
++ * Try to check if moused is running. DEFAULT_SYSMOUSE_DEV is useless without
++ * it. Also, try to check if the device is used by moused. If it is opened
++ * by moused, we do not want to use it directly. There doesn't seem to be
++ * a better way of checking.
++ */
++static Bool
++MousedRunning(const char *dev)
++{
++ char cmd[128];
++ FILE *f = NULL;
++ unsigned int i;
++
++ if (dev)
++ sprintf(cmd, "sh -c 'fstat %s | grep -c moused' 2>/dev/null", dev);
++ else
++ sprintf(cmd, "sh -c 'pgrep -nx moused' 2>/dev/null");
++ if ((f = popen(cmd, "r")) != NULL) {
++ if (fscanf(f, "%u", &i) == 1 && i > 0) {
++ pclose(f);
++ return TRUE;
++ }
++ pclose(f);
++ }
++ return FALSE;
++}
++
++#endif /* !defined(FREEBSD_USB) */
++
+ static const char *
+ FindDevice(InputInfoPtr pInfo, const char *protocol, int flags)
+ {
++#if !defined(FREEBSD_USB)
+ int fd = -1;
++#else
++ int ret = -1;
++#endif
+ const char **pdev, *dev = NULL;
+ Bool devMouse = FALSE;
+ struct stat devMouseStat;
+ struct stat sb;
+
+ for (pdev = mouseDevs; *pdev; pdev++) {
++
++#if !defined(FREEBSD_USB)
+ SYSCALL (fd = open(*pdev, O_RDWR | O_NONBLOCK));
+ if (fd == -1) {
++#else
++ SYSCALL (ret = stat(*pdev, &sb));
++ if (ret == -1) {
++#endif /* !defined(FREEBSD_USB) */
++
+ #ifdef DEBUG
++#if !defined(FREEBSD_USB)
+ ErrorF("Cannot open %s (%s)\n", *pdev, strerror(errno));
++#else
++ ErrorF("Cannot stat %s (%s)\n", *pdev, strerror(errno));
++#endif /* !defined(FREEBSD_USB) */
+ #endif
+ } else {
+ /*
+@@ -293,28 +505,70 @@ FindDevice(InputInfoPtr pInfo, const cha
+ * the test for whether /dev/sysmouse is usable can be made.
+ */
+ if (!strcmp(*pdev, DEFAULT_MOUSE_DEV)) {
++#if !defined(FREEBSD_USB)
+ if (fstat(fd, &devMouseStat) == 0)
+ devMouse = TRUE;
+ close(fd);
++#else
++ memcpy(&devMouseStat, &sb, sizeof(devMouseStat));
++ devMouse = TRUE;
++#endif /* !defined(FREEBSD_USB) */
+ continue;
+ } else if (!strcmp(*pdev, DEFAULT_SYSMOUSE_DEV)) {
+ /* Check if /dev/mouse is the same as /dev/sysmouse. */
++#if !defined(FREEBSD_USB)
+ if (devMouse && fstat(fd, &sb) == 0 &&
+ devMouseStat.st_dev == sb.st_dev &&
+ devMouseStat.st_ino == sb.st_ino) {
++#else
++ if (devMouse && devMouseStat.st_dev == sb.st_dev &&
++ devMouseStat.st_ino == sb.st_ino) {
++#endif /* !defined(FREEBSD_USB) */
+ /* If the same, use /dev/sysmouse. */
+ devMouse = FALSE;
+ }
++
++#if !defined(FREEBSD_USB)
+ close(fd);
+ if (MousedRunning())
++#else
++ if (MousedRunning(NULL))
++#endif /* !defined(FREEBSD_USB) */
++
+ break;
++
++#if !defined(FREEBSD_USB)
+ else {
+ #ifdef DEBUG
+ ErrorF("moused isn't running\n");
+ #endif
+ }
++#endif /* !defined(FREEBSD_USB) */
++
+ } else {
++
++#if !defined(FREEBSD_USB)
++
+ close(fd);
++
++#else /* defined(FREEBSD_USB) */
++
++ /* Check if /dev/mouse is the same as this device. */
++ if (devMouse && devMouseStat.st_dev == sb.st_dev &&
++ devMouseStat.st_ino == sb.st_ino) {
++ /* If the same, use this device. */
++ devMouse = FALSE;
++ }
++ if (MousedRunning(*pdev))
++ continue;
++ /* ums(4) does not support anything but SysMouse protocol. */
++ if (!strncmp(*pdev, DEFAULT_USB_DEV, 8) && protocol &&
++ xf86NameCmp(protocol, "auto") != 0 &&
++ xf86NameCmp(protocol, "sysmouse") != 0)
++ continue;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ break;
+ }
+ }
+@@ -486,8 +740,17 @@ wsconsPreInit(InputInfoPtr pInfo, const
+
+ #if defined(USBMOUSE_SUPPORT)
+
++#if defined(FREEBSD_USB)
++#define MAXRIDS 64
++#define MAXACOLS 8
++#define MAXLCOLS 16
++#endif
++
+ typedef struct _UsbMseRec {
+ int packetSize;
++
++#if !defined(FREEBSD_USB)
++
+ int iid;
+ hid_item_t loc_x; /* x locator item */
+ hid_item_t loc_y; /* y locator item */
+@@ -495,22 +758,92 @@ typedef struct _UsbMseRec {
+ hid_item_t loc_w; /* z (wheel) locator item */
+ hid_item_t loc_btn[MSE_MAXBUTTONS]; /* buttons locator items */
+ unsigned char *buffer;
++
++#else /* defined(FREEBSD_USB) */
++
++ int iid, nrids, nacols, opened;
++ struct {
++ int32_t rid;
++ int size;
++ } rids[MAXRIDS];
++ struct UsbMseAcol {
++ InputInfoPtr pInfo;
++ int nlcols, nbuttons, hasZ, hasW;
++ int xmin, xmax, ymin, ymax, pmin, pmax, px, py;
++ int cxmin, cxmax, cymin, cymax, cpmin, cpmax;
++ struct UsbMseLcol {
++ 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 (hwheel) locator item */
++ hid_item_t loc_p; /* Tip Pressure */
++ hid_item_t loc_valid; /* Touch Valid */
++ hid_item_t loc_in_range; /* In Range */
++ hid_item_t loc_btn[MSE_MAXBUTTONS]; /* buttons locator items */
++ } lcols[MAXLCOLS];
++ hid_item_t loc_cc; /* contact count */
++ } acols[MAXACOLS];
++ unsigned char *buffer;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ } UsbMseRec, *UsbMsePtr;
+
++#if defined(FREEBSD_USB)
++static int *
++usbGetReportSizePtr(UsbMsePtr pUsbMse, int32_t rid)
++{
++ int i;
++
++ for (i = 0; i < pUsbMse->nrids; i++) {
++ if (pUsbMse->rids[i].rid == rid)
++ return (&pUsbMse->rids[i].size);
++ }
++ for (i = 0; i < MAXRIDS; i++) {
++ if (pUsbMse->rids[i].size == 0) {
++ pUsbMse->rids[i].rid = rid;
++ pUsbMse->nrids = max(pUsbMse->nrids, i + 1);
++ return (&pUsbMse->rids[i].size);
++ }
++ }
++ return (NULL);
++}
++#endif /* defined(FREEBSD_USB) */
++
+ static int
+ usbMouseProc(DeviceIntPtr pPointer, int what)
+ {
+ InputInfoPtr pInfo;
+ MouseDevPtr pMse;
+ UsbMsePtr pUsbMse;
++#if defined(FREEBSD_USB)
++ struct UsbMseAcol *acol;
++#endif
+ unsigned char map[MSE_MAXBUTTONS + 1];
++
++#if !defined(FREEBSD_USB)
+ int nbuttons;
++#else /* defined (FREEBSD_USB) */
++ int nacol, nbuttons;
++#ifdef HAVE_LABELS
++ Atom btn_labels[MSE_MAXBUTTONS] = {0};
++ Atom axes_labels[3] = { 0, 0, 0 };
++#endif
++#endif /* !defined(FREEBSD_USB) */
+
+ pInfo = pPointer->public.devicePrivate;
+ pMse = pInfo->private;
+ pMse->device = pPointer;
+ pUsbMse = pMse->mousePriv;
+
++#if defined(FREEBSD_USB)
++ for (nacol = 0; nacol < (pUsbMse->nacols - 1); nacol++) {
++ if (pUsbMse->acols[nacol].pInfo == pInfo)
++ break;
++ }
++ acol = &pUsbMse->acols[nacol];
++#endif
++
+ switch (what) {
+ case DEVICE_INIT:
+ pPointer->public.on = FALSE;
+@@ -518,23 +851,114 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ for (nbuttons = 0; nbuttons < MSE_MAXBUTTONS; ++nbuttons)
+ map[nbuttons + 1] = nbuttons + 1;
+
++#if !defined(FREEBSD_USB)
+ InitPointerDeviceStruct((DevicePtr)pPointer,
+ map,
+ min(pMse->buttons, MSE_MAXBUTTONS),
+ miPointerGetMotionEvents,
+ pMse->Ctrl,
+ miPointerGetMotionBufferSize());
++#else /* defined(FREEBSD_USB) */
++
++#ifdef HAVE_LABELS
++ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
++ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
++ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
++ axes_labels[0] = XIGetKnownProperty((acol->xmin != acol->xmax)
++ ? AXIS_LABEL_PROP_ABS_X : AXIS_LABEL_PROP_REL_X);
++ axes_labels[1] = XIGetKnownProperty((acol->xmin != acol->xmax)
++ ? AXIS_LABEL_PROP_ABS_Y : AXIS_LABEL_PROP_REL_Y);
++ axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_PRESSURE);
++#endif
++
++ InitButtonClassDeviceStruct(pPointer, min(pMse->buttons, MSE_MAXBUTTONS),
++#ifdef HAVE_LABELS
++ btn_labels,
++#endif
++ map);
++ InitValuatorClassDeviceStruct(pPointer, (acol->pmin != acol->pmax) ? 3 : 2,
++#ifdef HAVE_LABELS
++ axes_labels,
++#endif
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
++ miPointerGetMotionEvents,
++#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
++ GetMotionHistory,
++#endif
++ GetMotionHistorySize(),
++ (acol->xmin != acol->xmax || acol->ymin != acol->ymax) ?
++ Absolute : Relative);
++ InitPtrFeedbackClassDeviceStruct(pPointer, pMse->Ctrl);
++
++#endif /* !defined(FREEBSD_USB) */
+
+ /* X valuator */
++#if !defined(FREEBSD_USB)
++
+ xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
+ xf86InitValuatorDefaults(pPointer, 0);
++
++#else /* defined(FREEBSD_USB) */
++
++ xf86InitValuatorAxisStruct(pPointer, 0,
++#ifdef HAVE_LABELS
++ axes_labels[0],
++#endif
++ (acol->xmin != acol->xmax) ? acol->xmin : -1,
++ (acol->xmin != acol->xmax) ? acol->xmax : -1,
++ 1, 0, 1
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
++ , (acol->xmin != acol->xmax) ? Absolute : Relative
++#endif
++ );
++ xf86InitValuatorDefaults(pPointer, 0);
++
++#endif /* !defined(FREEBSD_USB) */
++
+ /* Y valuator */
++
++#if !defined(FREEBSD_USB)
++
+ xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
+ xf86InitValuatorDefaults(pPointer, 1);
++
++#else /* defined(FREEBSD_USB) */
++
++ xf86InitValuatorAxisStruct(pPointer, 1,
++#ifdef HAVE_LABELS
++ axes_labels[1],
++#endif
++ (acol->ymin != acol->ymax) ? acol->ymin : -1,
++ (acol->ymin != acol->ymax) ? acol->ymax : -1,
++ 1, 0, 1
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
++ , (acol->ymin != acol->ymax) ? Absolute : Relative
++#endif
++ );
++ xf86InitValuatorDefaults(pPointer, 1);
++ /* Pressure valuator */
++ if (acol->pmin != acol->pmax) {
++ xf86InitValuatorAxisStruct(pPointer, 2,
++#ifdef HAVE_LABELS
++ axes_labels[2],
++#endif
++ acol->pmin, acol->pmax, 1, 0, 1
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
++ , Absolute
++#endif
++ );
++ xf86InitValuatorDefaults(pPointer, 2);
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
+ xf86MotionHistoryAllocate(pInfo);
+ break;
+
+ case DEVICE_ON:
++
++#if !defined(FREEBSD_USB)
++
+ pInfo->fd = xf86OpenSerial(pInfo->options);
+ if (pInfo->fd == -1)
+ xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
+@@ -551,6 +975,30 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ AddEnabledDevice(pInfo->fd);
+ }
+ }
++
++#else /* defined(FREEBSD_USB) */
++
++ if (pUsbMse->opened++ == 0) {
++ pInfo->fd = xf86OpenSerial(pInfo->options);
++ if (pInfo->fd == -1)
++ xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
++ else {
++ pMse->buffer = XisbNew(pInfo->fd, pUsbMse->packetSize);
++ if (!pMse->buffer) {
++ free(pMse);
++ xf86CloseSerial(pInfo->fd);
++ pInfo->fd = -1;
++ } else {
++ xf86FlushInput(pInfo->fd);
++ if (!xf86InstallSIGIOHandler (pInfo->fd, usbSigioReadInput,
++ pInfo))
++ AddEnabledDevice(pInfo->fd);
++ }
++ }
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
+ pMse->lastButtons = 0;
+ pMse->lastMappedButtons = 0;
+ pMse->emulateState = 0;
+@@ -571,6 +1019,9 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ xf86CloseSerial(pInfo->fd);
+ pInfo->fd = -1;
+ }
++#if defined(FREEBSD_USB)
++ pUsbMse->opened--;
++#endif
+ pPointer->public.on = FALSE;
+ usleep(300000);
+ break;
+@@ -586,27 +1037,86 @@ usbReadInput(InputInfoPtr pInfo)
+ {
+ MouseDevPtr pMse;
+ UsbMsePtr pUsbMse;
++
++#if !defined(FREEBSD_USB)
+ int buttons = pMse->lastButtons;
+ int dx = 0, dy = 0, dz = 0, dw = 0;
+ int n, c;
++#else
++ int buttons, cc;
++ int dx, dy, dz, dw, dp, upd, v, nx, ny, np, in_range;
++ int n, c, rid, *sizep, nacol, nlcol;
++#endif /* !defined(FREEBSD_USB) */
++
+ unsigned char *pBuf;
+
++#if defined(FREEBSD_USB)
++ struct UsbMseAcol *acol;
++ struct UsbMseLcol *lcol;
++#endif
+ pMse = pInfo->private;
+ pUsbMse = pMse->mousePriv;
+
+ XisbBlockDuration(pMse->buffer, -1);
++#if defined(FREEBSD_USB)
++next:
++#endif
+ pBuf = pUsbMse->buffer;
+ n = 0;
++
++#if !defined(FREEBSD_USB)
++
+ while ((c = XisbRead(pMse->buffer)) >= 0 && n < pUsbMse->packetSize) {
+ pBuf[n++] = (unsigned char)c;
++
++ }
++#else /* defined(FREEBSD_USB) */
++
++ if (pUsbMse->iid) {
++ rid = XisbRead(pMse->buffer);
++ if (rid < 0)
++ return;
++ pBuf[n++] = (unsigned char)rid;
++ } else
++ rid = 0;
++ sizep = usbGetReportSizePtr(pUsbMse, rid);
++ if (sizep == NULL || *sizep == 0) {
++ xf86Msg(X_WARNING, "%s: unknown report ID %d\n", pInfo->name, rid);
++ goto next;
+ }
++ while (n < *sizep && (c = XisbRead(pMse->buffer)) >= 0) {
++ pBuf[n++] = (unsigned char)c;
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
+ if (n == 0)
+ return;
++
++#if !defined(FREEBSD_USB)
++
+ if (n != pUsbMse->packetSize) {
+ LogMessageVerbSigSafe(X_WARNING, -1,
+ "%s: incomplete packet, size %d\n",
+ pInfo->name, n);
+ }
++
++#else /* defined(FREEBSD_USB) */
++
++ if (n == 0)
++ return;
++// xf86MsgVerb(X_INFO, 3, "pkt: %d %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
++// n, pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7], pBuf[8], pBuf[9]);
++ if (n != *sizep) {
++ LogMessageVerbSigSafe(X_WARNING, -1,
++ "%s: incomplete packet, size %d\n",
++ pInfo->name, n);
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
++#if !defined(FREEBSD_USB)
++
+ /* discard packets with an id that don't match the mouse */
+ /* XXX this is probably not the right thing */
+ if (pUsbMse->iid != 0) {
+@@ -625,6 +1135,122 @@ usbReadInput(InputInfoPtr pInfo)
+ }
+ pMse->PostEvent(pInfo, buttons, dx, dy, dz, dw);
+ return;
++
++#else /* defined(FREEBSD_USB) */
++
++ for (nacol = 0; nacol < pUsbMse->nacols; nacol++) {
++ acol = &pUsbMse->acols[nacol];
++ if (acol->pInfo == NULL)
++ continue;
++ nx = ny = np = upd = 0;
++ buttons = cc = 0;
++ dx = dy = dz = dw = dp = 0;
++ for (nlcol = 0; nlcol < pUsbMse->acols[nacol].nlcols; nlcol++) {
++ lcol = &acol->lcols[nlcol];
++
++ if (lcol->loc_valid.usage != 0 && rid == lcol->loc_valid.report_ID &&
++ hid_get_data(pBuf, &lcol->loc_valid) == 0)
++ continue;
++ if (lcol->loc_in_range.usage != 0 && rid == lcol->loc_in_range.report_ID)
++ in_range = hid_get_data(pBuf, &lcol->loc_in_range);
++ else
++ in_range = 1;
++ if (in_range && lcol->loc_x.usage != 0 && rid == lcol->loc_x.report_ID && nx == 0) {
++ v = hid_get_data(pBuf, &lcol->loc_x);
++ if (acol->xmin != acol->xmax) {
++ v = xf86ScaleAxis(v, acol->xmax, acol->xmin,
++ lcol->loc_x.logical_maximum, lcol->loc_x.logical_minimum);
++ if (acol->cxmin != acol->cxmax)
++ v = xf86ScaleAxis(v, acol->xmax, acol->xmin,
++ acol->cxmax, acol->cxmin);
++ }
++ dx += v;
++ nx++;
++ }
++ if (in_range && lcol->loc_y.usage != 0 && rid == lcol->loc_y.report_ID && ny == 0) {
++ v = hid_get_data(pBuf, &lcol->loc_y);
++ if (acol->xmin != acol->xmax) {
++ v = xf86ScaleAxis(v, acol->ymax, acol->ymin,
++ lcol->loc_y.logical_maximum, lcol->loc_y.logical_minimum);
++ if (acol->cymin != acol->cymax)
++ v = xf86ScaleAxis(v, acol->ymax, acol->ymin,
++ acol->cymax, acol->cymin);
++ }
++ dy += v;
++ ny++;
++ }
++ if (lcol->loc_z.usage != 0 && rid == lcol->loc_z.report_ID) {
++ dz -= hid_get_data(pBuf, &lcol->loc_z);
++ upd = 1;
++ }
++ if (lcol->loc_w.usage != 0 && rid == lcol->loc_w.report_ID) {
++ dw += hid_get_data(pBuf, &lcol->loc_w);
++ upd = 1;
++ }
++ if (lcol->loc_p.usage != 0 && rid == lcol->loc_p.report_ID && np == 0) {
++ v = hid_get_data(pBuf, &lcol->loc_p);
++ v = xf86ScaleAxis(v, acol->pmax, acol->pmin,
++ lcol->loc_p.logical_maximum, lcol->loc_p.logical_minimum);
++ if (acol->cpmin != acol->cpmax)
++ v = xf86ScaleAxis(v, acol->pmax, acol->pmin,
++ acol->cpmax, acol->cpmin);
++ dp += v;
++ np++;
++ }
++
++ for (n = 0; n < acol->nbuttons; n++) {
++ if (lcol->loc_btn[n].usage != 0 && rid == lcol->loc_btn[n].report_ID) {
++ if (hid_get_data(pBuf, &lcol->loc_btn[n]))
++ buttons |= (1 << UMS_BUT(n));
++ upd = 1;
++ }
++ }
++ }
++ if (acol->loc_cc.usage != 0 && rid == acol->loc_cc.report_ID)
++ cc = hid_get_data(pBuf, &acol->loc_cc);
++ else
++ cc = (nx || ny) ? 1 : 0;
++ if (cc > 1)
++ buttons = (1 << UMS_BUT(1));
++ if (nx != 0 && acol->xmin != acol->xmax)
++ dx /= nx;
++ if (ny != 0 && acol->ymin != acol->ymax)
++ dy /= ny;
++ if (np != 0 && acol->pmin != acol->pmax)
++ dp /= np;
++// if (upd || nx || ny || np)
++// xf86MsgVerb(X_INFO, 3, "%d cc %d dx %d dy %d dz %d dw %d press %d buttons %02x\n",
++// nacol, cc, dx, dy, dz, dw, dp, buttons);
++ if (nx != 0 || ny != 0) {
++ if (acol->pmin != acol->pmax) {
++ xf86PostMotionEvent(acol->pInfo->dev,
++ /* is_absolute: */ TRUE,
++ /* first_valuator: */ 0,
++ /* num_valuators: */ 3,
++ dx, dy, dp);
++ } else if (acol->xmin != acol->xmax || acol->ymin != acol->ymax) {
++ xf86PostMotionEvent(acol->pInfo->dev,
++ /* is_absolute: */ TRUE,
++ /* first_valuator: */ 0,
++ /* num_valuators: */ 2,
++ dx, dy);
++ }
++ }
++ if (upd || (nx != 0) || (ny != 0)) {
++ ((MouseDevPtr)acol->pInfo->private)->PostEvent(acol->pInfo, buttons,
++ ((acol->xmin != acol->xmax) ? dx - acol->px : dx),
++ ((acol->ymin != acol->ymax) ? dy - acol->py : dy),
++ dz, dw);
++ }
++ if (nx > 0)
++ acol->px = dx;
++ if (ny > 0)
++ acol->py = dy;
++ }
++ goto next;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ }
+
+ static void
+@@ -633,15 +1259,27 @@ usbSigioReadInput (int fd, void *closure
+ usbReadInput ((InputInfoPtr) closure);
+ }
+
++#if !defined(FREEBSD_USB)
+ /* This function is called when the protocol is "usb". */
+ static Bool
+ usbPreInit(InputInfoPtr pInfo, const char *protocol, int flags)
++#else
++static Bool
++usbInitFirst(InputInfoPtr pInfo)
++#endif /* !defined(FREEBSD_USB) */
+ {
+ MouseDevPtr pMse = pInfo->private;
+ UsbMsePtr pUsbMse;
+ report_desc_t reportDesc;
++#if !defined(FREEBSD_USB)
+ int i;
+-
++#else
++ hid_data_t d;
++ hid_item_t h;
++ struct UsbMseAcol *acol;
++ struct UsbMseLcol *lcol;
++ int mdepth, rsize, *rsizep, acolused, lcolused, used;
++#endif /* !defined(FREEBSD_USB) */
+ pUsbMse = malloc(sizeof(UsbMseRec));
+ if (pUsbMse == NULL) {
+ xf86Msg(X_ERROR, "%s: cannot allocate UsbMouseRec\n", pInfo->name);
+@@ -649,12 +1287,16 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ return FALSE;
+ }
+
++#if !defined(FREEBSD_USB)
+ pMse->protocol = protocol;
+ xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
+
+ /* Collect the options, and process the common options. */
+ COLLECT_INPUT_OPTIONS(pInfo, NULL);
+ xf86ProcessCommonOptions(pInfo, pInfo->options);
++#else
++ bzero(pUsbMse, sizeof(UsbMseRec));
++#endif /* !defined(FREEBSD_USB) */
+
+ /* Check if the device can be opened. */
+ pInfo->fd = xf86OpenSerial(pInfo->options);
+@@ -670,6 +1312,9 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ }
+ /* Get USB informations */
+ reportDesc = hid_get_report_desc(pInfo->fd);
++
++#if !defined(FREEBSD_USB)
++
+ /* Get packet size & iid */
+ #ifdef USB_NEW_HID
+ if (ioctl(pInfo->fd, USB_GET_REPORT_ID, &pUsbMse->iid) == -1) {
+@@ -683,6 +1328,139 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ pUsbMse->packetSize = hid_report_size(reportDesc, hid_input,
+ &pUsbMse->iid);
+ #endif
++
++#else /* defined(FREEBSD_USB) */
++
++ mdepth = 0;
++ pUsbMse->nacols = 0;
++ acol = &pUsbMse->acols[pUsbMse->nacols];
++ lcol = &acol->lcols[acol->nlcols];
++ acolused = 0;
++ lcolused = 0;
++ d = hid_start_parse(reportDesc, (1 << hid_input) |
++ (1 << hid_collection) | (1 << hid_endcollection), -1);
++ while (hid_get_item(d, &h)) {
++ switch (h.kind) {
++ case hid_collection:
++ if (mdepth != 0)
++ mdepth++;
++ else if (h.collection == 1 &&
++ (h.usage == 0x00010001 || h.usage == 0x00010002 ||
++ (h.usage >= 0x000d0001 && h.usage <= 0x000d000d))) {
++ mdepth++;
++ if (acolused) {
++ if (lcolused) {
++ acol->nlcols++;
++ lcolused = 0;
++ }
++ pUsbMse->nacols++;
++ acolused = 0;
++ acol = &pUsbMse->acols[pUsbMse->nacols];
++ lcol = &acol->lcols[acol->nlcols];
++ }
++ }
++ if (lcolused && (h.collection == 0 ||
++ h.collection == 2 || h.collection == 3)) {
++ acol->nlcols++;
++ lcolused = 0;
++ lcol = &acol->lcols[acol->nlcols];
++ }
++ break;
++ case hid_endcollection:
++ if (mdepth != 0)
++ mdepth--;
++ break;
++ case hid_input:
++ if (h.report_ID != 0)
++ pUsbMse->iid = 1;
++ rsize = pUsbMse->iid +
++ (h.pos + (h.report_size * h.report_count) + 7) / 8;
++ if ((rsizep = usbGetReportSizePtr(pUsbMse, h.report_ID)) != NULL)
++ *rsizep = max(*rsizep, rsize);
++ pUsbMse->packetSize = max(pUsbMse->packetSize, rsize);
++ if (mdepth == 0)
++ break;
++ used = 1;
++ if (h.usage == 0x00010030) { /* X */
++ lcol->loc_x = h;
++ if ((h.flags & 0x04) == 0) {
++ if (acol->xmin == acol->xmax) {
++ acol->xmin = h.logical_minimum;
++ acol->xmax = h.logical_maximum;
++ } else {
++ acol->xmin = min(acol->xmin, h.logical_minimum);
++ acol->xmax = max(acol->xmax, h.logical_maximum);
++ }
++ }
++ } else if (h.usage == 0x00010031) { /* Y */
++ lcol->loc_y = h;
++ if ((h.flags & 0x04) == 0) {
++ if (acol->ymin == acol->ymax) {
++ acol->ymin = h.logical_minimum;
++ acol->ymax = h.logical_maximum;
++ } else {
++ acol->ymin = min(acol->ymin, h.logical_minimum);
++ acol->ymax = max(acol->ymax, h.logical_maximum);
++ }
++ }
++ } else if (h.usage == 0x00010038) { /* Z */
++ lcol->loc_z = h;
++ acol->hasZ = 1;
++ } else if (h.usage == 0x000c0238) { /* W */
++ lcol->loc_w = h;
++ acol->hasW = 1;
++ } else if (h.usage == 0x000d0030) { /* Press */
++ lcol->loc_p = h;
++ if ((h.flags & 0x04) == 0) {
++ if (acol->pmin == acol->pmax) {
++ acol->pmin = h.logical_minimum;
++ acol->pmax = h.logical_maximum;
++ } else {
++ acol->pmin = min(acol->pmin, h.logical_minimum);
++ acol->pmax = max(acol->pmax, h.logical_maximum);
++ }
++ }
++ } else if (h.usage == 0x000d0032) /* In Range */
++ lcol->loc_in_range = h;
++ else if (h.usage == 0x000d0047) /* Valid */
++ lcol->loc_valid = h;
++ else if (h.usage > 0x00090000 &&
++ h.usage <= 0x00090000 + MSE_MAXBUTTONS) { /* Buttons */
++ lcol->loc_btn[(h.usage & 0xffff) - 1] = h;
++ acol->nbuttons = max(acol->nbuttons, h.usage & 0xffff);
++ } else if (h.usage == 0x000d0042) { /* Tip Switch */
++ lcol->loc_btn[0] = h;
++ acol->nbuttons = max(acol->nbuttons, 1);
++ } else if (h.usage == 0x000d0044) { /* Barrel Switch */
++ lcol->loc_btn[1] = h;
++ acol->nbuttons = max(acol->nbuttons, 2);
++ } else if (h.usage == 0x000d0045) { /* Eraser */
++ lcol->loc_btn[3] = h;
++ acol->nbuttons = max(acol->nbuttons, 4);
++ } else if (h.usage == 0x000d0046) { /* Tablet Pick */
++ lcol->loc_btn[2] = h;
++ acol->nbuttons = max(acol->nbuttons, 3);
++ } else if (h.usage == 0x000d0054) /* Contact Count */
++ acol->loc_cc = h;
++ else
++ used = 0;
++ lcolused += used;
++ acolused += used;
++ break;
++ default:
++ break;
++ }
++ }
++ if (lcolused)
++ acol->nlcols++;
++ if (acolused)
++ pUsbMse->nacols++;
++ hid_end_parse(d);
++ xf86Msg(X_DEFAULT, "%s: Found %d usable logical collections\n",
++ pInfo->name, pUsbMse->nacols);
++
++#endif /* !defined(FREEBSD_USB) */
++
+ /* Allocate buffer */
+ if (pUsbMse->packetSize <= 8) {
+ pUsbMse->buffer = pMse->protoBuf;
+@@ -692,10 +1470,15 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ if (pUsbMse->buffer == NULL) {
+ xf86Msg(X_ERROR, "%s: cannot allocate buffer\n", pInfo->name);
+ free(pUsbMse);
++#if !defined(FREEBSD_USB)
+ free(pMse);
++#endif
+ xf86CloseSerial(pInfo->fd);
+ return FALSE;
+ }
++
++#if !defined(FREEBSD_USB)
++
+ #ifdef USB_NEW_HID
+ if (hid_locate(reportDesc, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X),
+ hid_input, &pUsbMse->loc_x, pUsbMse->iid) < 0) {
+@@ -733,12 +1516,15 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ }
+ pMse->buttons = i-1;
+
++#endif /* !defined(FREEBSD_USB) */
++
+ xf86CloseSerial(pInfo->fd);
+ pInfo->fd = -1;
+
+ /* Private structure */
+ pMse->mousePriv = pUsbMse;
+
++#if !defined(FREEBSD_USB)
+ /* Process common mouse options (like Emulate3Buttons, etc). */
+ pMse->CommonOptions(pInfo);
+
+@@ -749,8 +1535,137 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
+ pInfo->flags |= XI86_CONFIGURED;
+ #endif
++
++#endif /* !defined(FREEBSD_USB) */
++
+ return TRUE;
+ }
++
++#if defined(FREEBSD_USB)
++
++/* This function is called when the protocol is "usb". */
++static Bool
++usbPreInit(InputInfoPtr pInfo, const char *protocol, int flags)
++{
++ InputInfoPtr pMatch;
++ MouseDevPtr pMse = pInfo->private;
++ UsbMsePtr pUsbMse;
++ struct UsbMseAcol *acol;
++ char *str;
++ int i, colopt;
++
++ pMse->protocol = protocol;
++ xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
++
++ /* Collect the options, and process the common options. */
++ COLLECT_INPUT_OPTIONS(pInfo, NULL);
++ xf86ProcessCommonOptions(pInfo, pInfo->options);
++
++ /* Check if this HID device is already opened. */
++ for (pMatch = xf86FirstLocalDevice(); pMatch != NULL; pMatch = pMatch->next) {
++ if ((pInfo != pMatch) && strstr(pMatch->drv->driverName, "mouse")) {
++ char *dev1, *dev2;
++
++ dev1 = xf86SetStrOption(pInfo->options, "Device", NULL);
++ dev2 = xf86SetStrOption(pMatch->options, "Device", NULL);
++ if (strcmp(dev1, dev2) == 0) {
++ free(dev1);
++ free(dev2);
++ break;
++ }
++ free(dev1);
++ free(dev2);
++ }
++ }
++ if (pMatch == NULL) {
++ xf86Msg(X_DEFAULT, "%s: Opening new HID device\n", pInfo->name);
++ if (!usbInitFirst(pInfo)) {
++ free(pMse);
++ return FALSE;
++ }
++ } else {
++ pMse->mousePriv = ((MouseDevPtr)pMatch->private)->mousePriv;
++ xf86Msg(X_DEFAULT, "%s: Attaching to already opened HID device\n",
++ pInfo->name);
++ }
++ pUsbMse = pMse->mousePriv;
++
++ /* Attach to collection, respecting "Collection" option. */
++ colopt = xf86SetIntOption(pInfo->options, "Collection", 0);
++ for (i = 0; i < pUsbMse->nacols; i++) {
++ if (pUsbMse->acols[i].pInfo == NULL &&
++ (colopt == 0 || i == colopt - 1)) {
++ pUsbMse->acols[i].pInfo = pInfo;
++ break;
++ }
++ }
++ xf86Msg(colopt == 0 ? X_DEFAULT : X_CONFIG,
++ "%s: Collection: %d\n", pInfo->name,
++ i == pUsbMse->nacols ? colopt : i + 1);
++ if (i == pUsbMse->nacols) {
++ xf86Msg(X_ERROR,
++ "%s: Application collection not found or already handled\n",
++ pInfo->name);
++ free(pMse);
++ return FALSE;
++ }
++
++ acol = &pUsbMse->acols[i];
++ pMse->buttons = acol->nbuttons;
++ if (pMse->buttons == 2)
++ pMse->buttons = 3;
++ if (acol->xmin != acol->xmax || acol->ymin != acol->ymax)
++ pMse->disableXY = TRUE;
++ pMse->hasZ = acol->hasZ;
++ pMse->hasW = acol->hasW;
++
++ /* Process common mouse options (like Emulate3Buttons, etc). */
++ pMse->CommonOptions(pInfo);
++
++ /* Process "Calibration" option. */
++ str = xf86CheckStrOption(pInfo->options, "Calibration", NULL);
++ if (str != NULL && (acol->xmin != acol->xmax || acol->ymin != acol->ymax)) {
++ int j, xmin, xmax, ymin, ymax, pmin, pmax;
++
++ j = sscanf(str, "%d %d %d %d %d %d", &xmin, &xmax, &ymin, &ymax, &pmin, &pmax);
++ if (j == 4) {
++ xf86Msg(X_CONFIG, "%s: Calibration: %d %d %d %d\n",
++ pInfo->name, xmin, xmax, ymin, ymax);
++ acol->cxmin = xmin;
++ acol->cxmax = xmax;
++ acol->cymin = ymin;
++ acol->cymax = ymax;
++ } else if (j == 6) {
++ xf86Msg(X_CONFIG, "%s: Calibration: %d %d %d %d %d %d\n",
++ pInfo->name, xmin, xmax, ymin, ymax, pmin, pmax);
++ acol->cxmin = xmin;
++ acol->cxmax = xmax;
++ acol->cymin = ymin;
++ acol->cymax = ymax;
++ acol->cpmin = pmin;
++ acol->cpmax = pmax;
++ } else
++ xf86Msg(X_WARNING, "%s: Calibration: Invalid arguments\n",
++ pInfo->name);
++ free(str);
++ } else if (acol->xmin != acol->xmax || acol->ymin != acol->ymax) {
++ xf86Msg(X_DEFAULT, "%s: Calibration: %d %d %d %d %d %d\n",
++ pInfo->name, acol->xmin, acol->xmax, acol->ymin, acol->ymax,
++ acol->pmin, acol->pmax);
++ }
++
++ /* Setup the local procs. */
++ pInfo->device_control = usbMouseProc;
++ pInfo->read_input = usbReadInput;
++
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
++ pInfo->flags |= XI86_CONFIGURED;
++#endif
++ return TRUE;
++}
++
++#endif /* defined(FREEBSD_USB) */
++
+ #endif /* USBMOUSE */
+
+ static Bool
+@@ -784,7 +1699,15 @@ OSMouseInit(int flags)
+ p->CheckProtocol = CheckProtocol;
+ #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)) && defined(MOUSE_PROTO_SYSMOUSE)
+ p->SetupAuto = SetupAuto;
++
++#if !defined(FREEBSD_USB)
++ p->SetPS2Res = SetSysMouseRes;
++#else
++#ifndef XPS2_SUPPORT
+ p->SetPS2Res = SetSysMouseRes;
++#endif
++#endif
++
+ p->SetBMRes = SetSysMouseRes;
+ p->SetMiscRes = SetSysMouseRes;
+ #endif
diff --git a/xf86-input-mouse-dfbsd/patches/patch-src_bsd__mouse.c b/xf86-input-mouse-dfbsd/patches/patch-src_bsd__mouse.c
new file mode 100644
index 0000000..c0a89a4
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/patches/patch-src_bsd__mouse.c
@@ -0,0 +1,1286 @@
+$NetBSD$
+
+Patches from FreeBSD ports / DragonFly dports with include guards.
+Support for different versions of system libusb headers.
+Patches from FreeBSD ports svn commit: r431436
+
+--- src/bsd_mouse.c.orig 2015-04-20 01:07:33.000000000 +0000
++++ src/bsd_mouse.c
+@@ -26,6 +26,41 @@
+ * authorization from the copyright holder(s) and author(s).
+ */
+
++/* PKGSRC note: To support newer versions of DragonFly and FreeBSD,
++ * this file is patched using DragonFly dports
++ * x11-drivers/xf86-input-mouse/files/patch-src-bsd_mouse.c and
++ * x11-drivers/xf86-input-mouse/dragonfly/patch-src_bsd__mouse.c
++ * as of master commit 4f04bfe0ea83 ... Tue Jul 14 22:56:44 2015 -0700
++ * The patch's code is enclosed in include defined(FREEBSD_USB) while the
++ * original code is enclosed in include !defined(FREEBSD_USB).
++ */
++
++/* DRAGONFLY_U4B is the usb system after OS version 300703
++ * DRAGONFLY_USB is the usb system before OS version 300703
++ * FREEBSD_USB must be defined if either DRAGONFLY_U4B or DRAGONFLY_USB are.
++ */
++
++#if defined(FREEBSD_USB)
++
++/*
++ * XXX - Should this be autoconf'd instead?
++ */
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
++
++#if !defined(USBMOUSE_SUPPORT)
++#define USBMOUSE_SUPPORT
++#endif
++#if !defined(HAS_LIB_USB_HID)
++#define HAS_LIB_USB_HID
++#endif
++#if !defined(XPS2_SUPPORT)
++#define XPS2_SUPPORT
++#endif
++
++#endif /* defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) */
++
++#endif /* defined(FREEBSD_USB) */
++
+ #include <xorg-server.h>
+
+ #include <X11/X.h>
+@@ -33,12 +68,33 @@
+ #include "xf86Priv.h"
+ #include "xf86_OSlib.h"
+ #include "xf86Xinput.h"
++#if defined(FREEBSD_USB)
++#include <exevents.h>
++#endif
+ #include "mouse.h"
+ #include "xisb.h"
+ #include "mipointer.h"
++
++#if defined(FREEBSD_USB)
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
++#define HAVE_PROPERTIES 1
++#endif
++#ifdef HAVE_PROPERTIES
++#include <X11/Xatom.h>
++#include <xserver-properties.h>
++/* 1.6 has properties, but no labels */
++#ifdef AXIS_LABEL_PROP
++#define HAVE_LABELS
++#else
++#undef HAVE_LABELS
++#endif
++#endif
++#endif /* defined(FREEBSD_USB) */
++
+ #ifdef WSCONS_SUPPORT
+ #include <dev/wscons/wsconsio.h>
+ #endif
++
+ #ifdef USBMOUSE_SUPPORT
+ #ifdef HAS_LIB_USB_HID
+ #include <usbhid.h>
+@@ -46,10 +102,25 @@
+ #include "usb.h"
+ #endif
+
++#if defined(FREEBSD_USB)
++
++#if defined(DRAGONFLY_U4B)
++#include <sys/param.h>
++#include <bus/u4b/usb.h>
++#elif defined(DRAGONFLY_USB)
++#include <sys/param.h>
++#include <bus/usb/usb.h>
++#else
+ #include <dev/usb/usb.h>
++#endif
++
++#endif /* defined(FREEBSD_USB) */
++
++#if !defined(FREEBSD_USB)
+ #ifdef USB_GET_REPORT_ID
+ #define USB_NEW_HID
+ #endif
++#endif /* !defined(FREEBSD_USB) */
+
+ #define HUP_GENERIC_DESKTOP 0x0001
+ #define HUP_BUTTON 0x0009
+@@ -76,10 +147,17 @@ static const char *FindDevice(InputInfoP
+ #define DEFAULT_SYSMOUSE_DEV "/dev/sysmouse"
+ #define DEFAULT_PS2_DEV "/dev/psm0"
+
++#if defined(FREEBSD_USB)
++#define DEFAULT_USB_DEV "/dev/ums0"
++#endif
++
+ static const char *mouseDevs[] = {
+ DEFAULT_MOUSE_DEV,
+ DEFAULT_SYSMOUSE_DEV,
+ DEFAULT_PS2_DEV,
++#if defined(FREEBSD_USB)
++ DEFAULT_USB_DEV,
++#endif
+ NULL
+ };
+ #elif (defined(__OpenBSD__) || defined(__NetBSD__)) && defined(WSCONS_SUPPORT)
+@@ -97,11 +175,23 @@ static const char *mouseDevs[] = {
+ static int
+ SupportedInterfaces(void)
+ {
++#if !defined(FREEBSD_USB)
++
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__NetBSD__)
+ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO | MSE_MISC;
+ #else
+ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_AUTO | MSE_MISC;
+ #endif
++
++#else /* defined(FREEBSD_USB) */
++
++#if defined(__NetBSD__)
++ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_AUTO | MSE_MISC;
++#else
++ return MSE_SERIAL | MSE_BUS | MSE_PS2 | MSE_XPS2 | MSE_AUTO | MSE_MISC;
++#endif
++
++#endif /* !defined(FREEBSD_USB) */
+ }
+
+ /* Names of protocols that are handled internally here. */
+@@ -178,9 +268,34 @@ static struct {
+ { MOUSE_PROTO_SYSMOUSE, "SysMouse" }
+ };
+
++#if defined(FREEBSD_USB)
++#ifdef XPS2_SUPPORT
++static struct {
++ int dmodel;
++ const char *name;
++} ps2proto[] = {
++ { MOUSE_MODEL_NETSCROLL, "NetScrollPS/2" },
++ { MOUSE_MODEL_NET, "NetMousePS/2" },
++ { MOUSE_MODEL_GLIDEPOINT, "GlidePointPS/2" },
++ { MOUSE_MODEL_THINK, "ThinkingMousePS/2" },
++ { MOUSE_MODEL_INTELLI, "IMPS/2" },
++ { MOUSE_MODEL_MOUSEMANPLUS, "MouseManPlusPS/2" },
++ { MOUSE_MODEL_EXPLORER, "ExplorerPS/2" },
++ { MOUSE_MODEL_4D, "IMPS/2" },
++ { MOUSE_MODEL_4DPLUS, "IMPS/2" },
++};
++#endif
++#endif /* defined(FREEBSD_USB) */
++
+ static const char *
+ SetupAuto(InputInfoPtr pInfo, int *protoPara)
+ {
++#if defined(FREEBSD_USB)
++#ifdef XPS2_SUPPORT
++ const char *dev;
++#endif
++ const char *proto;
++#endif /* defined(FREEBSD_USB) */
+ int i;
+ mousehw_t hw;
+ mousemode_t mode;
+@@ -189,6 +304,14 @@ SetupAuto(InputInfoPtr pInfo, int *proto
+ return NULL;
+
+ /* set the driver operation level, if applicable */
++#if defined (FREEBSD_USB)
++#ifdef XPS2_SUPPORT
++ dev = xf86FindOptionValue(pInfo->options, "Device");
++ if (dev != NULL && !strncmp(dev, DEFAULT_PS2_DEV, 8))
++ i = 2;
++ else
++#endif
++#endif /* defined(FREEBSD_USB) */
+ i = 1;
+ ioctl(pInfo->fd, MOUSE_SETLEVEL, &i);
+
+@@ -207,9 +330,27 @@ SetupAuto(InputInfoPtr pInfo, int *proto
+ protoPara[0] = mode.syncmask[0];
+ protoPara[1] = mode.syncmask[1];
+ }
++#if defined(FREEBSD_USB)
++ proto = devproto[i].name;
++#ifdef XPS2_SUPPORT
++ if (mode.protocol == MOUSE_PROTO_PS2)
++ for (i = 0; i < sizeof(ps2proto)/sizeof(ps2proto[0]); ++i)
++ if (hw.model == ps2proto[i].dmodel) {
++ proto = ps2proto[i].name;
++ break;
++ }
++#endif
++#endif /* defined(FREEBSD_USB) */
++
++#if !defined(FREEBSD_USB)
+ xf86MsgVerb(X_INFO, 3, "%s: SetupAuto: protocol is %s\n",
+ pInfo->name, devproto[i].name);
+ return devproto[i].name;
++#else /* defined(FREEBSD_USB) */
++ xf86MsgVerb(X_INFO, 3, "%s: SetupAuto: protocol is %s\n",
++ pInfo->name, proto);
++ return proto;
++#endif /* !defined(FREEBSD_USB) */
+ }
+ }
+ }
+@@ -227,6 +368,9 @@ SetSysMouseRes(InputInfoPtr pInfo, const
+ mode.rate = rate > 0 ? rate : -1;
+ mode.resolution = res > 0 ? res : -1;
+ mode.accelfactor = -1;
++
++#if !defined(FREEBSD_USB)
++
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+ if (pMse->autoProbe ||
+ (protocol && xf86NameCmp(protocol, "SysMouse") == 0)) {
+@@ -241,13 +385,35 @@ SetSysMouseRes(InputInfoPtr pInfo, const
+ #else
+ mode.level = -1;
+ #endif
++
++#else /* defined(FREEBSD_USB) */
++
++#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
++ if (pMse->autoProbe ||
++ (protocol && xf86NameCmp(protocol, "SysMouse") == 0)) {
++ /*
++ * As the FreeBSD sysmouse driver defaults to protocol level 0
++ * everytime it is closed we enforce protocol level 1 again at
++ * this point.
++ */
++ mode.level = 1;
++ } else
++#endif
++ mode.level = -1;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ ioctl(pInfo->fd, MOUSE_SETMODE, &mode);
+ }
+ #endif
+
+ #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+
++#if !defined(FREEBSD_USB)
+ #define MOUSED_PID_FILE "/var/run/moused.pid"
++#endif
++
++#if !defined(FREEBSD_USB)
+
+ /*
+ * Try to check if moused is running. DEFAULT_SYSMOUSE_DEV is useless without
+@@ -271,20 +437,66 @@ MousedRunning(void)
+ return FALSE;
+ }
+
++#else /* defined(FREEBSD_USB) */
++
++/*
++ * Try to check if moused is running. DEFAULT_SYSMOUSE_DEV is useless without
++ * it. Also, try to check if the device is used by moused. If it is opened
++ * by moused, we do not want to use it directly. There doesn't seem to be
++ * a better way of checking.
++ */
++static Bool
++MousedRunning(const char *dev)
++{
++ char cmd[128];
++ FILE *f = NULL;
++ unsigned int i;
++
++ if (dev)
++ sprintf(cmd, "sh -c 'fstat %s | grep -c moused' 2>/dev/null", dev);
++ else
++ sprintf(cmd, "sh -c 'pgrep -nx moused' 2>/dev/null");
++ if ((f = popen(cmd, "r")) != NULL) {
++ if (fscanf(f, "%u", &i) == 1 && i > 0) {
++ pclose(f);
++ return TRUE;
++ }
++ pclose(f);
++ }
++ return FALSE;
++}
++
++#endif /* !defined(FREEBSD_USB) */
++
+ static const char *
+ FindDevice(InputInfoPtr pInfo, const char *protocol, int flags)
+ {
++#if !defined(FREEBSD_USB)
+ int fd = -1;
++#else
++ int ret = -1;
++#endif
+ const char **pdev, *dev = NULL;
+ Bool devMouse = FALSE;
+ struct stat devMouseStat;
+ struct stat sb;
+
+ for (pdev = mouseDevs; *pdev; pdev++) {
++
++#if !defined(FREEBSD_USB)
+ SYSCALL (fd = open(*pdev, O_RDWR | O_NONBLOCK));
+ if (fd == -1) {
++#else
++ SYSCALL (ret = stat(*pdev, &sb));
++ if (ret == -1) {
++#endif /* !defined(FREEBSD_USB) */
++
+ #ifdef DEBUG
++#if !defined(FREEBSD_USB)
+ ErrorF("Cannot open %s (%s)\n", *pdev, strerror(errno));
++#else
++ ErrorF("Cannot stat %s (%s)\n", *pdev, strerror(errno));
++#endif /* !defined(FREEBSD_USB) */
+ #endif
+ } else {
+ /*
+@@ -293,28 +505,70 @@ FindDevice(InputInfoPtr pInfo, const cha
+ * the test for whether /dev/sysmouse is usable can be made.
+ */
+ if (!strcmp(*pdev, DEFAULT_MOUSE_DEV)) {
++#if !defined(FREEBSD_USB)
+ if (fstat(fd, &devMouseStat) == 0)
+ devMouse = TRUE;
+ close(fd);
++#else
++ memcpy(&devMouseStat, &sb, sizeof(devMouseStat));
++ devMouse = TRUE;
++#endif /* !defined(FREEBSD_USB) */
+ continue;
+ } else if (!strcmp(*pdev, DEFAULT_SYSMOUSE_DEV)) {
+ /* Check if /dev/mouse is the same as /dev/sysmouse. */
++#if !defined(FREEBSD_USB)
+ if (devMouse && fstat(fd, &sb) == 0 &&
+ devMouseStat.st_dev == sb.st_dev &&
+ devMouseStat.st_ino == sb.st_ino) {
++#else
++ if (devMouse && devMouseStat.st_dev == sb.st_dev &&
++ devMouseStat.st_ino == sb.st_ino) {
++#endif /* !defined(FREEBSD_USB) */
+ /* If the same, use /dev/sysmouse. */
+ devMouse = FALSE;
+ }
++
++#if !defined(FREEBSD_USB)
+ close(fd);
+ if (MousedRunning())
++#else
++ if (MousedRunning(NULL))
++#endif /* !defined(FREEBSD_USB) */
++
+ break;
++
++#if !defined(FREEBSD_USB)
+ else {
+ #ifdef DEBUG
+ ErrorF("moused isn't running\n");
+ #endif
+ }
++#endif /* !defined(FREEBSD_USB) */
++
+ } else {
++
++#if !defined(FREEBSD_USB)
++
+ close(fd);
++
++#else /* defined(FREEBSD_USB) */
++
++ /* Check if /dev/mouse is the same as this device. */
++ if (devMouse && devMouseStat.st_dev == sb.st_dev &&
++ devMouseStat.st_ino == sb.st_ino) {
++ /* If the same, use this device. */
++ devMouse = FALSE;
++ }
++ if (MousedRunning(*pdev))
++ continue;
++ /* ums(4) does not support anything but SysMouse protocol. */
++ if (!strncmp(*pdev, DEFAULT_USB_DEV, 8) && protocol &&
++ xf86NameCmp(protocol, "auto") != 0 &&
++ xf86NameCmp(protocol, "sysmouse") != 0)
++ continue;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ break;
+ }
+ }
+@@ -486,8 +740,17 @@ wsconsPreInit(InputInfoPtr pInfo, const
+
+ #if defined(USBMOUSE_SUPPORT)
+
++#if defined(FREEBSD_USB)
++#define MAXRIDS 64
++#define MAXACOLS 8
++#define MAXLCOLS 16
++#endif
++
+ typedef struct _UsbMseRec {
+ int packetSize;
++
++#if !defined(FREEBSD_USB)
++
+ int iid;
+ hid_item_t loc_x; /* x locator item */
+ hid_item_t loc_y; /* y locator item */
+@@ -495,22 +758,92 @@ typedef struct _UsbMseRec {
+ hid_item_t loc_w; /* z (wheel) locator item */
+ hid_item_t loc_btn[MSE_MAXBUTTONS]; /* buttons locator items */
+ unsigned char *buffer;
++
++#else /* defined(FREEBSD_USB) */
++
++ int iid, nrids, nacols, opened;
++ struct {
++ int32_t rid;
++ int size;
++ } rids[MAXRIDS];
++ struct UsbMseAcol {
++ InputInfoPtr pInfo;
++ int nlcols, nbuttons, hasZ, hasW;
++ int xmin, xmax, ymin, ymax, pmin, pmax, px, py;
++ int cxmin, cxmax, cymin, cymax, cpmin, cpmax;
++ struct UsbMseLcol {
++ 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 (hwheel) locator item */
++ hid_item_t loc_p; /* Tip Pressure */
++ hid_item_t loc_valid; /* Touch Valid */
++ hid_item_t loc_in_range; /* In Range */
++ hid_item_t loc_btn[MSE_MAXBUTTONS]; /* buttons locator items */
++ } lcols[MAXLCOLS];
++ hid_item_t loc_cc; /* contact count */
++ } acols[MAXACOLS];
++ unsigned char *buffer;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ } UsbMseRec, *UsbMsePtr;
+
++#if defined(FREEBSD_USB)
++static int *
++usbGetReportSizePtr(UsbMsePtr pUsbMse, int32_t rid)
++{
++ int i;
++
++ for (i = 0; i < pUsbMse->nrids; i++) {
++ if (pUsbMse->rids[i].rid == rid)
++ return (&pUsbMse->rids[i].size);
++ }
++ for (i = 0; i < MAXRIDS; i++) {
++ if (pUsbMse->rids[i].size == 0) {
++ pUsbMse->rids[i].rid = rid;
++ pUsbMse->nrids = max(pUsbMse->nrids, i + 1);
++ return (&pUsbMse->rids[i].size);
++ }
++ }
++ return (NULL);
++}
++#endif /* defined(FREEBSD_USB) */
++
+ static int
+ usbMouseProc(DeviceIntPtr pPointer, int what)
+ {
+ InputInfoPtr pInfo;
+ MouseDevPtr pMse;
+ UsbMsePtr pUsbMse;
++#if defined(FREEBSD_USB)
++ struct UsbMseAcol *acol;
++#endif
+ unsigned char map[MSE_MAXBUTTONS + 1];
++
++#if !defined(FREEBSD_USB)
+ int nbuttons;
++#else /* defined (FREEBSD_USB) */
++ int nacol, nbuttons;
++#ifdef HAVE_LABELS
++ Atom btn_labels[MSE_MAXBUTTONS] = {0};
++ Atom axes_labels[3] = { 0, 0, 0 };
++#endif
++#endif /* !defined(FREEBSD_USB) */
+
+ pInfo = pPointer->public.devicePrivate;
+ pMse = pInfo->private;
+ pMse->device = pPointer;
+ pUsbMse = pMse->mousePriv;
+
++#if defined(FREEBSD_USB)
++ for (nacol = 0; nacol < (pUsbMse->nacols - 1); nacol++) {
++ if (pUsbMse->acols[nacol].pInfo == pInfo)
++ break;
++ }
++ acol = &pUsbMse->acols[nacol];
++#endif
++
+ switch (what) {
+ case DEVICE_INIT:
+ pPointer->public.on = FALSE;
+@@ -518,23 +851,114 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ for (nbuttons = 0; nbuttons < MSE_MAXBUTTONS; ++nbuttons)
+ map[nbuttons + 1] = nbuttons + 1;
+
++#if !defined(FREEBSD_USB)
+ InitPointerDeviceStruct((DevicePtr)pPointer,
+ map,
+ min(pMse->buttons, MSE_MAXBUTTONS),
+ miPointerGetMotionEvents,
+ pMse->Ctrl,
+ miPointerGetMotionBufferSize());
++#else /* defined(FREEBSD_USB) */
++
++#ifdef HAVE_LABELS
++ btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
++ btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
++ btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
++ axes_labels[0] = XIGetKnownProperty((acol->xmin != acol->xmax)
++ ? AXIS_LABEL_PROP_ABS_X : AXIS_LABEL_PROP_REL_X);
++ axes_labels[1] = XIGetKnownProperty((acol->xmin != acol->xmax)
++ ? AXIS_LABEL_PROP_ABS_Y : AXIS_LABEL_PROP_REL_Y);
++ axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_ABS_PRESSURE);
++#endif
++
++ InitButtonClassDeviceStruct(pPointer, min(pMse->buttons, MSE_MAXBUTTONS),
++#ifdef HAVE_LABELS
++ btn_labels,
++#endif
++ map);
++ InitValuatorClassDeviceStruct(pPointer, (acol->pmin != acol->pmax) ? 3 : 2,
++#ifdef HAVE_LABELS
++ axes_labels,
++#endif
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
++ miPointerGetMotionEvents,
++#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
++ GetMotionHistory,
++#endif
++ GetMotionHistorySize(),
++ (acol->xmin != acol->xmax || acol->ymin != acol->ymax) ?
++ Absolute : Relative);
++ InitPtrFeedbackClassDeviceStruct(pPointer, pMse->Ctrl);
++
++#endif /* !defined(FREEBSD_USB) */
+
+ /* X valuator */
++#if !defined(FREEBSD_USB)
++
+ xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
+ xf86InitValuatorDefaults(pPointer, 0);
++
++#else /* defined(FREEBSD_USB) */
++
++ xf86InitValuatorAxisStruct(pPointer, 0,
++#ifdef HAVE_LABELS
++ axes_labels[0],
++#endif
++ (acol->xmin != acol->xmax) ? acol->xmin : -1,
++ (acol->xmin != acol->xmax) ? acol->xmax : -1,
++ 1, 0, 1
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
++ , (acol->xmin != acol->xmax) ? Absolute : Relative
++#endif
++ );
++ xf86InitValuatorDefaults(pPointer, 0);
++
++#endif /* !defined(FREEBSD_USB) */
++
+ /* Y valuator */
++
++#if !defined(FREEBSD_USB)
++
+ xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
+ xf86InitValuatorDefaults(pPointer, 1);
++
++#else /* defined(FREEBSD_USB) */
++
++ xf86InitValuatorAxisStruct(pPointer, 1,
++#ifdef HAVE_LABELS
++ axes_labels[1],
++#endif
++ (acol->ymin != acol->ymax) ? acol->ymin : -1,
++ (acol->ymin != acol->ymax) ? acol->ymax : -1,
++ 1, 0, 1
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
++ , (acol->ymin != acol->ymax) ? Absolute : Relative
++#endif
++ );
++ xf86InitValuatorDefaults(pPointer, 1);
++ /* Pressure valuator */
++ if (acol->pmin != acol->pmax) {
++ xf86InitValuatorAxisStruct(pPointer, 2,
++#ifdef HAVE_LABELS
++ axes_labels[2],
++#endif
++ acol->pmin, acol->pmax, 1, 0, 1
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 12
++ , Absolute
++#endif
++ );
++ xf86InitValuatorDefaults(pPointer, 2);
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
+ xf86MotionHistoryAllocate(pInfo);
+ break;
+
+ case DEVICE_ON:
++
++#if !defined(FREEBSD_USB)
++
+ pInfo->fd = xf86OpenSerial(pInfo->options);
+ if (pInfo->fd == -1)
+ xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
+@@ -548,9 +972,33 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ xf86FlushInput(pInfo->fd);
+ if (!xf86InstallSIGIOHandler (pInfo->fd, usbSigioReadInput,
+ pInfo))
+- AddEnabledDevice(pInfo->fd);
++ xf86AddEnabledDevice(pInfo);
+ }
+ }
++
++#else /* defined(FREEBSD_USB) */
++
++ if (pUsbMse->opened++ == 0) {
++ pInfo->fd = xf86OpenSerial(pInfo->options);
++ if (pInfo->fd == -1)
++ xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
++ else {
++ pMse->buffer = XisbNew(pInfo->fd, pUsbMse->packetSize);
++ if (!pMse->buffer) {
++ free(pMse);
++ xf86CloseSerial(pInfo->fd);
++ pInfo->fd = -1;
++ } else {
++ xf86FlushInput(pInfo->fd);
++ if (!xf86InstallSIGIOHandler (pInfo->fd, usbSigioReadInput,
++ pInfo))
++ xf86AddEnabledDevice(pInfo);
++ }
++ }
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
+ pMse->lastButtons = 0;
+ pMse->lastMappedButtons = 0;
+ pMse->emulateState = 0;
+@@ -560,7 +1008,7 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ case DEVICE_OFF:
+ case DEVICE_CLOSE:
+ if (pInfo->fd != -1) {
+- RemoveEnabledDevice(pInfo->fd);
++ xf86RemoveEnabledDevice(pInfo);
+ if (pUsbMse->packetSize > 8 && pUsbMse->buffer) {
+ free(pUsbMse->buffer);
+ }
+@@ -571,6 +1019,9 @@ usbMouseProc(DeviceIntPtr pPointer, int
+ xf86CloseSerial(pInfo->fd);
+ pInfo->fd = -1;
+ }
++#if defined(FREEBSD_USB)
++ pUsbMse->opened--;
++#endif
+ pPointer->public.on = FALSE;
+ usleep(300000);
+ break;
+@@ -586,27 +1037,86 @@ usbReadInput(InputInfoPtr pInfo)
+ {
+ MouseDevPtr pMse;
+ UsbMsePtr pUsbMse;
++
++#if !defined(FREEBSD_USB)
+ int buttons = pMse->lastButtons;
+ int dx = 0, dy = 0, dz = 0, dw = 0;
+ int n, c;
++#else
++ int buttons, cc;
++ int dx, dy, dz, dw, dp, upd, v, nx, ny, np, in_range;
++ int n, c, rid, *sizep, nacol, nlcol;
++#endif /* !defined(FREEBSD_USB) */
++
+ unsigned char *pBuf;
+
++#if defined(FREEBSD_USB)
++ struct UsbMseAcol *acol;
++ struct UsbMseLcol *lcol;
++#endif
+ pMse = pInfo->private;
+ pUsbMse = pMse->mousePriv;
+
+ XisbBlockDuration(pMse->buffer, -1);
++#if defined(FREEBSD_USB)
++next:
++#endif
+ pBuf = pUsbMse->buffer;
+ n = 0;
++
++#if !defined(FREEBSD_USB)
++
+ while ((c = XisbRead(pMse->buffer)) >= 0 && n < pUsbMse->packetSize) {
+ pBuf[n++] = (unsigned char)c;
++
++ }
++#else /* defined(FREEBSD_USB) */
++
++ if (pUsbMse->iid) {
++ rid = XisbRead(pMse->buffer);
++ if (rid < 0)
++ return;
++ pBuf[n++] = (unsigned char)rid;
++ } else
++ rid = 0;
++ sizep = usbGetReportSizePtr(pUsbMse, rid);
++ if (sizep == NULL || *sizep == 0) {
++ xf86Msg(X_WARNING, "%s: unknown report ID %d\n", pInfo->name, rid);
++ goto next;
+ }
++ while (n < *sizep && (c = XisbRead(pMse->buffer)) >= 0) {
++ pBuf[n++] = (unsigned char)c;
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
+ if (n == 0)
+ return;
++
++#if !defined(FREEBSD_USB)
++
+ if (n != pUsbMse->packetSize) {
+ LogMessageVerbSigSafe(X_WARNING, -1,
+ "%s: incomplete packet, size %d\n",
+ pInfo->name, n);
+ }
++
++#else /* defined(FREEBSD_USB) */
++
++ if (n == 0)
++ return;
++// xf86MsgVerb(X_INFO, 3, "pkt: %d %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
++// n, pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7], pBuf[8], pBuf[9]);
++ if (n != *sizep) {
++ LogMessageVerbSigSafe(X_WARNING, -1,
++ "%s: incomplete packet, size %d\n",
++ pInfo->name, n);
++ }
++
++#endif /* !defined(FREEBSD_USB) */
++
++#if !defined(FREEBSD_USB)
++
+ /* discard packets with an id that don't match the mouse */
+ /* XXX this is probably not the right thing */
+ if (pUsbMse->iid != 0) {
+@@ -625,6 +1135,122 @@ usbReadInput(InputInfoPtr pInfo)
+ }
+ pMse->PostEvent(pInfo, buttons, dx, dy, dz, dw);
+ return;
++
++#else /* defined(FREEBSD_USB) */
++
++ for (nacol = 0; nacol < pUsbMse->nacols; nacol++) {
++ acol = &pUsbMse->acols[nacol];
++ if (acol->pInfo == NULL)
++ continue;
++ nx = ny = np = upd = 0;
++ buttons = cc = 0;
++ dx = dy = dz = dw = dp = 0;
++ for (nlcol = 0; nlcol < pUsbMse->acols[nacol].nlcols; nlcol++) {
++ lcol = &acol->lcols[nlcol];
++
++ if (lcol->loc_valid.usage != 0 && rid == lcol->loc_valid.report_ID &&
++ hid_get_data(pBuf, &lcol->loc_valid) == 0)
++ continue;
++ if (lcol->loc_in_range.usage != 0 && rid == lcol->loc_in_range.report_ID)
++ in_range = hid_get_data(pBuf, &lcol->loc_in_range);
++ else
++ in_range = 1;
++ if (in_range && lcol->loc_x.usage != 0 && rid == lcol->loc_x.report_ID && nx == 0) {
++ v = hid_get_data(pBuf, &lcol->loc_x);
++ if (acol->xmin != acol->xmax) {
++ v = xf86ScaleAxis(v, acol->xmax, acol->xmin,
++ lcol->loc_x.logical_maximum, lcol->loc_x.logical_minimum);
++ if (acol->cxmin != acol->cxmax)
++ v = xf86ScaleAxis(v, acol->xmax, acol->xmin,
++ acol->cxmax, acol->cxmin);
++ }
++ dx += v;
++ nx++;
++ }
++ if (in_range && lcol->loc_y.usage != 0 && rid == lcol->loc_y.report_ID && ny == 0) {
++ v = hid_get_data(pBuf, &lcol->loc_y);
++ if (acol->xmin != acol->xmax) {
++ v = xf86ScaleAxis(v, acol->ymax, acol->ymin,
++ lcol->loc_y.logical_maximum, lcol->loc_y.logical_minimum);
++ if (acol->cymin != acol->cymax)
++ v = xf86ScaleAxis(v, acol->ymax, acol->ymin,
++ acol->cymax, acol->cymin);
++ }
++ dy += v;
++ ny++;
++ }
++ if (lcol->loc_z.usage != 0 && rid == lcol->loc_z.report_ID) {
++ dz -= hid_get_data(pBuf, &lcol->loc_z);
++ upd = 1;
++ }
++ if (lcol->loc_w.usage != 0 && rid == lcol->loc_w.report_ID) {
++ dw += hid_get_data(pBuf, &lcol->loc_w);
++ upd = 1;
++ }
++ if (lcol->loc_p.usage != 0 && rid == lcol->loc_p.report_ID && np == 0) {
++ v = hid_get_data(pBuf, &lcol->loc_p);
++ v = xf86ScaleAxis(v, acol->pmax, acol->pmin,
++ lcol->loc_p.logical_maximum, lcol->loc_p.logical_minimum);
++ if (acol->cpmin != acol->cpmax)
++ v = xf86ScaleAxis(v, acol->pmax, acol->pmin,
++ acol->cpmax, acol->cpmin);
++ dp += v;
++ np++;
++ }
++
++ for (n = 0; n < acol->nbuttons; n++) {
++ if (lcol->loc_btn[n].usage != 0 && rid == lcol->loc_btn[n].report_ID) {
++ if (hid_get_data(pBuf, &lcol->loc_btn[n]))
++ buttons |= (1 << UMS_BUT(n));
++ upd = 1;
++ }
++ }
++ }
++ if (acol->loc_cc.usage != 0 && rid == acol->loc_cc.report_ID)
++ cc = hid_get_data(pBuf, &acol->loc_cc);
++ else
++ cc = (nx || ny) ? 1 : 0;
++ if (cc > 1)
++ buttons = (1 << UMS_BUT(1));
++ if (nx != 0 && acol->xmin != acol->xmax)
++ dx /= nx;
++ if (ny != 0 && acol->ymin != acol->ymax)
++ dy /= ny;
++ if (np != 0 && acol->pmin != acol->pmax)
++ dp /= np;
++// if (upd || nx || ny || np)
++// xf86MsgVerb(X_INFO, 3, "%d cc %d dx %d dy %d dz %d dw %d press %d buttons %02x\n",
++// nacol, cc, dx, dy, dz, dw, dp, buttons);
++ if (nx != 0 || ny != 0) {
++ if (acol->pmin != acol->pmax) {
++ xf86PostMotionEvent(acol->pInfo->dev,
++ /* is_absolute: */ TRUE,
++ /* first_valuator: */ 0,
++ /* num_valuators: */ 3,
++ dx, dy, dp);
++ } else if (acol->xmin != acol->xmax || acol->ymin != acol->ymax) {
++ xf86PostMotionEvent(acol->pInfo->dev,
++ /* is_absolute: */ TRUE,
++ /* first_valuator: */ 0,
++ /* num_valuators: */ 2,
++ dx, dy);
++ }
++ }
++ if (upd || (nx != 0) || (ny != 0)) {
++ ((MouseDevPtr)acol->pInfo->private)->PostEvent(acol->pInfo, buttons,
++ ((acol->xmin != acol->xmax) ? dx - acol->px : dx),
++ ((acol->ymin != acol->ymax) ? dy - acol->py : dy),
++ dz, dw);
++ }
++ if (nx > 0)
++ acol->px = dx;
++ if (ny > 0)
++ acol->py = dy;
++ }
++ goto next;
++
++#endif /* !defined(FREEBSD_USB) */
++
+ }
+
+ static void
+@@ -633,15 +1259,27 @@ usbSigioReadInput (int fd, void *closure
+ usbReadInput ((InputInfoPtr) closure);
+ }
+
++#if !defined(FREEBSD_USB)
+ /* This function is called when the protocol is "usb". */
+ static Bool
+ usbPreInit(InputInfoPtr pInfo, const char *protocol, int flags)
++#else
++static Bool
++usbInitFirst(InputInfoPtr pInfo)
++#endif /* !defined(FREEBSD_USB) */
+ {
+ MouseDevPtr pMse = pInfo->private;
+ UsbMsePtr pUsbMse;
+ report_desc_t reportDesc;
++#if !defined(FREEBSD_USB)
+ int i;
+-
++#else
++ hid_data_t d;
++ hid_item_t h;
++ struct UsbMseAcol *acol;
++ struct UsbMseLcol *lcol;
++ int mdepth, rsize, *rsizep, acolused, lcolused, used;
++#endif /* !defined(FREEBSD_USB) */
+ pUsbMse = malloc(sizeof(UsbMseRec));
+ if (pUsbMse == NULL) {
+ xf86Msg(X_ERROR, "%s: cannot allocate UsbMouseRec\n", pInfo->name);
+@@ -649,12 +1287,16 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ return FALSE;
+ }
+
++#if !defined(FREEBSD_USB)
+ pMse->protocol = protocol;
+ xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
+
+ /* Collect the options, and process the common options. */
+ COLLECT_INPUT_OPTIONS(pInfo, NULL);
+ xf86ProcessCommonOptions(pInfo, pInfo->options);
++#else
++ bzero(pUsbMse, sizeof(UsbMseRec));
++#endif /* !defined(FREEBSD_USB) */
+
+ /* Check if the device can be opened. */
+ pInfo->fd = xf86OpenSerial(pInfo->options);
+@@ -670,6 +1312,9 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ }
+ /* Get USB informations */
+ reportDesc = hid_get_report_desc(pInfo->fd);
++
++#if !defined(FREEBSD_USB)
++
+ /* Get packet size & iid */
+ #ifdef USB_NEW_HID
+ if (ioctl(pInfo->fd, USB_GET_REPORT_ID, &pUsbMse->iid) == -1) {
+@@ -683,6 +1328,139 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ pUsbMse->packetSize = hid_report_size(reportDesc, hid_input,
+ &pUsbMse->iid);
+ #endif
++
++#else /* defined(FREEBSD_USB) */
++
++ mdepth = 0;
++ pUsbMse->nacols = 0;
++ acol = &pUsbMse->acols[pUsbMse->nacols];
++ lcol = &acol->lcols[acol->nlcols];
++ acolused = 0;
++ lcolused = 0;
++ d = hid_start_parse(reportDesc, (1 << hid_input) |
++ (1 << hid_collection) | (1 << hid_endcollection), -1);
++ while (hid_get_item(d, &h)) {
++ switch (h.kind) {
++ case hid_collection:
++ if (mdepth != 0)
++ mdepth++;
++ else if (h.collection == 1 &&
++ (h.usage == 0x00010001 || h.usage == 0x00010002 ||
++ (h.usage >= 0x000d0001 && h.usage <= 0x000d000d))) {
++ mdepth++;
++ if (acolused) {
++ if (lcolused) {
++ acol->nlcols++;
++ lcolused = 0;
++ }
++ pUsbMse->nacols++;
++ acolused = 0;
++ acol = &pUsbMse->acols[pUsbMse->nacols];
++ lcol = &acol->lcols[acol->nlcols];
++ }
++ }
++ if (lcolused && (h.collection == 0 ||
++ h.collection == 2 || h.collection == 3)) {
++ acol->nlcols++;
++ lcolused = 0;
++ lcol = &acol->lcols[acol->nlcols];
++ }
++ break;
++ case hid_endcollection:
++ if (mdepth != 0)
++ mdepth--;
++ break;
++ case hid_input:
++ if (h.report_ID != 0)
++ pUsbMse->iid = 1;
++ rsize = pUsbMse->iid +
++ (h.pos + (h.report_size * h.report_count) + 7) / 8;
++ if ((rsizep = usbGetReportSizePtr(pUsbMse, h.report_ID)) != NULL)
++ *rsizep = max(*rsizep, rsize);
++ pUsbMse->packetSize = max(pUsbMse->packetSize, rsize);
++ if (mdepth == 0)
++ break;
++ used = 1;
++ if (h.usage == 0x00010030) { /* X */
++ lcol->loc_x = h;
++ if ((h.flags & 0x04) == 0) {
++ if (acol->xmin == acol->xmax) {
++ acol->xmin = h.logical_minimum;
++ acol->xmax = h.logical_maximum;
++ } else {
++ acol->xmin = min(acol->xmin, h.logical_minimum);
++ acol->xmax = max(acol->xmax, h.logical_maximum);
++ }
++ }
++ } else if (h.usage == 0x00010031) { /* Y */
++ lcol->loc_y = h;
++ if ((h.flags & 0x04) == 0) {
++ if (acol->ymin == acol->ymax) {
++ acol->ymin = h.logical_minimum;
++ acol->ymax = h.logical_maximum;
++ } else {
++ acol->ymin = min(acol->ymin, h.logical_minimum);
++ acol->ymax = max(acol->ymax, h.logical_maximum);
++ }
++ }
++ } else if (h.usage == 0x00010038) { /* Z */
++ lcol->loc_z = h;
++ acol->hasZ = 1;
++ } else if (h.usage == 0x000c0238) { /* W */
++ lcol->loc_w = h;
++ acol->hasW = 1;
++ } else if (h.usage == 0x000d0030) { /* Press */
++ lcol->loc_p = h;
++ if ((h.flags & 0x04) == 0) {
++ if (acol->pmin == acol->pmax) {
++ acol->pmin = h.logical_minimum;
++ acol->pmax = h.logical_maximum;
++ } else {
++ acol->pmin = min(acol->pmin, h.logical_minimum);
++ acol->pmax = max(acol->pmax, h.logical_maximum);
++ }
++ }
++ } else if (h.usage == 0x000d0032) /* In Range */
++ lcol->loc_in_range = h;
++ else if (h.usage == 0x000d0047) /* Valid */
++ lcol->loc_valid = h;
++ else if (h.usage > 0x00090000 &&
++ h.usage <= 0x00090000 + MSE_MAXBUTTONS) { /* Buttons */
++ lcol->loc_btn[(h.usage & 0xffff) - 1] = h;
++ acol->nbuttons = max(acol->nbuttons, h.usage & 0xffff);
++ } else if (h.usage == 0x000d0042) { /* Tip Switch */
++ lcol->loc_btn[0] = h;
++ acol->nbuttons = max(acol->nbuttons, 1);
++ } else if (h.usage == 0x000d0044) { /* Barrel Switch */
++ lcol->loc_btn[1] = h;
++ acol->nbuttons = max(acol->nbuttons, 2);
++ } else if (h.usage == 0x000d0045) { /* Eraser */
++ lcol->loc_btn[3] = h;
++ acol->nbuttons = max(acol->nbuttons, 4);
++ } else if (h.usage == 0x000d0046) { /* Tablet Pick */
++ lcol->loc_btn[2] = h;
++ acol->nbuttons = max(acol->nbuttons, 3);
++ } else if (h.usage == 0x000d0054) /* Contact Count */
++ acol->loc_cc = h;
++ else
++ used = 0;
++ lcolused += used;
++ acolused += used;
++ break;
++ default:
++ break;
++ }
++ }
++ if (lcolused)
++ acol->nlcols++;
++ if (acolused)
++ pUsbMse->nacols++;
++ hid_end_parse(d);
++ xf86Msg(X_DEFAULT, "%s: Found %d usable logical collections\n",
++ pInfo->name, pUsbMse->nacols);
++
++#endif /* !defined(FREEBSD_USB) */
++
+ /* Allocate buffer */
+ if (pUsbMse->packetSize <= 8) {
+ pUsbMse->buffer = pMse->protoBuf;
+@@ -692,10 +1470,15 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ if (pUsbMse->buffer == NULL) {
+ xf86Msg(X_ERROR, "%s: cannot allocate buffer\n", pInfo->name);
+ free(pUsbMse);
++#if !defined(FREEBSD_USB)
+ free(pMse);
++#endif
+ xf86CloseSerial(pInfo->fd);
+ return FALSE;
+ }
++
++#if !defined(FREEBSD_USB)
++
+ #ifdef USB_NEW_HID
+ if (hid_locate(reportDesc, HID_USAGE2(HUP_GENERIC_DESKTOP, HUG_X),
+ hid_input, &pUsbMse->loc_x, pUsbMse->iid) < 0) {
+@@ -733,12 +1516,15 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ }
+ pMse->buttons = i-1;
+
++#endif /* !defined(FREEBSD_USB) */
++
+ xf86CloseSerial(pInfo->fd);
+ pInfo->fd = -1;
+
+ /* Private structure */
+ pMse->mousePriv = pUsbMse;
+
++#if !defined(FREEBSD_USB)
+ /* Process common mouse options (like Emulate3Buttons, etc). */
+ pMse->CommonOptions(pInfo);
+
+@@ -749,8 +1535,137 @@ usbPreInit(InputInfoPtr pInfo, const cha
+ #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
+ pInfo->flags |= XI86_CONFIGURED;
+ #endif
++
++#endif /* !defined(FREEBSD_USB) */
++
+ return TRUE;
+ }
++
++#if defined(FREEBSD_USB)
++
++/* This function is called when the protocol is "usb". */
++static Bool
++usbPreInit(InputInfoPtr pInfo, const char *protocol, int flags)
++{
++ InputInfoPtr pMatch;
++ MouseDevPtr pMse = pInfo->private;
++ UsbMsePtr pUsbMse;
++ struct UsbMseAcol *acol;
++ char *str;
++ int i, colopt;
++
++ pMse->protocol = protocol;
++ xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
++
++ /* Collect the options, and process the common options. */
++ COLLECT_INPUT_OPTIONS(pInfo, NULL);
++ xf86ProcessCommonOptions(pInfo, pInfo->options);
++
++ /* Check if this HID device is already opened. */
++ for (pMatch = xf86FirstLocalDevice(); pMatch != NULL; pMatch = pMatch->next) {
++ if ((pInfo != pMatch) && strstr(pMatch->drv->driverName, "mouse")) {
++ char *dev1, *dev2;
++
++ dev1 = xf86SetStrOption(pInfo->options, "Device", NULL);
++ dev2 = xf86SetStrOption(pMatch->options, "Device", NULL);
++ if (strcmp(dev1, dev2) == 0) {
++ free(dev1);
++ free(dev2);
++ break;
++ }
++ free(dev1);
++ free(dev2);
++ }
++ }
++ if (pMatch == NULL) {
++ xf86Msg(X_DEFAULT, "%s: Opening new HID device\n", pInfo->name);
++ if (!usbInitFirst(pInfo)) {
++ free(pMse);
++ return FALSE;
++ }
++ } else {
++ pMse->mousePriv = ((MouseDevPtr)pMatch->private)->mousePriv;
++ xf86Msg(X_DEFAULT, "%s: Attaching to already opened HID device\n",
++ pInfo->name);
++ }
++ pUsbMse = pMse->mousePriv;
++
++ /* Attach to collection, respecting "Collection" option. */
++ colopt = xf86SetIntOption(pInfo->options, "Collection", 0);
++ for (i = 0; i < pUsbMse->nacols; i++) {
++ if (pUsbMse->acols[i].pInfo == NULL &&
++ (colopt == 0 || i == colopt - 1)) {
++ pUsbMse->acols[i].pInfo = pInfo;
++ break;
++ }
++ }
++ xf86Msg(colopt == 0 ? X_DEFAULT : X_CONFIG,
++ "%s: Collection: %d\n", pInfo->name,
++ i == pUsbMse->nacols ? colopt : i + 1);
++ if (i == pUsbMse->nacols) {
++ xf86Msg(X_ERROR,
++ "%s: Application collection not found or already handled\n",
++ pInfo->name);
++ free(pMse);
++ return FALSE;
++ }
++
++ acol = &pUsbMse->acols[i];
++ pMse->buttons = acol->nbuttons;
++ if (pMse->buttons == 2)
++ pMse->buttons = 3;
++ if (acol->xmin != acol->xmax || acol->ymin != acol->ymax)
++ pMse->disableXY = TRUE;
++ pMse->hasZ = acol->hasZ;
++ pMse->hasW = acol->hasW;
++
++ /* Process common mouse options (like Emulate3Buttons, etc). */
++ pMse->CommonOptions(pInfo);
++
++ /* Process "Calibration" option. */
++ str = xf86CheckStrOption(pInfo->options, "Calibration", NULL);
++ if (str != NULL && (acol->xmin != acol->xmax || acol->ymin != acol->ymax)) {
++ int j, xmin, xmax, ymin, ymax, pmin, pmax;
++
++ j = sscanf(str, "%d %d %d %d %d %d", &xmin, &xmax, &ymin, &ymax, &pmin, &pmax);
++ if (j == 4) {
++ xf86Msg(X_CONFIG, "%s: Calibration: %d %d %d %d\n",
++ pInfo->name, xmin, xmax, ymin, ymax);
++ acol->cxmin = xmin;
++ acol->cxmax = xmax;
++ acol->cymin = ymin;
++ acol->cymax = ymax;
++ } else if (j == 6) {
++ xf86Msg(X_CONFIG, "%s: Calibration: %d %d %d %d %d %d\n",
++ pInfo->name, xmin, xmax, ymin, ymax, pmin, pmax);
++ acol->cxmin = xmin;
++ acol->cxmax = xmax;
++ acol->cymin = ymin;
++ acol->cymax = ymax;
++ acol->cpmin = pmin;
++ acol->cpmax = pmax;
++ } else
++ xf86Msg(X_WARNING, "%s: Calibration: Invalid arguments\n",
++ pInfo->name);
++ free(str);
++ } else if (acol->xmin != acol->xmax || acol->ymin != acol->ymax) {
++ xf86Msg(X_DEFAULT, "%s: Calibration: %d %d %d %d %d %d\n",
++ pInfo->name, acol->xmin, acol->xmax, acol->ymin, acol->ymax,
++ acol->pmin, acol->pmax);
++ }
++
++ /* Setup the local procs. */
++ pInfo->device_control = usbMouseProc;
++ pInfo->read_input = usbReadInput;
++
++#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
++ pInfo->flags |= XI86_CONFIGURED;
++#endif
++ return TRUE;
++}
++
++#endif /* defined(FREEBSD_USB) */
++
+ #endif /* USBMOUSE */
+
+ static Bool
+@@ -784,7 +1699,15 @@ OSMouseInit(int flags)
+ p->CheckProtocol = CheckProtocol;
+ #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)) && defined(MOUSE_PROTO_SYSMOUSE)
+ p->SetupAuto = SetupAuto;
++
++#if !defined(FREEBSD_USB)
++ p->SetPS2Res = SetSysMouseRes;
++#else
++#ifndef XPS2_SUPPORT
+ p->SetPS2Res = SetSysMouseRes;
++#endif
++#endif
++
+ p->SetBMRes = SetSysMouseRes;
+ p->SetMiscRes = SetSysMouseRes;
+ #endif
diff --git a/xf86-input-mouse-dfbsd/patches/patch-src_mouse.c b/xf86-input-mouse-dfbsd/patches/patch-src_mouse.c
new file mode 100644
index 0000000..f45f0f7
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/patches/patch-src_mouse.c
@@ -0,0 +1,227 @@
+$NetBSD$
+
+Patches from FreeBSD ports / DragonFly dports with include guards.
+Support for different versions of system libusb headers.
+
+--- src/mouse.c.orig 2016-09-06 03:53:31.000000000 +0000
++++ src/mouse.c
+@@ -43,6 +43,13 @@
+ * and to help limited dexterity persons
+ */
+
++/* PKGSRC note: To support newer versions of DragonFly and FreeBSD,
++ * this file is patched using DragonFly dports
++ * x11-drivers/xf86-input-mouse/files/patch-src_mouse.c
++ * as of master commit 4f04bfe0ea83 ... Tue Jul 14 22:56:44 2015 -0700
++ * The patch's code is enclosed in include defined(FREEBSD_USB) while the
++ * original code is enclosed in include !defined(FREEBSD_USB).
++ */
+ #ifdef HAVE_CONFIG_H
+ #include "config.h"
+ #endif
+@@ -304,13 +311,45 @@ MouseCommonOptions(InputInfoPtr pInfo)
+
+ pMse = pInfo->private;
+
++#if !defined(FREEBSD_USB)
+ pMse->buttons = xf86SetIntOption(pInfo->options, "Buttons", 0);
++#else
++ i = xf86SetIntOption(pInfo->options, "Buttons", 0);
++ if (i != 0)
++ pMse->buttons = i;
++#endif
+ if (!pMse->buttons) {
+ pMse->buttons = MSE_DFLTBUTTONS;
+ buttons_from = X_DEFAULT;
+ }
+ origButtons = pMse->buttons;
+
++#if defined(FREEBSD_USB)
++ s = xf86SetStrOption(pInfo->options, "ButtonMapping", NULL);
++ if (s) {
++ int b, n = 0;
++ char *s1 = s;
++ /* keep getting numbers which are buttons */
++ while (s1 && n < MSE_MAXBUTTONS && (b = strtol(s1, &s1, 10)) != 0) {
++ /* check sanity for a button */
++ if (b < 0 || b > MSE_MAXBUTTONS) {
++ xf86Msg(X_WARNING,
++ "ButtonMapping: Invalid button number = %d\n", b);
++ break;
++ };
++ pMse->buttonMap[n++] = 1 << (b-1);
++ if (b > pMse->buttons) pMse->buttons = b;
++ }
++ free(s);
++ }
++ /* get maximum of mapped buttons */
++ for (i = pMse->buttons-1; i >= 0; i--) {
++ int f = ffs (pMse->buttonMap[i]);
++ if (f > pMse->buttons)
++ pMse->buttons = f;
++ }
++#endif
++
+ pMse->emulate3Buttons = xf86SetBoolOption(pInfo->options,
+ "Emulate3Buttons", FALSE);
+ if (!xf86FindOptionValue(pInfo->options,"Emulate3Buttons")) {
+@@ -322,6 +361,10 @@ MouseCommonOptions(InputInfoPtr pInfo)
+ "Emulate3Timeout", 50);
+ if (pMse->emulate3Buttons || pMse->emulate3ButtonsSoft) {
+ MessageType from = X_CONFIG;
++#if defined(FREEBSD_USB)
++ if (pMse->buttons < 3)
++ pMse->buttons = 3;
++#endif
+ if (pMse->emulate3ButtonsSoft)
+ from = X_DEFAULT;
+ xf86Msg(from, "%s: Emulate3Buttons, Emulate3Timeout: %d\n",
+@@ -329,6 +372,10 @@ MouseCommonOptions(InputInfoPtr pInfo)
+ }
+
+ pMse->chordMiddle = xf86SetBoolOption(pInfo->options, "ChordMiddle", FALSE);
++#if defined(FREEBSD_USB)
++ if (pMse->chordMiddle && pMse->buttons < 3)
++ pMse->buttons = 3;
++#endif
+ pMse->flipXY = xf86SetBoolOption(pInfo->options, "FlipXY", FALSE);
+ if (xf86SetBoolOption(pInfo->options, "InvX", FALSE)) {
+ pMse->invX = -1;
+@@ -339,7 +386,9 @@ MouseCommonOptions(InputInfoPtr pInfo)
+ } else
+ pMse->invY = 1;
+ pMse->angleOffset = xf86SetIntOption(pInfo->options, "AngleOffset", 0);
+-
++#if defined(FREEBSD_USB)
++ pMse->sensitivity = xf86SetRealOption(pInfo->options, "Sensitivity", 1.0);
++#endif
+
+ if (pMse->pDragLock)
+ free(pMse->pDragLock);
+@@ -449,14 +498,25 @@ MouseCommonOptions(InputInfoPtr pInfo)
+ free(s);
+ }
+
++#if !defined(FREEBSD_USB)
+ s = xf86SetStrOption(pInfo->options, "ZAxisMapping", "4 5");
++#else
++ s = xf86SetStrOption(pInfo->options, "ZAxisMapping",
++ pMse->hasZ ? ( pMse->hasW ? "4 5 6 7" : "4 5" ) : "off");
++#endif
+ if (s) {
+ int b1 = 0, b2 = 0, b3 = 0, b4 = 0;
+ char *msg = NULL;
+
+ pMse->negativeZ = pMse->positiveZ = MSE_NOAXISMAP;
+ pMse->negativeW = pMse->positiveW = MSE_NOAXISMAP;
++#if !defined(FREEBSD_USB)
+ if (!xf86NameCmp(s, "x")) {
++#else
++ if (!xf86NameCmp(s, "off")) {
++ msg = xstrdup("off");
++ } else if (!xf86NameCmp(s, "x")) {
++#endif
+ pMse->negativeZ = pMse->positiveZ = MSE_MAPTOX;
+ msg = xstrdup("X axis");
+ } else if (!xf86NameCmp(s, "y")) {
+@@ -605,6 +665,7 @@ MouseCommonOptions(InputInfoPtr pInfo)
+ pInfo->name, wheelButton, pMse->wheelInertia,
+ pMse->wheelButtonTimeout);
+ }
++#if !defined(FREEBSD_USB)
+ s = xf86SetStrOption(pInfo->options, "ButtonMapping", NULL);
+ if (s) {
+ int b, n = 0;
+@@ -628,6 +689,7 @@ MouseCommonOptions(InputInfoPtr pInfo)
+ if (f > pMse->buttons)
+ pMse->buttons = f;
+ }
++#endif
+ if (origButtons != pMse->buttons)
+ buttons_from = X_CONFIG;
+ xf86Msg(buttons_from, "%s: Buttons: %d\n", pInfo->name, pMse->buttons);
+@@ -709,7 +771,9 @@ MouseHWOptions(InputInfoPtr pInfo)
+ }
+ pMse->sampleRate = xf86SetIntOption(pInfo->options, "SampleRate", 0);
+ pMse->resolution = xf86SetIntOption(pInfo->options, "Resolution", 0);
++#if !defined(FREEBSD_USB)
+ mPriv->sensitivity = xf86SetRealOption(pInfo->options, "Sensitivity", 1.0);
++#endif
+ }
+
+ static void
+@@ -998,6 +1062,11 @@ MousePreInit(InputDriverPtr drv, InputIn
+ for (i = 0; i < MSE_MAXBUTTONS; i++)
+ pMse->buttonMap[i] = 1 << (i > 2 && i < MSE_MAXBUTTONS-4 ? i+4 : i);
+
++#if defined(FREEBSD_USB)
++ pMse->hasZ = 1;
++ pMse->hasW = 0;
++#endif
++
+ protocol = MousePickProtocol(pInfo, device, protocol, &protocolID);
+
+ if (!device)
+@@ -2288,6 +2357,11 @@ MouseDoPostEvent(InputInfoPtr pInfo, int
+ }
+ }
+ }
++#if defined (FREEBSD_USB)
++ } else {
++ pMse->wheelXDistance = 0;
++ pMse->wheelYDistance = 0;
++#endif
+ }
+
+ /* Absorb the mouse movement while the wheel button is pressed. */
+@@ -2305,7 +2379,11 @@ MouseDoPostEvent(InputInfoPtr pInfo, int
+ if (pMse->emulate3ButtonsSoft && pMse->emulate3Pending && (dx || dy))
+ buttonTimer(pInfo);
+
++#if !defined(FREEBSD_USB)
+ if (dx || dy)
++#else
++ if ((dx || dy) && !pMse->disableXY)
++#endif
+ xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
+
+ if (change) {
+@@ -2418,12 +2496,16 @@ MousePostEvent(InputInfoPtr pInfo, int t
+ int dx, int dy, int dz, int dw)
+ {
+ MouseDevPtr pMse;
++#if !defined(FREEBSD_USB)
+ mousePrivPtr mousepriv;
++#endif
+ int zbutton = 0, wbutton = 0, zbuttoncount = 0, wbuttoncount = 0;
+ int i, b, buttons = 0;
+
+ pMse = pInfo->private;
++#if !defined(FREEBSD_USB)
+ mousepriv = (mousePrivPtr)pMse->mousePriv;
++#endif
+
+ if (pMse->protocolID == PROT_MMHIT)
+ b = reverseBits(hitachMap, truebuttons);
+@@ -2516,12 +2598,21 @@ MousePostEvent(InputInfoPtr pInfo, int t
+
+ /* Accumulate the scaled dx, dy in the private variables
+ fracdx,fracdy and return the integer number part */
++#if !defined(FREEBSD_USB)
+ if (mousepriv) {
+ mousepriv->fracdx += mousepriv->sensitivity*dx;
+ mousepriv->fracdy += mousepriv->sensitivity*dy;
+ mousepriv->fracdx -= ( dx=(int)(mousepriv->fracdx) );
+ mousepriv->fracdy -= ( dy=(int)(mousepriv->fracdy) );
+ }
++#else
++ if (pMse->sensitivity != 0) {
++ pMse->fracdx += pMse->sensitivity*dx;
++ pMse->fracdy += pMse->sensitivity*dy;
++ pMse->fracdx -= ( dx=(int)(pMse->fracdx) );
++ pMse->fracdy -= ( dy=(int)(pMse->fracdy) );
++ }
++#endif
+
+ /* If mouse wheel movement has to be mapped on a button, we need to
+ * loop for button press and release events. */
diff --git a/xf86-input-mouse-dfbsd/patches/patch-src_mouse.h b/xf86-input-mouse-dfbsd/patches/patch-src_mouse.h
new file mode 100644
index 0000000..79b97c7
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/patches/patch-src_mouse.h
@@ -0,0 +1,51 @@
+$NetBSD$
+
+Patches from FreeBSD ports / DragonFly dports with include guards.
+Support for different versions of system libusb headers.
+
+--- src/mouse.h.orig 2012-10-08 01:40:07.000000000 +0000
++++ src/mouse.h
+@@ -27,6 +27,14 @@
+
+ /* Public interface to OS-specific mouse support. */
+
++/* PKGSRC note: To support newer versions of DragonFly and FreeBSD,
++ * this file is patched using DragonFly dports
++ * x11-drivers/xf86-input-mouse/files/patch-src_mouse.h
++ * as of master commit 4f04bfe0ea83 ... Tue Jul 14 22:56:44 2015 -0700
++ * The patch's code is enclosed in include defined(FREEBSD_USB) while the
++ * original code is enclosed in include !defined(FREEBSD_USB).
++ */
++
+ #ifndef _XF86OSMOUSE_H_
+ #define _XF86OSMOUSE_H_
+
+@@ -220,10 +228,17 @@ typedef struct _MouseDevRec {
+ Bool emulate3ButtonsSoft;
+ int emulate3Timeout;/* Timeout for 3 button emulation */
+ Bool chordMiddle;
++#if defined(FREEBSD_USB)
++ Bool disableXY;
++#endif
+ Bool flipXY;
+ int invX;
+ int invY;
+ int resolution;
++#if defined(FREEBSD_USB)
++ Bool hasW;
++ Bool hasZ;
++#endif
+ int negativeZ; /* button mask */
+ int positiveZ; /* button mask */
+ int negativeW; /* button mask */
+@@ -262,6 +277,10 @@ typedef struct _MouseDevRec {
+ int doubleClickOldSourceState;
+ int lastMappedButtons;
+ int buttonMap[MSE_MAXBUTTONS];
++#if defined(FREEBSD_USB)
++ float fracdx, fracdy;
++ float sensitivity;
++#endif
+ } MouseDevRec, *MouseDevPtr;
+
+ #endif /* _XF86OSMOUSE_H_ */
diff --git a/xf86-input-mouse-dfbsd/patches/patch-src_mousePriv.h b/xf86-input-mouse-dfbsd/patches/patch-src_mousePriv.h
new file mode 100644
index 0000000..9a07313
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/patches/patch-src_mousePriv.h
@@ -0,0 +1,33 @@
+$NetBSD$
+
+Patches from FreeBSD ports / DragonFly dports with include guards.
+Support for different versions of system libusb headers.
+
+--- src/mousePriv.h.orig 2012-05-28 00:01:45.000000000 +0000
++++ src/mousePriv.h
+@@ -2,6 +2,14 @@
+ * Copyright (c) 1997-1999 by The XFree86 Project, Inc.
+ */
+
++/* PKGSRC note: To support newer versions of DragonFly and FreeBSD,
++ * this file is patched using DragonFly dports
++ * x11-drivers/xf86-input-mouse/files/patch-src_mousePriv.h
++ * as of master commit 4f04bfe0ea83 ... Tue Jul 14 22:56:44 2015 -0700
++ * The patch's code is enclosed in include defined(FREEBSD_USB) while the
++ * original code is enclosed in include !defined(FREEBSD_USB).
++ */
++
+ #ifndef _X_MOUSEPRIV_H
+ #define _X_MOUSEPRIV_H
+
+@@ -63,8 +71,10 @@ typedef struct {
+ int acc;
+ CARD32 pnpLast;
+ Bool disablePnPauto;
++#if !defined(FREEBSD_USB)
+ float fracdx,fracdy;
+ float sensitivity;
++#endif
+ } mousePrivRec, *mousePrivPtr;
+
+ /* mouse proto flags */
diff --git a/xf86-input-mouse-dfbsd/patches/patch-src_sun__mouse.c b/xf86-input-mouse-dfbsd/patches/patch-src_sun__mouse.c
new file mode 100644
index 0000000..554d16d
--- /dev/null
+++ b/xf86-input-mouse-dfbsd/patches/patch-src_sun__mouse.c
@@ -0,0 +1,27 @@
+$NetBSD: patch-src_sun__mouse.c,v 1.2 2016/11/17 08:06:52 wiz Exp $
+
+rearrange includes to fix build on OmniOS. Include unistd.h for ioctl(2).
+
+--- src/sun_mouse.c.orig 2014-08-12 06:36:34.000000000 +0000
++++ src/sun_mouse.c
+@@ -51,6 +51,10 @@
+ #include <xorg-config.h>
+ #endif
+
++#include <unistd.h> /* for ioctl(2) */
++#include <sys/stropts.h>
++#include <sys/vuid_event.h>
++#include <sys/msio.h>
+ #include "xorg-server.h"
+ #include "xf86.h"
+ #include "xf86_OSlib.h"
+@@ -58,9 +62,6 @@
+ #include "xisb.h"
+ #include "mipointer.h"
+ #include "xf86Crtc.h"
+-#include <sys/stropts.h>
+-#include <sys/vuid_event.h>
+-#include <sys/msio.h>
+
+ /* Wheel mouse support in VUID drivers in Solaris 9 updates & Solaris 10 */
+ #ifdef WHEEL_DEVID /* Defined in vuid_event.h if VUID wheel support present */
Home |
Main Index |
Thread Index |
Old Index