Commit 4e584ac7 authored by Angela Czubak's avatar Angela Czubak Committed by Benjamin Tissoires
Browse files

Input: MT - add INPUT_MT_TOTAL_FORCE flags



Add a flag to generate ABS_PRESSURE as sum of ABS_MT_PRESSURE across
all slots.
This flag should be set if one knows a device reports true force and would
like to report total force to the userspace.

Signed-off-by: default avatarAngela Czubak <aczubak@google.com>
Co-developed-by: default avatarJonathan Denose <jdenose@google.com>
Signed-off-by: default avatarJonathan Denose <jdenose@google.com>
Acked-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent a77efca3
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -198,6 +198,7 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
	struct input_mt *mt = dev->mt;
	struct input_mt_slot *oldest;
	int oldid, count, i;
	int p, reported_p = 0;

	if (!mt)
		return;
@@ -216,6 +217,13 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
			oldest = ps;
			oldid = id;
		}
		if (test_bit(ABS_MT_PRESSURE, dev->absbit)) {
			p = input_mt_get_value(ps, ABS_MT_PRESSURE);
			if (mt->flags & INPUT_MT_TOTAL_FORCE)
				reported_p += p;
			else if (oldid == id)
				reported_p = p;
		}
		count++;
	}

@@ -245,10 +253,8 @@ void input_mt_report_pointer_emulation(struct input_dev *dev, bool use_count)
		input_event(dev, EV_ABS, ABS_X, x);
		input_event(dev, EV_ABS, ABS_Y, y);

		if (test_bit(ABS_MT_PRESSURE, dev->absbit)) {
			int p = input_mt_get_value(oldest, ABS_MT_PRESSURE);
			input_event(dev, EV_ABS, ABS_PRESSURE, p);
		}
		if (test_bit(ABS_MT_PRESSURE, dev->absbit))
			input_event(dev, EV_ABS, ABS_PRESSURE, reported_p);
	} else {
		if (test_bit(ABS_MT_PRESSURE, dev->absbit))
			input_event(dev, EV_ABS, ABS_PRESSURE, 0);
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#define INPUT_MT_DROP_UNUSED	0x0004	/* drop contacts not seen in frame */
#define INPUT_MT_TRACK		0x0008	/* use in-kernel tracking */
#define INPUT_MT_SEMI_MT	0x0010	/* semi-mt device, finger count handled manually */
#define INPUT_MT_TOTAL_FORCE	0x0020	/* calculate total force from slots pressure */

/**
 * struct input_mt_slot - represents the state of an input MT slot