evdev: Reference count input device's seat capabilities
When the only input device of a certain seat capability is unplugged, stop advertising the capability. Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
This commit is contained in:
committed by
Kristian Høgsberg
parent
8e6f376ef0
commit
d6e1c34405
@@ -461,6 +461,9 @@ struct weston_seat {
|
|||||||
struct weston_pointer *pointer;
|
struct weston_pointer *pointer;
|
||||||
struct weston_keyboard *keyboard;
|
struct weston_keyboard *keyboard;
|
||||||
struct weston_touch *touch;
|
struct weston_touch *touch;
|
||||||
|
int pointer_device_count;
|
||||||
|
int keyboard_device_count;
|
||||||
|
int touch_device_count;
|
||||||
|
|
||||||
struct weston_output *output; /* constraint */
|
struct weston_output *output; /* constraint */
|
||||||
|
|
||||||
@@ -1124,11 +1127,17 @@ weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec,
|
|||||||
const char *seat_name);
|
const char *seat_name);
|
||||||
void
|
void
|
||||||
weston_seat_init_pointer(struct weston_seat *seat);
|
weston_seat_init_pointer(struct weston_seat *seat);
|
||||||
|
void
|
||||||
|
weston_seat_release_pointer(struct weston_seat *seat);
|
||||||
int
|
int
|
||||||
weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap);
|
weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap);
|
||||||
void
|
void
|
||||||
|
weston_seat_release_keyboard(struct weston_seat *seat);
|
||||||
|
void
|
||||||
weston_seat_init_touch(struct weston_seat *seat);
|
weston_seat_init_touch(struct weston_seat *seat);
|
||||||
void
|
void
|
||||||
|
weston_seat_release_touch(struct weston_seat *seat);
|
||||||
|
void
|
||||||
weston_seat_repick(struct weston_seat *seat);
|
weston_seat_repick(struct weston_seat *seat);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
+11
@@ -565,6 +565,7 @@ evdev_configure_device(struct evdev_device *device)
|
|||||||
if ((device->caps & (EVDEV_MOTION_ABS | EVDEV_MOTION_REL)) &&
|
if ((device->caps & (EVDEV_MOTION_ABS | EVDEV_MOTION_REL)) &&
|
||||||
(device->caps & EVDEV_BUTTON)) {
|
(device->caps & EVDEV_BUTTON)) {
|
||||||
weston_seat_init_pointer(device->seat);
|
weston_seat_init_pointer(device->seat);
|
||||||
|
device->seat_caps |= EVDEV_SEAT_POINTER;
|
||||||
weston_log("input device %s, %s is a pointer caps =%s%s%s\n",
|
weston_log("input device %s, %s is a pointer caps =%s%s%s\n",
|
||||||
device->devname, device->devnode,
|
device->devname, device->devnode,
|
||||||
device->caps & EVDEV_MOTION_ABS ? " absolute-motion" : "",
|
device->caps & EVDEV_MOTION_ABS ? " absolute-motion" : "",
|
||||||
@@ -574,11 +575,13 @@ evdev_configure_device(struct evdev_device *device)
|
|||||||
if ((device->caps & EVDEV_KEYBOARD)) {
|
if ((device->caps & EVDEV_KEYBOARD)) {
|
||||||
if (weston_seat_init_keyboard(device->seat, NULL) < 0)
|
if (weston_seat_init_keyboard(device->seat, NULL) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
device->seat_caps |= EVDEV_SEAT_KEYBOARD;
|
||||||
weston_log("input device %s, %s is a keyboard\n",
|
weston_log("input device %s, %s is a keyboard\n",
|
||||||
device->devname, device->devnode);
|
device->devname, device->devnode);
|
||||||
}
|
}
|
||||||
if ((device->caps & EVDEV_TOUCH)) {
|
if ((device->caps & EVDEV_TOUCH)) {
|
||||||
weston_seat_init_touch(device->seat);
|
weston_seat_init_touch(device->seat);
|
||||||
|
device->seat_caps |= EVDEV_SEAT_TOUCH;
|
||||||
weston_log("input device %s, %s is a touch device\n",
|
weston_log("input device %s, %s is a touch device\n",
|
||||||
device->devname, device->devnode);
|
device->devname, device->devnode);
|
||||||
}
|
}
|
||||||
@@ -602,6 +605,7 @@ evdev_device_create(struct weston_seat *seat, const char *path, int device_fd)
|
|||||||
container_of(ec->output_list.next, struct weston_output, link);
|
container_of(ec->output_list.next, struct weston_output, link);
|
||||||
|
|
||||||
device->seat = seat;
|
device->seat = seat;
|
||||||
|
device->seat_caps = 0;
|
||||||
device->is_mt = 0;
|
device->is_mt = 0;
|
||||||
device->mtdev = NULL;
|
device->mtdev = NULL;
|
||||||
device->devnode = strdup(path);
|
device->devnode = strdup(path);
|
||||||
@@ -649,6 +653,13 @@ evdev_device_destroy(struct evdev_device *device)
|
|||||||
{
|
{
|
||||||
struct evdev_dispatch *dispatch;
|
struct evdev_dispatch *dispatch;
|
||||||
|
|
||||||
|
if (device->seat_caps & EVDEV_SEAT_POINTER)
|
||||||
|
weston_seat_release_pointer(device->seat);
|
||||||
|
if (device->seat_caps & EVDEV_SEAT_KEYBOARD)
|
||||||
|
weston_seat_release_keyboard(device->seat);
|
||||||
|
if (device->seat_caps & EVDEV_SEAT_TOUCH)
|
||||||
|
weston_seat_release_touch(device->seat);
|
||||||
|
|
||||||
dispatch = device->dispatch;
|
dispatch = device->dispatch;
|
||||||
if (dispatch)
|
if (dispatch)
|
||||||
dispatch->interface->destroy(dispatch);
|
dispatch->interface->destroy(dispatch);
|
||||||
|
|||||||
@@ -49,6 +49,12 @@ enum evdev_device_capability {
|
|||||||
EVDEV_TOUCH = (1 << 4),
|
EVDEV_TOUCH = (1 << 4),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum evdev_device_seat_capability {
|
||||||
|
EVDEV_SEAT_POINTER = (1 << 0),
|
||||||
|
EVDEV_SEAT_KEYBOARD = (1 << 1),
|
||||||
|
EVDEV_SEAT_TOUCH = (1 << 2)
|
||||||
|
};
|
||||||
|
|
||||||
struct evdev_device {
|
struct evdev_device {
|
||||||
struct weston_seat *seat;
|
struct weston_seat *seat;
|
||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
@@ -80,6 +86,7 @@ struct evdev_device {
|
|||||||
|
|
||||||
enum evdev_event_type pending_event;
|
enum evdev_event_type pending_event;
|
||||||
enum evdev_device_capability caps;
|
enum evdev_device_capability caps;
|
||||||
|
enum evdev_device_seat_capability seat_caps;
|
||||||
|
|
||||||
int is_mt;
|
int is_mt;
|
||||||
};
|
};
|
||||||
|
|||||||
+50
-6
@@ -447,11 +447,11 @@ seat_send_updated_caps(struct weston_seat *seat)
|
|||||||
enum wl_seat_capability caps = 0;
|
enum wl_seat_capability caps = 0;
|
||||||
struct wl_resource *resource;
|
struct wl_resource *resource;
|
||||||
|
|
||||||
if (seat->pointer)
|
if (seat->pointer_device_count > 0)
|
||||||
caps |= WL_SEAT_CAPABILITY_POINTER;
|
caps |= WL_SEAT_CAPABILITY_POINTER;
|
||||||
if (seat->keyboard)
|
if (seat->keyboard_device_count > 0)
|
||||||
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
|
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
|
||||||
if (seat->touch)
|
if (seat->touch_device_count > 0)
|
||||||
caps |= WL_SEAT_CAPABILITY_TOUCH;
|
caps |= WL_SEAT_CAPABILITY_TOUCH;
|
||||||
|
|
||||||
wl_resource_for_each(resource, &seat->base_resource_list) {
|
wl_resource_for_each(resource, &seat->base_resource_list) {
|
||||||
@@ -1630,8 +1630,12 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
|
|||||||
{
|
{
|
||||||
struct weston_keyboard *keyboard;
|
struct weston_keyboard *keyboard;
|
||||||
|
|
||||||
if (seat->keyboard)
|
if (seat->keyboard) {
|
||||||
|
seat->keyboard_device_count += 1;
|
||||||
|
if (seat->keyboard_device_count == 1)
|
||||||
|
seat_send_updated_caps(seat);
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_XKBCOMMON
|
#ifdef ENABLE_XKBCOMMON
|
||||||
if (seat->compositor->use_xkbcommon) {
|
if (seat->compositor->use_xkbcommon) {
|
||||||
@@ -1663,6 +1667,7 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
seat->keyboard = keyboard;
|
seat->keyboard = keyboard;
|
||||||
|
seat->keyboard_device_count = 1;
|
||||||
keyboard->seat = seat;
|
keyboard->seat = seat;
|
||||||
|
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
@@ -1670,42 +1675,81 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WL_EXPORT void
|
||||||
|
weston_seat_release_keyboard(struct weston_seat *seat)
|
||||||
|
{
|
||||||
|
seat->keyboard_device_count--;
|
||||||
|
if (seat->keyboard_device_count == 0) {
|
||||||
|
seat_send_updated_caps(seat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_seat_init_pointer(struct weston_seat *seat)
|
weston_seat_init_pointer(struct weston_seat *seat)
|
||||||
{
|
{
|
||||||
struct weston_pointer *pointer;
|
struct weston_pointer *pointer;
|
||||||
|
|
||||||
if (seat->pointer)
|
if (seat->pointer) {
|
||||||
|
seat->pointer_device_count += 1;
|
||||||
|
if (seat->pointer_device_count == 1)
|
||||||
|
seat_send_updated_caps(seat);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pointer = weston_pointer_create();
|
pointer = weston_pointer_create();
|
||||||
if (pointer == NULL)
|
if (pointer == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
seat->pointer = pointer;
|
seat->pointer = pointer;
|
||||||
|
seat->pointer_device_count = 1;
|
||||||
pointer->seat = seat;
|
pointer->seat = seat;
|
||||||
|
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WL_EXPORT void
|
||||||
|
weston_seat_release_pointer(struct weston_seat *seat)
|
||||||
|
{
|
||||||
|
struct weston_pointer *pointer = seat->pointer;
|
||||||
|
|
||||||
|
seat->pointer_device_count--;
|
||||||
|
if (seat->pointer_device_count == 0) {
|
||||||
|
seat_send_updated_caps(seat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_seat_init_touch(struct weston_seat *seat)
|
weston_seat_init_touch(struct weston_seat *seat)
|
||||||
{
|
{
|
||||||
struct weston_touch *touch;
|
struct weston_touch *touch;
|
||||||
|
|
||||||
if (seat->touch)
|
if (seat->touch) {
|
||||||
|
seat->touch_device_count += 1;
|
||||||
|
if (seat->touch_device_count == 1)
|
||||||
|
seat_send_updated_caps(seat);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
touch = weston_touch_create();
|
touch = weston_touch_create();
|
||||||
if (touch == NULL)
|
if (touch == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
seat->touch = touch;
|
seat->touch = touch;
|
||||||
|
seat->touch_device_count = 1;
|
||||||
touch->seat = seat;
|
touch->seat = seat;
|
||||||
|
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WL_EXPORT void
|
||||||
|
weston_seat_release_touch(struct weston_seat *seat)
|
||||||
|
{
|
||||||
|
seat->touch_device_count--;
|
||||||
|
if (seat->touch_device_count == 0) {
|
||||||
|
seat_send_updated_caps(seat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec,
|
weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec,
|
||||||
const char *seat_name)
|
const char *seat_name)
|
||||||
|
|||||||
Reference in New Issue
Block a user