input: Handle correctly failure to compile XKB keymaps
And ultimately, fail to start when there are no input devices on the system. Patchs adds consistency to touch/pointer initialization to return -1 in case same thing happens. Further more, when the device is not created we can't assume to retrieve a valid one from a libinput_device so guard against it. This takes care of hot-plugging situations when we couldn't create the (keyboard) device, or when removing it. Fixes: #117, #402, #485 Signed-off-by: Marius Vlad <marius.vlad@collabora.com> Suggested-by: Daniel Stone <daniel.stone@collabora.com>
This commit is contained in:
committed by
Daniel Stone
parent
74bdb35c85
commit
eb34f827dd
+10
-6
@@ -3331,7 +3331,7 @@ weston_seat_release_keyboard(struct weston_seat *seat)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT int
|
||||||
weston_seat_init_pointer(struct weston_seat *seat)
|
weston_seat_init_pointer(struct weston_seat *seat)
|
||||||
{
|
{
|
||||||
struct weston_pointer *pointer;
|
struct weston_pointer *pointer;
|
||||||
@@ -3340,18 +3340,20 @@ weston_seat_init_pointer(struct weston_seat *seat)
|
|||||||
seat->pointer_device_count += 1;
|
seat->pointer_device_count += 1;
|
||||||
if (seat->pointer_device_count == 1)
|
if (seat->pointer_device_count == 1)
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pointer = weston_pointer_create(seat);
|
pointer = weston_pointer_create(seat);
|
||||||
if (pointer == NULL)
|
if (pointer == NULL)
|
||||||
return;
|
return -1;
|
||||||
|
|
||||||
seat->pointer_state = pointer;
|
seat->pointer_state = pointer;
|
||||||
seat->pointer_device_count = 1;
|
seat->pointer_device_count = 1;
|
||||||
pointer->seat = seat;
|
pointer->seat = seat;
|
||||||
|
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
@@ -3377,7 +3379,7 @@ weston_seat_release_pointer(struct weston_seat *seat)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT int
|
||||||
weston_seat_init_touch(struct weston_seat *seat)
|
weston_seat_init_touch(struct weston_seat *seat)
|
||||||
{
|
{
|
||||||
struct weston_touch *touch;
|
struct weston_touch *touch;
|
||||||
@@ -3386,18 +3388,20 @@ weston_seat_init_touch(struct weston_seat *seat)
|
|||||||
seat->touch_device_count += 1;
|
seat->touch_device_count += 1;
|
||||||
if (seat->touch_device_count == 1)
|
if (seat->touch_device_count == 1)
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
touch = weston_touch_create();
|
touch = weston_touch_create();
|
||||||
if (touch == NULL)
|
if (touch == NULL)
|
||||||
return;
|
return -1;
|
||||||
|
|
||||||
seat->touch_state = touch;
|
seat->touch_state = touch;
|
||||||
seat->touch_device_count = 1;
|
seat->touch_device_count = 1;
|
||||||
touch->seat = seat;
|
touch->seat = seat;
|
||||||
|
|
||||||
seat_send_updated_caps(seat);
|
seat_send_updated_caps(seat);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
WL_EXPORT void
|
WL_EXPORT void
|
||||||
|
|||||||
@@ -523,6 +523,9 @@ evdev_device_process_event(struct libinput_event *event)
|
|||||||
int handled = 1;
|
int handled = 1;
|
||||||
bool need_frame = false;
|
bool need_frame = false;
|
||||||
|
|
||||||
|
if (!device)
|
||||||
|
return 0;
|
||||||
|
|
||||||
switch (libinput_event_get_type(event)) {
|
switch (libinput_event_get_type(event)) {
|
||||||
case LIBINPUT_EVENT_KEYBOARD_KEY:
|
case LIBINPUT_EVENT_KEYBOARD_KEY:
|
||||||
handle_keyboard_key(libinput_device,
|
handle_keyboard_key(libinput_device,
|
||||||
@@ -728,13 +731,27 @@ evdev_device_create(struct libinput_device *libinput_device,
|
|||||||
|
|
||||||
if (libinput_device_has_capability(libinput_device,
|
if (libinput_device_has_capability(libinput_device,
|
||||||
LIBINPUT_DEVICE_CAP_KEYBOARD)) {
|
LIBINPUT_DEVICE_CAP_KEYBOARD)) {
|
||||||
weston_seat_init_keyboard(seat, NULL);
|
if (weston_seat_init_keyboard(seat, NULL) < 0) {
|
||||||
|
free(device);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
device->seat_caps |= EVDEV_SEAT_KEYBOARD;
|
device->seat_caps |= EVDEV_SEAT_KEYBOARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (libinput_device_has_capability(libinput_device,
|
if (libinput_device_has_capability(libinput_device,
|
||||||
LIBINPUT_DEVICE_CAP_TOUCH)) {
|
LIBINPUT_DEVICE_CAP_TOUCH)) {
|
||||||
weston_seat_init_touch(seat);
|
if (weston_seat_init_touch(seat) < 0) {
|
||||||
|
/* maybe we're a keyboard + touch device thus we need
|
||||||
|
* to release the keyboard in case we couldn't make use
|
||||||
|
* of the touch */
|
||||||
|
if (device->seat_caps & EVDEV_SEAT_KEYBOARD)
|
||||||
|
weston_seat_release_keyboard(seat);
|
||||||
|
|
||||||
|
free(device);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
device->seat_caps |= EVDEV_SEAT_TOUCH;
|
device->seat_caps |= EVDEV_SEAT_TOUCH;
|
||||||
device->touch_device = create_touch_device(device);
|
device->touch_device = create_touch_device(device);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,6 +150,9 @@ device_removed(struct udev_input *input, struct libinput_device *libinput_device
|
|||||||
struct evdev_device *device;
|
struct evdev_device *device;
|
||||||
|
|
||||||
device = libinput_device_get_user_data(libinput_device);
|
device = libinput_device_get_user_data(libinput_device);
|
||||||
|
if (!device)
|
||||||
|
return;
|
||||||
|
|
||||||
evdev_device_destroy(device);
|
evdev_device_destroy(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -188,13 +188,13 @@ weston_seat_release(struct weston_seat *seat);
|
|||||||
void
|
void
|
||||||
weston_seat_send_selection(struct weston_seat *seat, struct wl_client *client);
|
weston_seat_send_selection(struct weston_seat *seat, struct wl_client *client);
|
||||||
|
|
||||||
void
|
int
|
||||||
weston_seat_init_pointer(struct weston_seat *seat);
|
weston_seat_init_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
|
int
|
||||||
weston_seat_init_touch(struct weston_seat *seat);
|
weston_seat_init_touch(struct weston_seat *seat);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user