summaryrefslogtreecommitdiff
path: root/src/synproto.h
blob: 6ba6740709388198e002caedfded0efe1ebab1d3 (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
/*
 * Copyright © 2004 Peter Osterlund
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that the above copyright notice appear in all copies
 * and that both that copyright notice and this permission notice
 * appear in supporting documentation, and that the name of Red Hat
 * not be used in advertising or publicity pertaining to distribution
 * of the software without specific, written prior permission.  Red
 * Hat makes no representations about the suitability of this software
 * for any purpose.  It is provided "as is" without express or implied
 * warranty.
 *
 * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
 * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 * Authors:
 *      Peter Osterlund (petero2@telia.com)
 */

#ifndef _SYNPROTO_H_
#define _SYNPROTO_H_

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <xorg-server.h>

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

#ifndef XI86_SERVER_FD
#define XI86_SERVER_FD 0x20
#endif

struct _SynapticsPrivateRec;
typedef struct _SynapticsPrivateRec SynapticsPrivate;

enum SynapticsSlotState {
    SLOTSTATE_EMPTY = 0,        /* no slot in this cycle */
    SLOTSTATE_OPEN,             /* tracking ID received */
    SLOTSTATE_CLOSE,            /* tracking ID -1 received */
    SLOTSTATE_OPEN_EMPTY,       /* previously had tracking id, no events in this read cycle */
    SLOTSTATE_UPDATE,           /* had tracking id, other events in this cycle */
};

/* used to mark emulated hw button state */
#define BTN_EMULATED_FLAG 0x80

/*
 * A structure to describe the state of the touchpad hardware (buttons and pad)
 */
struct SynapticsHwState {
    CARD32 millis;              /* Timestamp in milliseconds */
    int x;                      /* X position of finger */
    int y;                      /* Y position of finger */
    int z;                      /* Finger pressure */
    int cumulative_dx;          /* Cumulative delta X for clickpad dragging */
    int cumulative_dy;          /* Cumulative delta Y for clickpad dragging */
    int numFingers;
    int fingerWidth;

    Bool left;
    Bool right;
    Bool up;
    Bool down;

    Bool multi[8];
    Bool middle;                /* Some ALPS touchpads have a middle button */

    int num_mt_mask;
    ValuatorMask **mt_mask;
    enum SynapticsSlotState *slot_state;
};

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

struct _SynapticsParameters;

struct SynapticsProtocolOperations {
    Bool (*DeviceOnHook) (InputInfoPtr pInfo,
                          struct _SynapticsParameters * para);
    Bool (*DeviceOffHook) (InputInfoPtr pInfo);
    Bool (*QueryHardware) (InputInfoPtr pInfo);
    Bool (*ReadHwState) (InputInfoPtr pInfo,
                         struct CommData * comm,
                         struct SynapticsHwState * hwRet);
    Bool (*AutoDevProbe) (InputInfoPtr pInfo, const char *device);
    void (*ReadDevDimensions) (InputInfoPtr pInfo);
};

#ifdef BUILD_PS2COMM
extern struct SynapticsProtocolOperations psaux_proto_operations;
extern struct SynapticsProtocolOperations alps_proto_operations;
#endif                          /* BUILD_PS2COMM */
#ifdef BUILD_EVENTCOMM
extern struct SynapticsProtocolOperations event_proto_operations;
#endif                          /* BUILD_EVENTCOMM */
#ifdef BUILD_PSMCOMM
extern struct SynapticsProtocolOperations psm_proto_operations;
#endif                          /* BUILD_PSMCOMM */

extern struct SynapticsHwState *SynapticsHwStateAlloc(SynapticsPrivate * priv);
extern void SynapticsHwStateFree(struct SynapticsHwState **hw);
extern void SynapticsCopyHwState(struct SynapticsHwState *dst,
                                 const struct SynapticsHwState *src);
extern void SynapticsResetHwState(struct SynapticsHwState *hw);
extern void SynapticsResetTouchHwState(struct SynapticsHwState *hw,
                                       Bool set_slot_empty);

extern Bool SynapticsIsSoftButtonAreasValid(int *values);

#endif                          /* _SYNPROTO_H_ */