Thread (7 messages) 7 messages, 2 authors, 2015-05-18

Re: [PATCH 2/2] Input: Allow devices to state that they aren't joysticks

From: Thomas Hellstrom <hidden>
Date: 2015-05-18 08:24:47

On 05/15/2015 11:12 PM, Dmitry Torokhov wrote:
On Sun, Apr 12, 2015 at 11:07:51PM -0700, Thomas Hellstrom wrote:
quoted
Sometimes the device driver knows that a device isn't a joystick.
In those cases, allow the driver to ovveride joydev's guess.
I'd rather not encode knowledge of various input handlers into
individual input drivers.
Good point.
 Maybe we should simply tell joydev not to bing
to devices with ABS_X, ABS_Y and 3 primary mouse buttons (and no other
events?).
IIRC the Xorg input people were a bit surprised over joydev's current
guessing heuristics as well.
I'll try to code something like that up and send a patch.

Thanks,
Thomas

Thanks.
quoted
Signed-off-by: Thomas Hellstrom <redacted>
---
 drivers/input/joydev.c        | 4 ++++
 drivers/input/mouse/vmmouse.c | 1 +
 include/linux/input.h         | 5 +++++
 3 files changed, 10 insertions(+)
diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
index f362883..6add101 100644
--- a/drivers/input/joydev.c
+++ b/drivers/input/joydev.c
@@ -750,6 +750,10 @@ static void joydev_cleanup(struct joydev *joydev)
 
 static bool joydev_match(struct input_handler *handler, struct input_dev *dev)
 {
+	/* Avoid devices that explicitly don't want to be joysticks */
+	if (dev->flags & INPUT_FLAG_NO_JOYSTICK)
+		return false;
+
 	/* Avoid touchpads and touchscreens */
 	if (test_bit(EV_KEY, dev->evbit) && test_bit(BTN_TOUCH, dev->keybit))
 		return false;
diff --git a/drivers/input/mouse/vmmouse.c b/drivers/input/mouse/vmmouse.c
index b3a6170..0fabe3d 100644
--- a/drivers/input/mouse/vmmouse.c
+++ b/drivers/input/mouse/vmmouse.c
@@ -468,6 +468,7 @@ int vmmouse_init(struct psmouse *psmouse)
 	abs_dev->id.product = PSMOUSE_VMMOUSE;
 	abs_dev->id.version = psmouse->model;
 	abs_dev->dev.parent = &psmouse->ps2dev.serio->dev;
+	abs_dev->flags |= INPUT_FLAG_NO_JOYSTICK;
 
 	if (input_register_device(priv->abs_dev))
 		goto init_fail;
diff --git a/include/linux/input.h b/include/linux/input.h
index 82ce323..516387e 100644
--- a/include/linux/input.h
+++ b/include/linux/input.h
@@ -117,6 +117,7 @@ struct input_value {
  * @vals: array of values queued in the current frame
  * @devres_managed: indicates that devices is managed with devres framework
  *	and needs not be explicitly unregistered or freed.
+ * @flags: Device flags.
  */
 struct input_dev {
 	const char *name;
@@ -187,9 +188,13 @@ struct input_dev {
 	struct input_value *vals;
 
 	bool devres_managed;
+
+	u32 flags;
 };
 #define to_input_dev(d) container_of(d, struct input_dev, dev)
 
+#define INPUT_FLAG_NO_JOYSTICK      (1 << 0)
+
 /*
  * Verify that we are in sync with input_device_id mod_devicetable.h #defines
  */
-- 
2.1.0
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help