summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2019-08-26 16:09:53 +0300
committerJonas Ådahl <jadahl@gmail.com>2019-08-27 15:31:25 +0000
commitad138210b3ef57dce7260ddc741527235c8e6f6c (patch)
treee891056dffebe29d9f30b01084297c8af4312de3
parent6968f17f3f2d36428aaa802d6b678a9260a13df3 (diff)
downloadmutter-ad138210b3ef57dce7260ddc741527235c8e6f6c.tar.gz
window-actor: Add 'damaged' signal
Make it possible to listen for damage on a window actor. For X11, the signal is emitted when damage is reported; for Wayland, it is emitted when any of the surfaces associated with the window is damaged. https://gitlab.gnome.org/GNOME/mutter/merge_requests/752
-rw-r--r--src/compositor/meta-window-actor-private.h2
-rw-r--r--src/compositor/meta-window-actor.c23
-rw-r--r--src/wayland/meta-wayland-surface.c27
3 files changed, 49 insertions, 3 deletions
diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h
index 354edd314..a36217f98 100644
--- a/src/compositor/meta-window-actor-private.h
+++ b/src/compositor/meta-window-actor-private.h
@@ -93,4 +93,6 @@ void meta_window_actor_set_geometry_scale (MetaWindowActor *window_actor,
int meta_window_actor_get_geometry_scale (MetaWindowActor *window_actor);
+void meta_window_actor_notify_damaged (MetaWindowActor *window_actor);
+
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index d2d46e6b0..f0df27666 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -115,6 +115,7 @@ enum
{
FIRST_FRAME,
EFFECTS_COMPLETED,
+ DAMAGED,
LAST_SIGNAL
};
@@ -219,6 +220,20 @@ meta_window_actor_class_init (MetaWindowActorClass *klass)
NULL, NULL, NULL,
G_TYPE_NONE, 0);
+ /**
+ * MetaWindowActor::damaged:
+ * @actor: the #MetaWindowActor instance
+ *
+ * Notify that one or more of the surfaces of the window have been damaged.
+ */
+ signals[DAMAGED] =
+ g_signal_new ("damaged",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+
pspec = g_param_spec_object ("meta-window",
"MetaWindow",
"The displayed MetaWindow",
@@ -1498,6 +1513,8 @@ meta_window_actor_process_x11_damage (MetaWindowActor *self,
event->area.y,
event->area.width,
event->area.height);
+
+ meta_window_actor_notify_damaged (self);
}
void
@@ -2111,3 +2128,9 @@ meta_window_actor_from_actor (ClutterActor *actor)
return NULL;
}
+
+void
+meta_window_actor_notify_damaged (MetaWindowActor *window_actor)
+{
+ g_signal_emit (window_actor, signals[DAMAGED], 0);
+}
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 9a1b45ece..12a607b47 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -672,6 +672,8 @@ void
meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
MetaWaylandPendingState *pending)
{
+ gboolean had_damage = FALSE;
+
if (surface->role)
{
meta_wayland_surface_role_pre_commit (surface->role, pending);
@@ -778,9 +780,12 @@ meta_wayland_surface_apply_pending_state (MetaWaylandSurface *surface,
if (!cairo_region_is_empty (pending->surface_damage) ||
!cairo_region_is_empty (pending->buffer_damage))
- surface_process_damage (surface,
- pending->surface_damage,
- pending->buffer_damage);
+ {
+ surface_process_damage (surface,
+ pending->surface_damage,
+ pending->buffer_damage);
+ had_damage = TRUE;
+ }
surface->offset_x += pending->dx;
surface->offset_y += pending->dy;
@@ -844,6 +849,22 @@ cleanup:
G_TRAVERSE_ALL,
parent_surface_state_applied,
NULL);
+
+ if (had_damage)
+ {
+ MetaWindow *toplevel_window;
+
+ toplevel_window = meta_wayland_surface_get_toplevel_window (surface);
+ if (toplevel_window)
+ {
+ MetaWindowActor *toplevel_window_actor;
+
+ toplevel_window_actor =
+ meta_window_actor_from_window (toplevel_window);
+ if (toplevel_window_actor)
+ meta_window_actor_notify_damaged (toplevel_window_actor);
+ }
+ }
}
static void