From 988a0e7314018d490527f1b786d2bba43e48c35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 22 Nov 2019 18:35:55 +0100 Subject: [PATCH] Adapt to painting and picking API change While still leaving them unused, pass around ClutterPaintContext and ClutterPickContext when painting and picking. The reason for splitting this change up in two is to make it possible to bisect easier in between the API change and the change to using the framebuffer passed around with the temporary contexts. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/827 --- js/ui/lookingGlass.js | 4 +-- js/ui/userWidget.js | 4 +-- src/shell-glsl-effect.c | 8 +++--- src/shell-invert-lightness-effect.c | 8 +++--- src/shell-recorder.c | 5 ++-- src/shell-screenshot.c | 40 +++++++++++++++++++++++++---- src/st/st-box-layout.c | 14 +++++----- src/st/st-entry.c | 7 ++--- src/st/st-icon.c | 7 ++--- src/st/st-label.c | 7 ++--- src/st/st-private.c | 9 +++++-- src/st/st-scroll-view-fade.c | 5 ++-- src/st/st-scroll-view.c | 22 ++++++++-------- src/st/st-widget.c | 10 +++++--- src/st/st-widget.h | 3 ++- 15 files changed, 102 insertions(+), 51 deletions(-) diff --git a/js/ui/lookingGlass.js b/js/ui/lookingGlass.js index 30aa8c2fa..19a9396d4 100644 --- a/js/ui/lookingGlass.js +++ b/js/ui/lookingGlass.js @@ -472,9 +472,9 @@ class ObjInspector extends St.ScrollView { var RedBorderEffect = GObject.registerClass( class RedBorderEffect extends Clutter.Effect { - vfunc_paint() { + vfunc_paint(paintContext) { let actor = this.get_actor(); - actor.continue_paint(); + actor.continue_paint(paintContext); let color = new Cogl.Color(); color.init_from_4ub(0xff, 0, 0, 0xc4); diff --git a/js/ui/userWidget.js b/js/ui/userWidget.js index 115f4db6b..03d4d6388 100644 --- a/js/ui/userWidget.js +++ b/js/ui/userWidget.js @@ -142,8 +142,8 @@ class UserWidgetLabel extends St.Widget { this._currentLabel.allocate(childBox, flags); } - vfunc_paint() { - this._currentLabel.paint(); + vfunc_paint(paintContext) { + this._currentLabel.paint(paintContext); } _updateUser() { diff --git a/src/shell-glsl-effect.c b/src/shell-glsl-effect.c index 1ffe9d0d9..6347dbf9c 100644 --- a/src/shell-glsl-effect.c +++ b/src/shell-glsl-effect.c @@ -26,7 +26,8 @@ struct _ShellGLSLEffectPrivate G_DEFINE_TYPE_WITH_PRIVATE (ShellGLSLEffect, shell_glsl_effect, CLUTTER_TYPE_OFFSCREEN_EFFECT); static gboolean -shell_glsl_effect_pre_paint (ClutterEffect *effect) +shell_glsl_effect_pre_paint (ClutterEffect *effect, + ClutterPaintContext *paint_context) { ShellGLSLEffect *self = SHELL_GLSL_EFFECT (effect); ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (effect); @@ -51,7 +52,7 @@ shell_glsl_effect_pre_paint (ClutterEffect *effect) } parent_class = CLUTTER_EFFECT_CLASS (shell_glsl_effect_parent_class); - success = parent_class->pre_paint (effect); + success = parent_class->pre_paint (effect, paint_context); if (!success) return FALSE; @@ -66,7 +67,8 @@ shell_glsl_effect_pre_paint (ClutterEffect *effect) } static void -shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect) +shell_glsl_effect_paint_target (ClutterOffscreenEffect *effect, + ClutterPaintContext *paint_context) { ShellGLSLEffect *self = SHELL_GLSL_EFFECT (effect); ShellGLSLEffectPrivate *priv; diff --git a/src/shell-invert-lightness-effect.c b/src/shell-invert-lightness-effect.c index b7618dec3..282725b22 100644 --- a/src/shell-invert-lightness-effect.c +++ b/src/shell-invert-lightness-effect.c @@ -76,7 +76,8 @@ G_DEFINE_TYPE (ShellInvertLightnessEffect, CLUTTER_TYPE_OFFSCREEN_EFFECT); static gboolean -shell_invert_lightness_effect_pre_paint (ClutterEffect *effect) +shell_invert_lightness_effect_pre_paint (ClutterEffect *effect, + ClutterPaintContext *paint_context) { ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect); ClutterEffectClass *parent_class; @@ -98,7 +99,7 @@ shell_invert_lightness_effect_pre_paint (ClutterEffect *effect) parent_class = CLUTTER_EFFECT_CLASS (shell_invert_lightness_effect_parent_class); - if (parent_class->pre_paint (effect)) + if (parent_class->pre_paint (effect, paint_context)) { ClutterOffscreenEffect *offscreen_effect = CLUTTER_OFFSCREEN_EFFECT (effect); @@ -117,7 +118,8 @@ shell_invert_lightness_effect_pre_paint (ClutterEffect *effect) } static void -shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect) +shell_invert_lightness_effect_paint_target (ClutterOffscreenEffect *effect, + ClutterPaintContext *paint_context) { ShellInvertLightnessEffect *self = SHELL_INVERT_LIGHTNESS_EFFECT (effect); ClutterActor *actor; diff --git a/src/shell-recorder.c b/src/shell-recorder.c index 43600ebbd..1a318175e 100644 --- a/src/shell-recorder.c +++ b/src/shell-recorder.c @@ -476,8 +476,9 @@ recorder_record_frame (ShellRecorder *recorder, * by clutter before glSwapBuffers() makes it visible to the user. */ static void -recorder_on_stage_paint (ClutterActor *actor, - ShellRecorder *recorder) +recorder_on_stage_paint (ClutterActor *actor, + ClutterPaintContext *paint_context, + ShellRecorder *recorder) { if (recorder->state == RECORDER_STATE_RECORDING) recorder_record_frame (recorder, FALSE); diff --git a/src/shell-screenshot.c b/src/shell-screenshot.c index 4af51c698..de95b8a72 100644 --- a/src/shell-screenshot.c +++ b/src/shell-screenshot.c @@ -45,6 +45,10 @@ typedef enum G_DEFINE_TYPE_WITH_PRIVATE (ShellScreenshot, shell_screenshot, G_TYPE_OBJECT); +static void +grab_screenshot (ClutterActor *stage, + GTask *result); + static void shell_screenshot_class_init (ShellScreenshotClass *screenshot_class) { @@ -263,6 +267,21 @@ draw_cursor_image (cairo_surface_t *surface, g_free (data); } +static void +on_paint (ClutterActor *actor, + ClutterPaintContext *paint_context, + GTask *result) +{ + grab_screenshot (actor, result); +} + +static void +on_actors_painted (ClutterActor *actor, + GTask *result) +{ + grab_screenshot (actor, result); +} + static void grab_screenshot (ClutterActor *stage, GTask *result) @@ -325,7 +344,8 @@ grab_screenshot (ClutterActor *stage, if (priv->include_cursor) draw_cursor_image (priv->image, priv->screenshot_area); - g_signal_handlers_disconnect_by_func (stage, grab_screenshot, result); + g_signal_handlers_disconnect_by_func (stage, on_paint, result); + g_signal_handlers_disconnect_by_func (stage, on_actors_painted, result); task = g_task_new (screenshot, NULL, on_screenshot_written, result); g_task_run_in_thread (task, write_screenshot_thread); @@ -460,7 +480,7 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot, { ClutterActor *stage; ShellScreenshotPrivate *priv = screenshot->priv; - const char *paint_signal; + gboolean use_paint_signal = FALSE; GTask *result; if (priv->stream != NULL) { @@ -483,7 +503,6 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot, priv->include_cursor = FALSE; stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); - paint_signal = "actors-painted"; meta_disable_unredirect_for_display (shell_global_get_display (priv->global)); @@ -492,10 +511,21 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot, if (should_draw_cursor_image (SHELL_SCREENSHOT_SCREEN)) priv->include_cursor = TRUE; else - paint_signal = "paint"; + use_paint_signal = TRUE; } - g_signal_connect_after (stage, paint_signal, G_CALLBACK (grab_screenshot), result); + if (use_paint_signal) + { + g_signal_connect_after (stage, "paint", + G_CALLBACK (on_paint), + result); + } + else + { + g_signal_connect_after (stage, "actors-painted", + G_CALLBACK (on_actors_painted), + result); + } clutter_actor_queue_redraw (stage); } diff --git a/src/st/st-box-layout.c b/src/st/st-box-layout.c index 0f02a478b..66b17b185 100644 --- a/src/st/st-box-layout.c +++ b/src/st/st-box-layout.c @@ -387,7 +387,8 @@ get_border_paint_offsets (StBoxLayout *self, static void -st_box_layout_paint (ClutterActor *actor) +st_box_layout_paint (ClutterActor *actor, + ClutterPaintContext *paint_context) { StBoxLayout *self = ST_BOX_LAYOUT (actor); StBoxLayoutPrivate *priv = self->priv; @@ -405,7 +406,7 @@ st_box_layout_paint (ClutterActor *actor) cogl_framebuffer_translate (fb, (int)x, (int)y, 0); } - st_widget_paint_background (ST_WIDGET (actor)); + st_widget_paint_background (ST_WIDGET (actor), paint_context); if (x != 0 || y != 0) { @@ -436,14 +437,15 @@ st_box_layout_paint (ClutterActor *actor) for (child = clutter_actor_get_first_child (actor); child != NULL; child = clutter_actor_get_next_sibling (child)) - clutter_actor_paint (child); + clutter_actor_paint (child, paint_context); if (priv->hadjustment || priv->vadjustment) cogl_framebuffer_pop_clip (fb); } static void -st_box_layout_pick (ClutterActor *actor) +st_box_layout_pick (ClutterActor *actor, + ClutterPickContext *pick_context) { StBoxLayout *self = ST_BOX_LAYOUT (actor); StBoxLayoutPrivate *priv = self->priv; @@ -461,7 +463,7 @@ st_box_layout_pick (ClutterActor *actor) cogl_framebuffer_translate (fb, (int)x, (int)y, 0); } - CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->pick (actor); + CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->pick (actor, pick_context); if (x != 0 || y != 0) { @@ -489,7 +491,7 @@ st_box_layout_pick (ClutterActor *actor) for (child = clutter_actor_get_first_child (actor); child != NULL; child = clutter_actor_get_next_sibling (child)) - clutter_actor_pick (child); + clutter_actor_pick (child, pick_context); if (priv->hadjustment || priv->vadjustment) cogl_framebuffer_pop_clip (fb); diff --git a/src/st/st-entry.c b/src/st/st-entry.c index eb8609887..9c45fbd65 100644 --- a/src/st/st-entry.c +++ b/src/st/st-entry.c @@ -842,14 +842,15 @@ st_entry_leave_event (ClutterActor *actor, } static void -st_entry_paint (ClutterActor *actor) +st_entry_paint (ClutterActor *actor, + ClutterPaintContext *paint_context) { StEntryPrivate *priv = ST_ENTRY_PRIV (actor); StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); StShadow *shadow_spec = st_theme_node_get_text_shadow (theme_node); ClutterActorClass *parent_class; - st_widget_paint_background (ST_WIDGET (actor)); + st_widget_paint_background (ST_WIDGET (actor), paint_context); if (shadow_spec) { @@ -888,7 +889,7 @@ st_entry_paint (ClutterActor *actor) * This is needed as we still want to paint children. */ parent_class = g_type_class_peek_parent (st_entry_parent_class); - parent_class->paint (actor); + parent_class->paint (actor, paint_context); } static void diff --git a/src/st/st-icon.c b/src/st/st-icon.c index 4ef287620..fc6aa5123 100644 --- a/src/st/st-icon.c +++ b/src/st/st-icon.c @@ -163,12 +163,13 @@ st_icon_dispose (GObject *gobject) } static void -st_icon_paint (ClutterActor *actor) +st_icon_paint (ClutterActor *actor, + ClutterPaintContext *paint_context) { StIcon *icon = ST_ICON (actor); StIconPrivate *priv = icon->priv; - st_widget_paint_background (ST_WIDGET (actor)); + st_widget_paint_background (ST_WIDGET (actor), paint_context); if (priv->icon_texture) { @@ -186,7 +187,7 @@ st_icon_paint (ClutterActor *actor) clutter_actor_get_paint_opacity (priv->icon_texture)); } - clutter_actor_paint (priv->icon_texture); + clutter_actor_paint (priv->icon_texture, paint_context); } } diff --git a/src/st/st-label.c b/src/st/st-label.c index 64127c964..42816ffdf 100644 --- a/src/st/st-label.c +++ b/src/st/st-label.c @@ -191,13 +191,14 @@ st_label_dispose (GObject *object) } static void -st_label_paint (ClutterActor *actor) +st_label_paint (ClutterActor *actor, + ClutterPaintContext *paint_context) { StLabelPrivate *priv = ST_LABEL (actor)->priv; StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor)); StShadow *shadow_spec = st_theme_node_get_text_shadow (theme_node); - st_widget_paint_background (ST_WIDGET (actor)); + st_widget_paint_background (ST_WIDGET (actor), paint_context); if (shadow_spec) { @@ -236,7 +237,7 @@ st_label_paint (ClutterActor *actor) } } - clutter_actor_paint (priv->label); + clutter_actor_paint (priv->label, paint_context); } static void diff --git a/src/st/st-private.c b/src/st/st-private.c index a9ca90644..fd2cc39b1 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -432,6 +432,7 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, CoglPipeline *shadow_pipeline = NULL; float resource_scale; float width, height; + ClutterPaintContext *paint_context; g_return_val_if_fail (clutter_actor_has_allocation (actor), NULL); @@ -501,13 +502,17 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, cogl_framebuffer_scale (fb, resource_scale, resource_scale, 1); clutter_actor_set_opacity_override (actor, 255); - clutter_actor_paint (actor); - clutter_actor_set_opacity_override (actor, -1); + + paint_context = clutter_paint_context_new_for_framebuffer (fb); + clutter_actor_paint (actor, paint_context); + clutter_paint_context_destroy (paint_context); G_GNUC_BEGIN_IGNORE_DEPRECATIONS; cogl_pop_framebuffer (); G_GNUC_END_IGNORE_DEPRECATIONS; + clutter_actor_set_opacity_override (actor, -1); + cogl_object_unref (fb); shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, buffer, diff --git a/src/st/st-scroll-view-fade.c b/src/st/st-scroll-view-fade.c index e288e695a..8d473d3ad 100644 --- a/src/st/st-scroll-view-fade.c +++ b/src/st/st-scroll-view-fade.c @@ -85,7 +85,8 @@ st_scroll_view_fade_get_static_shader_source (ClutterShaderEffect *effect) static void -st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect) +st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect, + ClutterPaintContext *paint_context) { StScrollViewFade *self = ST_SCROLL_VIEW_FADE (effect); ClutterShaderEffect *shader = CLUTTER_SHADER_EFFECT (effect); @@ -153,7 +154,7 @@ st_scroll_view_fade_paint_target (ClutterOffscreenEffect *effect) clutter_shader_effect_set_uniform (shader, "fade_area_bottomright", CLUTTER_TYPE_SHADER_FLOAT, 2, fade_area_bottomright); parent = CLUTTER_OFFSCREEN_EFFECT_CLASS (st_scroll_view_fade_parent_class); - parent->paint_target(effect); + parent->paint_target (effect, paint_context); } static void diff --git a/src/st/st-scroll-view.c b/src/st/st-scroll-view.c index 79af3ca13..04169b1a2 100644 --- a/src/st/st-scroll-view.c +++ b/src/st/st-scroll-view.c @@ -276,34 +276,36 @@ st_scroll_view_dispose (GObject *object) } static void -st_scroll_view_paint (ClutterActor *actor) +st_scroll_view_paint (ClutterActor *actor, + ClutterPaintContext *paint_context) { StScrollViewPrivate *priv = ST_SCROLL_VIEW (actor)->priv; - st_widget_paint_background (ST_WIDGET (actor)); + st_widget_paint_background (ST_WIDGET (actor), paint_context); if (priv->child) - clutter_actor_paint (priv->child); + clutter_actor_paint (priv->child, paint_context); if (priv->hscrollbar_visible) - clutter_actor_paint (priv->hscroll); + clutter_actor_paint (priv->hscroll, paint_context); if (priv->vscrollbar_visible) - clutter_actor_paint (priv->vscroll); + clutter_actor_paint (priv->vscroll, paint_context); } static void -st_scroll_view_pick (ClutterActor *actor) +st_scroll_view_pick (ClutterActor *actor, + ClutterPickContext *pick_context) { StScrollViewPrivate *priv = ST_SCROLL_VIEW (actor)->priv; /* Chain up so we get a bounding box pained (if we are reactive) */ - CLUTTER_ACTOR_CLASS (st_scroll_view_parent_class)->pick (actor); + CLUTTER_ACTOR_CLASS (st_scroll_view_parent_class)->pick (actor, pick_context); if (priv->child) - clutter_actor_pick (priv->child); + clutter_actor_pick (priv->child, pick_context); if (priv->hscrollbar_visible) - clutter_actor_pick (priv->hscroll); + clutter_actor_pick (priv->hscroll, pick_context); if (priv->vscrollbar_visible) - clutter_actor_pick (priv->vscroll); + clutter_actor_pick (priv->vscroll, pick_context); } static gboolean diff --git a/src/st/st-widget.c b/src/st/st-widget.c index 23787073d..dd11f8ad1 100644 --- a/src/st/st-widget.c +++ b/src/st/st-widget.c @@ -403,7 +403,8 @@ st_widget_allocate (ClutterActor *actor, * painting children. */ void -st_widget_paint_background (StWidget *widget) +st_widget_paint_background (StWidget *widget, + ClutterPaintContext *paint_context) { StWidgetPrivate *priv = st_widget_get_instance_private (widget); CoglFramebuffer *framebuffer; @@ -438,12 +439,13 @@ st_widget_paint_background (StWidget *widget) } static void -st_widget_paint (ClutterActor *actor) +st_widget_paint (ClutterActor *actor, + ClutterPaintContext *paint_context) { - st_widget_paint_background (ST_WIDGET (actor)); + st_widget_paint_background (ST_WIDGET (actor), paint_context); /* Chain up so we paint children. */ - CLUTTER_ACTOR_CLASS (st_widget_parent_class)->paint (actor); + CLUTTER_ACTOR_CLASS (st_widget_parent_class)->paint (actor, paint_context); } static void diff --git a/src/st/st-widget.h b/src/st/st-widget.h index 9b6efd559..82fd7d0b4 100644 --- a/src/st/st-widget.h +++ b/src/st/st-widget.h @@ -133,7 +133,8 @@ StThemeNode * st_widget_get_theme_node (StWidget *widg StThemeNode * st_widget_peek_theme_node (StWidget *widget); GList * st_widget_get_focus_chain (StWidget *widget); -void st_widget_paint_background (StWidget *widget); +void st_widget_paint_background (StWidget *widget, + ClutterPaintContext *paint_context); gboolean st_widget_get_resource_scale (StWidget *widget, float *resource_scale);