summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHenrik Rydberg <rydberg@euromail.se>2011-02-14 12:51:01 +0100
committerHenrik Rydberg <rydberg@euromail.se>2011-02-15 12:42:41 +0100
commit93e1a5a3904ef2f14110d8b807bcd7d107b3b2a4 (patch)
treea50e22d57ae77bcaa7674b4ff4bf8b2b1c3f690f /src
parenta06bde2b7aec991b798de9a8e0d7972adaabb40d (diff)
Map device coordinates onto target surface
The current implementation outputs most touch attributes in device coordinates. However, the primary use case is to map the input device onto an area on the screen, needed in particular for multihead setups. Moreover, the XI2.1 backend works with screen coordinates, creating an unnecessary discrepancy between backends. This patch adds the basic transformation layer to the utouch surface, thus serving as the master point of device-to-surface mapping. Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Diffstat (limited to 'src')
-rw-r--r--src/frame-impl.h1
-rw-r--r--src/frame-mtdev.c22
-rw-r--r--src/frame.c21
3 files changed, 33 insertions, 11 deletions
diff --git a/src/frame-impl.h b/src/frame-impl.h
index 63cbc7c..38affe7 100644
--- a/src/frame-impl.h
+++ b/src/frame-impl.h
@@ -30,7 +30,6 @@ struct utouch_frame_engine {
30 int hold_ms; 30 int hold_ms;
31 int frame; 31 int frame;
32 int slot; 32 int slot;
33 float max_orient;
34 struct utouch_surface *surface; 33 struct utouch_surface *surface;
35 struct utouch_frame **frames; 34 struct utouch_frame **frames;
36 struct utouch_frame *next; 35 struct utouch_frame *next;
diff --git a/src/frame-mtdev.c b/src/frame-mtdev.c
index 9192510..caf90ae 100644
--- a/src/frame-mtdev.c
+++ b/src/frame-mtdev.c
@@ -104,12 +104,12 @@ int utouch_frame_init_mtdev(utouch_frame_handle fh,
104 } 104 }
105 105
106 s->max_pressure = evemu_get_abs_maximum(dev, ABS_MT_PRESSURE); 106 s->max_pressure = evemu_get_abs_maximum(dev, ABS_MT_PRESSURE);
107 if (s->use_pressure && s->max_pressure == 0) 107 if (s->max_pressure == 0)
108 s->max_pressure = 256; 108 s->max_pressure = 256;
109 109
110 fh->max_orient = evemu_get_abs_maximum(dev, ABS_MT_ORIENTATION); 110 s->max_orient = evemu_get_abs_maximum(dev, ABS_MT_ORIENTATION);
111 if (s->use_orientation && fh->max_orient == 0) 111 if (s->max_orient == 0)
112 fh->max_orient = 1; 112 s->max_orient = 1;
113 113
114 tmp = evemu_get_abs_resolution(dev, ABS_MT_POSITION_X); 114 tmp = evemu_get_abs_resolution(dev, ABS_MT_POSITION_X);
115 if (tmp > 0) 115 if (tmp > 0)
@@ -133,12 +133,14 @@ int utouch_frame_init_mtdev(utouch_frame_handle fh,
133 else 133 else
134 s->phys_pressure = 10; 134 s->phys_pressure = 10;
135 135
136 return 0; 136 /* defaults expected by initial frame version */
137} 137 s->mapped_min_x = s->min_x;
138 s->mapped_min_y = s->min_y;
139 s->mapped_max_x = s->max_x;
140 s->mapped_max_y = s->max_y;
141 s->mapped_max_pressure = s->max_pressure;
138 142
139static float touch_angle(utouch_frame_handle fh, int orient) 143 return 0;
140{
141 return orient / fh->max_orient * M_PI_2;
142} 144}
143 145
144static int handle_abs_event(utouch_frame_handle fh, 146static int handle_abs_event(utouch_frame_handle fh,
@@ -169,7 +171,7 @@ static int handle_abs_event(utouch_frame_handle fh,
169 t->width_minor = ev->value; 171 t->width_minor = ev->value;
170 return 1; 172 return 1;
171 case ABS_MT_ORIENTATION: 173 case ABS_MT_ORIENTATION:
172 t->orientation = touch_angle(fh, ev->value); 174 t->orientation = ev->value;
173 return 1; 175 return 1;
174 case ABS_MT_PRESSURE: 176 case ABS_MT_PRESSURE:
175 t->pressure = ev->value; 177 t->pressure = ev->value;
diff --git a/src/frame.c b/src/frame.c
index 9c4be97..e722adf 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -205,6 +205,25 @@ int utouch_frame_set_current_slot(utouch_frame_handle fh, int slot)
205 return 0; 205 return 0;
206} 206}
207 207
208static void transform_slot(struct utouch_contact *slot,
209 const struct utouch_surface *s)
210{
211 float fx = (s->mapped_max_x - s->mapped_min_x) / (s->max_x - s->min_x);
212 float fy = (s->mapped_max_y - s->mapped_min_y) / (s->max_y - s->min_y);
213 /* assume clipped view for asymmetrical scaling */
214 float f = MAX(fx, fy);
215
216 slot->x = fx * (slot->x - s->min_x) + s->mapped_min_x;
217 slot->y = fy * (slot->y - s->min_y) + s->mapped_min_y;
218 slot->touch_major *= f;
219 slot->touch_minor *= f;
220 slot->width_major *= f;
221 slot->width_minor *= f;
222 slot->orientation *= M_PI_2 / s->max_orient;
223 slot->pressure *= s->mapped_max_pressure / s->max_pressure;
224 slot->distance *= f;
225}
226
208static void copy_contact(utouch_frame_handle fh, 227static void copy_contact(utouch_frame_handle fh,
209 struct utouch_contact *a, 228 struct utouch_contact *a,
210 const struct utouch_contact *b) 229 const struct utouch_contact *b)
@@ -225,6 +244,8 @@ static void copy_contact(utouch_frame_handle fh,
225 a->orientation = b->orientation; 244 a->orientation = b->orientation;
226 a->pressure = b->pressure; 245 a->pressure = b->pressure;
227 a->distance = b->distance; 246 a->distance = b->distance;
247
248 transform_slot(a, s);
228} 249}
229 250
230static int detect_addrem(const struct utouch_contact *a, 251static int detect_addrem(const struct utouch_contact *a,