[PATCH weston v2] compositor-wayland: Port to xdg-shell-v6

Armin Krezović krezovic.armin at gmail.com
Mon Nov 21 18:01:55 UTC 2016


On 21.11.2016 18:42, Armin Krezović wrote:
> v2:
> 
>  - Keep wl_shell code around until xdg_shell is declared stable.
> 
> Signed-off-by: Armin Krezović <krezovic.armin at gmail.com>

I hereby agree that the following changes can be merged as part of this patch:

https://phabricator.freedesktop.org/P6

> ---
>  Makefile.am                    |   8 ++-
>  libweston/compositor-wayland.c | 146 +++++++++++++++++++++++++++++++++++++----
>  2 files changed, 139 insertions(+), 15 deletions(-)
> 
> diff --git a/Makefile.am b/Makefile.am
> index b08ce71..b90c4c8 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -391,9 +391,11 @@ wayland_backend_la_CFLAGS =			\
>  	$(CAIRO_CFLAGS)				\
>  	$(WAYLAND_COMPOSITOR_CFLAGS)		\
>  	$(AM_CFLAGS)
> -wayland_backend_la_SOURCES = 			\
> -	libweston/compositor-wayland.c		\
> -	libweston/compositor-wayland.h		\
> +wayland_backend_la_SOURCES = 					\
> +	libweston/compositor-wayland.c				\
> +	libweston/compositor-wayland.h				\
> +	protocol/xdg-shell-unstable-v6-protocol.c		\
> +	protocol/xdg-shell-unstable-v6-client-protocol.h	\
>  	shared/helpers.h
>  nodist_wayland_backend_la_SOURCES =			\
>  	protocol/fullscreen-shell-unstable-v1-protocol.c		\
> diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
> index 775da25..6ac11eb 100644
> --- a/libweston/compositor-wayland.c
> +++ b/libweston/compositor-wayland.c
> @@ -51,6 +51,7 @@
>  #include "shared/os-compatibility.h"
>  #include "shared/cairo-util.h"
>  #include "fullscreen-shell-unstable-v1-client-protocol.h"
> +#include "xdg-shell-unstable-v6-client-protocol.h"
>  #include "presentation-time-server-protocol.h"
>  #include "linux-dmabuf.h"
>  #include "windowed-output-api.h"
> @@ -66,6 +67,7 @@ struct wayland_backend {
>  		struct wl_registry *registry;
>  		struct wl_compositor *compositor;
>  		struct wl_shell *shell;
> +		struct zxdg_shell_v6 *xdg_shell;
>  		struct zwp_fullscreen_shell_v1 *fshell;
>  		struct wl_shm *shm;
>  
> @@ -98,7 +100,10 @@ struct wayland_output {
>  		uint32_t global_id;
>  
>  		struct wl_shell_surface *shell_surface;
> +		struct zxdg_surface_v6 *xdg_surface;
> +		struct zxdg_toplevel_v6 *xdg_toplevel;
>  		int configure_width, configure_height;
> +		bool wait_for_configure;
>  	} parent;
>  
>  	int keyboard_count;
> @@ -623,6 +628,12 @@ wayland_output_repaint_pixman(struct weston_output *output_base,
>  static void
>  wayland_backend_destroy_output_surface(struct wayland_output *output)
>  {
> +	if (output->parent.xdg_toplevel)
> +		zxdg_toplevel_v6_destroy(output->parent.xdg_toplevel);
> +
> +	if (output->parent.xdg_surface)
> +		zxdg_surface_v6_destroy(output->parent.xdg_surface);
> +
>  	if (output->parent.shell_surface)
>  		wl_shell_surface_destroy(output->parent.shell_surface);
>  
> @@ -822,6 +833,9 @@ wayland_output_set_windowed(struct wayland_output *output)
>  		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) {
> @@ -840,7 +854,8 @@ wayland_output_set_windowed(struct wayland_output *output)
>  
>  	wayland_output_resize_surface(output);
>  
> -	wl_shell_surface_set_toplevel(output->parent.shell_surface);
> +	if (output->parent.shell_surface)
> +		wl_shell_surface_set_toplevel(output->parent.shell_surface);
>  
>  	return 0;
>  }
> @@ -860,7 +875,9 @@ wayland_output_set_fullscreen(struct wayland_output *output,
>  
>  	wayland_output_resize_surface(output);
>  
> -	if (output->parent.shell_surface) {
> +	if (output->parent.xdg_toplevel) {
> +		zxdg_toplevel_v6_set_fullscreen(output->parent.xdg_toplevel, target);
> +	} else if (output->parent.shell_surface) {
>  		wl_shell_surface_set_fullscreen(output->parent.shell_surface,
>  						method, framerate, target);
>  	} else if (b->parent.fshell) {
> @@ -961,7 +978,7 @@ wayland_output_switch_mode(struct weston_output *output_base,
>  
>  	b = to_wayland_backend(output_base->compositor);
>  
> -	if (output->parent.shell_surface || !b->parent.fshell)
> +	if (output->parent.xdg_surface || output->parent.shell_surface || !b->parent.fshell)
>  		return -1;
>  
>  	mode = wayland_output_choose_mode(output, mode);
> @@ -1033,6 +1050,41 @@ err_output:
>  	return -1;
>  }
>  
> +static void
> +handle_xdg_surface_configure(void *data, struct zxdg_surface_v6 *surface,
> +			 uint32_t serial)
> +{
> +	zxdg_surface_v6_ack_configure(surface, serial);
> +}
> +
> +static const struct zxdg_surface_v6_listener xdg_surface_listener = {
> +	handle_xdg_surface_configure
> +};
> +
> +static void
> +handle_xdg_toplevel_configure(void *data, struct zxdg_toplevel_v6 *toplevel,
> +			  int32_t width, int32_t height,
> +			  struct wl_array *states)
> +{
> +	struct wayland_output *output = data;
> +
> +	output->parent.configure_width = width;
> +	output->parent.configure_height = height;
> +
> +	output->parent.wait_for_configure = false;
> +	/* FIXME: implement resizing */
> +}
> +
> +static void
> +handle_xdg_toplevel_close(void *data, struct zxdg_toplevel_v6 *xdg_toplevel)
> +{
> +}
> +
> +static const struct zxdg_toplevel_v6_listener xdg_toplevel_listener = {
> +	handle_xdg_toplevel_configure,
> +	handle_xdg_toplevel_close,
> +};
> +
>  static int
>  wayland_backend_create_output_surface(struct wayland_output *output)
>  {
> @@ -1047,7 +1099,40 @@ wayland_backend_create_output_surface(struct wayland_output *output)
>  
>  	output->parent.draw_initial_frame = true;
>  
> -	if (b->parent.shell) {
> +	if (b->parent.xdg_shell) {
> +		output->parent.xdg_surface =
> +			zxdg_shell_v6_get_xdg_surface(b->parent.xdg_shell,
> +						      output->parent.surface);
> +		if (!output->parent.xdg_surface) {
> +			wl_surface_destroy(output->parent.surface);
> +			return -1;
> +		}
> +
> +		zxdg_surface_v6_add_listener(output->parent.xdg_surface,
> +					     &xdg_surface_listener, output);
> +
> +		output->parent.xdg_toplevel =
> +			zxdg_surface_v6_get_toplevel(output->parent.xdg_surface);
> +
> +		if (!output->parent.xdg_toplevel) {
> +			zxdg_surface_v6_destroy(output->parent.xdg_surface);
> +			wl_surface_destroy(output->parent.surface);
> +			return -1;
> +		}
> +
> +		zxdg_toplevel_v6_add_listener(output->parent.xdg_toplevel,
> +					      &xdg_toplevel_listener, output);
> +
> +		wl_surface_commit(output->parent.surface);
> +
> +		output->parent.wait_for_configure = true;
> +
> +		while (output->parent.wait_for_configure)
> +			wl_display_dispatch(b->parent.wl_display);
> +
> +		weston_log("wayland-backend: Using xdg_shell_v6\n");
> +	}
> +	else if (b->parent.shell) {
>  		output->parent.shell_surface =
>  			wl_shell_get_shell_surface(b->parent.shell,
>  						   output->parent.surface);
> @@ -1058,6 +1143,8 @@ wayland_backend_create_output_surface(struct wayland_output *output)
>  
>  		wl_shell_surface_add_listener(output->parent.shell_surface,
>  					      &shell_surface_listener, output);
> +
> +		weston_log("wayland-backend: Using wl_shell\n");
>  	}
>  
>  	return 0;
> @@ -1107,7 +1194,11 @@ wayland_output_enable(struct weston_output *base)
>  					      WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER,
>  					      output->mode.refresh, output->parent.output);
>  
> -		if (output->parent.shell_surface) {
> +		if (output->parent.xdg_toplevel) {
> +			zxdg_toplevel_v6_set_fullscreen(output->parent.xdg_toplevel,
> +							output->parent.output);
> +		}
> +		else if (output->parent.shell_surface) {
>  			wl_shell_surface_set_fullscreen(output->parent.shell_surface,
>  							WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER,
>  							output->mode.refresh, output->parent.output);
> @@ -1285,9 +1376,14 @@ wayland_output_create_fullscreen(struct wayland_backend *b)
>  		goto err_surface;
>  
>  	/* What should size be set if conditional is false? */
> -	if (b->parent.shell) {
> -		wl_shell_surface_set_fullscreen(output->parent.shell_surface,
> -						0, 0, NULL);
> +	if (b->parent.xdg_shell || b->parent.shell) {
> +		if (output->parent.xdg_toplevel)
> +			zxdg_toplevel_v6_set_fullscreen(output->parent.xdg_toplevel,
> +							output->parent.output);
> +		else if (output->parent.shell_surface)
> +			wl_shell_surface_set_fullscreen(output->parent.shell_surface,
> +							0, 0, NULL);
> +
>  		wl_display_roundtrip(b->parent.wl_display);
>  
>  		width = output->parent.configure_width;
> @@ -1504,9 +1600,12 @@ input_handle_button(void *data, struct wl_pointer *pointer,
>  						button, state);
>  
>  		if (frame_status(input->output->frame) & FRAME_STATUS_MOVE) {
> -
> -			wl_shell_surface_move(input->output->parent.shell_surface,
> +			if (input->output->parent.xdg_toplevel)
> +				zxdg_toplevel_v6_move(input->output->parent.xdg_toplevel,
>  					      input->parent.seat, serial);
> +			else if (input->output->parent.shell_surface)
> +				wl_shell_surface_move(input->output->parent.shell_surface,
> +						      input->parent.seat, serial);
>  			frame_status_clear(input->output->frame,
>  					   FRAME_STATUS_MOVE);
>  			return;
> @@ -1835,8 +1934,12 @@ input_handle_touch_down(void *data, struct wl_touch *wl_touch,
>  
>  		if (first_touch && (frame_status(output->frame) & FRAME_STATUS_MOVE)) {
>  			input->touch_points--;
> -			wl_shell_surface_move(output->parent.shell_surface,
> -					      input->parent.seat, serial);
> +			if (output->parent.xdg_toplevel)
> +				zxdg_toplevel_v6_move(output->parent.xdg_toplevel,
> +						      input->parent.seat, serial);
> +			else if (output->parent.shell_surface)
> +				wl_shell_surface_move(output->parent.shell_surface,
> +						      input->parent.seat, serial);
>  			frame_status_clear(output->frame,
>  					   FRAME_STATUS_MOVE);
>  			return;
> @@ -2164,6 +2267,16 @@ wayland_parent_output_destroy(struct wayland_parent_output *output)
>  }
>  
>  static void
> +xdg_shell_ping(void *data, struct zxdg_shell_v6 *shell, uint32_t serial)
> +{
> +	zxdg_shell_v6_pong(shell, serial);
> +}
> +
> +static const struct zxdg_shell_v6_listener xdg_shell_listener = {
> +	xdg_shell_ping,
> +};
> +
> +static void
>  registry_handle_global(void *data, struct wl_registry *registry, uint32_t name,
>  		       const char *interface, uint32_t version)
>  {
> @@ -2173,6 +2286,12 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name,
>  		b->parent.compositor =
>  			wl_registry_bind(registry, name,
>  					 &wl_compositor_interface, 1);
> +	} else if (strcmp(interface, "zxdg_shell_v6") == 0) {
> +		b->parent.xdg_shell =
> +			wl_registry_bind(registry, name,
> +					 &zxdg_shell_v6_interface, 1);
> +		zxdg_shell_v6_add_listener(b->parent.xdg_shell,
> +					   &xdg_shell_listener, b);
>  	} else if (strcmp(interface, "wl_shell") == 0) {
>  		b->parent.shell =
>  			wl_registry_bind(registry, name,
> @@ -2249,6 +2368,9 @@ wayland_destroy(struct weston_compositor *ec)
>  	if (b->parent.shm)
>  		wl_shm_destroy(b->parent.shm);
>  
> +	if (b->parent.shell)
> +		zxdg_shell_v6_destroy(b->parent.xdg_shell);
> +
>  	if (b->parent.fshell)
>  		zwp_fullscreen_shell_v1_release(b->parent.fshell);
>  
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 870 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20161121/952974a7/attachment.sig>


More information about the wayland-devel mailing list