[PATCH xwayland 2/2] xwayland: check if creating output succeeded
Olivier Fourdan
ofourdan at redhat.com
Mon Nov 23 05:31:39 PST 2015
Hi Marek,
----- Original Message -----
> check return values of RR.*Create calls and
> check if we added any output
>
> Signed-off-by: Marek Chalupa <mchqwerty at gmail.com>
> ---
> hw/xwayland/xwayland-output.c | 23 +++++++++++++++++++++++
> hw/xwayland/xwayland.c | 10 ++++++++--
> 2 files changed, 31 insertions(+), 2 deletions(-)
>
> diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
> index 5ef444d..178105c 100644
> --- a/hw/xwayland/xwayland-output.c
> +++ b/hw/xwayland/xwayland-output.c
> @@ -248,6 +248,11 @@ xwl_output_create(struct xwl_screen *xwl_screen,
> uint32_t id)
>
> xwl_output->output = wl_registry_bind(xwl_screen->registry, id,
> &wl_output_interface, 2);
> + if (!xwl_output->output) {
> + ErrorF("Failed binding wl_output\n");
> + goto err;
> + }
> +
> xwl_output->server_output_id = id;
> wl_output_add_listener(xwl_output->output, &output_listener,
> xwl_output);
>
> @@ -255,13 +260,31 @@ xwl_output_create(struct xwl_screen *xwl_screen,
> uint32_t id)
>
> xwl_output->xwl_screen = xwl_screen;
> xwl_output->randr_crtc = RRCrtcCreate(xwl_screen->screen, xwl_output);
> + if (!xwl_output->randr_crtc) {
> + ErrorF("Failed creating RandR CRTC\n");
> + goto err;
> + }
> +
> xwl_output->randr_output = RROutputCreate(xwl_screen->screen, name,
> strlen(name), xwl_output);
> + if (!xwl_output->randr_output) {
> + ErrorF("Failed creating RandR Output\n");
> + goto err;
> + }
> +
> RRCrtcGammaSetSize(xwl_output->randr_crtc, 256);
> RROutputSetCrtcs(xwl_output->randr_output, &xwl_output->randr_crtc, 1);
> RROutputSetConnection(xwl_output->randr_output, RR_Connected);
>
> return xwl_output;
> +
> +err:
> + if (xwl_output->randr_crtc)
> + RRCrtcDestroy(xwl_output->randr_crtc);
> + if (xwl_output->output)
> + wl_output_destroy(xwl_output->output);
> + free(xwl_output);
> + return NULL;
> }
>
> void
> diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
> index 56b03f6..2d57826 100644
> --- a/hw/xwayland/xwayland.c
> +++ b/hw/xwayland/xwayland.c
> @@ -397,8 +397,8 @@ registry_global(void *data, struct wl_registry *registry,
> uint32_t id,
> wl_registry_bind(registry, id, &wl_shell_interface, 1);
> }
> else if (strcmp(interface, "wl_output") == 0 && version >= 2) {
> - xwl_output_create(xwl_screen, id);
> - xwl_screen->expecting_event++;
> + if (xwl_output_create(xwl_screen, id))
> + xwl_screen->expecting_event++;
> }
> #ifdef GLAMOR_HAS_GBM
> else if (xwl_screen->glamor &&
> @@ -599,6 +599,12 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char
> **argv)
> while (xwl_screen->expecting_event > 0)
> wl_display_roundtrip(xwl_screen->display);
>
> + /* check if we have any output */
> + if (xorg_list_is_empty(&xwl_screen->output_list)) {
> + ErrorF("xwayland: Do not have any output");
> + return FALSE;
> + }
> +
Do we really have to fail if there is no output?
Would it be possible that a Wayland compositor starts Xwayland before creating/adding the outputs?
And what if all outputs get "hot-unplugged" later, should we bail out as well?
> bpc = xwl_screen->depth / 3;
> green_bpc = xwl_screen->depth - 2 * bpc;
> blue_mask = (1 << bpc) - 1;
Cheers,
Olivier
More information about the xorg-devel
mailing list