diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index a0e718c47a..b790c4ae75 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "gtkprivate.h" #include "gtkwindowprivate.h" @@ -268,6 +269,8 @@ struct _GtkWindowPrivate GdkWindow *hardcoded_window; GtkCssNode *decoration_node; + + GskRenderer *renderer; }; static const GtkTargetEntry dnd_dest_targets [] = { @@ -6886,6 +6889,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)) { attributes.x = allocation.x; @@ -6915,6 +6928,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; } @@ -7002,6 +7018,10 @@ gtk_window_realize (GtkWidget *widget) gtk_widget_register_window (widget, gdk_window); gtk_widget_set_realized (widget, TRUE); + gsk_renderer_set_window (priv->renderer, gdk_window); + gsk_renderer_set_use_alpha (priv->renderer, TRUE); + gsk_renderer_realize (priv->renderer); + attributes.x = allocation.x; attributes.y = allocation.y; attributes.width = allocation.width; @@ -7125,6 +7145,9 @@ gtk_window_realize (GtkWidget *widget) } check_scale_changed (window); + + /* Renderer */ + gsk_renderer_realize (priv->renderer); } static void @@ -7152,6 +7175,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. @@ -7298,6 +7324,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)) @@ -11826,3 +11867,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__ */