From 73e0e8d339daffded41c2fe8925289c5271c53e9 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 10 Dec 2024 12:36:30 +1000 Subject: [PATCH] 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: --- src/libeis-client.c | 8 +++----- src/libeis-event.c | 4 ++++ src/libeis-event.h | 3 +++ src/libeis-private.h | 3 +++ src/libeis.c | 30 ++++++++++++++++++++++++++++++ src/libeis.h | 14 ++++++++++++++ test/eierpecken.c | 31 ++++++++++++++++++++++++++----- test/eierpecken.h | 4 ++++ test/test-ei-device.c | 18 ++++++++++++++++-- test/test-ei.c | 13 +++++++++++++ test/test-eis.c | 2 ++ tools/eis-demo-server.c | 5 +++++ 12 files changed, 123 insertions(+), 12 deletions(-) diff --git a/src/libeis-client.c b/src/libeis-client.c index b55f690..84dce6a 100644 --- a/src/libeis-client.c +++ b/src/libeis-client.c @@ -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 = { diff --git a/src/libeis-event.c b/src/libeis-event.c index c59e0c4..c002a5e 100644 --- a/src/libeis-event.c +++ b/src/libeis-event.c @@ -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) diff --git a/src/libeis-event.h b/src/libeis-event.h index 2856b1d..b01aeed 100644 --- a/src/libeis-event.h +++ b/src/libeis-event.h @@ -66,6 +66,9 @@ struct eis_event { struct { struct eis_ping *ping; } pong; + struct { + struct eis_callback *callback; + } sync; }; }; diff --git a/src/libeis-private.h b/src/libeis-private.h index 57f390a..caff3ed 100644 --- a/src/libeis-private.h +++ b/src/libeis-private.h @@ -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); diff --git a/src/libeis.c b/src/libeis.c index 284c7df..6da2110 100644 --- a/src/libeis.c +++ b/src/libeis.c @@ -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; } diff --git a/src/libeis.h b/src/libeis.h index 88fcc0a..c85a75d 100644 --- a/src/libeis.h +++ b/src/libeis.h @@ -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 diff --git a/test/eierpecken.c b/test/eierpecken.c index 02df5f5..40b36b3 100644 --- a/test/eierpecken.c +++ b/test/eierpecken.c @@ -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); diff --git a/test/eierpecken.h b/test/eierpecken.h index 74c09c8..9eaa89c 100644 --- a/test/eierpecken.h +++ b/test/eierpecken.h @@ -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. diff --git a/test/test-ei-device.c b/test/test-ei-device.c index f9b155b..6fad482 100644 --- a/test/test-ei-device.c +++ b/test/test-ei-device.c @@ -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); diff --git a/test/test-ei.c b/test/test-ei.c index 7537185..2534b02 100644 --- a/test/test-ei.c +++ b/test/test-ei.c @@ -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); diff --git a/test/test-eis.c b/test/test-eis.c index ca763e1..f6ea868 100644 --- a/test/test-eis.c +++ b/test/test-eis.c @@ -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); diff --git a/tools/eis-demo-server.c b/tools/eis-demo-server.c index 77fd80d..ee1586f 100644 --- a/tools/eis-demo-server.c +++ b/tools/eis-demo-server.c @@ -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.