wayland output: add error handling for xdg shell

Note that this does not go on to the next backend, because
attempt_wl_backend does not check if we have any output created.

We cannot test simply because (right now) a run of our examples will go
in this function twice, the first of which will (rightly?) return no
display but needs to return backend creation success.
master
Dominique Martinet 7 years ago
parent 577d2f6fcd
commit 4f3d21c3ff

@ -137,7 +137,8 @@ static void wlr_wl_output_destroy(struct wlr_output *_output) {
} }
eglDestroySurface(output->backend->egl.display, output->surface); eglDestroySurface(output->backend->egl.display, output->surface);
wl_egl_window_destroy(output->egl_window); wl_egl_window_destroy(output->egl_window);
// xdg_surface/toplevel destroy zxdg_toplevel_v6_destroy(output->xdg_toplevel);
zxdg_surface_v6_destroy(output->xdg_surface);
wl_surface_destroy(output->surface); wl_surface_destroy(output->surface);
free(output); free(output);
} }
@ -230,12 +231,23 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
output->backend = backend; output->backend = backend;
// TODO: error handling
output->surface = wl_compositor_create_surface(backend->compositor); output->surface = wl_compositor_create_surface(backend->compositor);
if (!output->surface) {
wlr_log_errno(L_ERROR, "Could not create output surface");
goto error;
}
output->xdg_surface = output->xdg_surface =
zxdg_shell_v6_get_xdg_surface(backend->shell, output->surface); zxdg_shell_v6_get_xdg_surface(backend->shell, output->surface);
if (!output->xdg_surface) {
wlr_log_errno(L_ERROR, "Could not get xdg surface");
goto error;
}
output->xdg_toplevel = output->xdg_toplevel =
zxdg_surface_v6_get_toplevel(output->xdg_surface); zxdg_surface_v6_get_toplevel(output->xdg_surface);
if (!output->xdg_toplevel) {
wlr_log_errno(L_ERROR, "Could not get xdg toplevel");
goto error;
}
// class? app_id? // class? app_id?
zxdg_toplevel_v6_set_title(output->xdg_toplevel, "sway-wl"); zxdg_toplevel_v6_set_title(output->xdg_toplevel, "sway-wl");
@ -253,8 +265,7 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
output->egl_surface, output->egl_surface, output->egl_surface, output->egl_surface,
output->backend->egl.context)) { output->backend->egl.context)) {
wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error()); wlr_log(L_ERROR, "eglMakeCurrent failed: %s", egl_error());
free(output); goto error;
return NULL;
} }
glViewport(0, 0, wlr_output->width, wlr_output->height); glViewport(0, 0, wlr_output->width, wlr_output->height);
@ -266,16 +277,18 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *_backend) {
if (!eglSwapBuffers(output->backend->egl.display, output->egl_surface)) { if (!eglSwapBuffers(output->backend->egl.display, output->egl_surface)) {
wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error()); wlr_log(L_ERROR, "eglSwapBuffers failed: %s", egl_error());
free(output); goto error;
return NULL;
} }
if (list_add(backend->outputs, wlr_output) == -1) { if (list_add(backend->outputs, wlr_output) == -1) {
wlr_log(L_ERROR, "Allocation failed"); wlr_log(L_ERROR, "Allocation failed");
free(output); goto error;
return NULL;
} }
wlr_output_create_global(wlr_output, backend->local_display); wlr_output_create_global(wlr_output, backend->local_display);
wl_signal_emit(&backend->backend.events.output_add, wlr_output); wl_signal_emit(&backend->backend.events.output_add, wlr_output);
return wlr_output; return wlr_output;
error:
wlr_output_destroy(&output->wlr_output);
return NULL;
} }

Loading…
Cancel
Save