[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#509053: patch to make vmmouse autodetect the device as mouse does.



This patch includes the mousedrv(4) device node autodetection into vmmouse.

This fixes the disparity between mousedrv(4) and vmmouse(4x).

It also makes the driver report that it needs a device if one is not found instead of just failing silently.

Thanks

Michal
diff -ur xserver-xorg-input-vmmouse-12.5.1/src/vmmouse.c xserver-xorg-input-vmmouse-12.5.1.mod/src/vmmouse.c
--- xserver-xorg-input-vmmouse-12.5.1/src/vmmouse.c	2008-12-18 22:18:10.000000000 +0000
+++ xserver-xorg-input-vmmouse-12.5.1.mod/src/vmmouse.c	2008-12-22 14:31:41.434010681 +0000
@@ -289,6 +289,17 @@
  *----------------------------------------------------------------------
  */
 
+static InputInfoPtr FreePriv(InputInfoPtr pInfo) {
+   MouseDevPtr pMse = pInfo->private;
+   if(pMse) {
+      if(pMse->mousePriv)
+	 xfree(pMse->mousePriv);
+      xfree(pMse);
+   }
+   pInfo->private = NULL;
+   return pInfo;
+}
+
 static InputInfoPtr
 VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags)
 {
@@ -296,6 +307,9 @@
    MouseDevPtr pMse;
    VMMousePrivPtr mPriv;
    OSMouseInfoPtr osInfo = NULL;
+   MessageType protocolFrom = X_DEFAULT, deviceFrom = X_CONFIG;
+   const char *protocol;
+   const char *device;
 
    /*
     * let Xserver init the mouse first
@@ -355,6 +369,7 @@
    pInfo->read_input = VMMouseReadInput;
 #if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
    pInfo->motion_history_proc = xf86GetMotionEvents;
+   pInfo->history_size = 0;
 #endif
    pInfo->control_proc = VMMouseControlProc;
    pInfo->close_proc = VMMouseCloseProc;
@@ -366,6 +381,7 @@
    pInfo->private_flags = 0;
    pInfo->always_core_feedback = 0;
    pInfo->conf_idev = dev;
+   pInfo->private = NULL;
 
    /* Allocate the MouseDevRec and initialise it. */
    if (!(pMse = xcalloc(sizeof(MouseDevRec), 1))) {
@@ -380,10 +396,49 @@
    pMse->mousePriv = mPriv;
 
 
+   /* Try to detect a mouse device if not specified */
+
+   if (!xf86CheckStrOption(dev->commonOptions, "Device", NULL) &&
+	 HAVE_FIND_DEVICE && osInfo->FindDevice) {
+
+      xf86Msg(X_WARNING, "%s: No Device specified, looking for one...\n",
+	    pInfo->name);
+
+      /* Find the protocol type. */
+      protocol = xf86SetStrOption(dev->commonOptions, "Protocol", NULL);
+      if (protocol) {
+	 protocolFrom = X_CONFIG;
+      } else if (osInfo->DefaultProtocol) {
+	 protocol = osInfo->DefaultProtocol();
+	 protocolFrom = X_DEFAULT;
+      }
+      if (!protocol) {
+	 xf86Msg(X_ERROR, "%s: No Protocol specified and there is no default for this platform.\n", pInfo->name);
+	 return pInfo;
+      }
+      xf86Msg(protocolFrom, "%s: Protocol: %s\n", pInfo->name, protocol);
+
+      if (!osInfo->FindDevice(pInfo, protocol, 0)) {
+	 xf86Msg(X_ERROR, "%s: Cannot find which device to use.\n",
+	       pInfo->name);
+      } else {
+	 deviceFrom = X_PROBED;
+	 xf86MarkOptionUsedByName(dev->commonOptions, "Device");
+      }
+   }
+
    /* Collect the options, and process the common options. */
    xf86CollectInputOptions(pInfo, NULL, NULL);
    xf86ProcessCommonOptions(pInfo, pInfo->options);
 
+   device = xf86CheckStrOption(dev->commonOptions, "Device", NULL);
+   if (device)
+      xf86Msg(deviceFrom, "%s: Device: \"%s\"\n", pInfo->name, device);
+   else {
+      xf86Msg(X_ERROR, "%s: Need a mouse device to get notified about mouse events.\n", pInfo->name);
+      return FreePriv(pInfo);
+   }
+
    /* Check if the device can be opened. */
    pInfo->fd = xf86OpenSerial(pInfo->options);
    if (pInfo->fd == -1) {
@@ -391,11 +446,7 @@
 	 xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
       else {
 	 xf86Msg(X_ERROR, "%s: cannot open input device\n", pInfo->name);
-	 if (pMse->mousePriv)
-	    xfree(pMse->mousePriv);
-	 xfree(pMse);
-	 pInfo->private = NULL;
-	 return pInfo;
+	 return FreePriv(pInfo);
       }
    }
    xf86CloseSerial(pInfo->fd);

Reply to: