mirror of
https://github.com/X11Libre/xf86-input-synaptics.git
synced 2026-04-14 11:54:16 +00:00
through device. (It's not entirely uncommon that the pointing stick is broken and generates bogus pointer movements.) From Moritz Maass <maass@informatik.tu-muenchen.de>.
190 lines
7.2 KiB
C
190 lines
7.2 KiB
C
#ifndef _SYNAPTICS_H_
|
|
#define _SYNAPTICS_H_
|
|
|
|
#include <X11/Xdefs.h>
|
|
|
|
/******************************************************************************
|
|
* Public definitions.
|
|
* Used by driver and the shared memory configurator
|
|
*****************************************************************************/
|
|
typedef enum {
|
|
RT_TAP = 0, /* Right top corner */
|
|
RB_TAP, /* Right bottom corner */
|
|
LT_TAP, /* Left top corner */
|
|
LB_TAP, /* Left bottom corner */
|
|
F1_TAP, /* Non-corner tap, one finger */
|
|
F2_TAP, /* Non-corner tap, two fingers */
|
|
F3_TAP, /* Non-corner tap, three fingers */
|
|
MAX_TAP
|
|
} TapEvent;
|
|
|
|
struct SynapticsHwInfo {
|
|
unsigned long int model_id; /* Model-ID */
|
|
unsigned long int capabilities; /* Capabilities */
|
|
unsigned long int ext_cap; /* Extended Capabilities */
|
|
unsigned long int identity; /* Identification */
|
|
Bool hasGuest; /* Has a guest mouse */
|
|
};
|
|
|
|
|
|
#define SHM_SYNAPTICS 23947
|
|
typedef struct _SynapticsSHM
|
|
{
|
|
/* Current device state */
|
|
int x, y; /* actual x, y coordinates */
|
|
int z; /* pressure value */
|
|
int numFingers; /* number of fingers */
|
|
int fingerWidth; /* finger width value */
|
|
int left, right, up, down; /* left/right/up/down buttons */
|
|
Bool multi[8];
|
|
Bool middle;
|
|
int guest_left, guest_mid, guest_right; /* guest device buttons */
|
|
int guest_dx, guest_dy; /* guest device movement */
|
|
|
|
/* Probed hardware properties */
|
|
struct SynapticsHwInfo synhw;
|
|
|
|
/* Parameter data */
|
|
int left_edge, right_edge, top_edge, bottom_edge; /* edge coordinates absolute */
|
|
int finger_low, finger_high; /* finger detection values in Z-values */
|
|
unsigned long tap_time;
|
|
int tap_move; /* max. tapping-time and movement in packets and coord. */
|
|
int emulate_mid_button_time; /* Max time between left and right button presses to
|
|
emulate a middle button press. */
|
|
int scroll_dist_vert; /* Scrolling distance in absolute coordinates */
|
|
int scroll_dist_horiz; /* Scrolling distance in absolute coordinates */
|
|
double min_speed, max_speed, accl; /* movement parameters */
|
|
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, egde motion is used only when dragging */
|
|
|
|
Bool updown_button_scrolling; /* Up/Down-Button scrolling or middle/double-click */
|
|
Bool touchpad_off; /* Switches the touchpad off */
|
|
Bool guestmouse_off; /* Switches the guest mouse off */
|
|
Bool locked_drags; /* Enable locked drags */
|
|
int tap_action[MAX_TAP]; /* Button to report on tap events */
|
|
Bool circular_scrolling; /* Enable circular scrolling */
|
|
double scroll_dist_circ; /* Scrolling angle radians */
|
|
int circular_trigger; /* Trigger area for circular scrolling */
|
|
} SynapticsSHM;
|
|
|
|
/*
|
|
* The x/y limits are taken from the Synaptics TouchPad interfacing Guide,
|
|
* section 2.3.2, which says that they should be valid regardless of the
|
|
* actual size of the sensor.
|
|
*/
|
|
#define XMIN_NOMINAL 1472
|
|
#define XMAX_NOMINAL 5472
|
|
#define YMIN_NOMINAL 1408
|
|
#define YMAX_NOMINAL 4448
|
|
|
|
#define XMAX_VALID 6143
|
|
|
|
|
|
#ifdef SYNAPTICS_PRIVATE
|
|
|
|
#include "synproto.h"
|
|
|
|
/******************************************************************************
|
|
* Definitions
|
|
* structs, typedefs, #defines, enums
|
|
*****************************************************************************/
|
|
#define SYNAPTICS_MOVE_HISTORY 5
|
|
|
|
typedef struct _SynapticsTapRec
|
|
{
|
|
int x, y;
|
|
unsigned int millis;
|
|
} SynapticsTapRec;
|
|
|
|
typedef struct _SynapticsMoveHist
|
|
{
|
|
int x, y;
|
|
} SynapticsMoveHistRec;
|
|
|
|
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. */
|
|
};
|
|
|
|
/* 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_2, /* 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_UP_DOWN /* Send button up event + set down state */
|
|
};
|
|
|
|
typedef struct _SynapticsPrivateRec
|
|
{
|
|
/* shared memory pointer */
|
|
SynapticsSHM *synpara;
|
|
|
|
struct SynapticsProtocolOperations* proto_ops;
|
|
|
|
struct SynapticsHwState hwState;
|
|
|
|
/* Data read from the touchpad */
|
|
struct SynapticsHwInfo synhw;
|
|
Bool shm_config; /* True when shared memory area allocated */
|
|
|
|
OsTimerPtr timer; /* for up/down-button repeat, tap processing, etc */
|
|
|
|
struct CommData comm;
|
|
int fifofd; /* fd for fifo */
|
|
|
|
SynapticsMoveHistRec move_hist[SYNAPTICS_MOVE_HISTORY]; /* movement history */
|
|
int largest_valid_x; /* Largest valid X coordinate seen so far */
|
|
int scroll_y; /* last y-scroll position */
|
|
int scroll_x; /* last x-scroll position */
|
|
double scroll_a; /* last angle-scroll position */
|
|
unsigned long count_packet_finger; /* packet counter with finger on the touchpad */
|
|
unsigned int button_delay_millis; /* button delay for 3rd button emulation */
|
|
unsigned int prev_up; /* Previous up button value, for double click emulation */
|
|
Bool finger_flag; /* previous finger */
|
|
|
|
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 */
|
|
SynapticsTapRec touch_on; /* data when the touchpad is touched/released */
|
|
|
|
Bool vert_scroll_on; /* scrolling flag */
|
|
Bool horiz_scroll_on; /* scrolling flag */
|
|
Bool circ_scroll_on; /* scrolling flag */
|
|
double frac_x, frac_y; /* absolute -> relative fraction */
|
|
enum MidButtonEmulation mid_emu_state; /* emulated 3rd button */
|
|
int repeatButtons; /* buttons for repeat */
|
|
unsigned long 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 avg_width; /* weighted average of previous fingerWidth values */
|
|
|
|
} SynapticsPrivate;
|
|
|
|
|
|
Bool QueryHardware(LocalDevicePtr);
|
|
|
|
#endif /* SYNAPTICS_PRIVATE */
|
|
|
|
|
|
#endif /* _SYNAPTICS_H_ */
|