From 379f47b06bfced124566591ed77f17eee0cf5a3a Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Tue, 10 Aug 2021 16:59:34 +1000 Subject: [PATCH] proto: split the keymap message out from the device added message Same approach as used for the regions already, a separate (optional) message. Signed-off-by: Peter Hutterer --- proto/ei.proto | 19 ++++++++++++------- src/libei-proto.c | 21 +++++++++++++++------ src/libei-proto.h | 9 +++++++-- src/libei.c | 31 +++++++++++++++++++++++++------ src/libeis-client.c | 11 ++++++++--- src/libeis-proto.c | 31 +++++++++++++++++++++++-------- src/libeis-proto.h | 3 +++ 7 files changed, 93 insertions(+), 32 deletions(-) diff --git a/proto/ei.proto b/proto/ei.proto index 607eb76..f2c0dc7 100644 --- a/proto/ei.proto +++ b/proto/ei.proto @@ -169,13 +169,17 @@ message SeatRemoved { message DeviceAdded { uint32 deviceid = 1; uint32 capabilities = 2; - /* keymap is passed as fd if size is nonzero and type is not none */ - uint32 keymap_type = 4; - uint32 keymap_size = 5; string name = 6; uint32 seatid = 7; } +message DeviceKeymap { + uint32 deviceid = 1; + uint32 keymap_type = 2; + uint32 keymap_size = 3; + /* keymap itself is passed as fd */ +} + message DeviceRegion { uint32 deviceid = 1; uint32 offset_x = 2; @@ -209,10 +213,11 @@ message ServerMessage { SeatRemoved seat_removed = 5; DeviceAdded device_added = 6; DeviceRegion device_region = 7; - DeviceAddedDone device_added_done = 8; - DeviceRemoved device_removed = 9; - DeviceResumed device_resumed = 10; - DeviceSuspended device_suspended = 11; + DeviceKeymap device_keymap = 8; + DeviceAddedDone device_added_done = 9; + DeviceRemoved device_removed = 10; + DeviceResumed device_resumed = 11; + DeviceSuspended device_suspended = 12; } } diff --git a/src/libei-proto.c b/src/libei-proto.c index 32fb23f..692a44e 100644 --- a/src/libei-proto.c +++ b/src/libei-proto.c @@ -39,8 +39,10 @@ message_free(struct message *msg) case MESSAGE_SEAT_ADDED: free(msg->seat_added.name); break; + case MESSAGE_DEVICE_KEYMAP: + xclose(msg->device_keymap.keymap_fd); + break; case MESSAGE_DEVICE_ADDED: - xclose(msg->device_added.keymap_fd); free(msg->device_added.name); break; default: @@ -108,13 +110,8 @@ ei_proto_parse_message(struct brei_message *bmsg, size_t *consumed) .device_added.deviceid = a->deviceid, .device_added.name = a->name[0] ? xstrdup(a->name) : NULL, .device_added.capabilities = a->capabilities, - .device_added.keymap_fd = -1, - .device_added.keymap_type = a->keymap_type, - .device_added.keymap_size = a->keymap_size, .device_added.seatid = a->seatid, }; - if (a->keymap_type) - msg->device_added.keymap_fd = brei_message_take_fd(bmsg); } break; case SERVER_MESSAGE__MSG_DEVICE_ADDED_DONE: @@ -126,6 +123,18 @@ ei_proto_parse_message(struct brei_message *bmsg, size_t *consumed) }; } break; + case SERVER_MESSAGE__MSG_DEVICE_KEYMAP: + { + DeviceKeymap *k = proto->device_keymap; + *msg = (struct message) { + .type = MESSAGE_DEVICE_KEYMAP, + .device_keymap.deviceid = k->deviceid, + .device_keymap.keymap_fd = brei_message_take_fd(bmsg), + .device_keymap.keymap_type = k->keymap_type, + .device_keymap.keymap_size = k->keymap_size, + }; + } + break; case SERVER_MESSAGE__MSG_DEVICE_REGION: { DeviceRegion *r = proto->device_region; diff --git a/src/libei-proto.h b/src/libei-proto.h index 7a2f260..88d3886 100644 --- a/src/libei-proto.h +++ b/src/libei-proto.h @@ -39,6 +39,7 @@ enum message_type { MESSAGE_SEAT_REMOVED, MESSAGE_DEVICE_ADDED, MESSAGE_DEVICE_ADDED_DONE, + MESSAGE_DEVICE_KEYMAP, MESSAGE_DEVICE_REGION, MESSAGE_DEVICE_REMOVED, MESSAGE_DEVICE_RESUMED, @@ -55,6 +56,7 @@ message_type_to_string(enum message_type type) CASE_RETURN_STRING(MESSAGE_SEAT_REMOVED); CASE_RETURN_STRING(MESSAGE_DEVICE_ADDED); CASE_RETURN_STRING(MESSAGE_DEVICE_ADDED_DONE); + CASE_RETURN_STRING(MESSAGE_DEVICE_KEYMAP); CASE_RETURN_STRING(MESSAGE_DEVICE_REGION); CASE_RETURN_STRING(MESSAGE_DEVICE_REMOVED); CASE_RETURN_STRING(MESSAGE_DEVICE_RESUMED); @@ -84,11 +86,14 @@ struct message { uint32_t deviceid; char *name; uint32_t capabilities; + uint32_t seatid; + } device_added; + struct message_device_keymap { + uint32_t deviceid; enum ei_keymap_type keymap_type; int keymap_fd; size_t keymap_size; - uint32_t seatid; - } device_added; + } device_keymap; struct message_device_added_done { uint32_t deviceid; } device_added_done; diff --git a/src/libei.c b/src/libei.c index a440145..18844cf 100644 --- a/src/libei.c +++ b/src/libei.c @@ -524,8 +524,6 @@ handle_msg_seat_removed(struct ei *ei, uint32_t seatid) static int handle_msg_device_added(struct ei *ei, uint32_t deviceid, const char *name, uint32_t capabilities, - enum ei_keymap_type keymap_type, - int keymap_fd, size_t keymap_sz, uint32_t seatid) { struct ei_seat *seat = ei_find_seat(ei, seatid); @@ -548,7 +546,6 @@ handle_msg_device_added(struct ei *ei, uint32_t deviceid, _unref_(ei_device) *device = ei_device_new(seat, deviceid); ei_device_set_name(device, name); ei_device_set_capabilities(device, capabilities); - ei_device_set_keymap(device, keymap_type, keymap_fd, keymap_sz); ei_device_added(device); log_debug(ei, @@ -563,6 +560,22 @@ handle_msg_device_added(struct ei *ei, uint32_t deviceid, return 0; } +static int +handle_msg_device_keymap(struct ei *ei, uint32_t deviceid, + enum ei_keymap_type keymap_type, + int keymap_fd, size_t keymap_sz) +{ + log_debug(ei, "Adding keymap for %#x\n", deviceid); + + struct ei_device *device = ei_find_device(ei, deviceid); + if (!device) + return 0; + + ei_device_set_keymap(device, keymap_type, keymap_fd, keymap_sz); + + return 0; +} + void ei_queue_device_removed_event(struct ei_device *device) { @@ -810,6 +823,7 @@ connection_new_handle_msg(struct ei *ei, struct message *msg) case MESSAGE_SEAT_REMOVED: case MESSAGE_DEVICE_ADDED: case MESSAGE_DEVICE_ADDED_DONE: + case MESSAGE_DEVICE_KEYMAP: case MESSAGE_DEVICE_REGION: case MESSAGE_DEVICE_REMOVED: case MESSAGE_DEVICE_RESUMED: @@ -838,6 +852,7 @@ connection_connecting_handle_msg(struct ei *ei, struct message *msg) case MESSAGE_SEAT_REMOVED: case MESSAGE_DEVICE_ADDED: case MESSAGE_DEVICE_ADDED_DONE: + case MESSAGE_DEVICE_KEYMAP: case MESSAGE_DEVICE_REGION: case MESSAGE_DEVICE_REMOVED: case MESSAGE_DEVICE_RESUMED: @@ -875,14 +890,18 @@ connection_connected_handle_msg(struct ei *ei, struct message *msg) msg->device_added.deviceid, msg->device_added.name, msg->device_added.capabilities, - msg->device_added.keymap_type, - msg->device_added.keymap_fd, - msg->device_added.keymap_size, msg->device_added.seatid); break; case MESSAGE_DEVICE_ADDED_DONE: rc = handle_msg_device_added_done(ei, msg->device_added_done.deviceid); break; + case MESSAGE_DEVICE_KEYMAP: + rc = handle_msg_device_keymap(ei, + msg->device_keymap.deviceid, + msg->device_keymap.keymap_type, + msg->device_keymap.keymap_fd, + msg->device_keymap.keymap_size); + break; case MESSAGE_DEVICE_REGION: rc = handle_msg_device_region(ei, msg->device_region.deviceid, msg->device_region.x, msg->device_region.y, diff --git a/src/libeis-client.c b/src/libeis-client.c index 2916836..a7c5106 100644 --- a/src/libeis-client.c +++ b/src/libeis-client.c @@ -102,9 +102,14 @@ client_send_device_added(struct eis_client *client, struct eis_device *device) { int rc = eis_proto_send_device_added(client, device); - struct eis_region *r; - list_for_each(r, &device->regions, link) { - rc = eis_proto_send_device_region(client, device, r); + if (rc >= 0 && device->keymap) + rc = eis_proto_send_device_keymap(client, device); + + if (rc >= 0) { + struct eis_region *r; + list_for_each(r, &device->regions, link) { + rc = eis_proto_send_device_region(client, device, r); + } } if (rc >= 0) diff --git a/src/libeis-proto.c b/src/libeis-proto.c index 263e1a7..ce13445 100644 --- a/src/libeis-proto.c +++ b/src/libeis-proto.c @@ -67,6 +67,7 @@ log_wire_message(struct eis *eis, const ServerMessage *msg) MSG_STRING_CASE(SEAT_REMOVED); MSG_STRING_CASE(DEVICE_ADDED); MSG_STRING_CASE(DEVICE_ADDED_DONE); + MSG_STRING_CASE(DEVICE_KEYMAP); MSG_STRING_CASE(DEVICE_REGION); MSG_STRING_CASE(DEVICE_REMOVED); MSG_STRING_CASE(DEVICE_RESUMED); @@ -176,23 +177,37 @@ eis_proto_send_device_added(struct eis_client *client, struct eis_device *device ServerMessage msg = SERVER_MESSAGE__INIT; DeviceAdded added = DEVICE_ADDED__INIT; struct eis_seat *seat = eis_device_get_seat(device); - int fds[2] = {-1, -1}; added.deviceid = device->id; added.seatid = seat->id; added.name = device->name; added.capabilities = device->capabilities; - if (device->keymap) { - struct eis_keymap *keymap = device->keymap; - added.keymap_type = keymap->type; - added.keymap_size = keymap->size; - fds[0] = keymap->fd; - } - msg.device_added = &added; msg.msg_case = SERVER_MESSAGE__MSG_DEVICE_ADDED; + return eis_proto_send_msg(client, &msg); +} + +int +eis_proto_send_device_keymap(struct eis_client *client, struct eis_device *device) +{ + ServerMessage msg = SERVER_MESSAGE__INIT; + DeviceKeymap keymap = DEVICE_KEYMAP__INIT; + int fds[2] = {-1, -1}; + + if (!device->keymap) + return 0; + + struct eis_keymap *k = device->keymap; + keymap.deviceid = device->id; + keymap.keymap_type = k->type; + keymap.keymap_size = k->size; + fds[0] = k->fd; + + msg.device_keymap = &keymap; + msg.msg_case = SERVER_MESSAGE__MSG_DEVICE_KEYMAP; + return eis_proto_send_msg_with_fds(client, &msg, fds); } diff --git a/src/libeis-proto.h b/src/libeis-proto.h index 9349d4f..b3082e2 100644 --- a/src/libeis-proto.h +++ b/src/libeis-proto.h @@ -164,6 +164,9 @@ eis_proto_send_seat_removed(struct eis_client *client, int eis_proto_send_device_added(struct eis_client *client, struct eis_device *device); +int +eis_proto_send_device_keymap(struct eis_client *client, + struct eis_device *device); int eis_proto_send_device_added_done(struct eis_client *client,