summaryrefslogtreecommitdiff
path: root/synproto.h
blob: 8562a7593c236a77e629b67c36d15c138e2711d1 (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
/*
 *   Copyright 2004 Peter Osterlund <petero2@telia.com>
 *
 *   This program is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU General Public License
 *   as published by the Free Software Foundation; either version 2
 *   of the License, or (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
#ifndef _SYNPROTO_H_
#define _SYNPROTO_H_

#include <sys/ioctl.h>
#include <xf86Xinput.h>
#include <xisb.h>

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

struct CommData {
    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;

    /* Used for keeping track of partial HwState updates. */
    struct SynapticsHwState hwState;
    Bool oneFinger;
    Bool twoFingers;
    Bool threeFingers;
};

enum SynapticsProtocol {
    SYN_PROTO_PSAUX,		/* Raw psaux device */
    SYN_PROTO_EVENT,		/* Linux kernel event interface */
    SYN_PROTO_PSM,		/* FreeBSD psm driver */
    SYN_PROTO_ALPS		/* ALPS touchpad protocol */
};

struct SynapticsHwInfo;
struct CommData;

struct SynapticsProtocolOperations {
    void (*DeviceOnHook)(LocalDevicePtr local);
    void (*DeviceOffHook)(LocalDevicePtr local);
    Bool (*QueryHardware)(LocalDevicePtr local, struct SynapticsHwInfo *synhw);
    Bool (*ReadHwState)(LocalDevicePtr local, struct SynapticsHwInfo *synhw,
			struct SynapticsProtocolOperations *proto_ops,
			struct CommData *comm, struct SynapticsHwState *hwRet);
    Bool (*AutoDevProbe)(LocalDevicePtr local);
};

extern struct SynapticsProtocolOperations psaux_proto_operations;
extern struct SynapticsProtocolOperations event_proto_operations;
extern struct SynapticsProtocolOperations psm_proto_operations;
extern struct SynapticsProtocolOperations alps_proto_operations;


#endif /* _SYNPROTO_H_ */