summaryrefslogtreecommitdiff
path: root/synaptics.h
blob: 2e6ebae7eb683a99563edc708951233dba2c7a61 (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
#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 aktiv */

	/* 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;

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 aktiv */

	/* 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 */
	Bool third_button;					/* 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:
*/