summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2019-08-26 16:12:30 +0300
committerJonas Ådahl <jadahl@gmail.com>2019-08-27 15:31:25 +0000
commit65fde269c60678fd2d00c02e94b511ec3de4a93f (patch)
tree9c8af7b9c6821264fcfe4f4d0d0a7149c423b7ea
parentad138210b3ef57dce7260ddc741527235c8e6f6c (diff)
downloadmutter-65fde269c60678fd2d00c02e94b511ec3de4a93f.tar.gz
screen-cast/window: Use window actor damaged signal instead of paint
We are really more interested in when a window is damaged, rather than when it's painted, for screen casting windows. This also has the benefit of not listening on the "paint" signal of the actor, meaning it'll open doors for hacks currently necessary for taking a screenshot of a window consisting of multiple surfaces. https://gitlab.gnome.org/GNOME/mutter/merge_requests/752
-rw-r--r--src/backends/meta-screen-cast-window-stream-src.c45
1 files changed, 11 insertions, 34 deletions
diff --git a/src/backends/meta-screen-cast-window-stream-src.c b/src/backends/meta-screen-cast-window-stream-src.c
index dbf330420..c31830b03 100644
--- a/src/backends/meta-screen-cast-window-stream-src.c
+++ b/src/backends/meta-screen-cast-window-stream-src.c
@@ -34,13 +34,11 @@ struct _MetaScreenCastWindowStreamSrc
MetaScreenCastWindow *screen_cast_window;
- unsigned long screen_cast_window_before_paint_handler_id;
- unsigned long screen_cast_window_after_paint_handler_id;
+ unsigned long screen_cast_window_damaged_handler_id;
unsigned long screen_cast_window_destroyed_handler_id;
unsigned long cursor_moved_handler_id;
unsigned long cursor_changed_handler_id;
- gboolean actor_was_dirty;
gboolean cursor_bitmap_invalid;
};
@@ -255,15 +253,10 @@ meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_s
if (!window_src->screen_cast_window)
return;
- if (window_src->screen_cast_window_before_paint_handler_id)
+ if (window_src->screen_cast_window_damaged_handler_id)
g_signal_handler_disconnect (window_src->screen_cast_window,
- window_src->screen_cast_window_before_paint_handler_id);
- window_src->screen_cast_window_before_paint_handler_id = 0;
-
- if (window_src->screen_cast_window_after_paint_handler_id)
- g_signal_handler_disconnect (window_src->screen_cast_window,
- window_src->screen_cast_window_after_paint_handler_id);
- window_src->screen_cast_window_after_paint_handler_id = 0;
+ window_src->screen_cast_window_damaged_handler_id);
+ window_src->screen_cast_window_damaged_handler_id = 0;
if (window_src->screen_cast_window_destroyed_handler_id)
g_signal_handler_disconnect (window_src->screen_cast_window,
@@ -282,23 +275,12 @@ meta_screen_cast_window_stream_src_stop (MetaScreenCastWindowStreamSrc *window_s
}
static void
-screen_cast_window_before_paint (MetaScreenCastWindow *screen_cast_window,
- MetaScreenCastWindowStreamSrc *window_src)
-{
- window_src->actor_was_dirty =
- meta_screen_cast_window_has_damage (screen_cast_window);
-}
-
-static void
-screen_cast_window_after_paint (MetaWindowActor *actor,
- MetaScreenCastWindowStreamSrc *window_src)
+screen_cast_window_damaged (MetaWindowActor *actor,
+ MetaScreenCastWindowStreamSrc *window_src)
{
- if (window_src->actor_was_dirty)
- {
- MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
+ MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (window_src);
- meta_screen_cast_stream_src_maybe_record_frame (src);
- }
+ meta_screen_cast_stream_src_maybe_record_frame (src);
}
static void
@@ -378,16 +360,11 @@ meta_screen_cast_window_stream_src_enable (MetaScreenCastStreamSrc *src)
window_src->screen_cast_window = META_SCREEN_CAST_WINDOW (window_actor);
- window_src->screen_cast_window_before_paint_handler_id =
+ window_src->screen_cast_window_damaged_handler_id =
g_signal_connect (window_src->screen_cast_window,
- "paint",
- G_CALLBACK (screen_cast_window_before_paint),
+ "damaged",
+ G_CALLBACK (screen_cast_window_damaged),
window_src);
- window_src->screen_cast_window_after_paint_handler_id =
- g_signal_connect_after (window_src->screen_cast_window,
- "paint",
- G_CALLBACK (screen_cast_window_after_paint),
- window_src);
window_src->screen_cast_window_destroyed_handler_id =
g_signal_connect (window_src->screen_cast_window,