From b7965e9a46f79c3788733e29c6f3174d765530ec Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Fri, 27 Jun 2025 11:20:48 +0200 Subject: [PATCH 1/2] output: Have output_get_identifier take a wlr_output We only use wlr_output fields to generate the identifier, and a later commit will use this function before a sway_output is constructed. --- include/sway/config.h | 2 +- sway/commands/output.c | 2 +- sway/config/output.c | 7 +++---- sway/desktop/output.c | 2 +- sway/tree/workspace.c | 6 +++--- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/include/sway/config.h b/include/sway/config.h index bb770c6f7..58d799245 100644 --- a/include/sway/config.h +++ b/include/sway/config.h @@ -680,7 +680,7 @@ struct seat_config *store_seat_config(struct seat_config *seat); int output_name_cmp(const void *item, const void *data); void output_get_identifier(char *identifier, size_t len, - struct sway_output *output); + struct wlr_output *output); const char *sway_output_scale_filter_to_string(enum scale_filter_mode scale_filter); diff --git a/sway/commands/output.c b/sway/commands/output.c index 9d58413f2..e86af756f 100644 --- a/sway/commands/output.c +++ b/sway/commands/output.c @@ -65,7 +65,7 @@ struct cmd_results *cmd_output(int argc, char **argv) { output = new_output_config(sway_output->wlr_output->name); } else { char identifier[128]; - output_get_identifier(identifier, 128, sway_output); + output_get_identifier(identifier, 128, sway_output->wlr_output); output = new_output_config(identifier); } } else { diff --git a/sway/config/output.c b/sway/config/output.c index df80cab64..f697f644c 100644 --- a/sway/config/output.c +++ b/sway/config/output.c @@ -29,8 +29,7 @@ #endif void output_get_identifier(char *identifier, size_t len, - struct sway_output *output) { - struct wlr_output *wlr_output = output->wlr_output; + struct wlr_output *wlr_output) { snprintf(identifier, len, "%s %s %s", wlr_output->make ? wlr_output->make : "Unknown", wlr_output->model ? wlr_output->model : "Unknown", @@ -238,7 +237,7 @@ void store_output_config(struct output_config *oc) { char id[128]; if (output) { - output_get_identifier(id, sizeof(id), output); + output_get_identifier(id, sizeof(id), output->wlr_output); } for (int i = 0; i < config->output_configs->length; i++) { @@ -586,7 +585,7 @@ static struct output_config *find_output_config_from_list( } char id[128]; - output_get_identifier(id, sizeof(id), sway_output); + output_get_identifier(id, sizeof(id), sway_output->wlr_output); // We take a new config and merge on top, in order, the wildcard config, // output config by name, and output config by identifier to form the final diff --git a/sway/desktop/output.c b/sway/desktop/output.c index eeb203ffc..7c725bcec 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -47,7 +47,7 @@ bool output_match_name_or_id(struct sway_output *output, } char identifier[128]; - output_get_identifier(identifier, sizeof(identifier), output); + output_get_identifier(identifier, sizeof(identifier), output->wlr_output); return strcasecmp(identifier, name_or_id) == 0 || strcasecmp(output->wlr_output->name, name_or_id) == 0; } diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 44256bcff..a7964110f 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -615,7 +615,7 @@ static int find_output(const void *id1, const void *id2) { static int workspace_output_get_priority(struct sway_workspace *ws, struct sway_output *output) { char identifier[128]; - output_get_identifier(identifier, sizeof(identifier), output); + output_get_identifier(identifier, sizeof(identifier), output->wlr_output); int index_id = list_seq_find(ws->output_priority, find_output, identifier); int index_name = list_seq_find(ws->output_priority, find_output, output->wlr_output->name); @@ -632,7 +632,7 @@ void workspace_output_raise_priority(struct sway_workspace *ws, int new_index = workspace_output_get_priority(ws, output); if (new_index < 0) { char identifier[128]; - output_get_identifier(identifier, sizeof(identifier), output); + output_get_identifier(identifier, sizeof(identifier), output->wlr_output); list_insert(ws->output_priority, old_index, strdup(identifier)); } else if (new_index > old_index) { char *name = ws->output_priority->items[new_index]; @@ -645,7 +645,7 @@ void workspace_output_add_priority(struct sway_workspace *workspace, struct sway_output *output) { if (workspace_output_get_priority(workspace, output) < 0) { char identifier[128]; - output_get_identifier(identifier, sizeof(identifier), output); + output_get_identifier(identifier, sizeof(identifier), output->wlr_output); list_add(workspace->output_priority, strdup(identifier)); } } From 273c1224cf8a01be756800bde0a9af0c4e587529 Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Fri, 27 Jun 2025 11:22:02 +0200 Subject: [PATCH 2/2] output: Log output information when connected The only logging we currently provide about outputs is debug logging from wlroots about available modes, tested output states and errors applying it. Be more informative by logging some output details at INFO level when they pop up, including optional features like HDR and adaptive sync. This makes such output details more obvious from a quick glance, both for users and in case logs are shared for support. --- sway/desktop/output.c | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/sway/desktop/output.c b/sway/desktop/output.c index 7c725bcec..8a7669098 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -523,6 +523,39 @@ static void handle_request_state(struct wl_listener *listener, void *data) { force_modeset(); } +static void dump_output(struct wlr_output *output) { + bool supports_bt2020 = output->supported_primaries & + WLR_COLOR_NAMED_PRIMARIES_BT2020; + bool supports_pq = output->supported_transfer_functions & + WLR_COLOR_TRANSFER_FUNCTION_ST2084_PQ; + bool supports_color_transform = + server.renderer->features.output_color_transform; + + const char *hdr_support = "yes"; + if (!supports_bt2020 && !supports_pq) { + hdr_support = "no"; + } else if (supports_bt2020 && supports_pq && !supports_color_transform) { + hdr_support = "no (missing renderer color transform support)"; + } else if (!supports_bt2020) { + hdr_support = "no (missing BT2020 primaries)"; + } else if (!supports_pq) { + hdr_support = "no (missing PQ transfer function)"; + } + + char id[128]; + output_get_identifier(id, sizeof(id), output); + + sway_log(SWAY_INFO, "New output: %s", output->name); + sway_log(SWAY_INFO, " Identifier: %s", id); + sway_log(SWAY_INFO, " Dimensions: %dmm x %dmm", + output->phys_width, output->phys_height); + sway_log(SWAY_INFO, " Non-desktop: %s", + output->non_desktop ? "yes" : "no"); + sway_log(SWAY_INFO, " Adaptive sync support: %s", + output->adaptive_sync_supported ? "yes" : "no"); + sway_log(SWAY_INFO, " HDR support: %s", hdr_support); +} + static unsigned int last_headless_num = 0; void handle_new_output(struct wl_listener *listener, void *data) { @@ -539,8 +572,7 @@ void handle_new_output(struct wl_listener *listener, void *data) { wlr_output_set_name(wlr_output, name); } - sway_log(SWAY_DEBUG, "New output %p: %s (non-desktop: %d)", - wlr_output, wlr_output->name, wlr_output->non_desktop); + dump_output(wlr_output); if (wlr_output->non_desktop) { sway_log(SWAY_DEBUG, "Not configuring non-desktop output");