[PATCH weston 1/2] compositor-wayland: Refactor struct wayland_output::name usage
Quentin Glidic
sardemff7+wayland at sardemff7.net
Fri Mar 24 19:24:14 UTC 2017
On 3/24/17 7:53 PM, Sergi Granell wrote:
> struct wayland_output::name was used but never initialized.
> Also zxdg_toplevel_v6_set_title was only called for windowed outputs,
> and some compositors let you see the client's name even when it is
> fullscreen (GNOME Shell's Activities menu for example).
>
> So rename struct wayland_output::name to struct wayland_output::title and
> precompute it on wayland_output_create_common(), so it can be later used
> on xdg's set_title and frame_create.
>
> Signed-off-by: Sergi Granell <xerpi.g.12 at gmail.com>
One thing to fix (see inline), then I’ll push it.
> ---
> libweston/compositor-wayland.c | 67 +++++++++++++++++++-----------------------
> 1 file changed, 30 insertions(+), 37 deletions(-)
>
> diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
> index ebdbd13b..41834692 100644
> --- a/libweston/compositor-wayland.c
> +++ b/libweston/compositor-wayland.c
> @@ -111,7 +111,7 @@ struct wayland_output {
>
> int keyboard_count;
>
> - char *name;
> + char *title;
> struct frame *frame;
>
> struct {
> @@ -708,6 +708,7 @@ wayland_output_destroy(struct weston_output *base)
> if (output->frame_cb)
> wl_callback_destroy(output->frame_cb);
>
> + free(output->title);
> free(output);
> }
>
> @@ -835,36 +836,17 @@ wayland_output_set_windowed(struct wayland_output *output)
> {
> struct wayland_backend *b =
> to_wayland_backend(output->base.compositor);
> - int tlen;
> - char *title;
>
> if (output->frame)
> return 0;
>
> - if (output->name) {
> - tlen = strlen(output->name) + strlen(WINDOW_TITLE " - ");
> - title = malloc(tlen + 1);
> - if (!title)
> - return -1;
> -
> - snprintf(title, tlen + 1, WINDOW_TITLE " - %s", output->name);
> - } else {
> - title = strdup(WINDOW_TITLE);
> - }
> -
> - if (output->parent.xdg_toplevel)
> - zxdg_toplevel_v6_set_title(output->parent.xdg_toplevel, title);
> -
> if (!b->theme) {
> b->theme = theme_create();
> - if (!b->theme) {
> - free(title);
> + if (!b->theme)
> return -1;
> - }
> }
> output->frame = frame_create(b->theme, 100, 100,
> - FRAME_BUTTON_CLOSE, title);
> - free(title);
> + FRAME_BUTTON_CLOSE, output->title);
> if (!output->frame)
> return -1;
>
> @@ -1139,6 +1121,8 @@ wayland_backend_create_output_surface(struct wayland_output *output)
> while (output->parent.wait_for_configure)
> wl_display_dispatch(b->parent.wl_display);
>
> + zxdg_toplevel_v6_set_title(output->parent.xdg_toplevel, output->title);
> +
Move it *before* the first wl_surface_commit(). If you don’t, the parent
compositor has no info to match against for the first configure.
Also, you could send a follow-up patch to set the app_id too. :-)
Thanks,
> weston_log("wayland-backend: Using xdg_shell_v6\n");
> }
> else if (b->parent.shell) {
> @@ -1239,9 +1223,13 @@ err_output:
> }
>
> static struct wayland_output *
> -wayland_output_create_common(void)
> +wayland_output_create_common(const char *name)
> {
> struct wayland_output *output;
> + size_t len;
> +
> + /* name can't be NULL. */
> + assert(name);
>
> output = zalloc(sizeof *output);
> if (output == NULL) {
> @@ -1252,6 +1240,18 @@ wayland_output_create_common(void)
> output->base.destroy = wayland_output_destroy;
> output->base.disable = wayland_output_disable;
> output->base.enable = wayland_output_enable;
> + output->base.name = strdup(name);
> +
> + /* setup output name/title. */
> + len = strlen(WINDOW_TITLE " - ") + strlen(name) + 1;
> + output->title = zalloc(len);
> + if (!output->title) {
> + free(output->base.name);
> + free(output);
> + return NULL;
> + }
> +
> + snprintf(output->title, len, WINDOW_TITLE " - %s", name);
>
> return output;
> }
> @@ -1259,12 +1259,7 @@ wayland_output_create_common(void)
> static int
> wayland_output_create(struct weston_compositor *compositor, const char *name)
> {
> - struct wayland_output *output = wayland_output_create_common();
> -
> - /* name can't be NULL. */
> - assert(name);
> -
> - output->base.name = strdup(name);
> + struct wayland_output *output = wayland_output_create_common(name);
>
> weston_output_init(&output->base, compositor);
> weston_compositor_add_pending_output(&output->base, compositor);
> @@ -1324,11 +1319,9 @@ static int
> wayland_output_create_for_parent_output(struct wayland_backend *b,
> struct wayland_parent_output *poutput)
> {
> - struct wayland_output *output = wayland_output_create_common();
> + struct wayland_output *output = wayland_output_create_common("wlparent");
> struct weston_mode *mode;
>
> - output->base.name = strdup("wlparent");
> -
> if (poutput->current_mode) {
> mode = poutput->current_mode;
> } else if (poutput->preferred_mode) {
> @@ -1364,7 +1357,8 @@ wayland_output_create_for_parent_output(struct wayland_backend *b,
> return 0;
>
> out:
> - free(output->name);
> + free(output->base.name);
> + free(output->title);
> free(output);
>
> return -1;
> @@ -1373,11 +1367,9 @@ out:
> static int
> wayland_output_create_fullscreen(struct wayland_backend *b)
> {
> - struct wayland_output *output = wayland_output_create_common();
> + struct wayland_output *output = wayland_output_create_common("wayland-fullscreen");
> int width = 0, height = 0;
>
> - output->base.name = strdup("wayland-fullscreen");
> -
> weston_output_init(&output->base, b->compositor);
>
> output->base.scale = 1;
> @@ -1411,7 +1403,8 @@ wayland_output_create_fullscreen(struct wayland_backend *b)
> err_set_size:
> wayland_backend_destroy_output_surface(output);
> err_surface:
> - free(output->name);
> + free(output->base.name);
> + free(output->title);
> free(output);
>
> return -1;
>
--
Quentin “Sardem FF7” Glidic
More information about the wayland-devel
mailing list