[PATCH weston v2] xwm: set the shell_surface's title

Axel Davy davy at clipper.ens.fr
Sun Sep 15 01:08:51 PDT 2013


This patch makes XWayland often crash for me.

Axel Davy

Le 11/09/2013 18:20, Giulio Camuffo a écrit :
> add a new function pointer to the weston_shell_interface struct that
> shells will set accordingly.
> ---
>   src/compositor.h              |  2 ++
>   src/shell.c                   | 11 +++++++++--
>   src/xwayland/window-manager.c | 11 +++++++++++
>   3 files changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/src/compositor.h b/src/compositor.h
> index 3c1b643..ead0c91 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -107,6 +107,8 @@ struct weston_shell_interface {
>   	int (*move)(struct shell_surface *shsurf, struct weston_seat *ws);
>   	int (*resize)(struct shell_surface *shsurf,
>   		      struct weston_seat *ws, uint32_t edges);
> +	void (*set_title)(struct shell_surface *shsurf,
> +	                  const char *title);
>
>   };
>
> diff --git a/src/shell.c b/src/shell.c
> index dc15bfa..ea4315a 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -1595,13 +1595,19 @@ shell_surface_pong(struct wl_client *client, struct wl_resource *resource,
>   }
>
>   static void
> +set_title(struct shell_surface *shsurf, const char *title)
> +{
> +	free(shsurf->title);
> +	shsurf->title = strdup(title);
> +}
> +
> +static void
>   shell_surface_set_title(struct wl_client *client,
>   			struct wl_resource *resource, const char *title)
>   {
>   	struct shell_surface *shsurf = wl_resource_get_user_data(resource);
>
> -	free(shsurf->title);
> -	shsurf->title = strdup(title);
> +	set_title(shsurf, title);
>   }
>
>   static void
> @@ -4583,6 +4589,7 @@ module_init(struct weston_compositor *ec,
>   	ec->shell_interface.set_xwayland = set_xwayland;
>   	ec->shell_interface.move = surface_move;
>   	ec->shell_interface.resize = surface_resize;
> +	ec->shell_interface.set_title = set_title;
>
>   	wl_list_init(&shell->input_panel.surfaces);
>
> diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
> index f775734..b4f64d3 100644
> --- a/src/xwayland/window-manager.c
> +++ b/src/xwayland/window-manager.c
> @@ -363,6 +363,8 @@ static void
>   weston_wm_window_read_properties(struct weston_wm_window *window)
>   {
>   	struct weston_wm *wm = window->wm;
> +	struct weston_shell_interface *shell_interface =
> +		&wm->server->compositor->shell_interface;
>
>   #define F(field) offsetof(struct weston_wm_window, field)
>   	const struct {
> @@ -468,6 +470,9 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
>   		}
>   		free(reply);
>   	}
> +
> +	if (window->shsurf && window->name)
> +		shell_interface->set_title(window->shsurf, window->name);
>   }
>
>   static void
> @@ -1875,6 +1880,9 @@ surface_destroy(struct wl_listener *listener, void *data)
>
>   	wm_log("surface for xid %d destroyed\n", window->id);
>
> +	/* This should have been freed by the shell.
> +       Don't try to use it later. */
> +	window->shsurf = NULL;
>   	window->surface = NULL;
>   }
>
> @@ -2029,6 +2037,9 @@ xserver_map_shell_surface(struct weston_wm *wm,
>   						      window->surface,
>   						      &shell_client);
>
> +	if (window->name)
> +		shell_interface->set_title(window->shsurf, window->name);
> +
>   	if (window->fullscreen) {
>   		window->saved_width = window->width;
>   		window->saved_height = window->height;





More information about the wayland-devel mailing list