From ce98df881ff244ca1120a2907124ee536185eddf Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 29 Nov 2016 03:36:33 +0100 Subject: [PATCH] gsk: Change gsk_renderer_realize() Instead of having a gsk_renderer_set_window() call, pass the window to realize(). This way, the realization can fail with the wrong window. Signed-off-by: Emmanuele Bassi --- docs/reference/gsk/gsk4-sections.txt | 1 - gsk/gskcairorenderer.c | 3 +- gsk/gskglrenderer.c | 8 +--- gsk/gskrenderer.c | 55 +++++++++------------------- gsk/gskrenderer.h | 3 +- gsk/gskrendererprivate.h | 3 +- gtk/gtkwindow.c | 6 +-- 7 files changed, 28 insertions(+), 51 deletions(-) diff --git a/docs/reference/gsk/gsk4-sections.txt b/docs/reference/gsk/gsk4-sections.txt index 30adf194fd..1a1a18d3ea 100644 --- a/docs/reference/gsk/gsk4-sections.txt +++ b/docs/reference/gsk/gsk4-sections.txt @@ -5,7 +5,6 @@ gsk_renderer_set_viewport gsk_renderer_get_viewport gsk_renderer_set_scale_factor gsk_renderer_get_scale_factor -gsk_renderer_set_window gsk_renderer_get_window gsk_renderer_get_display gsk_renderer_realize diff --git a/gsk/gskcairorenderer.c b/gsk/gskcairorenderer.c index 71836c653b..9c9929c7b2 100644 --- a/gsk/gskcairorenderer.c +++ b/gsk/gskcairorenderer.c @@ -34,7 +34,8 @@ struct _GskCairoRendererClass G_DEFINE_TYPE (GskCairoRenderer, gsk_cairo_renderer, GSK_TYPE_RENDERER) static gboolean -gsk_cairo_renderer_realize (GskRenderer *renderer) +gsk_cairo_renderer_realize (GskRenderer *renderer, + GdkWindow *window) { return TRUE; } diff --git a/gsk/gskglrenderer.c b/gsk/gskglrenderer.c index 6834e32ea8..1df501a19f 100644 --- a/gsk/gskglrenderer.c +++ b/gsk/gskglrenderer.c @@ -278,7 +278,8 @@ gsk_gl_renderer_destroy_programs (GskGLRenderer *self) } static gboolean -gsk_gl_renderer_realize (GskRenderer *renderer) +gsk_gl_renderer_realize (GskRenderer *renderer, + GdkWindow *window) { GskGLRenderer *self = GSK_GL_RENDERER (renderer); GError *error = NULL; @@ -288,11 +289,6 @@ gsk_gl_renderer_realize (GskRenderer *renderer) */ if (self->gl_context == NULL) { - GdkWindow *window = gsk_renderer_get_window (renderer); - - if (window == NULL) - return FALSE; - self->gl_context = gdk_window_create_gl_context (window, &error); if (error != NULL) { diff --git a/gsk/gskrenderer.c b/gsk/gskrenderer.c index edf4633e58..7d0d8421ed 100644 --- a/gsk/gskrenderer.c +++ b/gsk/gskrenderer.c @@ -97,7 +97,8 @@ static GParamSpec *gsk_renderer_properties[N_PROPS]; g_critical ("Renderer of type '%s' does not implement GskRenderer::" # method, G_OBJECT_TYPE_NAME (obj)) static gboolean -gsk_renderer_real_realize (GskRenderer *self) +gsk_renderer_real_realize (GskRenderer *self, + GdkWindow *window) { GSK_RENDERER_WARN_NOT_IMPLEMENTED_METHOD (self, realize); return FALSE; @@ -145,7 +146,6 @@ gsk_renderer_dispose (GObject *gobject) g_clear_pointer (&priv->cairo_context, cairo_destroy); g_clear_object (&priv->profiler); - g_clear_object (&priv->window); g_clear_object (&priv->display); G_OBJECT_CLASS (gsk_renderer_parent_class)->dispose (gobject); @@ -170,10 +170,6 @@ gsk_renderer_set_property (GObject *gobject, gsk_renderer_set_scale_factor (self, g_value_get_int (value)); break; - case PROP_WINDOW: - gsk_renderer_set_window (self, g_value_get_object (value)); - break; - case PROP_DISPLAY: /* Construct-only */ priv->display = g_value_dup_object (value); @@ -431,34 +427,12 @@ gsk_renderer_get_scale_factor (GskRenderer *renderer) return priv->scale_factor; } -/** - * gsk_renderer_set_window: - * @renderer: a #GskRenderer - * @window: the window to set - * - * Sets the window on which the @renderer is rendering. - * - * Since: 3.90 - */ -void -gsk_renderer_set_window (GskRenderer *renderer, - GdkWindow *window) -{ - GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); - - g_return_if_fail (GSK_IS_RENDERER (renderer)); - g_return_if_fail (!priv->is_realized); - g_return_if_fail (window == NULL || GDK_IS_WINDOW (window)); - - if (g_set_object (&priv->window, window)) - g_object_notify_by_pspec (G_OBJECT (renderer), gsk_renderer_properties[PROP_WINDOW]); -} - /** * gsk_renderer_get_window: * @renderer: a #GskRenderer * - * Retrieves the #GdkWindow set using gsk_renderer_set_window(). + * Retrieves the #GdkWindow set using gsk_renderer_realize(). If the renderer + * has not been realized yet, %NULL will be returned. * * Returns: (transfer none) (nullable): a #GdkWindow * @@ -553,6 +527,7 @@ gsk_renderer_is_realized (GskRenderer *renderer) /** * gsk_renderer_realize: * @renderer: a #GskRenderer + * @window: the #GdkWindow renderer will be used on * * Creates the resources needed by the @renderer to render the scene * graph. @@ -560,18 +535,25 @@ gsk_renderer_is_realized (GskRenderer *renderer) * Since: 3.90 */ gboolean -gsk_renderer_realize (GskRenderer *renderer) +gsk_renderer_realize (GskRenderer *renderer, + GdkWindow *window) { GskRendererPrivate *priv = gsk_renderer_get_instance_private (renderer); g_return_val_if_fail (GSK_IS_RENDERER (renderer), FALSE); + g_return_val_if_fail (!gsk_renderer_is_realized (renderer), FALSE); + g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); - if (priv->is_realized) - return TRUE; + priv->window = g_object_ref (window); - priv->is_realized = GSK_RENDERER_GET_CLASS (renderer)->realize (renderer); + if (!GSK_RENDERER_GET_CLASS (renderer)->realize (renderer, window)) + { + g_clear_object (&priv->window); + return FALSE; + } - return priv->is_realized; + priv->is_realized = TRUE; + return TRUE; } /** @@ -815,13 +797,12 @@ gsk_renderer_create_fallback (GskRenderer *renderer, res = g_object_new (GSK_TYPE_CAIRO_RENDERER, "display", priv->display, - "window", priv->window, "scale-factor", priv->scale_factor, "viewport", viewport, NULL); gsk_renderer_set_cairo_context (res, cr); - gsk_renderer_realize (res); + gsk_renderer_realize (res, priv->window); return res; } diff --git a/gsk/gskrenderer.h b/gsk/gskrenderer.h index d3e1b3e46b..031de8e86c 100644 --- a/gsk/gskrenderer.h +++ b/gsk/gskrenderer.h @@ -62,7 +62,8 @@ GDK_AVAILABLE_IN_3_90 GdkDisplay * gsk_renderer_get_display (GskRenderer *renderer); GDK_AVAILABLE_IN_3_90 -gboolean gsk_renderer_realize (GskRenderer *renderer); +gboolean gsk_renderer_realize (GskRenderer *renderer, + GdkWindow *window); GDK_AVAILABLE_IN_3_90 void gsk_renderer_unrealize (GskRenderer *renderer); diff --git a/gsk/gskrendererprivate.h b/gsk/gskrendererprivate.h index 57f7e861f3..41064fb6ca 100644 --- a/gsk/gskrendererprivate.h +++ b/gsk/gskrendererprivate.h @@ -37,7 +37,8 @@ struct _GskRendererClass { GObjectClass parent_class; - gboolean (* realize) (GskRenderer *renderer); + gboolean (* realize) (GskRenderer *renderer, + GdkWindow *window); void (* unrealize) (GskRenderer *renderer); void (* render) (GskRenderer *renderer, diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 2715d0cdec..89a43e8ffc 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -6910,8 +6910,7 @@ gtk_window_realize (GtkWidget *widget) popover_realize (popover->widget, popover, window); } - gsk_renderer_set_window (priv->renderer, gdk_window); - gsk_renderer_realize (priv->renderer); + gsk_renderer_realize (priv->renderer, gdk_window); return; } @@ -7109,8 +7108,7 @@ gtk_window_realize (GtkWidget *widget) check_scale_changed (window); /* Renderer */ - gsk_renderer_set_window (priv->renderer, gdk_window); - gsk_renderer_realize (priv->renderer); + gsk_renderer_realize (priv->renderer, gdk_window); } static void