summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mtdev.h6
-rw-r--r--src/caps.c6
-rw-r--r--src/core.c17
3 files changed, 18 insertions, 11 deletions
diff --git a/include/mtdev.h b/include/mtdev.h
index b759803..b621245 100644
--- a/include/mtdev.h
+++ b/include/mtdev.h
@@ -74,11 +74,14 @@
74 74
75#define MT_ABS_SIZE 11 75#define MT_ABS_SIZE 11
76 76
77#define MT_ID_NULL (-1)
78#define MT_ID_MIN 0
79#define MT_ID_MAX 65535
80
77/** 81/**
78 * struct mt_caps - protocol capabilities of kernel device 82 * struct mt_caps - protocol capabilities of kernel device
79 * @has_mtdata: true if the device has MT capabilities 83 * @has_mtdata: true if the device has MT capabilities
80 * @has_slot: true if the device sends MT slots 84 * @has_slot: true if the device sends MT slots
81 * @nullid: tracking id used to represent null
82 * @slot: slot event properties 85 * @slot: slot event properties
83 * @abs: ABS_MT event properties 86 * @abs: ABS_MT event properties
84 */ 87 */
@@ -86,7 +89,6 @@ struct mtdev_caps {
86 int has_mtdata; 89 int has_mtdata;
87 int has_slot; 90 int has_slot;
88 int has_abs[MT_ABS_SIZE]; 91 int has_abs[MT_ABS_SIZE];
89 int nullid;
90 struct input_absinfo slot; 92 struct input_absinfo slot;
91 struct input_absinfo abs[MT_ABS_SIZE]; 93 struct input_absinfo abs[MT_ABS_SIZE];
92}; 94};
diff --git a/src/caps.c b/src/caps.c
index 1821bd7..0788acf 100644
--- a/src/caps.c
+++ b/src/caps.c
@@ -83,8 +83,10 @@ static int read_caps(struct mtdev_caps *cap, int fd)
83 83
84 cap->has_mtdata = has_mt_data(cap); 84 cap->has_mtdata = has_mt_data(cap);
85 85
86 if (cap->has_abs[MTDEV_TRACKING_ID]) 86 if (!cap->has_abs[MTDEV_TRACKING_ID]) {
87 cap->nullid = cap->abs[MTDEV_TRACKING_ID].minimum - 1; 87 cap->abs[MTDEV_TRACKING_ID].minimum = MT_ID_MIN;
88 cap->abs[MTDEV_TRACKING_ID].maximum = MT_ID_MAX;
89 }
88 90
89 default_fuzz(cap, MTDEV_POSITION_X, SN_COORD); 91 default_fuzz(cap, MTDEV_POSITION_X, SN_COORD);
90 default_fuzz(cap, MTDEV_POSITION_Y, SN_COORD); 92 default_fuzz(cap, MTDEV_POSITION_Y, SN_COORD);
diff --git a/src/core.c b/src/core.c
index 8df2477..55b62b6 100644
--- a/src/core.c
+++ b/src/core.c
@@ -89,9 +89,9 @@ static void solve(struct mtdev_state *state, const struct mtdev_caps *caps,
89 /* update matched contacts and create new ones */ 89 /* update matched contacts and create new ones */
90 foreach_bit(i, touch) { 90 foreach_bit(i, touch) {
91 j = n2s[i]; 91 j = n2s[i];
92 id = j >= 0 ? sid[j] : caps->nullid; 92 id = j >= 0 ? sid[j] : MT_ID_NULL;
93 while (id == caps->nullid) 93 if (id == MT_ID_NULL)
94 id = ++state->lastid; 94 id = state->lastid++ & MT_ID_MAX;
95 nid[i] = id; 95 nid[i] = id;
96 } 96 }
97} 97}
@@ -125,7 +125,7 @@ static void assign_tracking_id(struct mtdev_state *state,
125 solve(state, caps, sid, sx, sy, sn, nid, nx, ny, size, touch); 125 solve(state, caps, sid, sx, sy, sn, nid, nx, ny, size, touch);
126 for (i = 0; i < size; i++) { 126 for (i = 0; i < size; i++) {
127 data[i].abs[MTDEV_TRACKING_ID] = 127 data[i].abs[MTDEV_TRACKING_ID] =
128 GETBIT(touch, i) ? nid[i] : caps->nullid; 128 GETBIT(touch, i) ? nid[i] : MT_ID_NULL;
129 prop[i] |= BITMASK(MTDEV_TRACKING_ID); 129 prop[i] |= BITMASK(MTDEV_TRACKING_ID);
130 } 130 }
131} 131}
@@ -289,10 +289,10 @@ static void apply_typeA_changes(struct mtdev_state *state,
289 filter_data(state, caps, &data[i], prop[i], slot); 289 filter_data(state, caps, &data[i], prop[i], slot);
290 push_slot_changes(state, &data[i], prop[i], slot, syn); 290 push_slot_changes(state, &data[i], prop[i], slot, syn);
291 SETBIT(used, slot); 291 SETBIT(used, slot);
292 id = caps->nullid; 292 id = MT_ID_NULL;
293 break; 293 break;
294 } 294 }
295 if (id != caps->nullid) { 295 if (id != MT_ID_NULL) {
296 slot = firstbit(unused); 296 slot = firstbit(unused);
297 push_slot_changes(state, &data[i], prop[i], slot, syn); 297 push_slot_changes(state, &data[i], prop[i], slot, syn);
298 SETBIT(used, slot); 298 SETBIT(used, slot);
@@ -304,7 +304,7 @@ static void apply_typeA_changes(struct mtdev_state *state,
304 foreach_bit(slot, state->used & ~used) { 304 foreach_bit(slot, state->used & ~used) {
305 struct mtdev_slot tdata = state->data[slot]; 305 struct mtdev_slot tdata = state->data[slot];
306 bitmask_t tprop = BITMASK(MTDEV_TRACKING_ID); 306 bitmask_t tprop = BITMASK(MTDEV_TRACKING_ID);
307 tdata.abs[MTDEV_TRACKING_ID] = caps->nullid; 307 tdata.abs[MTDEV_TRACKING_ID] = MT_ID_NULL;
308 push_slot_changes(state, &tdata, tprop, slot, syn); 308 push_slot_changes(state, &tdata, tprop, slot, syn);
309 } 309 }
310 state->used = used; 310 state->used = used;
@@ -337,10 +337,13 @@ static void convert_A_to_B(struct mtdev_state *state,
337 337
338int mtdev_init(struct mtdev *dev) 338int mtdev_init(struct mtdev *dev)
339{ 339{
340 int i;
340 memset(dev, 0, sizeof(struct mtdev)); 341 memset(dev, 0, sizeof(struct mtdev));
341 dev->state = calloc(1, sizeof(struct mtdev_state)); 342 dev->state = calloc(1, sizeof(struct mtdev_state));
342 if (!dev->state) 343 if (!dev->state)
343 return -ENOMEM; 344 return -ENOMEM;
345 for (i = 0; i < DIM_FINGER; i++)
346 dev->state->data[i].abs[MTDEV_TRACKING_ID] = MT_ID_NULL;
344 return 0; 347 return 0;
345} 348}
346 349