/[pkg-src]/trunk/xorg-server/patches/xorg-server-1.17.1-dix-add-unaccelerated-valuators-to-the-valuatormask.patch |
Contents of /trunk/xorg-server/patches/xorg-server-1.17.1-dix-add-unaccelerated-valuators-to-the-valuatormask.patch
Parent Directory | Revision Log
Revision 2576 -
(show annotations)
(download)
Mon Jun 15 13:02:17 2015 UTC (9 years, 3 months ago) by niro
File size: 7618 byte(s)
Mon Jun 15 13:02:17 2015 UTC (9 years, 3 months ago) by niro
File size: 7618 byte(s)
-fixed garbage patches
1 | From e1a7f4bb5333b0271d29f785eb55f1c3273e626a Mon Sep 17 00:00:00 2001 |
2 | From: Peter Hutterer <peter.hutterer@who-t.net> |
3 | 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 | Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> |
27 | Reviewed-by: Hans de Goede <hdegoede@redhat.com> |
28 | --- |
29 | 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 | --- 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 | } |
42 | |
43 | -/** |
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 | { |
51 | 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 | } |
55 | |
56 | /** |
57 | + * 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 | * Set the valuator to the given integer data. |
69 | */ |
70 | void |
71 | @@ -594,11 +602,15 @@ valuator_mask_unset(ValuatorMask *mask, int valuator) |
72 | |
73 | ClearBit(mask->mask, valuator); |
74 | mask->valuators[valuator] = 0.0; |
75 | + mask->unaccelerated[valuator] = 0.0; |
76 | |
77 | for (i = 0; i <= mask->last_bit; i++) |
78 | if (valuator_mask_isset(mask, i)) |
79 | lastbit = max(lastbit, i); |
80 | mask->last_bit = lastbit; |
81 | + |
82 | + if (mask->last_bit == -1) |
83 | + mask->has_unaccelerated = FALSE; |
84 | } |
85 | } |
86 | |
87 | @@ -611,6 +623,66 @@ valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src) |
88 | valuator_mask_zero(dest); |
89 | } |
90 | |
91 | +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 | 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 | --- a/hw/xfree86/common/xf86Module.h |
157 | +++ b/hw/xfree86/common/xf86Module.h |
158 | @@ -81,7 +81,7 @@ typedef enum { |
159 | */ |
160 | #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) |
161 | #define ABI_VIDEODRV_VERSION SET_ABI_VERSION(19, 0) |
162 | -#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 0) |
163 | +#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 1) |
164 | #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 | --- 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 | extern _X_EXPORT Bool valuator_mask_fetch_double(const ValuatorMask *mask, |
173 | int valnum, double *val); |
174 | |
175 | +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 | /* 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 | --- a/include/inpututils.h |
196 | +++ b/include/inpututils.h |
197 | @@ -36,8 +36,10 @@ extern Mask event_filters[MAXDEVICES][MAXEVENTS]; |
198 | |
199 | struct _ValuatorMask { |
200 | int8_t last_bit; /* highest bit set in mask */ |
201 | + int8_t has_unaccelerated; |
202 | uint8_t mask[(MAX_VALUATORS + 7) / 8]; |
203 | double valuators[MAX_VALUATORS]; /* valuator data */ |
204 | + double unaccelerated[MAX_VALUATORS]; /* valuator data */ |
205 | }; |
206 | |
207 | extern void verify_internal_event(const InternalEvent *ev); |
208 | -- |
209 | 2.4.1 |
210 |