mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-20 06:50:05 +01:00
Add evdev_frame_append_one()
This is the most common usage, let's add a helper. Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1245>
This commit is contained in:
parent
af6f53d55c
commit
8141159beb
5 changed files with 78 additions and 37 deletions
|
|
@ -476,6 +476,21 @@ evdev_frame_append(struct evdev_frame *frame,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
evdev_frame_append_one(struct evdev_frame *frame, evdev_usage_t usage, int32_t value)
|
||||||
|
{
|
||||||
|
if (evdev_usage_eq(usage, EVDEV_SYN_REPORT))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (frame->count >= frame->max_size)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
struct evdev_event *e = &frame->events[frame->count - 1];
|
||||||
|
*e = (struct evdev_event){ .usage = usage, .value = value };
|
||||||
|
frame->count++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
evdev_frame_append_input_event(struct evdev_frame *frame,
|
evdev_frame_append_input_event(struct evdev_frame *frame,
|
||||||
const struct input_event *event)
|
const struct input_event *event)
|
||||||
|
|
|
||||||
|
|
@ -122,18 +122,14 @@ double_tool_plugin_filter_frame(struct libinput_plugin *plugin,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filter & (PEN_IN_PROX | PEN_OUT_OF_PROX)) {
|
if (filter & (PEN_IN_PROX | PEN_OUT_OF_PROX)) {
|
||||||
struct evdev_event event = {
|
evdev_frame_append_one(frame_out,
|
||||||
.usage = evdev_usage_from(EVDEV_BTN_TOOL_PEN),
|
evdev_usage_from(EVDEV_BTN_TOOL_PEN),
|
||||||
.value = (filter & PEN_IN_PROX) ? 1 : 0,
|
(filter & PEN_IN_PROX) ? 1 : 0);
|
||||||
};
|
|
||||||
evdev_frame_append(frame_out, &event, 1);
|
|
||||||
}
|
}
|
||||||
if (filter & (ERASER_IN_PROX | ERASER_OUT_OF_PROX)) {
|
if (filter & (ERASER_IN_PROX | ERASER_OUT_OF_PROX)) {
|
||||||
struct evdev_event event = {
|
evdev_frame_append_one(frame_out,
|
||||||
.usage = evdev_usage_from(EVDEV_BTN_TOOL_RUBBER),
|
evdev_usage_from(EVDEV_BTN_TOOL_RUBBER),
|
||||||
.value = (filter & ERASER_IN_PROX) ? 1 : 0,
|
(filter & ERASER_IN_PROX) ? 1 : 0);
|
||||||
};
|
|
||||||
evdev_frame_append(frame_out, &event, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return frame_out;
|
return frame_out;
|
||||||
|
|
|
||||||
|
|
@ -209,26 +209,20 @@ eraser_button_insert_frame(struct plugin_device *device,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filter & (PEN_IN_PROX | PEN_OUT_OF_PROX)) {
|
if (filter & (PEN_IN_PROX | PEN_OUT_OF_PROX)) {
|
||||||
struct evdev_event event = {
|
evdev_frame_append_one(frame_out,
|
||||||
.usage = evdev_usage_from(EVDEV_BTN_TOOL_PEN),
|
evdev_usage_from(EVDEV_BTN_TOOL_PEN),
|
||||||
.value = (filter & PEN_IN_PROX) ? 1 : 0,
|
(filter & PEN_IN_PROX) ? 1 : 0);
|
||||||
};
|
|
||||||
evdev_frame_append(frame_out, &event, 1);
|
|
||||||
}
|
}
|
||||||
if (filter & (ERASER_IN_PROX | ERASER_OUT_OF_PROX)) {
|
if (filter & (ERASER_IN_PROX | ERASER_OUT_OF_PROX)) {
|
||||||
struct evdev_event event = {
|
evdev_frame_append_one(frame_out,
|
||||||
.usage = evdev_usage_from(EVDEV_BTN_TOOL_RUBBER),
|
evdev_usage_from(EVDEV_BTN_TOOL_RUBBER),
|
||||||
.value = (filter & ERASER_IN_PROX) ? 1 : 0,
|
(filter & ERASER_IN_PROX) ? 1 : 0);
|
||||||
};
|
|
||||||
evdev_frame_append(frame_out, &event, 1);
|
|
||||||
}
|
}
|
||||||
if (filter & (BUTTON_UP | BUTTON_DOWN)) {
|
if (filter & (BUTTON_UP | BUTTON_DOWN)) {
|
||||||
assert(button != NULL);
|
assert(button != NULL);
|
||||||
struct evdev_event event = {
|
evdev_frame_append_one(frame_out,
|
||||||
.usage = *button,
|
*button,
|
||||||
.value = (filter & BUTTON_DOWN) ? 1 : 0,
|
(filter & BUTTON_DOWN) ? 1 : 0);
|
||||||
};
|
|
||||||
evdev_frame_append(frame_out, &event, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
evdev_frame_set_time(frame_out, evdev_frame_get_time(frame_in));
|
evdev_frame_set_time(frame_out, evdev_frame_get_time(frame_in));
|
||||||
|
|
|
||||||
|
|
@ -115,13 +115,9 @@ tablet_proximity_out_quirk_timer_func(struct libinput_plugin *plugin,
|
||||||
plugin_log_debug(device->parent->plugin,
|
plugin_log_debug(device->parent->plugin,
|
||||||
"%s: forcing proximity out after timeout\n",
|
"%s: forcing proximity out after timeout\n",
|
||||||
libinput_device_get_name(device->device));
|
libinput_device_get_name(device->device));
|
||||||
const struct evdev_event prox_out_event = {
|
|
||||||
.usage = evdev_usage_from(EVDEV_BTN_TOOL_PEN),
|
|
||||||
.value = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
_unref_(evdev_frame) *prox_out_frame = evdev_frame_new(2);
|
_unref_(evdev_frame) *prox_out_frame = evdev_frame_new(2);
|
||||||
evdev_frame_append(prox_out_frame, &prox_out_event, 1);
|
evdev_frame_append_one(prox_out_frame, evdev_usage_from(EVDEV_BTN_TOOL_PEN), 0);
|
||||||
evdev_frame_set_time(prox_out_frame, now);
|
evdev_frame_set_time(prox_out_frame, now);
|
||||||
|
|
||||||
libinput_plugin_prepend_evdev_frame(device->parent->plugin,
|
libinput_plugin_prepend_evdev_frame(device->parent->plugin,
|
||||||
|
|
@ -215,16 +211,10 @@ proximity_timer_plugin_device_handle_frame(struct libinput_plugin *libinput_plug
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (device->proximity_out_forced) {
|
} else if (device->proximity_out_forced) {
|
||||||
struct evdev_event pen_in_event = {
|
|
||||||
.usage = evdev_usage_from(EVDEV_BTN_TOOL_PEN),
|
|
||||||
.value = 1,
|
|
||||||
};
|
|
||||||
plugin_log_debug(libinput_plugin,
|
plugin_log_debug(libinput_plugin,
|
||||||
"%s: forcing proximity in\n",
|
"%s: forcing proximity in\n",
|
||||||
libinput_device_get_name(device->device));
|
libinput_device_get_name(device->device));
|
||||||
evdev_frame_append(frame,
|
evdev_frame_append_one(frame, evdev_usage_from(EVDEV_BTN_TOOL_PEN), 1);
|
||||||
&pen_in_event,
|
|
||||||
1); /* libinput's event frame will have space */
|
|
||||||
device->proximity_out_forced = false;
|
device->proximity_out_forced = false;
|
||||||
proximity_timer_plugin_set_timer(device, time);
|
proximity_timer_plugin_set_timer(device, time);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3005,6 +3005,52 @@ START_TEST(evdev_frames)
|
||||||
/* We never appended a timestamp */
|
/* We never appended a timestamp */
|
||||||
litest_assert_int_eq(evdev_frame_get_time(frame), 0U);
|
litest_assert_int_eq(evdev_frame_get_time(frame), 0U);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
struct evdev_event events[] = {
|
||||||
|
{
|
||||||
|
.usage = U(EVDEV_ABS_X),
|
||||||
|
.value = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.usage = U(EVDEV_ABS_Y),
|
||||||
|
.value = 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.usage = U(EVDEV_SYN_REPORT),
|
||||||
|
.value = 0,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
_unref_(evdev_frame) *frame = evdev_frame_new(3);
|
||||||
|
int rc = evdev_frame_append_one(frame, U(EVDEV_ABS_X), 1);
|
||||||
|
litest_assert_neg_errno_success(rc);
|
||||||
|
rc = evdev_frame_append_one(frame, U(EVDEV_ABS_Y), 2);
|
||||||
|
litest_assert_neg_errno_success(rc);
|
||||||
|
rc = evdev_frame_append_one(frame, U(EV_SYN), 0);
|
||||||
|
litest_assert_neg_errno_success(rc);
|
||||||
|
|
||||||
|
litest_assert_int_eq(evdev_frame_get_count(frame),
|
||||||
|
ARRAY_LENGTH(events));
|
||||||
|
litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
|
||||||
|
|
||||||
|
size_t nevents;
|
||||||
|
rc = memcmp(evdev_frame_get_events(frame, &nevents),
|
||||||
|
events,
|
||||||
|
sizeof(events));
|
||||||
|
litest_assert_int_eq(rc, 0);
|
||||||
|
litest_assert_int_eq(nevents, ARRAY_LENGTH(events));
|
||||||
|
|
||||||
|
/* Already full, can't append */
|
||||||
|
rc = evdev_frame_append_one(frame, U(EVDEV_ABS_Z), 1);
|
||||||
|
litest_assert_int_eq(rc, -ENOMEM);
|
||||||
|
|
||||||
|
/* Appending SYN_REPORT is a noop */
|
||||||
|
rc = evdev_frame_append_one(frame, U(EVDEV_SYN_REPORT), 0);
|
||||||
|
litest_assert_neg_errno_success(rc);
|
||||||
|
litest_assert_int_eq(evdev_frame_get_count(frame),
|
||||||
|
ARRAY_LENGTH(events));
|
||||||
|
litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue