mirror of
https://gitlab.freedesktop.org/libinput/libei.git
synced 2026-01-08 05:50:14 +01:00
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:
parent
2ec3328447
commit
379f47b06b
7 changed files with 93 additions and 32 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
31
src/libei.c
31
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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue