blob: b2fecbe2c1ce961372d7f2684ce66e51311db194 [file] [log] [blame] [edit]
/*
* Permission to use, copy, modify, distribute, and sell this software
* and its documentation for any purpose is hereby granted without
* fee, provided that the above copyright notice appear in all copies
* and that both that copyright notice and this permission notice
* appear in supporting documentation, and that the name of Red Hat
* not be used in advertising or publicity pertaining to distribution
* of the software without specific, written prior permission. Red
* Hat makes no representations about the suitability of this software
* for any purpose. It is provided "as is" without express or implied
* warranty.
*
* THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
* NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _SYNAPTICSSTR_H_
#define _SYNAPTICSSTR_H_
#include "synproto.h"
#ifdef DBG
# undef DBG
#endif
#ifdef DEBUG
#define DBG(verb, ...) \
xf86MsgVerb(X_INFO, verb, __VA_ARGS__)
#else
#define DBG(verb, msg, ...) /* */
#endif
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 12
#define xf86IDrvMsg(pInfo, type, ...) xf86Msg(type, __VA_ARGS__)
#endif
/******************************************************************************
* Definitions
* structs, typedefs, #defines, enums
*****************************************************************************/
#define SYNAPTICS_MOVE_HISTORY 5
typedef struct _SynapticsMoveHist
{
int x, y;
int millis;
} SynapticsMoveHistRec;
enum FingerState { /* Note! The order matters. Compared with < operator. */
FS_UNTOUCHED,
FS_TOUCHED,
FS_PRESSED
};
enum MovingState {
MS_FALSE,
MS_TOUCHPAD_RELATIVE,
MS_TRACKSTICK /* trackstick is always relative */
};
enum MidButtonEmulation {
MBE_OFF, /* No button pressed */
MBE_LEFT, /* Left button pressed, waiting for right button or timeout */
MBE_RIGHT, /* Right button pressed, waiting for left button or timeout */
MBE_MID, /* Left and right buttons pressed, waiting for both buttons
to be released */
MBE_TIMEOUT, /* Waiting for both buttons to be released. */
MBE_LEFT_CLICK, /* Emulate left button click. */
MBE_RIGHT_CLICK, /* Emulate right button click. */
};
/* See docs/tapndrag.dia for a state machine diagram */
enum TapState {
TS_START, /* No tap/drag in progress */
TS_1, /* After first touch */
TS_MOVE, /* Pointer movement enabled */
TS_2A, /* After first release */
TS_2B, /* After second/third/... release */
TS_SINGLETAP, /* After timeout after first release */
TS_3, /* After second touch */
TS_DRAG, /* Pointer drag enabled */
TS_4, /* After release when "locked drags" enabled */
TS_5 /* After touch when "locked drags" enabled */
};
enum TapButtonState {
TBS_BUTTON_UP, /* "Virtual tap button" is up */
TBS_BUTTON_DOWN, /* "Virtual tap button" is down */
TBS_BUTTON_DOWN_UP /* Send button down event + set up state */
};
enum TouchpadModel {
MODEL_UNKNOWN = 0,
MODEL_SYNAPTICS,
MODEL_ALPS,
MODEL_APPLETOUCH
};
typedef struct _SynapticsParameters
{
/* Parameter data */
int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */
int finger_low, finger_high, finger_press; /* finger detection values in Z-values */
int tap_time;
int tap_move; /* max. tapping time and movement in packets and coord. */
int single_tap_timeout; /* timeout to recognize a single tap */
int tap_time_2; /* max. tapping time for double taps */
int click_time; /* The duration of a single click */
Bool fast_taps; /* Faster reaction to single taps */
int emulate_mid_button_time; /* Max time between left and right button presses to
emulate a middle button press. */
int emulate_twofinger_z; /* pressure threshold to emulate two finger touch (for Alps) */
int emulate_twofinger_w; /* Finger width threshold to emulate two finger touch */
int scroll_dist_vert; /* Scrolling distance in absolute coordinates */
int scroll_dist_horiz; /* Scrolling distance in absolute coordinates */
Bool scroll_edge_vert; /* Enable/disable vertical scrolling on right edge */
Bool scroll_edge_horiz; /* Enable/disable horizontal scrolling on left edge */
Bool scroll_edge_corner; /* Enable/disable continuous edge scrolling when in the corner */
Bool scroll_twofinger_vert; /* Enable/disable vertical two-finger scrolling */
Bool scroll_twofinger_horiz; /* Enable/disable horizontal two-finger scrolling */
double min_speed, max_speed, accl; /* movement parameters */
double trackstick_speed; /* trackstick mode speed */
int edge_motion_min_z; /* finger pressure at which minimum edge motion speed is set */
int edge_motion_max_z; /* finger pressure at which maximum edge motion speed is set */
int edge_motion_min_speed; /* slowest setting for edge motion speed */
int edge_motion_max_speed; /* fastest setting for edge motion speed */
Bool edge_motion_use_always; /* If false, edge motion is used only when dragging */
Bool updown_button_scrolling; /* Up/Down-Button scrolling or middle/double-click */
Bool leftright_button_scrolling; /* Left/right-button scrolling, or two lots of middle button */
Bool updown_button_repeat; /* If up/down button being used to scroll, auto-repeat?*/
Bool leftright_button_repeat; /* If left/right button being used to scroll, auto-repeat? */
int scroll_button_repeat; /* time, in milliseconds, between scroll events being
* sent when holding down scroll buttons */
int touchpad_off; /* Switches the touchpad off
* 0 : Not off
* 1 : Off
* 2 : Only tapping and scrolling off
*/
Bool locked_drags; /* Enable locked drags */
int locked_drag_time; /* timeout for locked drags */
int tap_action[MAX_TAP]; /* Button to report on tap events */
int click_action[MAX_CLICK]; /* Button to report on click with fingers */
Bool circular_scrolling; /* Enable circular scrolling */
double scroll_dist_circ; /* Scrolling angle radians */
int circular_trigger; /* Trigger area for circular scrolling */
Bool circular_pad; /* Edge has an oval or circular shape */
Bool palm_detect; /* Enable Palm Detection */
int palm_min_width; /* Palm detection width */
int palm_min_z; /* Palm detection depth */
double coasting_speed; /* Coasting threshold scrolling speed */
double coasting_friction; /* Number of scrolls per second per second to change coasting speed */
int press_motion_min_z; /* finger pressure at which minimum pressure motion factor is applied */
int press_motion_max_z; /* finger pressure at which maximum pressure motion factor is applied */
double press_motion_min_factor; /* factor applied on speed when finger pressure is at minimum */
double press_motion_max_factor; /* factor applied on speed when finger pressure is at minimum */
Bool grab_event_device; /* grab event device for exclusive use? */
Bool tap_and_drag_gesture; /* Switches the tap-and-drag gesture on/off */
unsigned int resolution_horiz; /* horizontal resolution of touchpad in units/mm */
unsigned int resolution_vert; /* vertical resolution of touchpad in units/mm */
int area_left_edge, area_right_edge, area_top_edge, area_bottom_edge; /* area coordinates absolute */
int hyst_x, hyst_y; /* x and y width of hysteresis box */
} SynapticsParameters;
typedef struct _SynapticsPrivateRec
{
SynapticsParameters synpara; /* Default parameter settings, read from
the X config file */
SynapticsSHM *synshm; /* Current parameter settings. Will point to
shared memory if shm_config is true */
struct SynapticsProtocolOperations* proto_ops;
void *proto_data; /* protocol-specific data */
struct SynapticsHwState hwState;
char *device; /* device node */
Bool shm_config; /* True when shared memory area allocated */
OsTimerPtr timer; /* for up/down-button repeat, tap processing, etc */
struct CommData comm;
Bool absolute_events; /* post absolute motion events instead of relative */
SynapticsMoveHistRec move_hist[SYNAPTICS_MOVE_HISTORY]; /* movement history */
int hist_index; /* Last added entry in move_hist[] */
int hyst_center_x; /* center x of hysteresis*/
int hyst_center_y; /* center y of hysteresis*/
int scroll_y; /* last y-scroll position */
int scroll_x; /* last x-scroll position */
double scroll_a; /* last angle-scroll position */
int count_packet_finger; /* packet counter with finger on the touchpad */
int button_delay_millis; /* button delay for 3rd button emulation */
Bool prev_up; /* Previous up button value, for double click emulation */
enum FingerState finger_state; /* previous finger state */
enum TapState tap_state; /* State of tap processing */
int tap_max_fingers; /* Max number of fingers seen since entering start state */
int tap_button; /* Which button started the tap processing */
enum TapButtonState tap_button_state; /* Current tap action */
SynapticsMoveHistRec touch_on; /* data when the touchpad is touched/released */
enum MovingState moving_state; /* previous moving state */
Bool vert_scroll_edge_on; /* Keeps track of currently active scroll modes */
Bool horiz_scroll_edge_on; /* Keeps track of currently active scroll modes */
Bool vert_scroll_twofinger_on; /* Keeps track of currently active scroll modes */
Bool horiz_scroll_twofinger_on; /* Keeps track of currently active scroll modes */
Bool circ_scroll_on; /* Keeps track of currently active scroll modes */
Bool circ_scroll_vert; /* True: Generate vertical scroll events
False: Generate horizontal events */
int trackstick_neutral_x; /* neutral x position for trackstick mode */
int trackstick_neutral_y; /* neutral y position for trackstick mode */
double autoscroll_xspd; /* Horizontal coasting speed */
double autoscroll_yspd; /* Vertical coasting speed */
double autoscroll_x; /* Accumulated horizontal coasting scroll */
double autoscroll_y; /* Accumulated vertical coasting scroll */
int scroll_packet_count; /* Scroll duration */
double frac_x, frac_y; /* absolute -> relative fraction */
enum MidButtonEmulation mid_emu_state; /* emulated 3rd button */
int repeatButtons; /* buttons for repeat */
int nextRepeat; /* Time when to trigger next auto repeat event */
int lastButtons; /* last state of the buttons */
int palm; /* Set to true when palm detected, reset to false when
palm/finger contact disappears */
int prev_z; /* previous z value, for palm detection */
int prevFingers; /* previous numFingers, for transition detection */
int avg_width; /* weighted average of previous fingerWidth values */
double horiz_coeff; /* normalization factor for x coordintes */
double vert_coeff; /* normalization factor for y coordintes */
int minx, maxx, miny, maxy; /* min/max dimensions as detected */
int minp, maxp, minw, maxw; /* min/max pressure and finger width as detected */
int resx, resy; /* resolution of coordinates as detected in units/mm */
Bool has_left; /* left button detected for this device */
Bool has_right; /* right button detected for this device */
Bool has_middle; /* middle button detected for this device */
Bool has_double; /* double click detected for this device */
Bool has_triple; /* triple click detected for this device */
Bool has_pressure; /* device reports pressure */
Bool has_width; /* device reports finger width */
Bool has_scrollbuttons; /* device has physical scrollbuttons */
enum TouchpadModel model; /* The detected model */
unsigned short id_vendor; /* vendor id */
unsigned short id_product; /* product id */
} SynapticsPrivate;
#endif /* _SYNAPTICSSTR_H_ */