[gtk+/wip/ebassi/gsk-renderer: 57/58] gtk: Port GtkWindow to render nodes
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/ebassi/gsk-renderer: 57/58] gtk: Port GtkWindow to render nodes
- Date: Wed, 27 Jul 2016 10:50:45 +0000 (UTC)
commit 17b62fde0db9692c7e47813caf744f72e945b045
Author: Emmanuele Bassi <ebassi gnome org>
Date: Wed Jul 27 09:42:25 2016 +0100
gtk: Port GtkWindow to render nodes
WARNING: BROKEN COMMIT
gtk/gtkwindow.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 108 insertions(+), 1 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 9540470..aca60f6 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -36,6 +36,7 @@
#include "gtkwindowprivate.h"
#include "gtkaccelgroupprivate.h"
#include "gtkbindings.h"
+#include "gtkcontainerprivate.h"
#include "gtkcsscornervalueprivate.h"
#include "gtkcssiconthemevalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
@@ -459,6 +460,8 @@ static gboolean gtk_window_enable_debugging (GtkWindow *window,
gboolean toggle);
static gint gtk_window_draw (GtkWidget *widget,
cairo_t *cr);
+static GskRenderNode *gtk_window_get_render_node (GtkWidget *widget,
+ GskRenderer *renderer);
static void gtk_window_unset_transient_for (GtkWindow *window);
static void gtk_window_transient_parent_realized (GtkWidget *parent,
GtkWidget *window);
@@ -716,7 +719,7 @@ gtk_window_class_init (GtkWindowClass *klass)
widget_class->focus_out_event = gtk_window_focus_out_event;
widget_class->focus = gtk_window_focus;
widget_class->move_focus = gtk_window_move_focus;
- widget_class->draw = gtk_window_draw;
+// widget_class->draw = gtk_window_draw;
widget_class->window_state_event = gtk_window_state_event;
widget_class->get_preferred_width = gtk_window_get_preferred_width;
widget_class->get_preferred_width_for_height = gtk_window_get_preferred_width_for_height;
@@ -724,6 +727,7 @@ gtk_window_class_init (GtkWindowClass *klass)
widget_class->get_preferred_height_for_width = gtk_window_get_preferred_height_for_width;
widget_class->state_flags_changed = gtk_window_state_flags_changed;
widget_class->style_updated = gtk_window_style_updated;
+ widget_class->get_render_node = gtk_window_get_render_node;
container_class->remove = gtk_window_remove;
container_class->check_resize = gtk_window_check_resize;
@@ -10137,6 +10141,109 @@ gtk_window_compute_hints (GtkWindow *window,
* Redrawing functions *
***********************/
+static GskRenderNode *
+gtk_window_get_render_node (GtkWidget *widget,
+ GskRenderer *renderer)
+{
+ GtkWindowPrivate *priv = GTK_WINDOW (widget)->priv;
+ GtkStyleContext *context;
+ GskRenderNode *node;
+ GtkAllocation allocation;
+ GtkBorder window_border;
+ gint title_height;
+ graphene_rect_t bounds;
+ graphene_matrix_t m;
+ graphene_point3d_t p;
+ cairo_t *cr;
+
+ context = gtk_widget_get_style_context (widget);
+
+ get_shadow_width (GTK_WINDOW (widget), &window_border);
+ _gtk_widget_get_allocation (widget, &allocation);
+
+ graphene_rect_init (&bounds, allocation.x, allocation.y, allocation.width, allocation.height);
+ graphene_matrix_init_translate (&m, graphene_point3d_init (&p, allocation.x, allocation.y, 0.));
+
+ node = gsk_render_node_new ();
+ gsk_render_node_set_name (node, "Window Decoration");
+ gsk_render_node_set_bounds (node, &bounds);
+ gsk_render_node_set_transform (node, &m);
+
+ cr = gsk_render_node_get_draw_context (node);
+
+ if (priv->client_decorated &&
+ priv->decorated &&
+ !priv->fullscreen &&
+ !priv->maximized)
+ {
+ gtk_style_context_save_to_node (context, priv->decoration_node);
+
+ if (priv->use_client_shadow)
+ {
+ GtkBorder padding, border;
+
+ gtk_style_context_get_padding (context, gtk_style_context_get_state (context), &padding);
+ gtk_style_context_get_border (context, gtk_style_context_get_state (context), &border);
+ sum_borders (&border, &padding);
+
+ gtk_render_background (context, cr,
+ window_border.left - border.left, window_border.top - border.top,
+ allocation.width -
+ (window_border.left + window_border.right - border.left - border.right),
+ allocation.height -
+ (window_border.top + window_border.bottom - border.top - border.bottom));
+ gtk_render_frame (context, cr,
+ window_border.left - border.left, window_border.top - border.top,
+ allocation.width -
+ (window_border.left + window_border.right - border.left - border.right),
+ allocation.height -
+ (window_border.top + window_border.bottom - border.top - border.bottom));
+ }
+ else
+ {
+ gtk_render_background (context, cr, 0, 0,
+ allocation.width,
+ allocation.height);
+
+ gtk_render_frame (context, cr, 0, 0,
+ allocation.width,
+ allocation.height);
+ }
+ gtk_style_context_restore (context);
+ }
+
+ if (!gtk_widget_get_app_paintable (widget))
+ {
+ if (priv->title_box &&
+ gtk_widget_get_visible (priv->title_box) &&
+ gtk_widget_get_child_visible (priv->title_box))
+ title_height = priv->title_height;
+ else
+ title_height = 0;
+
+ gtk_render_background (context, cr,
+ window_border.left,
+ window_border.top + title_height,
+ allocation.width -
+ (window_border.left + window_border.right),
+ allocation.height -
+ (window_border.top + window_border.bottom + title_height));
+ gtk_render_frame (context, cr,
+ window_border.left,
+ window_border.top + title_height,
+ allocation.width -
+ (window_border.left + window_border.right),
+ allocation.height -
+ (window_border.top + window_border.bottom + title_height));
+ }
+
+ cairo_destroy (cr);
+
+ gtk_container_propagate_render_node (GTK_CONTAINER (widget), renderer, node);
+
+ return node;
+}
+
static gboolean
gtk_window_draw (GtkWidget *widget,
cairo_t *cr)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]