eis: add EI_EVENT_SYNC as opaque event to correctly schedule callbacks

This event is required to fix an issue with the current
ei_callback.done handling in libeis: previously we would imediately send
the ei_callback.done upon receiving ei_connection.sync from the client.
This results in incorrect behavior as we may have events in the queue
(and/or pending a frame) that the EIS implementation hasn't seen yet.
For example a client sending:
- ei_pointer.motion
- ei_connection.sync
- ei_device.frame
- ei_connection.sync

Will queue a motion + frame event on the EIS side during eis_dispatch()
but immediately receive done events for both sync requests.

This could be handled purely internally by keeping the sync event in the
queue but hidden to the caller - and automatically calling done when
it's that events turn, i.e. something like:

```
  struct eis_event *eis_get_event(struct eis) {
      struct eis_event *e = first_event(eis);
      if (e == EIS_EVENT_SYNC) {
           eis_callback_send_done(e);
           eis_event_unref(e);
           e = next_event(eis);
      }
      return e;
  }
```

but that opens us up to a set of potential bugs detailed in
https://gitlab.freedesktop.org/libinput/libei/-/issues/71#note_2694603

So let's go the easy route by having a new event type that does nothing
other than eis_event_unref() in the EIS implementation. This way we can
queue the event and have everything behave in-order and as expected.

Closes #71

Part-of: <https://gitlab.freedesktop.org/libinput/libei/-/merge_requests/316>
This commit is contained in:
Peter Hutterer 2024-12-10 12:36:30 +10:00 committed by Marge Bot
parent 971013429d
commit 73e0e8d339
12 changed files with 123 additions and 12 deletions

View file

@ -326,11 +326,9 @@ client_msg_sync(struct eis_connection *connection, object_id_t new_id, uint32_t
DISCONNECT_IF_INVALID_ID(client, new_id);
DISCONNECT_IF_INVALID_VERSION(client, ei_connection, new_id, version);
struct eis_callback *callback = eis_callback_new(client, new_id, version);
log_debug(eis_client_get_context(client) , "object %#" PRIx64 ": connection sync done", new_id);
int rc = eis_callback_event_done(callback, 0);
eis_callback_unref(callback);
return brei_result_new_from_neg_errno(rc);
eis_queue_sync_event(client, new_id, version);
return 0;
}
static const struct eis_connection_interface intf_state_new = {

View file

@ -62,6 +62,10 @@ eis_event_destroy(struct eis_event *event)
eis_ping_unref(event->pong.ping);
handled = true;
break;
case EIS_EVENT_SYNC:
eis_callback_unref(event->sync.callback);
handled = true;
break;
}
if (!handled)

View file

@ -66,6 +66,9 @@ struct eis_event {
struct {
struct eis_ping *ping;
} pong;
struct {
struct eis_callback *callback;
} sync;
};
};

View file

@ -95,6 +95,9 @@ eis_queue_disconnect_event(struct eis_client *client);
void
eis_queue_pong_event(struct eis_client *client, struct eis_ping *ping);
void
eis_queue_sync_event(struct eis_client *client, object_id_t newid, uint32_t version);
void
eis_queue_seat_bind_event(struct eis_seat *seat, uint32_t capabilities);

View file

@ -44,6 +44,9 @@ _Static_assert(sizeof(enum eis_keymap_type) == sizeof(int), "Invalid enum size")
_Static_assert(sizeof(enum eis_event_type) == sizeof(int), "Invalid enum size");
_Static_assert(sizeof(enum eis_log_priority) == sizeof(int), "Invalid enum size");
DEFINE_UNREF_CLEANUP_FUNC(brei_result);
DEFINE_UNREF_CLEANUP_FUNC(eis_callback);
static void
eis_destroy(struct eis *eis)
{
@ -119,6 +122,7 @@ eis_event_type_to_string(enum eis_event_type type)
CASE_RETURN_STRING(EIS_EVENT_SEAT_BIND);
CASE_RETURN_STRING(EIS_EVENT_DEVICE_CLOSED);
CASE_RETURN_STRING(EIS_EVENT_PONG);
CASE_RETURN_STRING(EIS_EVENT_SYNC);
CASE_RETURN_STRING(EIS_EVENT_DEVICE_START_EMULATING);
CASE_RETURN_STRING(EIS_EVENT_DEVICE_STOP_EMULATING);
CASE_RETURN_STRING(EIS_EVENT_POINTER_MOTION);
@ -252,6 +256,15 @@ eis_queue_device_closed_event(struct eis_device *device)
eis_queue_event(e);
}
void
eis_queue_sync_event(struct eis_client *client, object_id_t newid, uint32_t version)
{
struct eis_event *e = eis_event_new_for_client(client);
e->type = EIS_EVENT_SYNC;
e->sync.callback = eis_callback_new(client, newid, version);
eis_queue_event(e);
}
void
eis_queue_pong_event(struct eis_client *client, struct eis_ping *ping)
{
@ -426,6 +439,23 @@ eis_get_event(struct eis *eis)
struct eis_event *e = list_first_entry(&eis->event_queue, e, link);
list_remove(&e->link);
if (e->type == EIS_EVENT_SYNC) {
_unref_(eis_callback) *callback = steal(&e->sync.callback);
log_debug(eis_event_get_context(e) ,
"object %#" PRIx64 ": connection sync done",
eis_callback_get_id(callback));
int rc = eis_callback_event_done(callback, 0);
_unref_(brei_result) *result = brei_result_new_from_neg_errno(rc);
if (result) {
log_debug(eis_event_get_context(e), ".... result is %d\n", rc);
struct eis_client *client = eis_event_get_client(e);
eis_client_disconnect_with_reason(client,
brei_result_get_reason(result),
brei_result_get_explanation(result));
}
}
return e;
}

View file

@ -276,6 +276,20 @@ enum eis_event_type {
*/
EIS_EVENT_PONG = 90,
/**
* This event represents a synchronization request (ping) from the client
* implementation. The corresponding reply (pong) will be sent when it
* is unref'd. It has no other API.
*
* The caller must ensure that any state changes triggered by messages
* received prior to this event have been resolved and communicated to the
* client prior to calling eis_event_unref(). E.g., if the preceding frame
* included a key event that caused shift to become logically depressed, the
* caller should ensure that the updated modifier state has been sent before
* calling unref.
*/
EIS_EVENT_SYNC,
/**
* "Hardware" frame event. This event **must** be sent by the client
* and notifies the server that the previous set of events belong to

View file

@ -486,6 +486,7 @@ new_context(enum peck_ei_mode ei_mode)
peck->eis = eis;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_FRAME);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
struct ei *ei = ei_mode == PECK_EI_RECEIVER ? ei_new_receiver(peck) : ei_new_sender(peck);
ei_set_user_data(ei, peck);
@ -598,6 +599,7 @@ peck_enable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior)
case PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT:
case PECK_EIS_BEHAVIOR_HANDLE_CLOSE_DEVICE:
case PECK_EIS_BEHAVIOR_HANDLE_FRAME:
case PECK_EIS_BEHAVIOR_HANDLE_SYNC:
case PECK_EIS_BEHAVIOR_HANDLE_START_EMULATING:
case PECK_EIS_BEHAVIOR_HANDLE_STOP_EMULATING:
case PECK_EIS_BEHAVIOR_ADD_POINTER:
@ -620,7 +622,6 @@ peck_enable_eis_behavior(struct peck *peck, enum peck_eis_behavior behavior)
break;
}
}
void
peck_enable_ei_behavior(struct peck *peck, enum peck_ei_behavior behavior)
{
@ -911,6 +912,10 @@ _peck_dispatch_eis(struct peck *peck, int lineno)
break;
case EIS_EVENT_PONG:
break;
case EIS_EVENT_SYNC:
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_HANDLE_SYNC))
process_event = tristate_yes;
break;
case EIS_EVENT_FRAME:
/* Ensure we only expect frames when we expect them */
munit_assert_true(need_frame);
@ -1258,10 +1263,17 @@ _peck_assert_no_eis_events(struct eis *eis, int lineno)
if (!e)
return;
if (peck && flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_HANDLE_FRAME) &&
eis_event_get_type(e) == EIS_EVENT_FRAME) {
log_debug(peck, "Skipping over frame event\n");
continue;
if (peck) {
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_HANDLE_FRAME) &&
eis_event_get_type(e) == EIS_EVENT_FRAME) {
log_debug(peck, "Skipping over frame event\n");
continue;
}
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_HANDLE_SYNC) &&
eis_event_get_type(e) == EIS_EVENT_SYNC) {
log_debug(peck, "Skipping over sync event\n");
continue;
}
}
munit_errorf("Expected empty event queue, have: %s, line %d\n",
@ -1313,6 +1325,14 @@ _peck_eis_next_event(struct eis *eis, enum eis_event_type type, int lineno)
}
}
if (flag_is_set(peck->eis_behavior, PECK_EIS_BEHAVIOR_HANDLE_SYNC)) {
while (event && eis_event_get_type(event) == EIS_EVENT_SYNC) {
eis_event_unref(event);
log_debug(peck, "Skipping over sync event\n");
event = eis_get_event(eis);
}
}
if (!event)
munit_errorf("Expected EIS event type %s, got none, line %d\n",
peck_eis_event_type_name(type),
@ -1423,6 +1443,7 @@ peck_eis_event_type_name(enum eis_event_type type)
CASE_STRING(SEAT_BIND);
CASE_STRING(DEVICE_CLOSED);
CASE_STRING(PONG);
CASE_STRING(SYNC);
CASE_STRING(DEVICE_START_EMULATING);
CASE_STRING(DEVICE_STOP_EMULATING);
CASE_STRING(POINTER_MOTION);

View file

@ -86,6 +86,10 @@ enum peck_eis_behavior {
* Handle frame events. This behavior is enabled by default.
*/
PECK_EIS_BEHAVIOR_HANDLE_FRAME,
/**
* Handle sync events. This behavior is enabled by default.
*/
PECK_EIS_BEHAVIOR_HANDLE_SYNC,
/**
* Handle the start/stop emulation event. This behavior is enabled as part of
* PECK_EIS_BEHAVIOR_ACCEPT_ALL.

View file

@ -289,6 +289,7 @@ MUNIT_TEST(test_ei_device_close)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT);
@ -909,6 +910,7 @@ MUNIT_TEST(test_ei_device_pointer_abs)
/* Don't auto-handle the DEVICE_CLOSED event */
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
}
with_client(peck) {
@ -1541,6 +1543,7 @@ MUNIT_TEST(test_ei_keymap_set)
_unref_(eis_keymap) *keymap = NULL;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT);
@ -1654,6 +1657,7 @@ MUNIT_TEST(test_ei_frame_timestamp)
uint64_t ts1 = 0, ts2 = 0;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
@ -1702,6 +1706,7 @@ MUNIT_TEST(test_ei_no_empty_frames)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
@ -1734,6 +1739,7 @@ MUNIT_TEST(test_ei_buffered_frame)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
@ -1789,6 +1795,8 @@ MUNIT_TEST(test_ei_flush_frame)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
@ -1855,7 +1863,9 @@ MUNIT_TEST(test_passive_ei_device_start_stop_emulating)
{
_unref_(peck) *peck = peck_new_context(PECK_EI_RECEIVER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT);
@ -1894,7 +1904,9 @@ MUNIT_TEST(test_passive_ei_device_stop_emulating_when_removing)
{
_unref_(peck) *peck = peck_new_context(PECK_EI_RECEIVER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_DEFAULT_SEAT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_CLIENT);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_BIND_SEAT);
@ -2884,6 +2896,7 @@ MUNIT_TEST(test_passive_ei_frame_timestamp)
uint64_t ts1 = 0, ts2 = 0;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
@ -2942,6 +2955,7 @@ MUNIT_TEST(test_passive_ei_flush_frame)
_unref_(peck) *peck = peck_new_context(PECK_EI_RECEIVER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);

View file

@ -72,6 +72,7 @@ MUNIT_TEST(test_ei_unref_self_immediately)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_dispatch_until_stable(peck);
/* Disconnect before server processed CONNECT */
@ -98,6 +99,7 @@ MUNIT_TEST(test_ei_disconnect_self_immediately)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_dispatch_until_stable(peck);
/* Disconnect before server processed CONNECT */
@ -159,6 +161,7 @@ MUNIT_TEST(test_ei_unref_self_after_connect)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_dispatch_until_stable(peck);
with_client(peck) {
@ -183,6 +186,7 @@ MUNIT_TEST(test_ei_disconnect_self_after_connect)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_dispatch_until_stable(peck);
with_client(peck) {
@ -260,6 +264,7 @@ MUNIT_TEST(test_ei_disconnect_self_after_seat)
}
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_dispatch_until_stable(peck);
with_server(peck) {
@ -513,6 +518,7 @@ MUNIT_TEST(test_client_is_sender)
_unref_(peck) *peck = peck_new_context(PECK_EI_SENDER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_NONE);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_CONNECT);
peck_dispatch_until_stable(peck);
@ -531,6 +537,7 @@ MUNIT_TEST(test_client_is_receiver)
_unref_(peck) *peck = peck_new_context(PECK_EI_RECEIVER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_NONE);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_HANDLE_CONNECT);
peck_dispatch_until_stable(peck);
@ -596,6 +603,7 @@ MUNIT_TEST(test_ei_exceed_write_buffer)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
@ -681,6 +689,7 @@ MUNIT_TEST(test_ei_exceed_write_buffer_cleanup)
struct ei *ei = peck_get_ei(peck);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
@ -732,6 +741,7 @@ MUNIT_TEST(test_ei_invalid_object_ids)
_unref_(eis_device) *dummy = NULL;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTOSTART);
@ -805,6 +815,7 @@ MUNIT_TEST(test_ei_ping)
int userdata = 123;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
@ -905,9 +916,11 @@ MUNIT_TEST(test_ei_ping_within_frame)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_KEYBOARD);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_NONE);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTODEVICES);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_AUTOSTART);

View file

@ -51,6 +51,7 @@ MUNIT_TEST(eistest_name)
_unref_(peck) *peck = peck_new();
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_ei_behavior(peck, PECK_EI_BEHAVIOR_NONE);
/* The name is set by peck_new() and immutable after the
@ -360,6 +361,7 @@ MUNIT_TEST(test_eis_ping)
int userdata = 123;
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_NONE);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_HANDLE_SYNC);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ACCEPT_ALL);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_ADD_POINTER);
peck_enable_eis_behavior(peck, PECK_EIS_BEHAVIOR_RESUME_DEVICE);

View file

@ -551,6 +551,11 @@ eis_demo_server_printf_handle_event(struct eis_demo_server *server,
colorprint("pong\n");
}
break;
case EIS_EVENT_SYNC:
{
colorprint("sync\n");
}
break;
default:
/* This is a demo server and we abort to make it easy to debug
* a missing implementation of some new event.