From 36a2b19485ad299ee0039eb97c0f688d68205539 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 9 Dec 2021 15:43:19 +0100 Subject: [PATCH] output: introduce wlr_output_set_name wlroots picks names for all outputs, but it might be desirable for compositor to override it. For instance, Sway will use a headless output as a fallback in case no outputs are connected. Sway wants to clearly label the fallback output as such and label "real" headless outputs starting from HEADLESS-1. --- backend/drm/drm.c | 3 +-- backend/headless/output.c | 6 ++++-- backend/wayland/output.c | 6 ++++-- backend/x11/output.c | 6 ++++-- include/wlr/types/wlr_output.h | 13 ++++++++++++- types/output/output.c | 8 ++++++++ 6 files changed, 33 insertions(+), 9 deletions(-) diff --git a/backend/drm/drm.c b/backend/drm/drm.c index d7c532316..1a46b4959 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -1299,8 +1299,7 @@ void scan_drm_connectors(struct wlr_drm_backend *drm, wlr_output_init(&wlr_conn->output, &drm->backend, &output_impl, drm->display); - memcpy(wlr_conn->output.name, wlr_conn->name, - sizeof(wlr_conn->output.name)); + wlr_output_set_name(&wlr_conn->output, wlr_conn->name); wlr_conn->output.phys_width = drm_conn->mmWidth; wlr_conn->output.phys_height = drm_conn->mmHeight; diff --git a/backend/headless/output.c b/backend/headless/output.c index 50d914e44..fbec8110a 100644 --- a/backend/headless/output.c +++ b/backend/headless/output.c @@ -116,8 +116,10 @@ struct wlr_output *wlr_headless_add_output(struct wlr_backend *wlr_backend, output_set_custom_mode(output, width, height, 0); strncpy(wlr_output->make, "headless", sizeof(wlr_output->make)); strncpy(wlr_output->model, "headless", sizeof(wlr_output->model)); - snprintf(wlr_output->name, sizeof(wlr_output->name), "HEADLESS-%zd", - ++backend->last_output_num); + + char name[64]; + snprintf(name, sizeof(name), "HEADLESS-%zd", ++backend->last_output_num); + wlr_output_set_name(wlr_output, name); char description[128]; snprintf(description, sizeof(description), diff --git a/backend/wayland/output.c b/backend/wayland/output.c index 3fa86a3cf..27195592d 100644 --- a/backend/wayland/output.c +++ b/backend/wayland/output.c @@ -520,8 +520,10 @@ struct wlr_output *wlr_wl_output_create(struct wlr_backend *wlr_backend) { wlr_output_update_custom_mode(wlr_output, 1280, 720, 0); strncpy(wlr_output->make, "wayland", sizeof(wlr_output->make)); strncpy(wlr_output->model, "wayland", sizeof(wlr_output->model)); - snprintf(wlr_output->name, sizeof(wlr_output->name), "WL-%zd", - ++backend->last_output_num); + + char name[64]; + snprintf(name, sizeof(name), "WL-%zd", ++backend->last_output_num); + wlr_output_set_name(wlr_output, name); char description[128]; snprintf(description, sizeof(description), diff --git a/backend/x11/output.c b/backend/x11/output.c index 9081769e3..25194e708 100644 --- a/backend/x11/output.c +++ b/backend/x11/output.c @@ -512,8 +512,10 @@ struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) { wlr_output_update_custom_mode(wlr_output, 1024, 768, 0); - snprintf(wlr_output->name, sizeof(wlr_output->name), "X11-%zd", - ++x11->last_output_num); + char name[64]; + snprintf(name, sizeof(name), "X11-%zd", ++x11->last_output_num); + wlr_output_set_name(wlr_output, name); + parse_xcb_setup(wlr_output, x11->xcb); char description[128]; diff --git a/include/wlr/types/wlr_output.h b/include/wlr/types/wlr_output.h index fd8e65563..791023d2e 100644 --- a/include/wlr/types/wlr_output.h +++ b/include/wlr/types/wlr_output.h @@ -118,7 +118,7 @@ struct wlr_output { struct wl_global *global; struct wl_list resources; - char name[24]; + char *name; char *description; // may be NULL char make[56]; char model[16]; @@ -336,6 +336,17 @@ void wlr_output_set_render_format(struct wlr_output *output, uint32_t format); void wlr_output_set_scale(struct wlr_output *output, float scale); void wlr_output_set_subpixel(struct wlr_output *output, enum wl_output_subpixel subpixel); +/** + * Set the output name. + * + * Output names are subject to the following rules: + * + * - Each output name must be unique. + * - The name cannot change after the output has been advertised to clients. + * + * For more details, see the protocol documentation for wl_output.name. + */ +void wlr_output_set_name(struct wlr_output *output, const char *name); void wlr_output_set_description(struct wlr_output *output, const char *desc); /** * Schedule a done event. diff --git a/types/output/output.c b/types/output/output.c index 9a715d120..91a45f131 100644 --- a/types/output/output.c +++ b/types/output/output.c @@ -324,6 +324,13 @@ void wlr_output_set_subpixel(struct wlr_output *output, wlr_output_schedule_done(output); } +void wlr_output_set_name(struct wlr_output *output, const char *name) { + assert(output->global == NULL); + + free(output->name); + output->name = strdup(name); +} + void wlr_output_set_description(struct wlr_output *output, const char *desc) { if (output->description != NULL && desc != NULL && strcmp(output->description, desc) == 0) { @@ -420,6 +427,7 @@ void wlr_output_destroy(struct wlr_output *output) { wl_event_source_remove(output->idle_done); } + free(output->name); free(output->description); pixman_region32_fini(&output->pending.damage);