mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-02-03 21:40:40 +01:00
tools: libinput-record: print a comment when the device is in a neutral state
Common problem: some touch sequence does something to confuse libinput but it cannot easily be captureed. The result is a long sequence of touche that need to be picked apart and isolated. Print an easy-to-search for message in the evdev output that signals that the device touch state is now neutral (i.e. no finger down). Same can be achieved by searching for BTN_TOOL_FINGER but that provides false positives for switching between one and two fingers. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
6e4c83636a
commit
056a5eb64a
1 changed files with 48 additions and 1 deletions
|
|
@ -56,6 +56,7 @@ enum event_type {
|
|||
NONE,
|
||||
EVDEV,
|
||||
LIBINPUT,
|
||||
COMMENT,
|
||||
};
|
||||
|
||||
struct event {
|
||||
|
|
@ -64,6 +65,7 @@ struct event {
|
|||
union {
|
||||
struct input_event evdev;
|
||||
struct li_event libinput;
|
||||
char comment[200];
|
||||
} u;
|
||||
};
|
||||
|
||||
|
|
@ -76,6 +78,12 @@ struct record_device {
|
|||
struct event *events;
|
||||
size_t nevents;
|
||||
size_t events_sz;
|
||||
|
||||
struct {
|
||||
bool is_touch_device;
|
||||
uint16_t slot_state;
|
||||
uint16_t last_slot_state;
|
||||
} touch;
|
||||
};
|
||||
|
||||
struct record_context {
|
||||
|
|
@ -255,11 +263,12 @@ handle_evdev_frame(struct record_context *ctx, struct record_device *d)
|
|||
struct libevdev *evdev = d->evdev;
|
||||
struct input_event e;
|
||||
size_t count = 0;
|
||||
uint32_t last_time = 0;
|
||||
struct event *event;
|
||||
|
||||
while (libevdev_next_event(evdev,
|
||||
LIBEVDEV_READ_FLAG_NORMAL,
|
||||
&e) == LIBEVDEV_READ_STATUS_SUCCESS) {
|
||||
struct event *event;
|
||||
|
||||
if (d->nevents == d->events_sz)
|
||||
resize(d->events, d->events_sz);
|
||||
|
|
@ -270,10 +279,40 @@ handle_evdev_frame(struct record_context *ctx, struct record_device *d)
|
|||
event->u.evdev = e;
|
||||
count++;
|
||||
|
||||
if (d->touch.is_touch_device &&
|
||||
e.type == EV_ABS &&
|
||||
e.code == ABS_MT_TRACKING_ID) {
|
||||
unsigned int slot = libevdev_get_current_slot(evdev);
|
||||
assert(slot < sizeof(d->touch.slot_state) * 8);
|
||||
|
||||
if (e.value != -1)
|
||||
d->touch.slot_state |= 1 << slot;
|
||||
else
|
||||
d->touch.slot_state &= ~(1 << slot);
|
||||
}
|
||||
|
||||
last_time = event->time;
|
||||
|
||||
if (e.type == EV_SYN && e.code == SYN_REPORT)
|
||||
break;
|
||||
}
|
||||
|
||||
if (d->touch.slot_state != d->touch.last_slot_state) {
|
||||
d->touch.last_slot_state = d->touch.slot_state;
|
||||
if (d->nevents == d->events_sz)
|
||||
resize(d->events, d->events_sz);
|
||||
|
||||
if (d->touch.slot_state == 0) {
|
||||
event = &d->events[d->nevents++];
|
||||
event->type = COMMENT;
|
||||
event->time = last_time;
|
||||
snprintf(event->u.comment,
|
||||
sizeof(event->u.comment),
|
||||
" # Touch device in neutral state\n");
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
|
@ -681,6 +720,8 @@ print_cached_events(struct record_context *ctx,
|
|||
else
|
||||
iprintf(ctx, "libinput:\n");
|
||||
break;
|
||||
case COMMENT:
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
|
@ -696,6 +737,9 @@ print_cached_events(struct record_context *ctx,
|
|||
case LIBINPUT:
|
||||
iprintf(ctx, "- %s\n", e->u.libinput.msg);
|
||||
break;
|
||||
case COMMENT:
|
||||
iprintf(ctx, "%s", e->u.comment);
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
|
|
@ -1502,6 +1546,9 @@ init_device(struct record_context *ctx, char *path)
|
|||
|
||||
libevdev_set_clock_id(d->evdev, CLOCK_MONOTONIC);
|
||||
|
||||
if (libevdev_get_num_slots(d->evdev) > 0)
|
||||
d->touch.is_touch_device = true;
|
||||
|
||||
list_insert(&ctx->devices, &d->link);
|
||||
ctx->ndevices++;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue