From 69e0902cfc36b338701f167bf310938f397122ea Mon Sep 17 00:00:00 2001 From: hujianwei Date: Thu, 17 Nov 2022 02:26:27 +0000 Subject: [PATCH] Implement wl_output version 4 * 12to11.man: * README: Update documentation. * output.c (struct _Output): Rearrange structure for alignment. (HandleBind): Send output name if necessary. (CompareOutputs): Handle name changes separately. (MakeGlobal): Support version 4 or later. (SendUpdates): Handle name changes separately. --- 12to11.man | 2 +- README | 2 +- output.c | 35 +++++++++++++++++++++++++---------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/12to11.man b/12to11.man index 9b1cac2..54e0c0d 100644 --- a/12to11.man +++ b/12to11.man @@ -260,7 +260,7 @@ following Wayland interfaces: lb lb lb n . Protocol Version -wl_output 2 +wl_output 4 wl_compositor 5 wl_shm 1 xdg_wm_base 5 diff --git a/README b/README index 2168677..928ec85 100644 --- a/README +++ b/README @@ -52,7 +52,7 @@ the "renderer" resource (class "Renderer") to "egl". The following Wayland protocols are implemented to a more-or-less complete degree: - 'wl_output', version: 2 + 'wl_output', version: 4 'wl_compositor', version: 5 'wl_shm', version: 1 'xdg_wm_base', version: 5 diff --git a/output.c b/output.c index 398fc12..ab74acd 100644 --- a/output.c +++ b/output.c @@ -39,9 +39,6 @@ struct _Output /* The output ID of this output. */ RROutput output; - /* Physical height of this output. */ - unsigned int mm_width, mm_height; - /* List of display modes. */ XLList *modes; @@ -51,15 +48,18 @@ struct _Output /* A list of resources associated with this output. */ XLList *resources; + /* The name of the output. */ + char *name; + + /* Physical height of this output. */ + unsigned int mm_width, mm_height; + /* The X and Y position of this output. */ int x, y; /* The width and height of this output. */ int width, height; - /* The name of the output. */ - char *name; - /* The transform and subpixel layout of this output. */ uint32_t transform, subpixel; @@ -83,10 +83,11 @@ enum { ModesChanged = 1, GeometryChanged = (1 << 2), + NameChanged = (1 << 3), /* N.B. that this isn't currently checked during comparisons, since the rest of the code only supports a single global scale. */ - ScaleChanged = (1 << 3), + ScaleChanged = (1 << 4), }; /* List of all outputs registered. */ @@ -271,6 +272,11 @@ HandleBind (struct wl_client *client, void *data, for (tem = output->modes; tem; tem = tem->next) SendMode (tem->data, resource); + /* Send the output name. I think it is supposed to be unique. */ + + if (wl_resource_get_version (resource) >= 3) + wl_output_send_name (resource, output->name); + if (wl_resource_get_version (resource) >= 2) wl_output_send_done (resource); @@ -530,10 +536,12 @@ CompareOutputs (Output *output, Output *other, int *flags) || output->x != other->x || output->y != other->y || output->subpixel != other->subpixel - || output->transform != other->transform - || !strcmp (output->name, other->name)) + || output->transform != other->transform) difference |= GeometryChanged; + if (strcmp (output->name, other->name)) + difference |= NameChanged; + *flags = difference; } @@ -560,7 +568,7 @@ MakeGlobal (Output *output) XLAssert (!output->global); output->global = wl_global_create (compositor.wl_display, - &wl_output_interface, 2, + &wl_output_interface, 4, output, HandleBind); if (!output->global) @@ -585,11 +593,18 @@ SendUpdates (Output *output, int difference) if (!difference) return; + /* Given a mask of differences, send the updated output information + to all clients. */ + for (tem = output->resources; tem; tem = tem->next) { if (difference & GeometryChanged) SendGeometry (output, tem->data); + if (difference & NameChanged + && wl_resource_get_version (tem->data) >= 3) + wl_output_send_name (tem->data, output->name); + if (difference & ModesChanged) { for (tem1 = output->modes; tem1; tem1 = tem->next)