[clutter/wip/wayland-2: 12/22] wayland-surface: Adds queue-damage-redraw signal
- From: Neil Roberts <nroberts src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter/wip/wayland-2: 12/22] wayland-surface: Adds queue-damage-redraw signal
- Date: Wed, 29 Feb 2012 17:57:34 +0000 (UTC)
commit 56039ec5caf37ff5a1fce709dc35d63b1dc05b2f
Author: Robert Bragg <robert linux intel com>
Date: Wed Jan 11 00:08:05 2012 +0000
wayland-surface: Adds queue-damage-redraw signal
This adds a signal that's emitted whenever a wayland surface is damaged
that allows sub-classes to override the default handler to change
how clipped redraws are queued if the sub-class doesn't simply draw
a rectangle. The signal can also be used just to track damage.
Reviewed-by: Neil Roberts <neil linux intel com>
clutter/wayland/clutter-wayland-surface.c | 53 ++++++++++++++++++++++++----
clutter/wayland/clutter-wayland-surface.h | 7 ++++
2 files changed, 52 insertions(+), 8 deletions(-)
---
diff --git a/clutter/wayland/clutter-wayland-surface.c b/clutter/wayland/clutter-wayland-surface.c
index 3be3274..54debaa 100644
--- a/clutter/wayland/clutter-wayland-surface.c
+++ b/clutter/wayland/clutter-wayland-surface.c
@@ -62,14 +62,14 @@ enum
static GParamSpec *obj_props[PROP_LAST];
-#if 0
enum
{
+ QUEUE_DAMAGE_REDRAW,
+
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0, };
-#endif
struct _ClutterWaylandSurfacePrivate
{
@@ -243,10 +243,9 @@ clutter_wayland_surface_set_surface (ClutterWaylandSurface *self,
{
free_pipeline (self);
free_surface_buffers (self);
- clutter_wayland_surface_queue_damage_redraw (self,
- 0, 0,
- priv->width,
- priv->height);
+ g_signal_emit (self, signals[QUEUE_DAMAGE_REDRAW],
+ 0,
+ 0, 0, priv->width, priv->height);
}
priv->surface = surface;
@@ -448,7 +447,43 @@ clutter_wayland_surface_class_init (ClutterWaylandSurfaceClass *klass)
COGL_TYPE_HANDLE,
CLUTTER_PARAM_READWRITE);
obj_props[PROP_COGL_TEXTURE] = pspec;
- g_object_class_install_property (gobject_class, PROP_COGL_TEXTURE, pspec);
+ g_object_class_install_property (object_class, PROP_COGL_TEXTURE, pspec);
+
+
+ /**
+ * ClutterWaylandSurface::queue-damage-redraw
+ * @texture: the object which received the signal
+ * @x: The top left x position of the damage region
+ * @y: The top left y position of the damage region
+ * @width: The width of the damage region
+ * @height: The height of the damage region
+ *
+ * ::queue-damage-redraw is emitted to notify that some sub-region
+ * of the texture has been changed. This usually means a redraw
+ * needs to be queued for the actor.
+ *
+ * The default handler will queue a clipped redraw in response to
+ * the damage, using the assumption that the pixmap is being painted
+ * to a rectangle covering the transformed allocation of the actor.
+ * If you sub-class and change the paint method so this isn't true
+ * then you must also provide your own damage signal handler to
+ * queue a redraw that blocks this default behaviour.
+ *
+ * Since: 1.10
+ */
+ signals[QUEUE_DAMAGE_REDRAW] =
+ g_signal_new (g_intern_static_string ("queue-damage-redraw"),
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (ClutterWaylandSurfaceClass, queue_damage_redraw),
+ NULL, NULL,
+ _clutter_marshal_VOID__INT_INT_INT_INT,
+ G_TYPE_NONE, 4,
+ G_TYPE_INT,
+ G_TYPE_INT,
+ G_TYPE_INT,
+ G_TYPE_INT);
+ klass->queue_damage_redraw = clutter_wayland_surface_queue_damage_redraw;
}
/**
@@ -588,7 +623,9 @@ clutter_wayland_surface_damage_buffer (ClutterWaylandSurface *self,
wl_shm_buffer_get_data (buffer));
}
- clutter_wayland_surface_queue_damage_redraw (self, x, y, width, height);
+ g_signal_emit (self, signals[QUEUE_DAMAGE_REDRAW],
+ 0,
+ x, y, width, height);
}
CoglTexture *
diff --git a/clutter/wayland/clutter-wayland-surface.h b/clutter/wayland/clutter-wayland-surface.h
index 54e4572..e5f64a1 100644
--- a/clutter/wayland/clutter-wayland-surface.h
+++ b/clutter/wayland/clutter-wayland-surface.h
@@ -74,6 +74,13 @@ struct _ClutterWaylandSurfaceClass
{
/*< private >*/
ClutterActorClass parent_class;
+
+ /*< public >*/
+ void (*queue_damage_redraw) (ClutterWaylandSurface *texture,
+ gint x,
+ gint y,
+ gint width,
+ gint height);
};
GType clutter_wayland_surface_get_type (void) G_GNUC_CONST;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]