~jderose/ubuntu/raring/xserver-xorg-input-synaptics/clickpad

« back to all changes in this revision

Viewing changes to src/properties.c

  • Committer: Bazaar Package Importer
  • Author(s): Christopher James Halse Rogers, Cyril Brulebois, Christopher James Halse Rogers
  • Date: 2011-01-25 20:01:58 UTC
  • mfrom: (1.2.2 upstream) (2.1.4 experimental)
  • Revision ID: james.westby@ubuntu.com-20110125200158-9qpvmzuexogs7a5n
Tags: 1.3.99+git20110116.0e27ce3a-0ubuntu1
[ Cyril Brulebois ]
* Switch to Architecture: any, adding armhf support (Closes: #604672).

[ Christopher James Halse Rogers ]
* Merge from (unreleased) Debian experimental.  Remaining Ubuntu changes:
  - Split out our synaptics quirks into 51-synaptics-quirks.conf
  - Add the udev rule back for tagging specific machines to be quirked
  - Trigger udev in postinst to pick up udev rules
  - add Depend: on udev
  - 103_enable_cornertapping.patch: Enable right/middle clicks by
    tapping in the bottom- and top-right corners.
  - 104_always_enable_tapping.patch: Enable tapping regardless of the
    presence of physical buttons.
  - 106_always_enable_vert_edge_scroll.patch: Enable vertical edge
    tapping by default even if we enable two-finger scrolling as well.
  - 114_jumpy_cursor_first_part.patch: Adds a property to enable filtering
    jumpy cursor problems on some machines.
  - Specify ‘ubuntu’ branch in gbp.conf
  - 115_evdev_only.patch: Only bind to /dev/input/event* evdev devices
    (LP 624985)
* Update to git snapshot to fix build against Xserver 1.10 input API
* debian/patches/01-synaptics-dont-grab-if-not-on-current-VT.patch:
  - Refresh for new upstream.
* debian/patches/114_jumpy_cursor_first_part.patch:
  - Refresh for new upstream.  Drop the multi-touch chunk of the quirk,
    as that is handled by upstream commit a6ca4d25.
  

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
 
30
30
#include <xorg-server.h>
31
31
#include "xf86Module.h"
32
 
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
33
32
 
34
33
#include <X11/Xatom.h>
35
34
#include <xf86.h>
65
64
Atom prop_buttonscroll_repeat   = 0;
66
65
Atom prop_buttonscroll_time     = 0;
67
66
Atom prop_off                   = 0;
68
 
Atom prop_guestmouse            = 0;
69
67
Atom prop_lockdrags             = 0;
70
68
Atom prop_lockdrags_time        = 0;
71
69
Atom prop_tapaction             = 0;
134
132
}
135
133
 
136
134
void
137
 
InitDeviceProperties(LocalDevicePtr local)
 
135
InitDeviceProperties(InputInfoPtr pInfo)
138
136
{
139
 
    SynapticsPrivate *priv = (SynapticsPrivate *) local->private;
 
137
    SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private;
140
138
    SynapticsParameters *para = &priv->synpara;
141
139
    int values[9]; /* we never have more than 9 values in an atom */
142
140
    float fvalues[4]; /* never have more than 4 float values */
148
146
        if (!float_type)
149
147
        {
150
148
            xf86Msg(X_ERROR, "%s: Failed to init float atom. "
151
 
                             "Disabling property support.\n", local->name);
 
149
                             "Disabling property support.\n", pInfo->name);
152
150
            return;
153
151
        }
154
152
    }
158
156
    values[2] = para->top_edge;
159
157
    values[3] = para->bottom_edge;
160
158
 
161
 
    prop_edges = InitAtom(local->dev, SYNAPTICS_PROP_EDGES, 32, 4, values);
 
159
    prop_edges = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGES, 32, 4, values);
162
160
 
163
161
    values[0] = para->finger_low;
164
162
    values[1] = para->finger_high;
165
163
    values[2] = para->finger_press;
166
164
 
167
 
    prop_finger = InitAtom(local->dev, SYNAPTICS_PROP_FINGER, 32, 3, values);
168
 
    prop_tap_time = InitAtom(local->dev, SYNAPTICS_PROP_TAP_TIME, 32, 1, &para->tap_time);
169
 
    prop_tap_move = InitAtom(local->dev, SYNAPTICS_PROP_TAP_MOVE, 32, 1, &para->tap_move);
 
165
    prop_finger = InitAtom(pInfo->dev, SYNAPTICS_PROP_FINGER, 32, 3, values);
 
166
    prop_tap_time = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_TIME, 32, 1, &para->tap_time);
 
167
    prop_tap_move = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_MOVE, 32, 1, &para->tap_move);
170
168
 
171
169
    values[0] = para->single_tap_timeout;
172
170
    values[1] = para->tap_time_2;
173
171
    values[2] = para->click_time;
174
172
 
175
 
    prop_tap_durations = InitAtom(local->dev, SYNAPTICS_PROP_TAP_DURATIONS, 32, 3, values);
176
 
    prop_tap_fast = InitAtom(local->dev, SYNAPTICS_PROP_TAP_FAST, 8, 1, &para->fast_taps);
177
 
    prop_middle_timeout = InitAtom(local->dev, SYNAPTICS_PROP_MIDDLE_TIMEOUT,
 
173
    prop_tap_durations = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_DURATIONS, 32, 3, values);
 
174
    prop_tap_fast = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_FAST, 8, 1, &para->fast_taps);
 
175
    prop_middle_timeout = InitAtom(pInfo->dev, SYNAPTICS_PROP_MIDDLE_TIMEOUT,
178
176
                                   32, 1, &para->emulate_mid_button_time);
179
 
    prop_twofinger_pressure = InitAtom(local->dev, SYNAPTICS_PROP_TWOFINGER_PRESSURE,
 
177
    prop_twofinger_pressure = InitAtom(pInfo->dev, SYNAPTICS_PROP_TWOFINGER_PRESSURE,
180
178
                                       32, 1, &para->emulate_twofinger_z);
181
 
    prop_twofinger_width = InitAtom(local->dev, SYNAPTICS_PROP_TWOFINGER_WIDTH,
 
179
    prop_twofinger_width = InitAtom(pInfo->dev, SYNAPTICS_PROP_TWOFINGER_WIDTH,
182
180
                                       32, 1, &para->emulate_twofinger_w);
183
181
 
184
182
    values[0] = para->scroll_dist_vert;
185
183
    values[1] = para->scroll_dist_horiz;
186
 
    prop_scrolldist = InitAtom(local->dev, SYNAPTICS_PROP_SCROLL_DISTANCE, 32, 2, values);
 
184
    prop_scrolldist = InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_DISTANCE, 32, 2, values);
187
185
 
188
186
    values[0] = para->scroll_edge_vert;
189
187
    values[1] = para->scroll_edge_horiz;
190
188
    values[2] = para->scroll_edge_corner;
191
 
    prop_scrolledge = InitAtom(local->dev, SYNAPTICS_PROP_SCROLL_EDGE,8, 3, values);
 
189
    prop_scrolledge = InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_EDGE,8, 3, values);
192
190
    values[0] = para->scroll_twofinger_vert;
193
191
    values[1] = para->scroll_twofinger_horiz;
194
 
    prop_scrolltwofinger = InitAtom(local->dev, SYNAPTICS_PROP_SCROLL_TWOFINGER,8, 2, values);
 
192
    prop_scrolltwofinger = InitAtom(pInfo->dev, SYNAPTICS_PROP_SCROLL_TWOFINGER,8, 2, values);
195
193
 
196
194
    fvalues[0] = para->min_speed;
197
195
    fvalues[1] = para->max_speed;
198
196
    fvalues[2] = para->accl;
199
197
    fvalues[3] = para->trackstick_speed;
200
 
    prop_speed = InitFloatAtom(local->dev, SYNAPTICS_PROP_SPEED, 4, fvalues);
 
198
    prop_speed = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_SPEED, 4, fvalues);
201
199
 
202
200
    values[0] = para->edge_motion_min_z;
203
201
    values[1] = para->edge_motion_max_z;
204
 
    prop_edgemotion_pressure = InitAtom(local->dev, SYNAPTICS_PROP_EDGEMOTION_PRESSURE, 32, 2, values);
 
202
    prop_edgemotion_pressure = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION_PRESSURE, 32, 2, values);
205
203
 
206
204
    values[0] = para->edge_motion_min_speed;
207
205
    values[1] = para->edge_motion_max_speed;
208
 
    prop_edgemotion_speed = InitAtom(local->dev, SYNAPTICS_PROP_EDGEMOTION_SPEED, 32, 2, values);
209
 
    prop_edgemotion_always = InitAtom(local->dev, SYNAPTICS_PROP_EDGEMOTION, 8, 1, &para->edge_motion_use_always);
210
 
 
211
 
    values[0] = para->updown_button_scrolling;
212
 
    values[1] = para->leftright_button_scrolling;
213
 
    prop_buttonscroll = InitAtom(local->dev, SYNAPTICS_PROP_BUTTONSCROLLING, 8, 2, values);
214
 
 
215
 
    values[0] = para->updown_button_repeat;
216
 
    values[1] = para->leftright_button_repeat;
217
 
    prop_buttonscroll_repeat = InitAtom(local->dev, SYNAPTICS_PROP_BUTTONSCROLLING_REPEAT, 8, 2, values);
218
 
    prop_buttonscroll_time = InitAtom(local->dev, SYNAPTICS_PROP_BUTTONSCROLLING_TIME, 32, 1, &para->scroll_button_repeat);
219
 
    prop_off = InitAtom(local->dev, SYNAPTICS_PROP_OFF, 8, 1, &para->touchpad_off);
220
 
    prop_guestmouse = InitAtom(local->dev, SYNAPTICS_PROP_GUESTMOUSE, 8, 1, &para->guestmouse_off);
221
 
    prop_lockdrags = InitAtom(local->dev, SYNAPTICS_PROP_LOCKED_DRAGS, 8, 1, &para->locked_drags);
222
 
    prop_lockdrags_time = InitAtom(local->dev, SYNAPTICS_PROP_LOCKED_DRAGS_TIMEOUT, 32, 1, &para->locked_drag_time);
 
206
    prop_edgemotion_speed = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION_SPEED, 32, 2, values);
 
207
    prop_edgemotion_always = InitAtom(pInfo->dev, SYNAPTICS_PROP_EDGEMOTION, 8, 1, &para->edge_motion_use_always);
 
208
 
 
209
    if (priv->has_scrollbuttons)
 
210
    {
 
211
        values[0] = para->updown_button_scrolling;
 
212
        values[1] = para->leftright_button_scrolling;
 
213
        prop_buttonscroll = InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING, 8, 2, values);
 
214
 
 
215
        values[0] = para->updown_button_repeat;
 
216
        values[1] = para->leftright_button_repeat;
 
217
        prop_buttonscroll_repeat = InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING_REPEAT, 8, 2, values);
 
218
        prop_buttonscroll_time = InitAtom(pInfo->dev, SYNAPTICS_PROP_BUTTONSCROLLING_TIME, 32, 1, &para->scroll_button_repeat);
 
219
    }
 
220
 
 
221
    prop_off = InitAtom(pInfo->dev, SYNAPTICS_PROP_OFF, 8, 1, &para->touchpad_off);
 
222
    prop_lockdrags = InitAtom(pInfo->dev, SYNAPTICS_PROP_LOCKED_DRAGS, 8, 1, &para->locked_drags);
 
223
    prop_lockdrags_time = InitAtom(pInfo->dev, SYNAPTICS_PROP_LOCKED_DRAGS_TIMEOUT, 32, 1, &para->locked_drag_time);
223
224
 
224
225
    memcpy(values, para->tap_action, MAX_TAP * sizeof(int));
225
 
    prop_tapaction = InitAtom(local->dev, SYNAPTICS_PROP_TAP_ACTION, 8, MAX_TAP, values);
 
226
    prop_tapaction = InitAtom(pInfo->dev, SYNAPTICS_PROP_TAP_ACTION, 8, MAX_TAP, values);
226
227
 
227
228
    memcpy(values, para->click_action, MAX_CLICK * sizeof(int));
228
 
    prop_clickaction = InitAtom(local->dev, SYNAPTICS_PROP_CLICK_ACTION, 8, MAX_CLICK, values);
 
229
    prop_clickaction = InitAtom(pInfo->dev, SYNAPTICS_PROP_CLICK_ACTION, 8, MAX_CLICK, values);
229
230
 
230
 
    prop_circscroll = InitAtom(local->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING, 8, 1, &para->circular_scrolling);
 
231
    prop_circscroll = InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING, 8, 1, &para->circular_scrolling);
231
232
 
232
233
    fvalues[0] = para->scroll_dist_circ;
233
 
    prop_circscroll_dist = InitFloatAtom(local->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_DIST, 1, fvalues);
 
234
    prop_circscroll_dist = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_DIST, 1, fvalues);
234
235
 
235
 
    prop_circscroll_trigger = InitAtom(local->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_TRIGGER, 8, 1, &para->circular_trigger);
236
 
    prop_circpad = InitAtom(local->dev, SYNAPTICS_PROP_CIRCULAR_PAD, 8, 1, &para->circular_pad);
237
 
    prop_palm = InitAtom(local->dev, SYNAPTICS_PROP_PALM_DETECT, 8, 1, &para->palm_detect);
 
236
    prop_circscroll_trigger = InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_SCROLLING_TRIGGER, 8, 1, &para->circular_trigger);
 
237
    prop_circpad = InitAtom(pInfo->dev, SYNAPTICS_PROP_CIRCULAR_PAD, 8, 1, &para->circular_pad);
 
238
    prop_palm = InitAtom(pInfo->dev, SYNAPTICS_PROP_PALM_DETECT, 8, 1, &para->palm_detect);
238
239
 
239
240
    values[0] = para->palm_min_width;
240
241
    values[1] = para->palm_min_z;
241
242
 
242
 
    prop_palm_dim = InitAtom(local->dev, SYNAPTICS_PROP_PALM_DIMENSIONS, 32, 2, values);
 
243
    prop_palm_dim = InitAtom(pInfo->dev, SYNAPTICS_PROP_PALM_DIMENSIONS, 32, 2, values);
243
244
 
244
245
    fvalues[0] = para->coasting_speed;
245
 
    prop_coastspeed = InitFloatAtom(local->dev, SYNAPTICS_PROP_COASTING_SPEED, 1, fvalues);
 
246
    fvalues[1] = para->coasting_friction;
 
247
    prop_coastspeed = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_COASTING_SPEED, 2, fvalues);
246
248
 
247
249
    values[0] = para->press_motion_min_z;
248
250
    values[1] = para->press_motion_max_z;
249
 
    prop_pressuremotion = InitAtom(local->dev, SYNAPTICS_PROP_PRESSURE_MOTION, 32, 2, values);
 
251
    prop_pressuremotion = InitAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION, 32, 2, values);
250
252
 
251
253
    fvalues[0] = para->press_motion_min_factor;
252
254
    fvalues[1] = para->press_motion_max_factor;
253
255
 
254
 
    prop_pressuremotion_factor = InitFloatAtom(local->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, fvalues);
 
256
    prop_pressuremotion_factor = InitFloatAtom(pInfo->dev, SYNAPTICS_PROP_PRESSURE_MOTION_FACTOR, 2, fvalues);
255
257
 
256
 
    prop_grab = InitAtom(local->dev, SYNAPTICS_PROP_GRAB, 8, 1, &para->grab_event_device);
 
258
    prop_grab = InitAtom(pInfo->dev, SYNAPTICS_PROP_GRAB, 8, 1, &para->grab_event_device);
257
259
 
258
260
    values[0] = para->tap_and_drag_gesture;
259
 
    prop_gestures = InitAtom(local->dev, SYNAPTICS_PROP_GESTURES, 8, 1, values);
 
261
    prop_gestures = InitAtom(pInfo->dev, SYNAPTICS_PROP_GESTURES, 8, 1, values);
260
262
 
261
263
    values[0] = priv->has_left;
262
264
    values[1] = priv->has_middle;
263
265
    values[2] = priv->has_right;
264
266
    values[3] = priv->has_double;
265
267
    values[4] = priv->has_triple;
266
 
    prop_capabilities = InitAtom(local->dev, SYNAPTICS_PROP_CAPABILITIES, 8, 5, values);
 
268
    values[5] = priv->has_pressure;
 
269
    values[6] = priv->has_width;
 
270
    prop_capabilities = InitAtom(pInfo->dev, SYNAPTICS_PROP_CAPABILITIES, 8, 7, values);
267
271
 
268
272
    values[0] = para->resolution_vert;
269
273
    values[1] = para->resolution_horiz;
270
 
    prop_resolution = InitAtom(local->dev, SYNAPTICS_PROP_RESOLUTION, 32, 2, values);
 
274
    prop_resolution = InitAtom(pInfo->dev, SYNAPTICS_PROP_RESOLUTION, 32, 2, values);
271
275
 
272
276
    values[0] = para->area_left_edge;
273
277
    values[1] = para->area_right_edge;
274
278
    values[2] = para->area_top_edge;
275
279
    values[3] = para->area_bottom_edge;
276
 
    prop_area = InitAtom(local->dev, SYNAPTICS_PROP_AREA, 32, 4, values);
 
280
    prop_area = InitAtom(pInfo->dev, SYNAPTICS_PROP_AREA, 32, 4, values);
277
281
}
278
282
 
279
283
int
280
284
SetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
281
285
            BOOL checkonly)
282
286
{
283
 
    LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate;
284
 
    SynapticsPrivate *priv = (SynapticsPrivate *) local->private;
 
287
    InputInfoPtr pInfo = dev->public.devicePrivate;
 
288
    SynapticsPrivate *priv = (SynapticsPrivate *) pInfo->private;
285
289
    SynapticsParameters *para = &priv->synpara;
286
290
    SynapticsParameters tmp;
287
291
 
454
458
    {
455
459
        BOOL *scroll;
456
460
 
 
461
        if (!priv->has_scrollbuttons)
 
462
            return BadMatch;
 
463
 
457
464
        if (prop->size != 2 || prop->format != 8 || prop->type != XA_INTEGER)
458
465
            return BadMatch;
459
466
 
465
472
    {
466
473
        BOOL *repeat;
467
474
 
 
475
        if (!priv->has_scrollbuttons)
 
476
            return BadMatch;
 
477
 
468
478
        if (prop->size != 2 || prop->format != 8 || prop->type != XA_INTEGER)
469
479
            return BadMatch;
470
480
 
473
483
        para->leftright_button_repeat = repeat[1];
474
484
    } else if (property == prop_buttonscroll_time)
475
485
    {
 
486
        if (!priv->has_scrollbuttons)
 
487
            return BadMatch;
 
488
 
476
489
        if (prop->size != 1 || prop->format != 32 || prop->type != XA_INTEGER)
477
490
            return BadMatch;
478
491
 
490
503
            return BadValue;
491
504
 
492
505
        para->touchpad_off = off;
493
 
    } else if (property == prop_guestmouse)
494
 
    {
495
 
        if (prop->size != 1 || prop->format != 8 || prop->type != XA_INTEGER)
496
 
            return BadMatch;
497
 
 
498
 
        para->guestmouse_off = *(BOOL*)prop->data;
499
506
    } else if (property == prop_gestures)
500
507
    {
501
508
        BOOL *gestures;
594
601
        para->palm_min_z     = dim[1];
595
602
    } else if (property == prop_coastspeed)
596
603
    {
597
 
        float speed;
 
604
        float *coast_speeds;
598
605
 
599
 
        if (prop->size != 1 || prop->format != 32 || prop->type != float_type)
 
606
        if (prop->size != 2 || prop->format != 32 || prop->type != float_type)
600
607
            return BadMatch;
601
608
 
602
 
        speed = *(float*)prop->data;
603
 
        para->coasting_speed = speed;
604
 
 
 
609
        coast_speeds = (float*)prop->data;
 
610
        para->coasting_speed = coast_speeds[0];
 
611
        para->coasting_friction = coast_speeds[1];
605
612
    } else if (property == prop_pressuremotion)
606
613
    {
607
614
        float *press;
647
654
    return Success;
648
655
}
649
656
 
650
 
#endif
651