[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