[PATCH weston 1/3] compositor: Add visibility state to surfaces

Kristian Høgsberg hoegsberg at gmail.com
Thu Jun 7 12:28:03 PDT 2012


On Wed, Jun 06, 2012 at 11:36:08AM +0200, Jonas Ådahl wrote:
> When a surface becomes invisible frame callbacks will be queued until
> the surface is shown.
> 
> Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
> ---
>  src/compositor.c |   28 +++++++++++++++++++++++++---
>  src/compositor.h |    6 ++++++
>  2 files changed, 31 insertions(+), 3 deletions(-)
> 
> diff --git a/src/compositor.c b/src/compositor.c
> index 7cc176c..139c379 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -233,6 +233,7 @@ weston_surface_create(struct weston_compositor *compositor)
>  	surface->opaque_rect[2] = 0.0;
>  	surface->opaque_rect[3] = 0.0;
>  	surface->pitch = 1;
> +	surface->visible = true;

I don't like adding a flag here to track visible or not, it's
basically what es->output is.  We have weston_surface_unmap that
unmaps a surface the right way and we should use that.  The problem is
that we don't want to hit the "assign random initial position" code
path right?

Instead I think we need to just track "position undefined" in
shell_surface in shell.c, and only the initial map assigns the random
position.  Subsequent unmapped->mapped transitions just use the
current position.

Kristian

>  	surface->buffer = NULL;
>  	surface->output = NULL;
> @@ -1115,7 +1116,10 @@ WL_EXPORT void
>  weston_layer_init(struct weston_layer *layer, struct wl_list *below)
>  {
>  	wl_list_init(&layer->surface_list);
> -	wl_list_insert(below, &layer->link);
> +	if (below != NULL)
> +		wl_list_insert(below, &layer->link);
> +	else
> +		wl_list_init(&layer->link);
>  }
>  
>  WL_EXPORT void
> @@ -1175,6 +1179,24 @@ weston_compositor_fade(struct weston_compositor *compositor, float tint)
>  			       &compositor->fade.animation.link);
>  }
>  
> +WL_EXPORT void
> +weston_surface_show(struct weston_surface *es)
> +{
> +	es->visible = true;
> +
> +	if (!wl_list_empty(&es->frame_callback_list)) {
> +		wl_list_insert_list(es->output->frame_callback_list.prev,
> +				    &es->frame_callback_list);
> +		wl_list_init(&es->frame_callback_list);
> +	}
> +}
> +
> +WL_EXPORT void
> +weston_surface_hide(struct weston_surface *es)
> +{
> +	es->visible = false;
> +}
> +
>  static void
>  surface_destroy(struct wl_client *client, struct wl_resource *resource)
>  {
> @@ -1255,7 +1277,7 @@ weston_surface_assign_output(struct weston_surface *es)
>  	es->output = new_output;
>  	weston_surface_update_output_mask(es, mask);
>  
> -	if (!wl_list_empty(&es->frame_callback_list)) {
> +	if (es->visible && !wl_list_empty(&es->frame_callback_list)) {
>  		wl_list_insert_list(new_output->frame_callback_list.prev,
>  				    &es->frame_callback_list);
>  		wl_list_init(&es->frame_callback_list);
> @@ -1349,7 +1371,7 @@ surface_frame(struct wl_client *client,
>  
>  	wl_client_add_resource(client, &cb->resource);
>  
> -	if (es->output) {
> +	if (es->output && es->visible) {
>  		wl_list_insert(es->output->frame_callback_list.prev,
>  			       &cb->link);
>  	} else {
> diff --git a/src/compositor.h b/src/compositor.h
> index 2d52048..1f1095b 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -24,6 +24,7 @@
>  #ifndef _WAYLAND_SYSTEM_COMPOSITOR_H_
>  #define _WAYLAND_SYSTEM_COMPOSITOR_H_
>  
> +#include <stdbool.h>
>  #include <pixman.h>
>  #include <xkbcommon/xkbcommon.h>
>  #include <wayland-server.h>
> @@ -383,6 +384,7 @@ struct weston_surface {
>  	GLfloat opaque_rect[4];
>  	GLfloat alpha;
>  	int blend;
> +	bool visible;
>  
>  	/* Surface geometry state, mutable.
>  	 * If you change anything, set dirty = 1.
> @@ -521,6 +523,10 @@ weston_compositor_schedule_repaint(struct weston_compositor *compositor);
>  void
>  weston_compositor_fade(struct weston_compositor *compositor, float tint);
>  void
> +weston_surface_show(struct weston_surface *es);
> +void
> +weston_surface_hide(struct weston_surface *es);
> +void
>  weston_compositor_damage_all(struct weston_compositor *compositor);
>  void
>  weston_compositor_unlock(struct weston_compositor *compositor);
> -- 
> 1.7.9.5
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list