From 97174913e09db464d3020c50cbf223d2fe823d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 13 Dec 2021 19:15:17 +0100 Subject: [PATCH 1/2] wayland: estimate scaled (logical) width/height, if not provided MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes us slightly more resilient against a missing XDG output interface. We use the “real” (the physical) dimensions, combined with the scaling factor, to estimate the logical dimensions. This works out correctly with non-fractional scaling, but not otherwise. --- wayland.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/wayland.c b/wayland.c index dd313813..85f00b98 100644 --- a/wayland.c +++ b/wayland.c @@ -385,13 +385,19 @@ output_update_ppi(struct monitor *mon) break; } - mon->ppi.scaled.x = mon->dim.px_scaled.width / x_inches; - mon->ppi.scaled.y = mon->dim.px_scaled.height / y_inches; + int scaled_width = mon->dim.px_scaled.width; + int scaled_height = mon->dim.px_scaled.height; - float px_diag = sqrt( - pow(mon->dim.px_scaled.width, 2) + - pow(mon->dim.px_scaled.height, 2)); + if (scaled_width == 0 && scaled_height == 0 && mon->scale > 0) { + /* Estimate scaled width/height if none has been provided */ + scaled_width = mon->dim.px_real.width / mon->scale; + scaled_height = mon->dim.px_real.height / mon->scale; + } + mon->ppi.scaled.x = scaled_width / x_inches; + mon->ppi.scaled.y = scaled_height / y_inches; + + float px_diag = sqrt(pow(scaled_width, 2) + pow(scaled_height, 2)); mon->dpi = px_diag / mon->inch * mon->scale; } From 01a417660d4a1d8d52c3fb0c8a79556623a7cc24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 13 Dec 2021 19:17:48 +0100 Subject: [PATCH 2/2] wayland: add wl_output.name() and wl_output.description() These are new in version 4 of the wl_output interface (first included in wayland-1.20). This allows us to get the name and description of the outputs, also on compositors without the XDG output interface. --- wayland.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/wayland.c b/wayland.c index 85f00b98..61e2dfdf 100644 --- a/wayland.c +++ b/wayland.c @@ -452,11 +452,38 @@ output_scale(void *data, struct wl_output *wl_output, int32_t factor) output_update_ppi(mon); } +#if defined(WL_OUTPUT_NAME_SINCE_VERSION) +static void +output_name(void *data, struct wl_output *wl_output, const char *name) +{ + struct monitor *mon = data; + free(mon->name); + mon->name = name != NULL ? xstrdup(name) : NULL; +} +#endif + +#if defined(WL_OUTPUT_DESCRIPTION_SINCE_VERSION) +static void +output_description(void *data, struct wl_output *wl_output, + const char *description) +{ + struct monitor *mon = data; + free(mon->description); + mon->description = description != NULL ? xstrdup(description) : NULL; +} +#endif + static const struct wl_output_listener output_listener = { .geometry = &output_geometry, .mode = &output_mode, .done = &output_done, .scale = &output_scale, +#if defined(WL_OUTPUT_NAME_SINCE_VERSION) + .name = &output_name, +#endif +#if defined(WL_OUTPUT_DESCRIPTION_SINCE_VERSION) + .description = &output_description, +#endif }; static void @@ -970,7 +997,7 @@ handle_global(void *data, struct wl_registry *registry, return; struct wl_output *output = wl_registry_bind( - wayl->registry, name, &wl_output_interface, min(version, 3)); + wayl->registry, name, &wl_output_interface, min(version, 4)); tll_push_back( wayl->monitors,