diff --git a/hw/kdrive/linux/mouse.c b/hw/kdrive/linux/mouse.c index 02214b33e..6f399b586 100644 --- a/hw/kdrive/linux/mouse.c +++ b/hw/kdrive/linux/mouse.c @@ -961,7 +961,11 @@ MouseInit (KdPointerInfo *pi) km = (Kmouse *) xalloc (sizeof (Kmouse)); if (km) { km->iob.avail = km->iob.used = 0; - MouseFirstProtocol(km, "exps/2"); + MouseFirstProtocol(km, pi->protocol ? pi->protocol : "exps/2"); + /* MouseFirstProtocol sets state to MouseBroken for later protocol + * checks. Skip these checks if a protocol was supplied */ + if (pi->protocol) + km->state = MouseWorking; km->i_prot = 0; km->tty = isatty (fd); km->iob.fd = -1; diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h index c60559a89..ce47cf4fa 100644 --- a/hw/kdrive/src/kdrive.h +++ b/hw/kdrive/src/kdrive.h @@ -220,6 +220,7 @@ struct _KdPointerInfo { DeviceIntPtr dixdev; char *name; char *path; + char *protocol; InputOption *options; int inputClass; diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 0d216a9b8..360739cac 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -1166,6 +1166,8 @@ KdParsePointerOptions (KdPointerInfo *pi) pi->transformCoordinates = FALSE; else if (!strcasecmp (option->key, "device")) pi->path = strdup(option->value); + else if (!strcasecmp (option->key, "protocol")) + pi->protocol = strdup(option->value); else ErrorF("Pointer option key (%s) of value (%s) not assigned!\n", option->key, option->value); @@ -1186,6 +1188,7 @@ KdParsePointer (char *arg) return NULL; pi->emulateMiddleButton = kdEmulateMiddleButton; pi->transformCoordinates = !kdRawPointerCoordinates; + pi->protocol = NULL; pi->nButtons = 5; /* XXX should not be hardcoded */ pi->inputClass = KD_MOUSE;