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 <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2021-08-10 16:59:34 +10:00
parent 2ec3328447
commit 379f47b06b
7 changed files with 93 additions and 32 deletions

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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;

View file

@ -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,

View file

@ -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)

View file

@ -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);
}

View file

@ -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,