backend/wayland: add error flow in create_wl_seat

This commit is contained in:
Mykola Orliuk 2020-10-18 19:12:01 +02:00 committed by Simon Ser
parent 36395e5b1c
commit 41bf1c6871
3 changed files with 10 additions and 3 deletions

View file

@ -105,7 +105,9 @@ static void registry_global(void *data, struct wl_registry *registry,
} else if (strcmp(iface, wl_seat_interface.name) == 0) { } else if (strcmp(iface, wl_seat_interface.name) == 0) {
struct wl_seat *wl_seat = wl_registry_bind(registry, name, struct wl_seat *wl_seat = wl_registry_bind(registry, name,
&wl_seat_interface, 5); &wl_seat_interface, 5);
create_wl_seat(wl_seat, wl); if (!create_wl_seat(wl_seat, wl)) {
wl_seat_destroy(wl_seat);
}
} else if (strcmp(iface, xdg_wm_base_interface.name) == 0) { } else if (strcmp(iface, xdg_wm_base_interface.name) == 0) {
wl->xdg_wm_base = wl_registry_bind(registry, name, wl->xdg_wm_base = wl_registry_bind(registry, name,
&xdg_wm_base_interface, 1); &xdg_wm_base_interface, 1);

View file

@ -372,12 +372,17 @@ static struct wlr_wl_input_device *get_wl_input_device_from_input_device(
return (struct wlr_wl_input_device *)wlr_dev; return (struct wlr_wl_input_device *)wlr_dev;
} }
void create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl) { bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl) {
assert(!wl->seat); // only one seat supported at the moment assert(!wl->seat); // only one seat supported at the moment
struct wlr_wl_seat *seat = calloc(1, sizeof(struct wlr_wl_seat)); struct wlr_wl_seat *seat = calloc(1, sizeof(struct wlr_wl_seat));
if (!seat) {
wlr_log_errno(WLR_ERROR, "Allocation failed");
return false;
}
seat->wl_seat = wl_seat; seat->wl_seat = wl_seat;
wl->seat = seat; wl->seat = seat;
wl_seat_add_listener(wl_seat, &seat_listener, wl); wl_seat_add_listener(wl_seat, &seat_listener, wl);
return true;
} }
void destroy_wl_seats(struct wlr_wl_backend *wl) { void destroy_wl_seats(struct wlr_wl_backend *wl) {

View file

@ -121,7 +121,7 @@ void create_wl_keyboard(struct wl_keyboard *wl_keyboard, struct wlr_wl_backend *
void create_wl_touch(struct wl_touch *wl_touch, struct wlr_wl_backend *wl); void create_wl_touch(struct wl_touch *wl_touch, struct wlr_wl_backend *wl);
struct wlr_wl_input_device *create_wl_input_device( struct wlr_wl_input_device *create_wl_input_device(
struct wlr_wl_backend *backend, enum wlr_input_device_type type); struct wlr_wl_backend *backend, enum wlr_input_device_type type);
void create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl); bool create_wl_seat(struct wl_seat *wl_seat, struct wlr_wl_backend *wl);
void destroy_wl_seats(struct wlr_wl_backend *wl); void destroy_wl_seats(struct wlr_wl_backend *wl);
extern const struct wl_seat_listener seat_listener; extern const struct wl_seat_listener seat_listener;