mirror of
https://github.com/X11Libre/xf86-input-synaptics.git
synced 2026-04-14 11:54:16 +00:00
214 lines
8.6 KiB
C
214 lines
8.6 KiB
C
#ifndef _SYNAPTICS_H_
|
|
#define _SYNAPTICS_H_
|
|
|
|
#include "linux_input.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;
|
|
|
|
#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 */
|
|
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 isSynaptics; /* Synaptics touchpad active */
|
|
|
|
/* 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 */
|
|
|
|
char* repeater; /* Repeater on or off */
|
|
Bool updown_button_scrolling; /* Up/Down-Button scrolling or middle/double-click */
|
|
Bool touchpad_off; /* Switches the Touchpad 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;
|
|
|
|
#ifdef SYNAPTICS_PRIVATE
|
|
/******************************************************************************
|
|
* Definitions
|
|
* structs, typedefs, #defines, enums
|
|
*****************************************************************************/
|
|
#define SYNAPTICS_MOVE_HISTORY 5
|
|
|
|
/*
|
|
* A structure to describe the state of the touchpad hardware (buttons and pad)
|
|
*/
|
|
struct SynapticsHwState {
|
|
int millis; /* Timestamp in milliseconds */
|
|
int x; /* X position of finger */
|
|
int y; /* Y position of finger */
|
|
int z; /* Finger pressure */
|
|
int numFingers;
|
|
int fingerWidth;
|
|
|
|
Bool left;
|
|
Bool right;
|
|
Bool up;
|
|
Bool down;
|
|
|
|
Bool multi[8];
|
|
Bool middle; /* Some ALPS touchpads have a middle button */
|
|
|
|
Bool guest_left; /* guest device */
|
|
Bool guest_mid;
|
|
Bool guest_right;
|
|
int guest_dx;
|
|
int guest_dy;
|
|
};
|
|
|
|
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. */
|
|
};
|
|
|
|
enum SynapticsProtocol {
|
|
SYN_PROTO_PSAUX, /* Raw psaux device */
|
|
SYN_PROTO_EVENT /* Linux kernel event interface */
|
|
};
|
|
|
|
typedef struct _SynapticsPrivateRec
|
|
{
|
|
/* shared memory pointer */
|
|
SynapticsSHM *synpara;
|
|
|
|
enum SynapticsProtocol proto;
|
|
|
|
struct SynapticsHwState hwState;
|
|
|
|
/* Data read from the touchpad */
|
|
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 isSynaptics; /* Synaptics touchpad active */
|
|
Bool hasGuest; /* Has a guest mouse */
|
|
Bool shm_config; /* True when shared memory area allocated */
|
|
|
|
OsTimerPtr timer; /* for up/down-button repeat, tap processing, etc */
|
|
|
|
/* Data for normal processing */
|
|
XISBuffer *buffer;
|
|
unsigned char protoBuf[6]; /* Buffer for Packet */
|
|
unsigned char lastByte; /* Last read byte. Use for reset sequence detection. */
|
|
int outOfSync; /* How many consecutive incorrect packets we
|
|
have received */
|
|
int protoBufTail;
|
|
int fifofd; /* fd for fifo */
|
|
SynapticsTapRec touch_on; /* data when the touchpad is touched */
|
|
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 tapping_millis; /* packet counter for tapping */
|
|
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 */
|
|
Bool tap, drag, doubletap; /* feature flags */
|
|
Bool draglock; /* Locked drag active */
|
|
Bool tap_left, tap_mid, tap_right; /* tapping buttons */
|
|
Bool vert_scroll_on; /* scrolling flag */
|
|
Bool horiz_scroll_on; /* scrolling flag */
|
|
Bool circ_scroll_on; /* scrolling flag */
|
|
double frac_x, frac_y; /* absoulte -> 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 finger_count; /* tap counter for fingers */
|
|
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 */
|
|
|
|
Bool oneFinger; /* Used by SynapticsParseEventData to */
|
|
Bool twoFingers; /* keep track of the number of fingers */
|
|
Bool threeFingers; /* on the touchpad. */
|
|
} SynapticsPrivate;
|
|
|
|
|
|
static Bool DeviceControl(DeviceIntPtr, int);
|
|
static void ReadInput(LocalDevicePtr);
|
|
static int HandleState(LocalDevicePtr, struct SynapticsHwState*);
|
|
static int ControlProc(LocalDevicePtr, xDeviceCtl*);
|
|
static void CloseProc(LocalDevicePtr);
|
|
static int SwitchMode(ClientPtr, DeviceIntPtr, int);
|
|
static Bool ConvertProc(LocalDevicePtr, int, int, int, int, int, int, int, int, int*, int*);
|
|
static Bool QueryHardware(LocalDevicePtr);
|
|
static Bool DeviceInit(DeviceIntPtr);
|
|
static Bool DeviceOn(DeviceIntPtr);
|
|
static Bool DeviceOff(DeviceIntPtr);
|
|
static Bool DeviceInit(DeviceIntPtr);
|
|
static Bool SynapticsGetHwState(LocalDevicePtr, SynapticsPrivate *, struct SynapticsHwState *);
|
|
static Bool SynapticsParseEventData(LocalDevicePtr, SynapticsPrivate *,
|
|
struct SynapticsHwState *);
|
|
static Bool SynapticsReadEvent(SynapticsPrivate *, struct input_event *);
|
|
static Bool SynapticsParseRawPacket(LocalDevicePtr, SynapticsPrivate *,
|
|
struct SynapticsHwState *);
|
|
static Bool SynapticsGetPacket(LocalDevicePtr, SynapticsPrivate *);
|
|
static void PrintIdent(SynapticsPrivate *);
|
|
|
|
#endif /* SYNAPTICS_PRIVATE */
|
|
|
|
|
|
#endif /* _SYNAPTICS_H_ */
|