From ad138210b3ef57dce7260ddc741527235c8e6f6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Mon, 26 Aug 2019 16:09:53 +0300 Subject: [PATCH] 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 --- src/compositor/meta-window-actor-private.h | 2 ++ src/compositor/meta-window-actor.c | 23 ++++++++++++++++++ src/wayland/meta-wayland-surface.c | 27 +++++++++++++++++++--- 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