xref: /third_party/libinput/src/evdev.h (revision a46c0ec8)
1/*
2 * Copyright © 2011, 2012 Intel Corporation
3 * Copyright © 2013 Jonas Ådahl
4 * Copyright © 2013-2015 Red Hat, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 * DEALINGS IN THE SOFTWARE.
24 */
25
26#ifndef EVDEV_H
27#define EVDEV_H
28
29#include "config.h"
30
31#include <stdbool.h>
32#include <stdarg.h>
33#include "linux/input.h"
34#include <libevdev/libevdev.h>
35
36#include "libinput-private.h"
37#include "timer.h"
38#include "filter.h"
39#include "quirks.h"
40
41/* The fake resolution value for abs devices without resolution */
42#define EVDEV_FAKE_RESOLUTION 1
43
44enum evdev_event_type {
45	EVDEV_NONE,
46	EVDEV_ABSOLUTE_TOUCH_DOWN	= bit(0),
47	EVDEV_ABSOLUTE_MOTION		= bit(1),
48	EVDEV_ABSOLUTE_TOUCH_UP		= bit(2),
49	EVDEV_ABSOLUTE_MT		= bit(3),
50	EVDEV_WHEEL			= bit(4),
51	EVDEV_KEY			= bit(5),
52	EVDEV_RELATIVE_MOTION		= bit(6),
53	EVDEV_BUTTON			= bit(7),
54};
55
56enum evdev_device_seat_capability {
57	EVDEV_DEVICE_POINTER		= bit(0),
58	EVDEV_DEVICE_KEYBOARD		= bit(1),
59	EVDEV_DEVICE_TOUCH		= bit(2),
60	EVDEV_DEVICE_TABLET		= bit(3),
61	EVDEV_DEVICE_TABLET_PAD		= bit(4),
62	EVDEV_DEVICE_GESTURE		= bit(5),
63	EVDEV_DEVICE_SWITCH		= bit(6),
64};
65
66enum evdev_device_tags {
67	EVDEV_TAG_EXTERNAL_MOUSE	= bit(0),
68	EVDEV_TAG_INTERNAL_TOUCHPAD	= bit(1),
69	EVDEV_TAG_EXTERNAL_TOUCHPAD	= bit(2),
70	EVDEV_TAG_TRACKPOINT		= bit(3),
71	EVDEV_TAG_KEYBOARD		= bit(4),
72	EVDEV_TAG_LID_SWITCH		= bit(5),
73	EVDEV_TAG_INTERNAL_KEYBOARD	= bit(6),
74	EVDEV_TAG_EXTERNAL_KEYBOARD	= bit(7),
75	EVDEV_TAG_TABLET_MODE_SWITCH	= bit(8),
76	EVDEV_TAG_TABLET_TOUCHPAD	= bit(9),
77};
78
79enum evdev_middlebutton_state {
80	MIDDLEBUTTON_IDLE,
81	MIDDLEBUTTON_LEFT_DOWN,
82	MIDDLEBUTTON_RIGHT_DOWN,
83	MIDDLEBUTTON_MIDDLE,
84	MIDDLEBUTTON_LEFT_UP_PENDING,
85	MIDDLEBUTTON_RIGHT_UP_PENDING,
86	MIDDLEBUTTON_IGNORE_LR,
87	MIDDLEBUTTON_IGNORE_L,
88	MIDDLEBUTTON_IGNORE_R,
89	MIDDLEBUTTON_PASSTHROUGH,
90};
91
92enum evdev_middlebutton_event {
93	MIDDLEBUTTON_EVENT_L_DOWN,
94	MIDDLEBUTTON_EVENT_R_DOWN,
95	MIDDLEBUTTON_EVENT_OTHER,
96	MIDDLEBUTTON_EVENT_L_UP,
97	MIDDLEBUTTON_EVENT_R_UP,
98	MIDDLEBUTTON_EVENT_TIMEOUT,
99	MIDDLEBUTTON_EVENT_ALL_UP,
100};
101
102/**
103 * model flags are used as shortcut for quirks that need to be checked
104 * multiple times in timing-sensitive paths. For quirks that need to be
105 * checked only once, use the quirk directly.
106 */
107enum evdev_device_model {
108	EVDEV_MODEL_DEFAULT = 0,
109	EVDEV_MODEL_WACOM_TOUCHPAD		= bit(1),
110	EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD	= bit(2),
111	EVDEV_MODEL_ALPS_SERIAL_TOUCHPAD	= bit(3),
112	EVDEV_MODEL_LENOVO_T450_TOUCHPAD	= bit(4),
113	EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON	= bit(5),
114	EVDEV_MODEL_LENOVO_SCROLLPOINT		= bit(6),
115
116	/* udev tags, not true quirks */
117	EVDEV_MODEL_TEST_DEVICE			= bit(20),
118	EVDEV_MODEL_TRACKBALL			= bit(21),
119	EVDEV_MODEL_LENOVO_X220_TOUCHPAD_FW81	= bit(22),
120};
121
122enum evdev_button_scroll_state {
123	BUTTONSCROLL_IDLE,
124	BUTTONSCROLL_BUTTON_DOWN,	/* button is down */
125	BUTTONSCROLL_READY,		/* ready for scroll events */
126	BUTTONSCROLL_SCROLLING,		/* have sent scroll events */
127};
128
129enum evdev_button_scroll_lock_state {
130	BUTTONSCROLL_LOCK_DISABLED,
131	BUTTONSCROLL_LOCK_IDLE,
132	BUTTONSCROLL_LOCK_FIRSTDOWN,
133	BUTTONSCROLL_LOCK_FIRSTUP,
134	BUTTONSCROLL_LOCK_SECONDDOWN,
135};
136
137enum evdev_debounce_state {
138	/**
139	 * Initial state, no debounce but monitoring events
140	 */
141	DEBOUNCE_INIT,
142	/**
143	 * Bounce detected, future events need debouncing
144	 */
145	DEBOUNCE_NEEDED,
146	/**
147	 * Debounce is enabled, but no event is currently being filtered
148	 */
149	DEBOUNCE_ON,
150	/**
151	 * Debounce is enabled and we are currently filtering an event
152	 */
153	DEBOUNCE_ACTIVE,
154};
155
156enum evdev_arbitration_state {
157	ARBITRATION_NOT_ACTIVE,
158	ARBITRATION_IGNORE_ALL,
159	ARBITRATION_IGNORE_RECT,
160};
161
162struct evdev_device {
163	struct libinput_device base;
164
165	struct libinput_source *source;
166
167	struct evdev_dispatch *dispatch;
168	struct libevdev *evdev;
169	struct udev_device *udev_device;
170	char *output_name;
171	const char *devname;
172	char *log_prefix_name;
173	char *sysname;
174	bool was_removed;
175	int fd;
176	enum evdev_device_seat_capability seat_caps;
177	enum evdev_device_tags tags;
178	bool is_mt;
179	bool is_suspended;
180	int dpi; /* HW resolution */
181	double trackpoint_multiplier; /* trackpoint constant multiplier */
182	bool use_velocity_averaging; /* whether averaging should be applied on velocity calculation */
183	struct ratelimit syn_drop_limit; /* ratelimit for SYN_DROPPED logging */
184	struct ratelimit delay_warning_limit; /* ratelimit for delayd processing logging */
185	struct ratelimit nonpointer_rel_limit; /* ratelimit for REL_* events from non-pointer devices */
186	uint32_t model_flags;
187	struct mtdev *mtdev;
188
189	struct {
190		const struct input_absinfo *absinfo_x, *absinfo_y;
191		bool is_fake_resolution;
192
193		int apply_calibration;
194		struct matrix calibration;
195		struct matrix default_calibration; /* from LIBINPUT_CALIBRATION_MATRIX */
196		struct matrix usermatrix; /* as supplied by the caller */
197
198		struct device_coords dimensions;
199
200		struct {
201			struct device_coords min, max;
202			struct ratelimit range_warn_limit;
203		} warning_range;
204	} abs;
205
206	struct {
207		struct libinput_timer timer;
208		struct libinput_device_config_scroll_method config;
209		/* Currently enabled method, button */
210		enum libinput_config_scroll_method method;
211		uint32_t button;
212		uint64_t button_down_time;
213
214		/* set during device init, used at runtime to delay changes
215		 * until all buttons are up */
216		enum libinput_config_scroll_method want_method;
217		uint32_t want_button;
218		/* Checks if buttons are down and commits the setting */
219		void (*change_scroll_method)(struct evdev_device *device);
220		enum evdev_button_scroll_state button_scroll_state;
221		double threshold;
222		double direction_lock_threshold;
223		uint32_t direction;
224		struct normalized_coords buildup;
225
226		struct libinput_device_config_natural_scroll config_natural;
227		/* set during device init if we want natural scrolling,
228		 * used at runtime to enable/disable the feature */
229		bool natural_scrolling_enabled;
230
231		/* set during device init to invert direction of
232		 * horizontal scrolling */
233		bool invert_horizontal_scrolling;
234
235		/* angle per REL_WHEEL click in degrees */
236		struct wheel_angle wheel_click_angle;
237
238		enum evdev_button_scroll_lock_state lock_state;
239		bool want_lock_enabled;
240		bool lock_enabled;
241	} scroll;
242
243	struct {
244		struct libinput_device_config_accel config;
245		struct motion_filter *filter;
246	} pointer;
247
248	/* Key counter used for multiplexing button events internally in
249	 * libinput. */
250	uint8_t key_count[KEY_CNT];
251
252	struct {
253		struct libinput_device_config_left_handed config;
254		/* left-handed currently enabled */
255		bool enabled;
256		/* set during device init if we want left_handed config,
257		 * used at runtime to delay the effect until buttons are up */
258		bool want_enabled;
259		/* Checks if buttons are down and commits the setting */
260		void (*change_to_enabled)(struct evdev_device *device);
261	} left_handed;
262
263	struct {
264		struct libinput_device_config_middle_emulation config;
265		/* middle-button emulation enabled */
266		bool enabled;
267		bool enabled_default;
268		bool want_enabled;
269		enum evdev_middlebutton_state state;
270		struct libinput_timer timer;
271		uint32_t button_mask;
272		uint64_t first_event_time;
273	} middlebutton;
274};
275
276static inline struct evdev_device *
277evdev_device(struct libinput_device *device)
278{
279	return container_of(device, struct evdev_device, base);
280}
281
282#define EVDEV_UNHANDLED_DEVICE ((struct evdev_device *) 1)
283
284struct evdev_dispatch;
285
286struct evdev_dispatch_interface {
287	/* Process an evdev input event. */
288	void (*process)(struct evdev_dispatch *dispatch,
289			struct evdev_device *device,
290			struct input_event *event,
291			uint64_t time);
292
293	/* Device is being suspended */
294	void (*suspend)(struct evdev_dispatch *dispatch,
295			struct evdev_device *device);
296
297	/* Device is being removed (may be NULL) */
298	void (*remove)(struct evdev_dispatch *dispatch);
299
300	/* Destroy an event dispatch handler and free all its resources. */
301	void (*destroy)(struct evdev_dispatch *dispatch);
302
303	/* A new device was added */
304	void (*device_added)(struct evdev_device *device,
305			     struct evdev_device *added_device);
306
307	/* A device was removed */
308	void (*device_removed)(struct evdev_device *device,
309			       struct evdev_device *removed_device);
310
311	/* A device was suspended */
312	void (*device_suspended)(struct evdev_device *device,
313				 struct evdev_device *suspended_device);
314
315	/* A device was resumed */
316	void (*device_resumed)(struct evdev_device *device,
317			       struct evdev_device *resumed_device);
318
319	/* Called immediately after the LIBINPUT_EVENT_DEVICE_ADDED event
320	 * was sent */
321	void (*post_added)(struct evdev_device *device,
322			   struct evdev_dispatch *dispatch);
323
324	/* For touch arbitration, called on the device that should
325	 * enable/disable touch capabilities.
326	 */
327	void (*touch_arbitration_toggle)(struct evdev_dispatch *dispatch,
328					 struct evdev_device *device,
329					 enum evdev_arbitration_state which,
330					 const struct phys_rect *rect, /* may be NULL */
331					 uint64_t now);
332
333	/* Called when touch arbitration is on, updates the area where touch
334	 * arbitration should apply.
335	 */
336	void (*touch_arbitration_update_rect)(struct evdev_dispatch *dispatch,
337					      struct evdev_device *device,
338					      const struct phys_rect *rect,
339					      uint64_t now);
340
341	/* Return the state of the given switch */
342	enum libinput_switch_state
343		(*get_switch_state)(struct evdev_dispatch *dispatch,
344				    enum libinput_switch which);
345
346	void (*left_handed_toggle)(struct evdev_dispatch *dispatch,
347				   struct evdev_device *device,
348				   bool left_handed_enabled);
349};
350
351enum evdev_dispatch_type {
352	DISPATCH_FALLBACK,
353	DISPATCH_TOUCHPAD,
354	DISPATCH_TABLET,
355	DISPATCH_TABLET_PAD,
356	DISPATCH_TOTEM,
357};
358
359struct evdev_dispatch {
360	enum evdev_dispatch_type dispatch_type;
361	struct evdev_dispatch_interface *interface;
362
363	struct {
364		struct libinput_device_config_send_events config;
365		enum libinput_config_send_events_mode current_mode;
366	} sendevents;
367};
368
369static inline void
370evdev_verify_dispatch_type(struct evdev_dispatch *dispatch,
371			   enum evdev_dispatch_type type)
372{
373	if (dispatch->dispatch_type != type)
374		abort();
375}
376
377struct evdev_device *
378evdev_device_create(struct libinput_seat *seat,
379		    struct udev_device *device);
380
381static inline struct libinput *
382evdev_libinput_context(const struct evdev_device *device)
383{
384	return device->base.seat->libinput;
385}
386
387static inline bool
388evdev_device_has_model_quirk(struct evdev_device *device,
389			     enum quirk model_quirk)
390{
391	struct quirks_context *quirks;
392	struct quirks *q;
393	bool result = false;
394
395	assert(quirk_get_name(model_quirk) != NULL);
396
397	quirks = evdev_libinput_context(device)->quirks;
398	q = quirks_fetch_for_device(quirks, device->udev_device);
399	quirks_get_bool(q, model_quirk, &result);
400	quirks_unref(q);
401
402	return result;
403}
404
405void
406evdev_transform_absolute(struct evdev_device *device,
407			 struct device_coords *point);
408
409void
410evdev_transform_relative(struct evdev_device *device,
411			 struct device_coords *point);
412
413void
414evdev_init_calibration(struct evdev_device *device,
415		        struct libinput_device_config_calibration *calibration);
416
417void
418evdev_read_calibration_prop(struct evdev_device *device);
419
420int
421evdev_read_fuzz_prop(struct evdev_device *device, unsigned int code);
422
423enum switch_reliability
424evdev_read_switch_reliability_prop(struct evdev_device *device);
425
426void
427evdev_init_sendevents(struct evdev_device *device,
428		      struct evdev_dispatch *dispatch);
429
430void
431evdev_device_init_pointer_acceleration(struct evdev_device *device,
432				       struct motion_filter *filter);
433
434struct evdev_dispatch *
435evdev_touchpad_create(struct evdev_device *device);
436
437struct evdev_dispatch *
438evdev_mt_touchpad_create(struct evdev_device *device);
439
440struct evdev_dispatch *
441evdev_tablet_create(struct evdev_device *device);
442
443struct evdev_dispatch *
444evdev_tablet_pad_create(struct evdev_device *device);
445
446struct evdev_dispatch *
447evdev_lid_switch_dispatch_create(struct evdev_device *device);
448
449struct evdev_dispatch *
450fallback_dispatch_create(struct libinput_device *libinput_device);
451
452struct evdev_dispatch *
453evdev_totem_create(struct evdev_device *device);
454
455bool
456evdev_is_fake_mt_device(struct evdev_device *device);
457
458int
459evdev_need_mtdev(struct evdev_device *device);
460
461void
462evdev_device_led_update(struct evdev_device *device, enum libinput_led leds);
463
464int
465evdev_device_get_keys(struct evdev_device *device, char *keys, size_t size);
466
467const char *
468evdev_device_get_output(struct evdev_device *device);
469
470const char *
471evdev_device_get_sysname(struct evdev_device *device);
472
473const char *
474evdev_device_get_name(struct evdev_device *device);
475
476unsigned int
477evdev_device_get_id_product(struct evdev_device *device);
478
479unsigned int
480evdev_device_get_id_vendor(struct evdev_device *device);
481
482struct udev_device *
483evdev_device_get_udev_device(struct evdev_device *device);
484
485void
486evdev_device_set_default_calibration(struct evdev_device *device,
487				     const float calibration[6]);
488void
489evdev_device_calibrate(struct evdev_device *device,
490		       const float calibration[6]);
491
492bool
493evdev_device_has_capability(struct evdev_device *device,
494			    enum libinput_device_capability capability);
495
496int
497evdev_device_get_size(const struct evdev_device *device,
498		      double *w,
499		      double *h);
500
501int
502evdev_device_has_button(struct evdev_device *device, uint32_t code);
503
504int
505evdev_device_has_key(struct evdev_device *device, uint32_t code);
506
507int
508evdev_device_get_touch_count(struct evdev_device *device);
509
510int
511evdev_device_has_switch(struct evdev_device *device,
512			enum libinput_switch sw);
513
514int
515evdev_device_tablet_pad_has_key(struct evdev_device *device,
516				uint32_t code);
517
518int
519evdev_device_tablet_pad_get_num_buttons(struct evdev_device *device);
520
521int
522evdev_device_tablet_pad_get_num_rings(struct evdev_device *device);
523
524int
525evdev_device_tablet_pad_get_num_strips(struct evdev_device *device);
526
527int
528evdev_device_tablet_pad_get_num_mode_groups(struct evdev_device *device);
529
530struct libinput_tablet_pad_mode_group *
531evdev_device_tablet_pad_get_mode_group(struct evdev_device *device,
532				       unsigned int index);
533
534enum libinput_switch_state
535evdev_device_switch_get_state(struct evdev_device *device,
536			      enum libinput_switch sw);
537
538double
539evdev_device_transform_x(struct evdev_device *device,
540			 double x,
541			 uint32_t width);
542
543double
544evdev_device_transform_y(struct evdev_device *device,
545			 double y,
546			 uint32_t height);
547void
548evdev_device_suspend(struct evdev_device *device);
549
550int
551evdev_device_resume(struct evdev_device *device);
552
553void
554evdev_notify_suspended_device(struct evdev_device *device);
555
556void
557evdev_notify_resumed_device(struct evdev_device *device);
558
559void
560evdev_pointer_notify_button(struct evdev_device *device,
561			    uint64_t time,
562			    unsigned int button,
563			    enum libinput_button_state state);
564void
565evdev_pointer_notify_physical_button(struct evdev_device *device,
566				     uint64_t time,
567				     int button,
568				     enum libinput_button_state state);
569
570void
571evdev_init_natural_scroll(struct evdev_device *device);
572
573void
574evdev_init_button_scroll(struct evdev_device *device,
575			 void (*change_scroll_method)(struct evdev_device *));
576
577void
578evdev_set_button_scroll_lock_enabled(struct evdev_device *device,
579				     bool enabled);
580
581int
582evdev_update_key_down_count(struct evdev_device *device,
583			    int code,
584			    int pressed);
585
586void
587evdev_notify_axis_legacy_wheel(struct evdev_device *device,
588			       uint64_t time,
589			       uint32_t axes,
590			       const struct normalized_coords *delta_in,
591			       const struct discrete_coords *discrete_in);
592void
593evdev_notify_axis_wheel(struct evdev_device *device,
594			uint64_t time,
595			uint32_t axes,
596			const struct normalized_coords *delta_in,
597			const struct wheel_v120 *v120_in);
598void
599evdev_notify_axis_finger(struct evdev_device *device,
600			uint64_t time,
601			uint32_t axes,
602			const struct normalized_coords *delta_in);
603void
604evdev_notify_axis_continous(struct evdev_device *device,
605			    uint64_t time,
606			    uint32_t axes,
607			    const struct normalized_coords *delta_in);
608
609void
610evdev_post_scroll(struct evdev_device *device,
611		  uint64_t time,
612		  enum libinput_pointer_axis_source source,
613		  const struct normalized_coords *delta);
614
615void
616evdev_stop_scroll(struct evdev_device *device,
617		  uint64_t time,
618		  enum libinput_pointer_axis_source source);
619
620void
621evdev_device_remove(struct evdev_device *device);
622
623void
624evdev_device_destroy(struct evdev_device *device);
625
626bool
627evdev_middlebutton_filter_button(struct evdev_device *device,
628				 uint64_t time,
629				 int button,
630				 enum libinput_button_state state);
631
632void
633evdev_init_middlebutton(struct evdev_device *device,
634			bool enabled,
635			bool want_config);
636
637enum libinput_config_middle_emulation_state
638evdev_middlebutton_get(struct libinput_device *device);
639
640int
641evdev_middlebutton_is_available(struct libinput_device *device);
642
643enum libinput_config_middle_emulation_state
644evdev_middlebutton_get_default(struct libinput_device *device);
645
646static inline double
647evdev_convert_to_mm(const struct input_absinfo *absinfo, double v)
648{
649	double value = v - absinfo->minimum;
650	return value/absinfo->resolution;
651}
652
653static inline struct phys_coords
654evdev_convert_xy_to_mm(const struct evdev_device *device, int x, int y)
655{
656	struct phys_coords mm;
657
658	mm.x = evdev_convert_to_mm(device->abs.absinfo_x, x);
659	mm.y = evdev_convert_to_mm(device->abs.absinfo_y, y);
660
661	return mm;
662}
663
664void
665evdev_init_left_handed(struct evdev_device *device,
666		       void (*change_to_left_handed)(struct evdev_device *));
667
668bool
669evdev_tablet_has_left_handed(struct evdev_device *device);
670
671static inline uint32_t
672evdev_to_left_handed(struct evdev_device *device,
673		     uint32_t button)
674{
675	if (device->left_handed.enabled) {
676		if (button == BTN_LEFT)
677			return BTN_RIGHT;
678		else if (button == BTN_RIGHT)
679			return BTN_LEFT;
680	}
681	return button;
682}
683
684/**
685 * Apply a hysteresis filtering to the coordinate in, based on the current
686 * hysteresis center and the margin. If 'in' is within 'margin' of center,
687 * return the center (and thus filter the motion). If 'in' is outside,
688 * return a point on the edge of the new margin (which is an ellipse, usually
689 * a circle). So for a point x in the space outside c + margin we return r:
690 * ,---.       ,---.
691 * | c |  x →  | r x
692 * `---'       `---'
693 *
694 * The effect of this is that initial small motions are filtered. Once we
695 * move into one direction we lag the real coordinates by 'margin' but any
696 * movement that continues into that direction will always be just outside
697 * margin - we get responsive movement. Once we move back into the other
698 * direction, the first movements are filtered again.
699 *
700 * Returning the edge rather than the point avoids cursor jumps, as the
701 * first reachable coordinate is the point next to the center (center + 1).
702 * Otherwise, the center has a dead zone of size margin around it and the
703 * first reachable point is the margin edge.
704 *
705 * @param in The input coordinate
706 * @param center Current center of the hysteresis
707 * @param margin Hysteresis width (on each side)
708 *
709 * @return The new center of the hysteresis
710 */
711static inline struct device_coords
712evdev_hysteresis(const struct device_coords *in,
713		 const struct device_coords *center,
714		 const struct device_coords *margin)
715{
716	int dx = in->x - center->x;
717	int dy = in->y - center->y;
718	int dx2 = dx * dx;
719	int dy2 = dy * dy;
720	int a = margin->x;
721	int b = margin->y;
722	double normalized_finger_distance, finger_distance, margin_distance;
723	double lag_x, lag_y;
724	struct device_coords result;
725
726	if (!a || !b)
727		return *in;
728
729	/*
730	 * Basic equation for an ellipse of radii a,b:
731	 *   x²/a² + y²/b² = 1
732	 * But we start by making a scaled ellipse passing through the
733	 * relative finger location (dx,dy). So the scale of this ellipse is
734	 * the ratio of finger_distance to margin_distance:
735	 *   dx²/a² + dy²/b² = normalized_finger_distance²
736	 */
737	normalized_finger_distance = sqrt((double)dx2 / (a * a) +
738					  (double)dy2 / (b * b));
739
740	/* Which means anything less than 1 is within the elliptical margin */
741	if (normalized_finger_distance < 1.0)
742		return *center;
743
744	finger_distance = sqrt(dx2 + dy2);
745	margin_distance = finger_distance / normalized_finger_distance;
746
747	/*
748	 * Now calculate the x,y coordinates on the edge of the margin ellipse
749	 * where it intersects the finger vector. Shortcut: We achieve this by
750	 * finding the point with the same gradient as dy/dx.
751	 */
752	if (dx) {
753		double gradient = (double)dy / dx;
754		lag_x = margin_distance / sqrt(gradient * gradient + 1);
755		lag_y = sqrt((margin_distance + lag_x) *
756			     (margin_distance - lag_x));
757	} else {  /* Infinite gradient */
758		lag_x = 0.0;
759		lag_y = margin_distance;
760	}
761
762	/*
763	 * 'result' is the centre of an ellipse (radii a,b) which has been
764	 * dragged by the finger moving inside it to 'in'. The finger is now
765	 * touching the margin ellipse at some point: (±lag_x,±lag_y)
766	 */
767	result.x = (dx >= 0) ? in->x - lag_x : in->x + lag_x;
768	result.y = (dy >= 0) ? in->y - lag_y : in->y + lag_y;
769	return result;
770}
771
772LIBINPUT_ATTRIBUTE_PRINTF(3, 4)
773static inline void
774evdev_log_msg(struct evdev_device *device,
775	      enum libinput_log_priority priority,
776	      const char *format,
777	      ...)
778{
779	va_list args;
780	char buf[1024];
781
782	if (!is_logged(evdev_libinput_context(device), priority))
783		return;
784
785	/* Anything info and above is user-visible, use the device name */
786	snprintf(buf,
787		 sizeof(buf),
788		 "%-7s - %s%s%s",
789		 evdev_device_get_sysname(device),
790		 (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ?  device->log_prefix_name : "",
791		 (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ?  ": " : "",
792		 format);
793
794	va_start(args, format);
795#pragma GCC diagnostic push
796#pragma GCC diagnostic ignored "-Wformat-nonliteral"
797	log_msg_va(evdev_libinput_context(device), priority, buf, args);
798#pragma GCC diagnostic pop
799	va_end(args);
800
801}
802
803LIBINPUT_ATTRIBUTE_PRINTF(4, 5)
804static inline void
805evdev_log_msg_ratelimit(struct evdev_device *device,
806			struct ratelimit *ratelimit,
807			enum libinput_log_priority priority,
808			const char *format,
809			...)
810{
811	va_list args;
812	char buf[1024];
813
814	enum ratelimit_state state;
815
816	if (!is_logged(evdev_libinput_context(device), priority))
817		return;
818
819	state = ratelimit_test(ratelimit);
820	if (state == RATELIMIT_EXCEEDED)
821		return;
822
823	/* Anything info and above is user-visible, use the device name */
824	snprintf(buf,
825		 sizeof(buf),
826		 "%-7s - %s%s%s",
827		 evdev_device_get_sysname(device),
828		 (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ?  device->log_prefix_name : "",
829		 (priority > LIBINPUT_LOG_PRIORITY_DEBUG) ?  ": " : "",
830		 format);
831
832	va_start(args, format);
833#pragma GCC diagnostic push
834#pragma GCC diagnostic ignored "-Wformat-nonliteral"
835	log_msg_va(evdev_libinput_context(device), priority, buf, args);
836#pragma GCC diagnostic pop
837	va_end(args);
838
839	if (state == RATELIMIT_THRESHOLD) {
840		struct human_time ht = to_human_time(ratelimit->interval);
841		evdev_log_msg(device,
842			      priority,
843			      "WARNING: log rate limit exceeded (%d msgs per %d%s). "
844			      "Discarding future messages.\n",
845			      ratelimit->burst,
846			      ht.value,
847			      ht.unit);
848
849	}
850}
851
852#define evdev_log_debug(d_, ...) evdev_log_msg((d_), LIBINPUT_LOG_PRIORITY_DEBUG, __VA_ARGS__)
853#define evdev_log_info(d_, ...) evdev_log_msg((d_), LIBINPUT_LOG_PRIORITY_INFO, __VA_ARGS__)
854#define evdev_log_error(d_, ...) evdev_log_msg((d_), LIBINPUT_LOG_PRIORITY_ERROR, __VA_ARGS__)
855#define evdev_log_bug_kernel(d_, ...) evdev_log_msg((d_), LIBINPUT_LOG_PRIORITY_ERROR, "kernel bug: " __VA_ARGS__)
856#define evdev_log_bug_libinput(d_, ...) evdev_log_msg((d_), LIBINPUT_LOG_PRIORITY_ERROR, "libinput bug: " __VA_ARGS__)
857#define evdev_log_bug_client(d_, ...) evdev_log_msg((d_), LIBINPUT_LOG_PRIORITY_ERROR, "client bug: " __VA_ARGS__)
858
859#define evdev_log_debug_ratelimit(d_, r_, ...) \
860	evdev_log_msg_ratelimit((d_), (r_), LIBINPUT_LOG_PRIORITY_DEBUG, __VA_ARGS__)
861#define evdev_log_info_ratelimit(d_, r_, ...) \
862	evdev_log_msg_ratelimit((d_), (r_), LIBINPUT_LOG_PRIORITY_INFO, __VA_ARGS__)
863#define evdev_log_error_ratelimit(d_, r_, ...) \
864	evdev_log_msg_ratelimit((d_), (r_), LIBINPUT_LOG_PRIORITY_ERROR, __VA_ARGS__)
865#define evdev_log_bug_kernel_ratelimit(d_, r_, ...) \
866	evdev_log_msg_ratelimit((d_), (r_), LIBINPUT_LOG_PRIORITY_ERROR, "kernel bug: " __VA_ARGS__)
867#define evdev_log_bug_libinput_ratelimit(d_, r_, ...) \
868	evdev_log_msg_ratelimit((d_), (r_), LIBINPUT_LOG_PRIORITY_ERROR, "libinput bug: " __VA_ARGS__)
869#define evdev_log_bug_client_ratelimit(d_, r_, ...) \
870	evdev_log_msg_ratelimit((d_), (r_), LIBINPUT_LOG_PRIORITY_ERROR, "client bug: " __VA_ARGS__)
871
872/**
873 * Convert the pair of delta coordinates in device space to mm.
874 */
875static inline struct phys_coords
876evdev_device_unit_delta_to_mm(const struct evdev_device* device,
877			      const struct device_coords *units)
878{
879	struct phys_coords mm = { 0,  0 };
880	const struct input_absinfo *absx, *absy;
881
882	if (device->abs.absinfo_x == NULL ||
883	    device->abs.absinfo_y == NULL) {
884		log_bug_libinput(evdev_libinput_context(device),
885				 "%s: is not an abs device\n",
886				 device->devname);
887		return mm;
888	}
889
890	absx = device->abs.absinfo_x;
891	absy = device->abs.absinfo_y;
892
893	mm.x = 1.0 * units->x/absx->resolution;
894	mm.y = 1.0 * units->y/absy->resolution;
895
896	return mm;
897}
898
899/**
900 * Convert the pair of coordinates in device space to mm. This takes the
901 * axis min into account, i.e. a unit of min is equivalent to 0 mm.
902 */
903static inline struct phys_coords
904evdev_device_units_to_mm(const struct evdev_device* device,
905			 const struct device_coords *units)
906{
907	struct phys_coords mm = { 0,  0 };
908	const struct input_absinfo *absx, *absy;
909
910	if (device->abs.absinfo_x == NULL ||
911	    device->abs.absinfo_y == NULL) {
912		log_bug_libinput(evdev_libinput_context(device),
913				 "%s: is not an abs device\n",
914				 device->devname);
915		return mm;
916	}
917
918	absx = device->abs.absinfo_x;
919	absy = device->abs.absinfo_y;
920
921	mm.x = (units->x - absx->minimum)/absx->resolution;
922	mm.y = (units->y - absy->minimum)/absy->resolution;
923
924	return mm;
925}
926
927/**
928 * Convert the pair of coordinates in mm to device units. This takes the
929 * axis min into account, i.e. 0 mm  is equivalent to the min.
930 */
931static inline struct device_coords
932evdev_device_mm_to_units(const struct evdev_device *device,
933			 const struct phys_coords *mm)
934{
935	struct device_coords units = { 0,  0 };
936	const struct input_absinfo *absx, *absy;
937
938	if (device->abs.absinfo_x == NULL ||
939	    device->abs.absinfo_y == NULL) {
940		log_bug_libinput(evdev_libinput_context(device),
941				 "%s: is not an abs device\n",
942				 device->devname);
943		return units;
944	}
945
946	absx = device->abs.absinfo_x;
947	absy = device->abs.absinfo_y;
948
949	units.x = mm->x * absx->resolution + absx->minimum;
950	units.y = mm->y * absy->resolution + absy->minimum;
951
952	return units;
953}
954
955static inline struct device_coord_rect
956evdev_phys_rect_to_units(const struct evdev_device *device,
957			 const struct phys_rect *mm)
958{
959	struct device_coord_rect units = {0};
960	const struct input_absinfo *absx, *absy;
961
962	if (device->abs.absinfo_x == NULL ||
963	    device->abs.absinfo_y == NULL) {
964		log_bug_libinput(evdev_libinput_context(device),
965				 "%s: is not an abs device\n",
966				 device->devname);
967		return units;
968	}
969
970	absx = device->abs.absinfo_x;
971	absy = device->abs.absinfo_y;
972
973	units.x = mm->x * absx->resolution + absx->minimum;
974	units.y = mm->y * absy->resolution + absy->minimum;
975	units.w = mm->w * absx->resolution;
976	units.h = mm->h * absy->resolution;
977
978	return units;
979}
980
981static inline void
982evdev_device_init_abs_range_warnings(struct evdev_device *device)
983{
984	const struct input_absinfo *x, *y;
985	int width, height;
986
987	x = device->abs.absinfo_x;
988	y = device->abs.absinfo_y;
989	width = device->abs.dimensions.x;
990	height = device->abs.dimensions.y;
991
992	device->abs.warning_range.min.x = x->minimum - 0.05 * width;
993	device->abs.warning_range.min.y = y->minimum - 0.05 * height;
994	device->abs.warning_range.max.x = x->maximum + 0.05 * width;
995	device->abs.warning_range.max.y = y->maximum + 0.05 * height;
996
997	/* One warning every 5 min is enough */
998	ratelimit_init(&device->abs.warning_range.range_warn_limit,
999		       s2us(3000),
1000		       1);
1001}
1002
1003static inline void
1004evdev_device_check_abs_axis_range(struct evdev_device *device,
1005				  unsigned int code,
1006				  int value)
1007{
1008	int min, max;
1009
1010	switch(code) {
1011	case ABS_X:
1012	case ABS_MT_POSITION_X:
1013		min = device->abs.warning_range.min.x;
1014		max = device->abs.warning_range.max.x;
1015		break;
1016	case ABS_Y:
1017	case ABS_MT_POSITION_Y:
1018		min = device->abs.warning_range.min.y;
1019		max = device->abs.warning_range.max.y;
1020		break;
1021	default:
1022		return;
1023	}
1024
1025	if (value < min || value > max) {
1026		log_info_ratelimit(evdev_libinput_context(device),
1027				   &device->abs.warning_range.range_warn_limit,
1028				   "Axis %#x value %d is outside expected range [%d, %d]\n"
1029				   "See %s/absolute_coordinate_ranges.html for details\n",
1030				   code, value, min, max,
1031				   HTTP_DOC_LINK);
1032	}
1033}
1034
1035struct evdev_paired_keyboard {
1036	struct list link;
1037	struct evdev_device *device;
1038	struct libinput_event_listener listener;
1039};
1040
1041static inline void
1042evdev_paired_keyboard_destroy(struct evdev_paired_keyboard *kbd)
1043{
1044	kbd->device = NULL;
1045	libinput_device_remove_event_listener(&kbd->listener);
1046	list_remove(&kbd->link);
1047	free(kbd);
1048}
1049
1050#endif /* EVDEV_H */
1051