[PATCH libinput 4/8] touchpad: Keep track of associated trackpoint device

Hans de Goede hdegoede at redhat.com
Tue Sep 16 07:22:38 PDT 2014


From: Peter Hutterer <peter.hutterer at who-t.net>

The top soft buttons are intended for use with a trackpoint, and to e.g.
make middle button scrolling work correctly, we must post the events for
these "buttons" through the trackpoint device.

This commit is a preparation patch for this, it adds a link to the
trackpoint to the touchpad, but does not yet do anything with it.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 src/evdev-mt-touchpad.c | 7 +++++++
 src/evdev-mt-touchpad.h | 2 ++
 src/evdev.c             | 9 +++++++++
 src/evdev.h             | 1 +
 4 files changed, 19 insertions(+)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 72e1c23..a0ad8db 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -642,6 +642,10 @@ tp_device_added(struct evdev_device *device,
 {
 	struct tp_dispatch *tp = (struct tp_dispatch*)device->dispatch;
 
+	if (tp->buttons.trackpoint == NULL &&
+	    (added_device->tags & EVDEV_TAG_TRACKPOINT))
+		tp->buttons.trackpoint = added_device;
+
 	if (tp->sendevents.current_mode !=
 	    LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE)
 		return;
@@ -657,6 +661,9 @@ tp_device_removed(struct evdev_device *device,
 	struct tp_dispatch *tp = (struct tp_dispatch*)device->dispatch;
 	struct libinput_device *dev;
 
+	if (removed_device == tp->buttons.trackpoint)
+		tp->buttons.trackpoint = NULL;
+
 	if (tp->sendevents.current_mode !=
 	    LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE)
 		return;
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 8671f79..4a16db9 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -198,6 +198,8 @@ struct tp_dispatch {
 			int32_t rightbutton_left_edge;
 			int32_t leftbutton_right_edge;
 		} top_area;
+
+		struct evdev_device *trackpoint;
 	} buttons;				/* physical buttons */
 
 	enum touchpad_event queued;
diff --git a/src/evdev.c b/src/evdev.c
index cb43c27..4e9db2f 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -607,6 +607,14 @@ evdev_tag_external_mouse(struct evdev_device *device,
 }
 
 static void
+evdev_tag_trackpoint(struct evdev_device *device,
+		     struct udev_device *udev_device)
+{
+	if (libevdev_has_property(device->evdev, INPUT_PROP_POINTING_STICK))
+		device->tags |= EVDEV_TAG_TRACKPOINT;
+}
+
+static void
 fallback_process(struct evdev_dispatch *dispatch,
 		 struct evdev_device *device,
 		 struct input_event *event,
@@ -644,6 +652,7 @@ fallback_tag_device(struct evdev_device *device,
 		    struct udev_device *udev_device)
 {
 	evdev_tag_external_mouse(device, udev_device);
+	evdev_tag_trackpoint(device, udev_device);
 }
 
 static int
diff --git a/src/evdev.h b/src/evdev.h
index 4047a6d..2da30f8 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -53,6 +53,7 @@ enum evdev_device_seat_capability {
 enum evdev_device_tags {
 	EVDEV_TAG_EXTERNAL_MOUSE = (1 << 0),
 	EVDEV_TAG_INTERNAL_TOUCHPAD = (1 << 1),
+	EVDEV_TAG_TRACKPOINT = (1 << 2),
 };
 
 struct mt_slot {
-- 
2.1.0



More information about the wayland-devel mailing list