/[pkg-src]/trunk/xorg-server/patches/xorg-server-1.17.1-dix-add-unaccelerated-valuators-to-the-valuatormask.patch |
Annotation of /trunk/xorg-server/patches/xorg-server-1.17.1-dix-add-unaccelerated-valuators-to-the-valuatormask.patch
Parent Directory | Revision Log
Revision 2576 -
(hide annotations)
(download)
Mon Jun 15 13:02:17 2015 UTC (9 years ago) by niro
File size: 7618 byte(s)
Mon Jun 15 13:02:17 2015 UTC (9 years ago) by niro
File size: 7618 byte(s)
-fixed garbage patches
1 | niro | 2576 | From e1a7f4bb5333b0271d29f785eb55f1c3273e626a Mon Sep 17 00:00:00 2001 |
2 | From: Peter Hutterer <peter.hutterer@who-t.net> | ||
3 | niro | 2575 | Date: Tue, 5 May 2015 14:18:54 +1000 |
4 | Subject: [PATCH] dix: Add unaccelerated valuators to the ValuatorMask | ||
5 | |||
6 | Allows a mask to carry both accelerated and unaccelerated motion at the same | ||
7 | time. | ||
8 | |||
9 | This is required for xf86-input-libinput where the pointer acceleration | ||
10 | happens in libinput already, but parts of the server, specifically raw events | ||
11 | and DGA rely on device-specific unaccelerated data. | ||
12 | |||
13 | To ease integration add this as a second set to the ValuatorMask rather than | ||
14 | extending all APIs to carry a second, possibly NULL set of valuators. | ||
15 | |||
16 | Note that a valuator mask should only be used in either accel/unaccel or | ||
17 | standard mode at any time. Switching requires either a valuator_mask_zero() | ||
18 | call or unsetting all valuators one-by-one. Trying to mix the two will produce | ||
19 | a warning. | ||
20 | |||
21 | The server has a shortcut for changing a mask with the | ||
22 | valuator_mask_drop_unaccelerated() call. This saves us from having to loop | ||
23 | through all valuators on every event, we can just drop the bits we know we | ||
24 | don't want. | ||
25 | |||
26 | niro | 2576 | Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> |
27 | Reviewed-by: Hans de Goede <hdegoede@redhat.com> | ||
28 | --- | ||
29 | niro | 2575 | dix/inpututils.c | 82 +++++++++++++++++++++++++++++++++++++++--- |
30 | hw/xfree86/common/xf86Module.h | 2 +- | ||
31 | include/input.h | 15 ++++++++ | ||
32 | include/inpututils.h | 2 ++ | ||
33 | 4 files changed, 95 insertions(+), 6 deletions(-) | ||
34 | |||
35 | diff --git a/dix/inpututils.c b/dix/inpututils.c | ||
36 | index 5c2a32d..1363988 100644 | ||
37 | niro | 2576 | --- a/dix/inpututils.c |
38 | +++ b/dix/inpututils.c | ||
39 | @@ -505,11 +505,8 @@ valuator_mask_isset(const ValuatorMask *mask, int valuator) | ||
40 | return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator); | ||
41 | niro | 2575 | } |
42 | |||
43 | niro | 2576 | -/** |
44 | - * Set the valuator to the given floating-point data. | ||
45 | - */ | ||
46 | -void | ||
47 | -valuator_mask_set_double(ValuatorMask *mask, int valuator, double data) | ||
48 | +static inline void | ||
49 | +_valuator_mask_set_double(ValuatorMask *mask, int valuator, double data) | ||
50 | niro | 2575 | { |
51 | niro | 2576 | mask->last_bit = max(valuator, mask->last_bit); |
52 | SetBit(mask->mask, valuator); | ||
53 | @@ -517,6 +514,17 @@ valuator_mask_set_double(ValuatorMask *mask, int valuator, double data) | ||
54 | niro | 2575 | } |
55 | |||
56 | /** | ||
57 | niro | 2576 | + * Set the valuator to the given floating-point data. |
58 | + */ | ||
59 | +void | ||
60 | +valuator_mask_set_double(ValuatorMask *mask, int valuator, double data) | ||
61 | +{ | ||
62 | + BUG_WARN_MSG(mask->has_unaccelerated, | ||
63 | + "Do not mix valuator types, zero mask first\n"); | ||
64 | + _valuator_mask_set_double(mask, valuator, data); | ||
65 | +} | ||
66 | + | ||
67 | +/** | ||
68 | niro | 2575 | * Set the valuator to the given integer data. |
69 | */ | ||
70 | void | ||
71 | niro | 2576 | @@ -594,11 +602,15 @@ valuator_mask_unset(ValuatorMask *mask, int valuator) |
72 | niro | 2575 | |
73 | niro | 2576 | ClearBit(mask->mask, valuator); |
74 | mask->valuators[valuator] = 0.0; | ||
75 | + mask->unaccelerated[valuator] = 0.0; | ||
76 | niro | 2575 | |
77 | niro | 2576 | for (i = 0; i <= mask->last_bit; i++) |
78 | niro | 2575 | if (valuator_mask_isset(mask, i)) |
79 | lastbit = max(lastbit, i); | ||
80 | niro | 2576 | mask->last_bit = lastbit; |
81 | + | ||
82 | + if (mask->last_bit == -1) | ||
83 | + mask->has_unaccelerated = FALSE; | ||
84 | niro | 2575 | } |
85 | } | ||
86 | |||
87 | niro | 2576 | @@ -611,6 +623,66 @@ valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src) |
88 | niro | 2575 | valuator_mask_zero(dest); |
89 | } | ||
90 | |||
91 | niro | 2576 | +Bool |
92 | +valuator_mask_has_unaccelerated(const ValuatorMask *mask) | ||
93 | +{ | ||
94 | + return mask->has_unaccelerated; | ||
95 | +} | ||
96 | + | ||
97 | +void | ||
98 | +valuator_mask_drop_unaccelerated(ValuatorMask *mask) | ||
99 | +{ | ||
100 | + memset(mask->unaccelerated, 0, sizeof(mask->unaccelerated)); | ||
101 | + mask->has_unaccelerated = FALSE; | ||
102 | +} | ||
103 | + | ||
104 | +/** | ||
105 | + * Set both accelerated and unaccelerated value for this mask. | ||
106 | + */ | ||
107 | +void | ||
108 | +valuator_mask_set_unaccelerated(ValuatorMask *mask, | ||
109 | + int valuator, | ||
110 | + double accel, | ||
111 | + double unaccel) | ||
112 | +{ | ||
113 | + BUG_WARN_MSG(mask->last_bit != -1 && !mask->has_unaccelerated, | ||
114 | + "Do not mix valuator types, zero mask first\n"); | ||
115 | + _valuator_mask_set_double(mask, valuator, accel); | ||
116 | + mask->has_unaccelerated = TRUE; | ||
117 | + mask->unaccelerated[valuator] = unaccel; | ||
118 | +} | ||
119 | + | ||
120 | +double | ||
121 | +valuator_mask_get_accelerated(const ValuatorMask *mask, | ||
122 | + int valuator) | ||
123 | +{ | ||
124 | + return valuator_mask_get_double(mask, valuator); | ||
125 | +} | ||
126 | + | ||
127 | +double | ||
128 | +valuator_mask_get_unaccelerated(const ValuatorMask *mask, | ||
129 | + int valuator) | ||
130 | +{ | ||
131 | + return mask->unaccelerated[valuator]; | ||
132 | +} | ||
133 | + | ||
134 | +Bool | ||
135 | +valuator_mask_fetch_unaccelerated(const ValuatorMask *mask, | ||
136 | + int valuator, | ||
137 | + double *accel, | ||
138 | + double *unaccel) | ||
139 | +{ | ||
140 | + if (valuator_mask_isset(mask, valuator)) { | ||
141 | + if (accel) | ||
142 | + *accel = valuator_mask_get_accelerated(mask, valuator); | ||
143 | + if (unaccel) | ||
144 | + *unaccel = valuator_mask_get_unaccelerated(mask, valuator); | ||
145 | + return TRUE; | ||
146 | + } | ||
147 | + else | ||
148 | + return FALSE; | ||
149 | +} | ||
150 | + | ||
151 | niro | 2575 | int |
152 | CountBits(const uint8_t * mask, int len) | ||
153 | { | ||
154 | diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h | ||
155 | index e68fe9c..6133641 100644 | ||
156 | niro | 2576 | --- a/hw/xfree86/common/xf86Module.h |
157 | +++ b/hw/xfree86/common/xf86Module.h | ||
158 | @@ -81,7 +81,7 @@ typedef enum { | ||
159 | niro | 2575 | */ |
160 | #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) | ||
161 | #define ABI_VIDEODRV_VERSION SET_ABI_VERSION(19, 0) | ||
162 | niro | 2576 | -#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 0) |
163 | +#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 1) | ||
164 | niro | 2575 | #define ABI_EXTENSION_VERSION SET_ABI_VERSION(9, 0) |
165 | #define ABI_FONT_VERSION SET_ABI_VERSION(0, 6) | ||
166 | |||
167 | diff --git a/include/input.h b/include/input.h | ||
168 | index bf22dc7..0a4c4f7 100644 | ||
169 | niro | 2576 | --- a/include/input.h |
170 | +++ b/include/input.h | ||
171 | @@ -674,6 +674,21 @@ extern _X_EXPORT Bool valuator_mask_fetch(const ValuatorMask *mask, | ||
172 | niro | 2575 | extern _X_EXPORT Bool valuator_mask_fetch_double(const ValuatorMask *mask, |
173 | int valnum, double *val); | ||
174 | |||
175 | niro | 2576 | +extern _X_EXPORT Bool valuator_mask_has_unaccelerated(const ValuatorMask *mask); |
176 | +extern _X_EXPORT void valuator_mask_set_unaccelerated(ValuatorMask *mask, | ||
177 | + int valuator, | ||
178 | + double accel, | ||
179 | + double unaccel); | ||
180 | +extern _X_EXPORT double valuator_mask_get_accelerated(const ValuatorMask *mask, | ||
181 | + int valuator); | ||
182 | +extern _X_EXPORT double valuator_mask_get_unaccelerated(const ValuatorMask *mask, | ||
183 | + int valuator); | ||
184 | +extern _X_EXPORT Bool valuator_mask_fetch_unaccelerated(const ValuatorMask *mask, | ||
185 | + int valuator, | ||
186 | + double *accel, | ||
187 | + double *unaccel); | ||
188 | +extern _X_HIDDEN void valuator_mask_drop_unaccelerated(ValuatorMask *mask); | ||
189 | + | ||
190 | niro | 2575 | /* InputOption handling interface */ |
191 | extern _X_EXPORT InputOption *input_option_new(InputOption *list, | ||
192 | const char *key, | ||
193 | diff --git a/include/inpututils.h b/include/inpututils.h | ||
194 | index 53c96ba..4e90815 100644 | ||
195 | niro | 2576 | --- a/include/inpututils.h |
196 | +++ b/include/inpututils.h | ||
197 | @@ -36,8 +36,10 @@ extern Mask event_filters[MAXDEVICES][MAXEVENTS]; | ||
198 | niro | 2575 | |
199 | struct _ValuatorMask { | ||
200 | int8_t last_bit; /* highest bit set in mask */ | ||
201 | niro | 2576 | + int8_t has_unaccelerated; |
202 | niro | 2575 | uint8_t mask[(MAX_VALUATORS + 7) / 8]; |
203 | double valuators[MAX_VALUATORS]; /* valuator data */ | ||
204 | niro | 2576 | + double unaccelerated[MAX_VALUATORS]; /* valuator data */ |
205 | niro | 2575 | }; |
206 | |||
207 | extern void verify_internal_event(const InternalEvent *ev); | ||
208 | niro | 2576 | -- |
209 | niro | 2575 | 2.4.1 |
210 |