summaryrefslogtreecommitdiff
path: root/synaptics.h
blob: 409185b0fb4d1aa6dfb87aa8a64eb60fde34bd99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifndef	_SYNAPTICS_H_
#define _SYNAPTICS_H_

/******************************************************************************
 *		Public definitions.
 *						Used by driver and the shared memory configurator
 *****************************************************************************/
#define SHM_SYNAPTICS 23947
typedef struct _SynapticsSHM
{
	/* Current device state */
	int x, y;							/* actual x, y Coordinates */
	int z;								/* pressure value */
	int w;								/* finger width value */
	int left, right, up, down;			/* left/right/up/down buttons */

	/* Probed hardware properties */
	unsigned long int model_id;			/* Model-ID */
	unsigned long int capabilities; 	/* 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 */
	int	tap_time, 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_speed;				/* Edge motion speed when dragging */
	char* repeater;						/* Repeater on or off */
	Bool updown_button_scrolling;		/* Up/Down-Button scrolling or middle/double-click */
} SynapticsSHM, *SynapticsSHMPtr;

#ifdef SYNAPTICS_PRIVATE
/******************************************************************************
 *		Definitions
 *									structs, typedefs, #defines, enums
 *****************************************************************************/
#define SYNAPTICS_MOVE_HISTORY	5

typedef struct _SynapticsTapRec 
{
	int x, y;
	unsigned int packet;
} 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 */
};

typedef struct _SynapticsPrivateRec
{
	/* shared memory pointer */
	SynapticsSHMPtr synpara;	

	/* Data read from the touchpad */
	unsigned long int model_id;			/* Model-ID */
	unsigned long int capabilities; 	/* Capabilities */
	unsigned long int identity;			/* Identification */
	Bool isSynaptics;					/* Synaptics touchpad active */
	Bool six_buttons;					/* Use six button protocol */

	Bool shm_config;					/* True when shared memory area allocated */

	/* Data for normal processing */
	XISBuffer *buffer;
	unsigned char protoBuf[6];			/* Buffer for Packet */
	unsigned char lastByte;				/* letztes gelesene byte */
	Bool inSync;						/* Packets in sync */
	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 scroll_y;						/* last y-scroll position */
	int scroll_x;						/* last x-scroll position */
	unsigned int count_packet_finger;	/* packet counter with finger on the touchpad */
	unsigned int count_packet;			/* packet counter */
	unsigned int count_packet_tapping;	/* packet counter for tapping */
	unsigned int count_button_delay;	/* 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 tap_left, tap_mid, tap_right;	/* tapping buttons */
	Bool vert_scroll_on;				/* scrolling flag */
	Bool horiz_scroll_on;				/* scrolling flag */
	double frac_x, frac_y;				/* absoulte -> relative fraction */
	enum MidButtonEmulation mid_emu_state;	/* emulated 3rd button */
	OsTimerPtr repeat_timer;			/* for up/down-button repeat */
	int repeatButtons;					/* buttons for repeat */
	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_w;							/* weighted average of previous w values */
}
SynapticsPrivateRec, *SynapticsPrivatePtr;


static Bool DeviceControl(DeviceIntPtr, int);
static void ReadInput(LocalDevicePtr);
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 SynapticsGetPacket(LocalDevicePtr, SynapticsPrivatePtr);
static void PrintIdent(SynapticsPrivatePtr);

#endif


/* 
 *    DO NOT PUT ANYTHING AFTER THIS ENDIF
 */
#endif /* _SYNAPTICS_H_ */

/* Local Variables: */
/* tab-width: 4 */
/* End: */
/* vim:ts=4:sw=4:cindent:
*/