summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2010-06-16 02:27:32 +0200
committerHenrik Rydberg <rydberg@euromail.se>2010-06-16 02:27:32 +0200
commitff88de5cd38b5b51bad0e63d373d66745f1f8d31 (patch)
tree3fbf4adc8c807bc79a8272c4df1623c3677a9b2f /src
parentad6faf6c53bc1924986e1cc10bb42e5d157cba8f (diff)
refactor: Move files
Move all headers into include, separate source files into modules match, mtdev, src and driver, move some common definitions to common.h, and include define support for the MT slot protocol. This patch does not introduce any logical changes. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src')
-rw-r--r--src/capabilities.c181
-rw-r--r--src/capabilities.h57
-rw-r--r--src/common.h95
-rw-r--r--src/gestures.h43
-rw-r--r--src/hwdata.c133
-rw-r--r--src/hwdata.h95
-rw-r--r--src/hwstate.c2
-rw-r--r--src/hwstate.h47
-rw-r--r--src/iobuffer.c54
-rw-r--r--src/iobuffer.h38
-rw-r--r--src/memory.h73
-rw-r--r--src/mtouch.h59
-rw-r--r--src/mtstate.h62
-rw-r--r--src/multitouch.c369
-rw-r--r--src/test.c3
15 files changed, 2 insertions, 1309 deletions
diff --git a/src/capabilities.c b/src/capabilities.c
deleted file mode 100644
index cd96e8e..0000000
--- a/src/capabilities.c
+++ /dev/null
@@ -1,181 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#include "capabilities.h"
23
24#define SETABS(c, x, map, key, fd) \
25 (c->has_##x = getbit(map, key) && getabs(&c->abs_##x, key, fd))
26
27#define ADDCAP(s, c, x) strcat(s, c->has_##x ? " " #x : "")
28
29#define CLICK_AREA(c) ((c->has_ibt ? 0.20 : 0.00) * get_cap_ysize(c))
30
31static const int SN_COORD = 250; /* coordinate signal-to-noise ratio */
32static const int SN_WIDTH = 100; /* width signal-to-noise ratio */
33
34static const int bits_per_long = 8 * sizeof(long);
35
36static inline int nlongs(int nbit)
37{
38 return (nbit + bits_per_long - 1) / bits_per_long;
39}
40
41static inline int getbit(const unsigned long *map, int key)
42{
43 return (map[key / bits_per_long] >> (key % bits_per_long)) & 0x01;
44}
45
46static int getabs(struct input_absinfo *abs, int key, int fd)
47{
48 int rc;
49 SYSCALL(rc = ioctl(fd, EVIOCGABS(key), abs));
50 return rc >= 0;
51}
52
53static int has_integrated_button(const struct Capabilities *cap)
54{
55 static const int bcm5974_vmask_ibt = 1;
56 if (strcmp(cap->devname, "bcm5974"))
57 return 0;
58 return cap->devid.version & bcm5974_vmask_ibt;
59}
60
61int read_capabilities(struct Capabilities *cap, int fd)
62{
63 unsigned long evbits[nlongs(EV_MAX)];
64 unsigned long absbits[nlongs(ABS_MAX)];
65 unsigned long keybits[nlongs(KEY_MAX)];
66 int rc;
67
68 memset(cap, 0, sizeof(struct Capabilities));
69
70 SYSCALL(rc = ioctl(fd, EVIOCGID, &cap->devid));
71 if (rc < 0)
72 return rc;
73 SYSCALL(rc = ioctl(fd, EVIOCGNAME(sizeof(cap->devname)), cap->devname));
74 if (rc < 0)
75 return rc;
76 SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_SYN, sizeof(evbits)), evbits));
77 if (rc < 0)
78 return rc;
79 SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybits)), keybits));
80 if (rc < 0)
81 return rc;
82 SYSCALL(rc = ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(absbits)), absbits));
83 if (rc < 0)
84 return rc;
85
86 cap->has_left = getbit(keybits, BTN_LEFT);
87 cap->has_middle = getbit(keybits, BTN_MIDDLE);
88 cap->has_right = getbit(keybits, BTN_RIGHT);
89
90 SETABS(cap, touch_major, absbits, ABS_MT_TOUCH_MAJOR, fd);
91 SETABS(cap, touch_minor, absbits, ABS_MT_TOUCH_MINOR, fd);
92 SETABS(cap, width_major, absbits, ABS_MT_WIDTH_MAJOR, fd);
93 SETABS(cap, width_minor, absbits, ABS_MT_WIDTH_MINOR, fd);
94 SETABS(cap, orientation, absbits, ABS_MT_ORIENTATION, fd);
95 SETABS(cap, position_x, absbits, ABS_MT_POSITION_X, fd);
96 SETABS(cap, position_y, absbits, ABS_MT_POSITION_Y, fd);
97
98 cap->has_mtdata = cap->has_position_x && cap->has_position_y;
99 cap->has_ibt = has_integrated_button(cap);
100
101 cap->xfuzz = cap->abs_position_x.fuzz;
102 cap->yfuzz = cap->abs_position_y.fuzz;
103 if (cap->xfuzz <= 0 || cap->yfuzz <= 0) {
104 cap->xfuzz = get_cap_xsize(cap) / SN_COORD;
105 cap->yfuzz = get_cap_ysize(cap) / SN_COORD;
106 }
107 cap->wfuzz = cap->abs_touch_major.fuzz;
108 if (cap->wfuzz <= 0)
109 cap->wfuzz = get_cap_wsize(cap) / SN_WIDTH;
110
111 cap->yclick = cap->abs_position_y.maximum - CLICK_AREA(cap);
112
113 return 0;
114}
115
116int get_cap_xsize(const struct Capabilities *cap)
117{
118 return cap->abs_position_x.maximum - cap->abs_position_x.minimum;
119}
120
121int get_cap_ysize(const struct Capabilities *cap)
122{
123 return cap->abs_position_y.maximum - cap->abs_position_y.minimum;
124}
125
126int get_cap_wsize(const struct Capabilities *cap)
127{
128 return cap->abs_touch_major.maximum - cap->abs_touch_major.minimum;
129}
130
131int get_cap_xmid(const struct Capabilities *cap)
132{
133 return (cap->abs_position_x.maximum + cap->abs_position_x.minimum) >> 1;
134}
135
136int get_cap_ymid(const struct Capabilities *cap)
137{
138 return (cap->abs_position_y.maximum + cap->abs_position_y.minimum) >> 1;
139}
140
141void output_capabilities(const struct Capabilities *cap)
142{
143 char line[1024];
144 memset(line, 0, sizeof(line));
145 ADDCAP(line, cap, left);
146 ADDCAP(line, cap, middle);
147 ADDCAP(line, cap, right);
148 ADDCAP(line, cap, mtdata);
149 ADDCAP(line, cap, ibt);
150 ADDCAP(line, cap, touch_major);
151 ADDCAP(line, cap, touch_minor);
152 ADDCAP(line, cap, width_major);
153 ADDCAP(line, cap, width_minor);
154 ADDCAP(line, cap, orientation);
155 ADDCAP(line, cap, position_x);
156 ADDCAP(line, cap, position_y);
157 xf86Msg(X_INFO, "multitouch: devname: %s\n", cap->devname);
158 xf86Msg(X_INFO, "multitouch: devid: %x %x %x\n",
159 cap->devid.vendor, cap->devid.product, cap->devid.version);
160 xf86Msg(X_INFO, "multitouch: caps:%s\n", line);
161 if (cap->has_touch_major)
162 xf86Msg(X_INFO, "multitouch: touch: %d %d\n",
163 cap->abs_touch_major.minimum,
164 cap->abs_touch_major.maximum);
165 if (cap->has_width_major)
166 xf86Msg(X_INFO, "multitouch: width: %d %d\n",
167 cap->abs_width_major.minimum,
168 cap->abs_width_major.maximum);
169 if (cap->has_orientation)
170 xf86Msg(X_INFO, "multitouch: orientation: %d %d\n",
171 cap->abs_orientation.minimum,
172 cap->abs_orientation.maximum);
173 if (cap->has_position_x)
174 xf86Msg(X_INFO, "multitouch: position_x: %d %d\n",
175 cap->abs_position_x.minimum,
176 cap->abs_position_x.maximum);
177 if (cap->has_position_y)
178 xf86Msg(X_INFO, "multitouch: position_y: %d %d\n",
179 cap->abs_position_y.minimum,
180 cap->abs_position_y.maximum);
181}
diff --git a/src/capabilities.h b/src/capabilities.h
deleted file mode 100644
index 23086bd..0000000
--- a/src/capabilities.h
+++ /dev/null
@@ -1,57 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef CAPABILITIES_H
23#define CAPABILITIES_H
24
25#include "common.h"
26
27struct Capabilities {
28 struct input_id devid;
29 char devname[32];
30 int has_left, has_middle;
31 int has_right, has_mtdata, has_ibt;
32 int has_touch_major, has_touch_minor;
33 int has_width_major, has_width_minor;
34 int has_orientation, has_dummy;
35 int has_position_x, has_position_y;
36 struct input_absinfo abs_touch_major;
37 struct input_absinfo abs_touch_minor;
38 struct input_absinfo abs_width_major;
39 struct input_absinfo abs_width_minor;
40 struct input_absinfo abs_orientation;
41 struct input_absinfo abs_position_x;
42 struct input_absinfo abs_position_y;
43 int xfuzz, yfuzz, wfuzz;
44 int yclick;
45};
46
47int read_capabilities(struct Capabilities *cap, int fd);
48int get_cap_xsize(const struct Capabilities *cap);
49int get_cap_ysize(const struct Capabilities *cap);
50int get_cap_wsize(const struct Capabilities *cap);
51
52int get_cap_xmid(const struct Capabilities *cap);
53int get_cap_ymid(const struct Capabilities *cap);
54
55void output_capabilities(const struct Capabilities *cap);
56
57#endif
diff --git a/src/common.h b/src/common.h
deleted file mode 100644
index 32be48d..0000000
--- a/src/common.h
+++ /dev/null
@@ -1,95 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef COMMON_H
23#define COMMON_H
24
25#include "xorg-server.h"
26#include <xf86.h>
27#include <xf86_OSproc.h>
28#include <xf86Xinput.h>
29#include <linux/input.h>
30#include <errno.h>
31#include <match/match.h>
32
33/* includes available in 2.6.30-rc5 */
34
35#ifndef BTN_TOOL_QUADTAP
36#define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */
37#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
38#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
39#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
40#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
41#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
42#define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
43#define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */
44#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
45#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
46#define SYN_MT_REPORT 2
47#define MT_TOOL_FINGER 0
48#define MT_TOOL_PEN 1
49#endif
50
51/* includes available in 2.6.33 */
52#ifndef ABS_MT_PRESSURE
53#define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
54#endif
55
56#define SYSCALL(call) while (((call) == -1) && (errno == EINTR))
57
58#define BITMASK(x) (1U << (x))
59#define BITONES(x) (BITMASK(x) - 1U)
60#define GETBIT(m, x) (((m) >> (x)) & 1U)
61#define SETBIT(m, x) (m |= BITMASK(x))
62#define CLEARBIT(m, x) (m &= ~BITMASK(x))
63
64static inline int maxval(int x, int y) { return x > y ? x : y; }
65static inline int minval(int x, int y) { return x < y ? x : y; }
66
67static inline int clamp15(int x)
68{
69 return x < -32767 ? -32767 : x > 32767 ? 32767 : x;
70}
71
72/* absolute scale is assumed to fit in 15 bits */
73static inline int dist2(int dx, int dy)
74{
75 dx = clamp15(dx);
76 dy = clamp15(dy);
77 return dx * dx + dy * dy;
78}
79
80/* Count number of bits (Sean Eron Andersson's Bit Hacks) */
81static inline int bitcount(unsigned v)
82{
83 v -= ((v>>1) & 0x55555555);
84 v = (v&0x33333333) + ((v>>2) & 0x33333333);
85 return (((v + (v>>4)) & 0xF0F0F0F) * 0x1010101) >> 24;
86}
87
88/* Return index of first bit [0-31], -1 on zero */
89#define firstbit(v) (__builtin_ffs(v) - 1)
90
91/* boost-style foreach bit */
92#define foreach_bit(i, m) \
93 for (i = firstbit(m); i >= 0; i = firstbit((m) & (~0U << i + 1)))
94
95#endif
diff --git a/src/gestures.h b/src/gestures.h
deleted file mode 100644
index 2866ba4..0000000
--- a/src/gestures.h
+++ /dev/null
@@ -1,43 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef GESTURES_H
23#define GESTURES_H
24
25#include "mtouch.h"
26
27#define GS_BUTTON 0
28#define GS_MOVE 1
29#define GS_VSCROLL 2
30#define GS_HSCROLL 3
31#define GS_VSWIPE 4
32#define GS_HSWIPE 5
33#define GS_SCALE 6
34#define GS_ROTATE 7
35
36struct Gestures {
37 unsigned type, btmask, btdata;
38 int same_fingers, dx, dy, scale, rot;
39};
40
41void extract_gestures(struct Gestures *gs, struct MTouch* mt);
42
43#endif
diff --git a/src/hwdata.c b/src/hwdata.c
deleted file mode 100644
index 689418e..0000000
--- a/src/hwdata.c
+++ /dev/null
@@ -1,133 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#include "hwdata.h"
23
24void init_hwdata(struct HWData *hw)
25{
26 memset(hw, 0, sizeof(struct HWData));
27}
28
29static void set_value(struct HWData *hw, int code, int value)
30{
31 if (hw->nread < DIM_FINGER) {
32 (&hw->finger[hw->nread].touch_major)[code] = value;
33 SETBIT(hw->mread[hw->nread], code);
34 }
35 hw->mtread++;
36}
37
38static void accept_finger(struct HWData *hw)
39{
40 if (hw->nread < DIM_FINGER &&
41 GETBIT(hw->mread[hw->nread], BIT_MT_POSITION_X) &&
42 GETBIT(hw->mread[hw->nread], BIT_MT_POSITION_Y)) {
43 hw->mask[hw->nread] = hw->mread[hw->nread];
44 hw->nread++;
45 }
46 if (hw->nread < DIM_FINGER)
47 hw->mread[hw->nread] = 0;
48}
49
50static void accept_packet(struct HWData *hw, const struct timeval* tv)
51{
52 static const mstime_t ms = 1000;
53 if (hw->mtread)
54 hw->nfinger = hw->nread;
55 hw->mtread = 0;
56 hw->nread = 0;
57 hw->mread[hw->nread] = 0;
58 hw->evtime = tv->tv_usec / ms + tv->tv_sec * ms;
59}
60
61int read_hwdata(struct HWData *hw, const struct input_event* ev)
62{
63 switch (ev->type) {
64 case EV_SYN:
65 switch (ev->code) {
66 case SYN_REPORT:
67 accept_packet(hw, &ev->time);
68 return 1;
69 case SYN_MT_REPORT:
70 accept_finger(hw);
71 break;
72 }
73 break;
74 case EV_KEY:
75 switch (ev->code) {
76 case BTN_TOUCH:
77 hw->mtread++;
78 break;
79 case BTN_LEFT:
80 if (ev->value)
81 SETBIT(hw->button, MT_BUTTON_LEFT);
82 else
83 CLEARBIT(hw->button, MT_BUTTON_LEFT);
84 break;
85 case BTN_MIDDLE:
86 if (ev->value)
87 SETBIT(hw->button, MT_BUTTON_MIDDLE);
88 else
89 CLEARBIT(hw->button, MT_BUTTON_MIDDLE);
90 break;
91 case BTN_RIGHT:
92 if (ev->value)
93 SETBIT(hw->button, MT_BUTTON_RIGHT);
94 else
95 CLEARBIT(hw->button, MT_BUTTON_RIGHT);
96 break;
97 }
98 break;
99 case EV_ABS:
100 switch (ev->code) {
101 case ABS_MT_TOUCH_MAJOR:
102 set_value(hw, BIT_MT_TOUCH_MAJOR, ev->value);
103 break;
104 case ABS_MT_TOUCH_MINOR:
105 set_value(hw, BIT_MT_TOUCH_MINOR, ev->value);
106 break;
107 case ABS_MT_WIDTH_MAJOR:
108 set_value(hw, BIT_MT_WIDTH_MAJOR, ev->value);
109 break;
110 case ABS_MT_WIDTH_MINOR:
111 set_value(hw, BIT_MT_WIDTH_MINOR, ev->value);
112 break;
113 case ABS_MT_ORIENTATION:
114 set_value(hw, BIT_MT_ORIENTATION, ev->value);
115 break;
116 case ABS_MT_PRESSURE:
117 set_value(hw, BIT_MT_PRESSURE, ev->value);
118 break;
119 case ABS_MT_POSITION_X:
120 set_value(hw, BIT_MT_POSITION_X, ev->value);
121 break;
122 case ABS_MT_POSITION_Y:
123 set_value(hw, BIT_MT_POSITION_Y, ev->value);
124 break;
125 }
126 break;
127 }
128 return 0;
129}
130
131void output_hwdata(const struct HWData *hw)
132{
133}
diff --git a/src/hwdata.h b/src/hwdata.h
deleted file mode 100644
index 42d0a19..0000000
--- a/src/hwdata.h
+++ /dev/null
@@ -1,95 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef HWDATA_H
23#define HWDATA_H
24
25#include "common.h"
26
27#define DIM_BUTTON 15
28
29#define MT_BUTTON_LEFT 0
30#define MT_BUTTON_MIDDLE 1
31#define MT_BUTTON_RIGHT 2
32#define MT_BUTTON_WHEEL_UP 3
33#define MT_BUTTON_WHEEL_DOWN 4
34#define MT_BUTTON_HWHEEL_LEFT 5
35#define MT_BUTTON_HWHEEL_RIGHT 6
36#define MT_BUTTON_SWIPE_UP 7
37#define MT_BUTTON_SWIPE_DOWN 8
38#define MT_BUTTON_SWIPE_LEFT 9
39#define MT_BUTTON_SWIPE_RIGHT 10
40#define MT_BUTTON_SCALE_DOWN 11
41#define MT_BUTTON_SCALE_UP 12
42#define MT_BUTTON_ROTATE_LEFT 13
43#define MT_BUTTON_ROTATE_RIGHT 14
44
45#define BIT_MT_TOUCH_MAJOR 0
46#define BIT_MT_TOUCH_MINOR 1
47#define BIT_MT_WIDTH_MAJOR 2
48#define BIT_MT_WIDTH_MINOR 3
49#define BIT_MT_ORIENTATION 4
50#define BIT_MT_PRESSURE 5
51#define BIT_MT_POSITION_X 6
52#define BIT_MT_POSITION_Y 7
53#define BIT_MT_CNT 8
54
55struct FingerData {
56 int touch_major, touch_minor;
57 int width_major, width_minor;
58 int orientation, pressure;
59 int position_x, position_y;
60};
61
62/* year-proof millisecond event time */
63typedef __u64 mstime_t;
64
65/**
66 * struct HWData - hardware reads
67 *
68 * @finger: finger data
69 * @mask: bits corresponding to data actually read (readonly)
70 * @mread: bits corresponding to data in progress (writeonly)
71 * @button: bitmask of buttons
72 * @nfinger: number of fingers actually read (readonly)
73 * @nread: number of fingers in progress (writeonly)
74 *
75 */
76struct HWData {
77 struct FingerData finger[DIM_FINGER];
78 unsigned mask[DIM_FINGER], mread[DIM_FINGER];
79 unsigned button;
80 int nfinger, mtread, nread;
81 mstime_t evtime;
82};
83
84void init_hwdata(struct HWData *hw);
85int read_hwdata(struct HWData *hw, const struct input_event* ev);
86void output_hwdata(const struct HWData *hw);
87
88static inline int finger_dist2(const struct FingerData *a,
89 const struct FingerData *b)
90{
91 return dist2(a->position_x - b->position_x,
92 a->position_y - b->position_y);
93}
94
95#endif
diff --git a/src/hwstate.c b/src/hwstate.c
index a68b81a..81f4b8b 100644
--- a/src/hwstate.c
+++ b/src/hwstate.c
@@ -20,8 +20,6 @@
20 **************************************************************************/ 20 **************************************************************************/
21 21
22#include "hwstate.h" 22#include "hwstate.h"
23#include <stdlib.h>
24#include <limits.h>
25 23
26#define NOTOUCH(hw, c) ((hw)->touch_major == 0 && (c)->has_touch_major) 24#define NOTOUCH(hw, c) ((hw)->touch_major == 0 && (c)->has_touch_major)
27 25
diff --git a/src/hwstate.h b/src/hwstate.h
deleted file mode 100644
index b8c2ba0..0000000
--- a/src/hwstate.h
+++ /dev/null
@@ -1,47 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef MTEVENT_H
23#define MTEVENT_H
24
25#include "capabilities.h"
26#include "hwdata.h"
27
28/* zero id means not mapped (not touching) */
29struct FingerState {
30 struct FingerData hw;
31 int id;
32};
33
34struct HWState {
35 struct FingerState finger[DIM_FINGER];
36 unsigned button;
37 int nfinger;
38 mstime_t evtime;
39 int lastid;
40};
41
42void init_hwstate(struct HWState *s);
43void modify_hwstate(struct HWState *s,
44 const struct HWData *hw,
45 const struct Capabilities *caps);
46
47#endif
diff --git a/src/iobuffer.c b/src/iobuffer.c
deleted file mode 100644
index 35b61e9..0000000
--- a/src/iobuffer.c
+++ /dev/null
@@ -1,54 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#include "iobuffer.h"
23
24void init_iobuf(struct IOBuffer *buf)
25{
26 memset(buf, 0, sizeof(struct IOBuffer));
27 buf->at = buf->begin;
28 buf->top = buf->at;
29 buf->end = buf->begin + DIM_BUFFER;
30}
31
32const struct input_event *get_iobuf_event(struct IOBuffer *buf, int fd)
33{
34 const struct input_event *ev;
35 int n = buf->top - buf->at;
36 if (n < EVENT_SIZE) {
37 /* partial event is available: save it */
38 if (buf->at != buf->begin && n > 0)
39 memmove(buf->begin, buf->at, n);
40 /* start from the beginning */
41 buf->at = buf->begin;
42 buf->top = buf->at + n;
43 /* read more data */
44 SYSCALL(n = read(fd, buf->top, buf->end - buf->top));
45 if (n <= 0)
46 return NULL;
47 buf->top += n;
48 }
49 if (buf->top - buf->at < EVENT_SIZE)
50 return NULL;
51 ev = (const struct input_event *)buf->at;
52 buf->at += EVENT_SIZE;
53 return ev;
54}
diff --git a/src/iobuffer.h b/src/iobuffer.h
deleted file mode 100644
index 2e3d0c8..0000000
--- a/src/iobuffer.h
+++ /dev/null
@@ -1,38 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef IOBUFFER_H
23#define IOBUFFER_H
24
25#include "common.h"
26
27#define EVENT_SIZE sizeof(struct input_event)
28#define DIM_EVENTS 64
29#define DIM_BUFFER (DIM_EVENTS * EVENT_SIZE)
30
31struct IOBuffer {
32 char begin[DIM_BUFFER], *at, *top, *end;
33};
34
35void init_iobuf(struct IOBuffer *buf);
36const struct input_event *get_iobuf_event(struct IOBuffer *buf, int fd);
37
38#endif
diff --git a/src/memory.h b/src/memory.h
deleted file mode 100644
index 8ffbdab..0000000
--- a/src/memory.h
+++ /dev/null
@@ -1,73 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef MEMORY_H
23#define MEMORY_H
24
25#include "mtstate.h"
26
27/**
28 * struct Memory - parsing state
29 *
30 * @btdata: logical finger state
31 * @same: true if the finger configuration is unchanged
32 * @fingers: bitmask of fingers on the pad
33 * @added: bitmask of new fingers on the pad
34 * @thumb: bitmask of thumbs on the pad
35 * @pointing: bitmask of pointing fingers
36 * @pending: bitmask of tentatively moving fingers
37 * @moving: bitmask of moving fingers
38 * @ybar: vertical position on pad marking the clicking area
39 * @mvhold: movement before this point in time is accumulated
40 * @mvforget: movement before this point in time is discarded
41 * @dx: array of accumulated horiontal movement per finger
42 * @dy: array of accumulated vertical movement per finger
43 *
44 */
45struct Memory {
46 unsigned btdata, same;
47 unsigned fingers, added, thumb;
48 unsigned pointing, pending, moving;
49 int ybar;
50 mstime_t mvhold, mvforget;
51 int dx[DIM_FINGER], dy[DIM_FINGER];
52};
53
54void init_memory(struct Memory *mem);
55void refresh_memory(struct Memory *m,
56 const struct MTState *prev_state,
57 const struct MTState *state,
58 const struct Capabilities *caps);
59void output_memory(const struct Memory *m);
60
61static inline void mem_hold_movement(struct Memory *m, mstime_t t)
62{
63 if (t > m->mvhold)
64 m->mvhold = t;
65}
66
67static inline void mem_forget_movement(struct Memory *m, mstime_t t)
68{
69 if (t > m->mvforget)
70 m->mvforget = t;
71}
72
73#endif
diff --git a/src/mtouch.h b/src/mtouch.h
deleted file mode 100644
index aab35bd..0000000
--- a/src/mtouch.h
+++ /dev/null
@@ -1,59 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef MTOUCH_H
23#define MTOUCH_H
24
25#include "capabilities.h"
26#include "iobuffer.h"
27#include "hwdata.h"
28#include "hwstate.h"
29#include "mtstate.h"
30#include "memory.h"
31
32struct MTouch {
33 struct Capabilities caps;
34 struct IOBuffer buf;
35 struct HWData hw;
36 struct HWState hs;
37 struct MTState prev_state, state;
38 struct Memory mem;
39};
40
41int configure_mtouch(struct MTouch *mt, int fd);
42int open_mtouch(struct MTouch *mt, int fd);
43int close_mtouch(struct MTouch *mt, int fd);
44
45int read_synchronized_event(struct MTouch *mt, int fd);
46void parse_event(struct MTouch *mt);
47
48
49static inline void mt_delay_movement(struct MTouch *mt, int t)
50{
51 mem_hold_movement(&mt->mem, mt->state.evtime + t);
52}
53
54static inline void mt_skip_movement(struct MTouch *mt, int t)
55{
56 mem_forget_movement(&mt->mem, mt->state.evtime + t);
57}
58
59#endif
diff --git a/src/mtstate.h b/src/mtstate.h
deleted file mode 100644
index ac0b18d..0000000
--- a/src/mtstate.h
+++ /dev/null
@@ -1,62 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#ifndef MTSTATE_H
23#define MTSTATE_H
24
25#include "hwstate.h"
26
27struct MTFinger {
28 struct FingerData hw;
29 int id, thumb;
30};
31
32struct MTState {
33 struct MTFinger finger[DIM_FINGER];
34 int nfinger;
35 unsigned button;
36 mstime_t evtime;
37};
38
39void init_mtstate(struct MTState *s);
40void extract_mtstate(struct MTState *s,
41 const struct HWState *hs,
42 const struct Capabilities *caps);
43void output_mtstate(const struct MTState *s);
44
45const struct MTFinger *find_finger(const struct MTState *s, int id);
46
47
48static inline int center_dist2(const struct MTFinger *a,
49 const struct Capabilities *caps)
50{
51 return dist2(a->hw.position_x - get_cap_xmid(caps),
52 a->hw.position_y - get_cap_ymid(caps));
53}
54
55static inline int center_maxdist2(const struct Capabilities *caps)
56{
57 return dist2(caps->abs_position_x.maximum - get_cap_xmid(caps),
58 caps->abs_position_y.maximum - get_cap_ymid(caps));
59}
60
61#endif
62
diff --git a/src/multitouch.c b/src/multitouch.c
deleted file mode 100644
index 7e275b3..0000000
--- a/src/multitouch.c
+++ /dev/null
@@ -1,369 +0,0 @@
1/***************************************************************************
2 *
3 * Multitouch X driver
4 * Copyright (C) 2008 Henrik Rydberg <rydberg@euromail.se>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 **************************************************************************/
21
22#include "gestures.h"
23
24#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
25#include <X11/Xatom.h>
26#include <xserver-properties.h>
27#endif
28
29/* these should be user-configurable at some point */
30static const float vscroll_fraction = 0.05;
31static const float hscroll_fraction = 0.05;
32static const float vswipe_fraction = 0.25;
33static const float hswipe_fraction = 0.25;
34static const float scale_fraction = 0.05;
35static const float rot_fraction = 0.05;
36
37/* flip these to enable event debugging */
38#if 1
39#define TRACE1(format, arg1)
40#define TRACE2(format, arg1, arg2)
41#else
42#define TRACE1(format, arg1) xf86Msg(X_INFO, format, arg1)
43#define TRACE2(format, arg1, arg2) xf86Msg(X_INFO, format, arg1, arg2)
44#endif
45
46/* button mapping simplified */
47#define PROPMAP(m, x, y) m[x] = XIGetKnownProperty(y)
48
49static void pointer_control(DeviceIntPtr dev, PtrCtrl *ctrl)
50{
51 xf86Msg(X_INFO, "pointer_control\n");
52}
53
54static int pointer_property(DeviceIntPtr dev,
55 Atom property,
56 XIPropertyValuePtr prop,
57 BOOL checkonly)
58{
59 xf86Msg(X_INFO, "pointer_property\n");
60 return Success;
61}
62
63#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
64static void initAxesLabels(Atom map[2])
65{
66 memset(map, 0, 2 * sizeof(Atom));
67 PROPMAP(map, 0, AXIS_LABEL_PROP_REL_X);
68 PROPMAP(map, 1, AXIS_LABEL_PROP_REL_Y);
69}
70
71static void initButtonLabels(Atom map[DIM_BUTTON])
72{
73 memset(map, 0, DIM_BUTTON * sizeof(Atom));
74 PROPMAP(map, MT_BUTTON_LEFT, BTN_LABEL_PROP_BTN_LEFT);
75 PROPMAP(map, MT_BUTTON_MIDDLE, BTN_LABEL_PROP_BTN_MIDDLE);
76 PROPMAP(map, MT_BUTTON_RIGHT, BTN_LABEL_PROP_BTN_RIGHT);
77 PROPMAP(map, MT_BUTTON_WHEEL_UP, BTN_LABEL_PROP_BTN_WHEEL_UP);
78 PROPMAP(map, MT_BUTTON_WHEEL_DOWN, BTN_LABEL_PROP_BTN_WHEEL_DOWN);
79 PROPMAP(map, MT_BUTTON_HWHEEL_LEFT, BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
80 PROPMAP(map, MT_BUTTON_HWHEEL_RIGHT, BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
81 /* how to map swipe buttons? */
82 PROPMAP(map, MT_BUTTON_SWIPE_UP, BTN_LABEL_PROP_BTN_0);
83 PROPMAP(map, MT_BUTTON_SWIPE_DOWN, BTN_LABEL_PROP_BTN_1);
84 PROPMAP(map, MT_BUTTON_SWIPE_LEFT, BTN_LABEL_PROP_BTN_2);
85 PROPMAP(map, MT_BUTTON_SWIPE_RIGHT, BTN_LABEL_PROP_BTN_3);
86 /* how to map scale and rotate? */
87 PROPMAP(map, MT_BUTTON_SCALE_DOWN, BTN_LABEL_PROP_BTN_4);
88 PROPMAP(map, MT_BUTTON_SCALE_UP, BTN_LABEL_PROP_BTN_5);
89 PROPMAP(map, MT_BUTTON_ROTATE_LEFT, BTN_LABEL_PROP_BTN_6);
90 PROPMAP(map, MT_BUTTON_ROTATE_RIGHT, BTN_LABEL_PROP_BTN_7);
91}
92#endif
93
94static int device_init(DeviceIntPtr dev, LocalDevicePtr local)
95{
96 struct MTouch *mt = local->private;
97 unsigned char btmap[DIM_BUTTON + 1] = {
98 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
99 };
100#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
101 Atom axes_labels[2], btn_labels[DIM_BUTTON];
102 initAxesLabels(axes_labels);
103 initButtonLabels(btn_labels);
104#endif
105
106 local->fd = xf86OpenSerial(local->options);
107 if (local->fd < 0) {
108 xf86Msg(X_ERROR, "multitouch: cannot open device\n");
109 return !Success;
110 }
111 if (configure_mtouch(mt, local->fd)) {
112 xf86Msg(X_ERROR, "multitouch: cannot configure device\n");
113 return !Success;
114 }
115 xf86CloseSerial(local->fd);
116
117#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 3
118 InitPointerDeviceStruct((DevicePtr)dev,
119 btmap, DIM_BUTTON,
120 GetMotionHistory,
121 pointer_control,
122 GetMotionHistorySize(),
123 2);
124#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) < 7
125 InitPointerDeviceStruct((DevicePtr)dev,
126 btmap, DIM_BUTTON,
127 pointer_control,
128 GetMotionHistorySize(),
129 2);
130#elif GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
131 InitPointerDeviceStruct((DevicePtr)dev,
132 btmap, DIM_BUTTON, btn_labels,
133 pointer_control,
134 GetMotionHistorySize(),
135 2, axes_labels);
136#else
137#error "Unsupported ABI_XINPUT_VERSION"
138#endif
139
140 xf86InitValuatorAxisStruct(dev, 0,
141#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
142 axes_labels[0],
143#endif
144 mt->caps.abs_position_x.minimum,
145 mt->caps.abs_position_x.maximum,
146 1, 0, 1);
147 xf86InitValuatorDefaults(dev, 0);
148 xf86InitValuatorAxisStruct(dev, 1,
149#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 7
150 axes_labels[1],
151#endif
152 mt->caps.abs_position_y.minimum,
153 mt->caps.abs_position_y.maximum,
154 1, 0, 1);
155 xf86InitValuatorDefaults(dev, 1);
156
157 XIRegisterPropertyHandler(dev, pointer_property, NULL, NULL);
158
159 return Success;
160}
161
162static int device_on(LocalDevicePtr local)
163{
164 struct MTouch *mt = local->private;
165 local->fd = xf86OpenSerial(local->options);
166 if (local->fd < 0) {
167 xf86Msg(X_ERROR, "multitouch: cannot open device\n");
168 return !Success;
169 }
170 if (open_mtouch(mt, local->fd)) {
171 xf86Msg(X_ERROR, "multitouch: cannot grab device\n");
172 return !Success;
173 }
174 xf86AddEnabledDevice(local);
175 return Success;
176}
177
178static int device_off(LocalDevicePtr local)
179{
180 struct MTouch *mt = local->private;
181 xf86RemoveEnabledDevice(local);
182 if (close_mtouch(mt, local->fd))
183 xf86Msg(X_WARNING, "multitouch: cannot ungrab device\n");
184 xf86CloseSerial(local->fd);
185 return Success;
186}
187
188static int device_close(LocalDevicePtr local)
189{
190 return Success;
191}
192
193static void tickle_button(LocalDevicePtr local, int id)
194{
195 xf86PostButtonEvent(local->dev, FALSE, id, 1, 0, 0);
196 xf86PostButtonEvent(local->dev, FALSE, id, 0, 0, 0);
197}
198
199static void button_scroll(LocalDevicePtr local,
200 int btdec, int btinc,
201 int *scroll, int step,
202 int delta)
203{
204 *scroll += delta;
205 while (*scroll > step) {
206 tickle_button(local, btinc);
207 *scroll -= step;
208 }
209 while (*scroll < -step) {
210 tickle_button(local, btdec);
211 *scroll += step;
212 }
213}
214
215static void handle_gestures(LocalDevicePtr local,
216 const struct Gestures *gs,
217 const struct Capabilities *caps)
218{
219 static int vscroll, hscroll, vswipe, hswipe, scale, rot;
220 int vscrollstep = 1 + vscroll_fraction * get_cap_ysize(caps);
221 int hscrollstep = 1 + hscroll_fraction * get_cap_xsize(caps);
222 int vswipestep = 1 + vswipe_fraction * get_cap_ysize(caps);
223 int hswipestep = 1 + hswipe_fraction * get_cap_xsize(caps);
224 int scalestep = 1 + scale_fraction * get_cap_xsize(caps);
225 int rotstep = 1 + rot_fraction * get_cap_xsize(caps);
226 int i;
227 if (!gs->same_fingers) {
228 vscroll = 0;
229 hscroll = 0;
230 vswipe = 0;
231 hswipe = 0;
232 }
233 for (i = 0; i < DIM_BUTTON; i++) {
234 if (GETBIT(gs->btmask, i)) {
235 xf86PostButtonEvent(local->dev, FALSE,
236 i + 1, GETBIT(gs->btdata, i), 0, 0);
237 TRACE2("button bit: %d %d\n", i, GETBIT(gs->btdata, i));
238 }
239 }
240 if (GETBIT(gs->type, GS_MOVE)) {
241 xf86PostMotionEvent(local->dev, 0, 0, 2,
242 gs->dx, gs->dy);
243 TRACE2("motion: %d %d\n", gs->dx, gs->dy);
244 }
245 if (GETBIT(gs->type, GS_VSCROLL)) {
246 button_scroll(local, 4, 5, &vscroll, vscrollstep, gs->dy);
247 TRACE1("vscroll: %d\n", gs->dy);
248 }
249 if (GETBIT(gs->type, GS_HSCROLL)) {
250 button_scroll(local, 6, 7, &hscroll, hscrollstep, gs->dx);
251 TRACE1("hscroll: %d\n", gs->dx);
252 }
253 if (GETBIT(gs->type, GS_VSWIPE)) {
254 button_scroll(local, 8, 9, &vswipe, vswipestep, gs->dy);
255 TRACE1("vswipe: %d\n", gs->dy);
256 }
257 if (GETBIT(gs->type, GS_HSWIPE)) {
258 button_scroll(local, 10, 11, &hswipe, hswipestep, gs->dx);
259 TRACE1("hswipe: %d\n", gs->dx);
260 }
261 if (GETBIT(gs->type, GS_SCALE)) {
262 button_scroll(local, 12, 13, &scale, scalestep, gs->scale);
263 TRACE1("scale: %d\n", gs->scale);
264 }
265 if (GETBIT(gs->type, GS_ROTATE)) {
266 button_scroll(local, 14, 15, &rot, rotstep, gs->rot);
267 TRACE1("rotate: %d\n", gs->rot);
268 }
269}
270
271/* called for each full received packet from the touchpad */
272static void read_input(LocalDevicePtr local)
273{
274 struct Gestures gs;
275 struct MTouch *mt = local->private;
276 while (read_synchronized_event(mt, local->fd)) {
277 parse_event(mt);
278 extract_gestures(&gs, mt);
279 handle_gestures(local, &gs, &mt->caps);
280 }
281}
282
283static Bool device_control(DeviceIntPtr dev, int mode)
284{
285 LocalDevicePtr local = dev->public.devicePrivate;
286 switch (mode) {
287 case DEVICE_INIT:
288 xf86Msg(X_INFO, "device control: init\n");
289 return device_init(dev, local);
290 case DEVICE_ON:
291 xf86Msg(X_INFO, "device control: on\n");
292 return device_on(local);
293 case DEVICE_OFF:
294 xf86Msg(X_INFO, "device control: off\n");
295 return device_off(local);
296 case DEVICE_CLOSE:
297 xf86Msg(X_INFO, "device control: close\n");
298 return device_close(local);
299 default:
300 xf86Msg(X_INFO, "device control: default\n");
301 return BadValue;
302 }
303}
304
305
306static InputInfoPtr preinit(InputDriverPtr drv, IDevPtr dev, int flags)
307{
308 struct MTouch *mt;
309 InputInfoPtr local = xf86AllocateInput(drv, 0);
310 if (!local)
311 goto error;
312 mt = xcalloc(1, sizeof(struct MTouch));
313 if (!mt)
314 goto error;
315
316 local->name = dev->identifier;
317 local->type_name = XI_TOUCHPAD;
318 local->device_control = device_control;
319 local->read_input = read_input;
320 local->private = mt;
321 local->flags = XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS;
322 local->conf_idev = dev;
323
324 xf86CollectInputOptions(local, NULL, NULL);
325 /* xf86OptionListReport(local->options); */
326 xf86ProcessCommonOptions(local, local->options);
327
328 local->flags |= XI86_CONFIGURED;
329 error:
330 return local;
331}
332
333static void uninit(InputDriverPtr drv, InputInfoPtr local, int flags)
334{
335 xfree(local->private);
336 local->private = 0;
337 xf86DeleteInput(local, 0);
338}
339
340static InputDriverRec MULTITOUCH = {
341 1,
342 "multitouch",
343 NULL,
344 preinit,
345 uninit,
346 NULL,
347 0
348};
349
350static XF86ModuleVersionInfo VERSION = {
351 "multitouch",
352 MODULEVENDORSTRING,
353 MODINFOSTRING1,
354 MODINFOSTRING2,
355 XORG_VERSION_CURRENT,
356 0, 1, 0,
357 ABI_CLASS_XINPUT,
358 ABI_XINPUT_VERSION,
359 MOD_CLASS_XINPUT,
360 {0, 0, 0, 0}
361};
362
363static pointer setup(pointer module, pointer options, int *errmaj, int *errmin)
364{
365 xf86AddInputDriver(&MULTITOUCH, module, 0);
366 return module;
367}
368
369XF86ModuleData multitouchModuleData = {&VERSION, &setup, NULL };
diff --git a/src/test.c b/src/test.c
index fc16201..7d983a0 100644
--- a/src/test.c
+++ b/src/test.c
@@ -19,7 +19,8 @@
19 * 19 *
20 **************************************************************************/ 20 **************************************************************************/
21 21
22#include "common.h" 22#include <common.h>
23#include <xbypass.h>
23#include <stdio.h> 24#include <stdio.h>
24#include <time.h> 25#include <time.h>
25 26