From 258af60c18aa5bee70f939246f9beabb99a4b461 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 23 Jun 2016 17:34:38 +0100 Subject: [PATCH] gtk: Add a GskRenderer to GtkWindow Each top-level should have its own GskRenderer, to be used when drawing the render node tree. --- gtk/gtkwindow.c | 47 ++++++++++++++++++++++++++++++++++++++++++ gtk/gtkwindowprivate.h | 2 ++ 2 files changed, 49 insertions(+) diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 8dba92efcf..122982a419 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "gtkprivate.h" #include "gtkwindowprivate.h" @@ -270,6 +271,8 @@ struct _GtkWindowPrivate GdkWindow *hardcoded_window; GtkCssNode *decoration_node; + + GskRenderer *renderer; }; static const GtkTargetEntry dnd_dest_targets [] = { @@ -6839,6 +6842,16 @@ gtk_window_realize (GtkWidget *widget) _gtk_widget_get_allocation (widget, &allocation); + if (priv->renderer == NULL) + { + graphene_rect_t viewport; + + priv->renderer = gsk_renderer_get_for_display (gtk_widget_get_display (widget)); + + graphene_rect_init (&viewport, 0, 0, allocation.width, allocation.height); + gsk_renderer_set_viewport (priv->renderer, &viewport); + } + if (gtk_widget_get_parent_window (widget)) { gdk_window = gdk_window_new_child (gtk_widget_get_parent_window (widget), @@ -6857,6 +6870,9 @@ gtk_window_realize (GtkWidget *widget) popover_realize (popover->widget, popover, window); } + gsk_renderer_set_window (priv->renderer, gdk_window); + gsk_renderer_realize (priv->renderer); + return; } @@ -7051,6 +7067,11 @@ gtk_window_realize (GtkWidget *widget) } check_scale_changed (window); + + /* Renderer */ + gsk_renderer_set_window (priv->renderer, gdk_window); + gsk_renderer_set_use_alpha (priv->renderer, TRUE); + gsk_renderer_realize (priv->renderer); } static void @@ -7078,6 +7099,9 @@ gtk_window_unrealize (GtkWidget *widget) GList *link; gint i; + if (priv->renderer != NULL) + gsk_renderer_unrealize (priv->renderer); + /* On unrealize, we reset the size of the window such * that we will re-apply the default sizing stuff * next time we show the window. @@ -7224,6 +7248,21 @@ _gtk_window_set_allocation (GtkWindow *window, child_allocation.width = allocation->width; child_allocation.height = allocation->height; + if (priv->renderer != NULL) + { + graphene_rect_t viewport; + graphene_matrix_t projection; + + graphene_rect_init (&viewport, 0, 0, allocation->width, allocation->height); + gsk_renderer_set_viewport (priv->renderer, &viewport); + + graphene_matrix_init_ortho (&projection, + 0, allocation->width, + 0, allocation->height, + -1, 1); + gsk_renderer_set_projection (priv->renderer, &projection); + } + get_shadow_width (window, &window_border); if (_gtk_widget_get_realized (widget)) @@ -11735,3 +11774,11 @@ gtk_window_unexport_handle (GtkWindow *window) } #endif } + +GskRenderer * +gtk_window_get_renderer (GtkWindow *window) +{ + GtkWindowPrivate *priv = window->priv; + + return priv->renderer; +} diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h index 20dbbda2a6..4d53ee4372 100644 --- a/gtk/gtkwindowprivate.h +++ b/gtk/gtkwindowprivate.h @@ -142,6 +142,8 @@ gboolean gtk_window_export_handle (GtkWindow *window, gpointer user_data); void gtk_window_unexport_handle (GtkWindow *window); +GskRenderer *gtk_window_get_renderer (GtkWindow *window); + G_END_DECLS #endif /* __GTK_WINDOW_PRIVATE_H__ */