Compare commits

...

6 Commits

Author SHA1 Message Date
Matthias Clasen
dd5c64488f check button: Update for new box gadget functionality
The box gadget now does the render node conversion for
all its children, so we have less work to do.
2016-10-28 12:58:18 -04:00
Matthias Clasen
cb0ba8b0c8 expander: Update for new box gadget functionality
The box gadget now does the render node conversion for
all its children, so we have less work to do.
2016-10-28 12:57:39 -04:00
Matthias Clasen
7577d28db3 box gadget: Implement get_render_node vfunc
This implements get_render_node in the obvious way.
2016-10-28 12:57:07 -04:00
Matthias Clasen
20f44f7918 container: Add a private api for render node propagation
Add a function that propagates a render node for a single
child. This will be used in the box gadget to handle widgets.
2016-10-28 12:56:21 -04:00
Matthias Clasen
bf1c7be738 gadget: Add a get_render_node vfunc
This will let us do box gadgets like we do containers.
2016-10-28 12:55:33 -04:00
Matthias Clasen
4f5eb6a852 Convert GtkEntry to indirect rendering
Warning! This unveils some positioning issue with the secondary icon.
2016-10-28 11:14:17 -04:00
8 changed files with 135 additions and 96 deletions

View File

@@ -26,6 +26,7 @@
#include "gtkprivate.h" #include "gtkprivate.h"
#include "gtksizerequest.h" #include "gtksizerequest.h"
#include "gtkwidgetprivate.h" #include "gtkwidgetprivate.h"
#include "gtkcontainerprivate.h"
/* GtkBoxGadget is a container gadget implementation that arranges its /* GtkBoxGadget is a container gadget implementation that arranges its
* children in a row, either horizontally or vertically. Children can * children in a row, either horizontally or vertically. Children can
@@ -518,6 +519,36 @@ gtk_box_gadget_draw (GtkCssGadget *gadget,
return FALSE; return FALSE;
} }
static GskRenderNode *
gtk_box_gadget_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus)
{
GtkBoxGadgetPrivate *priv = gtk_box_gadget_get_instance_private (GTK_BOX_GADGET (gadget));
GtkWidget *owner = gtk_css_gadget_get_owner (gadget);
GskRenderNode *res, *node;
guint i;
res = GTK_CSS_GADGET_CLASS (gtk_box_gadget_parent_class)->get_render_node (gadget, renderer, draw_focus);
for (i = 0; i < priv->children->len; i++)
{
guint draw_index = priv->draw_reverse ? priv->children->len - 1 - i : i;
GtkBoxGadgetChild *child = &g_array_index (priv->children, GtkBoxGadgetChild, draw_index);
if (GTK_IS_WIDGET (child->object))
gtk_container_propagate_render_node_for_child (GTK_CONTAINER (owner), GTK_WIDGET (child->object), renderer, res);
else
{
node = gtk_css_gadget_get_render_node (GTK_CSS_GADGET (child->object), renderer, FALSE);
gsk_render_node_append_child (res, node);
gsk_render_node_unref (node);
}
}
return res;
}
static gboolean static gboolean
gtk_box_gadget_has_content (GtkCssGadget *gadget) gtk_box_gadget_has_content (GtkCssGadget *gadget)
{ {
@@ -545,6 +576,7 @@ gtk_box_gadget_class_init (GtkBoxGadgetClass *klass)
gadget_class->get_preferred_size = gtk_box_gadget_get_preferred_size; gadget_class->get_preferred_size = gtk_box_gadget_get_preferred_size;
gadget_class->allocate = gtk_box_gadget_allocate; gadget_class->allocate = gtk_box_gadget_allocate;
gadget_class->draw = gtk_box_gadget_draw; gadget_class->draw = gtk_box_gadget_draw;
gadget_class->get_render_node = gtk_box_gadget_get_render_node;
gadget_class->has_content = gtk_box_gadget_has_content; gadget_class->has_content = gtk_box_gadget_has_content;
} }

View File

@@ -387,28 +387,13 @@ gtk_check_button_get_render_node (GtkWidget *widget,
GskRenderer *renderer) GskRenderer *renderer)
{ {
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget)); GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
GskRenderNode *res;
GskRenderNode *node;
if (!gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget))) if (!gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
return GTK_WIDGET_CLASS (gtk_check_button_parent_class)->get_render_node (widget, renderer); return GTK_WIDGET_CLASS (gtk_check_button_parent_class)->get_render_node (widget, renderer);
else
res = gtk_css_gadget_get_render_node (priv->gadget, return gtk_css_gadget_get_render_node (priv->gadget,
renderer, renderer,
gtk_widget_has_visible_focus (widget)); gtk_widget_has_visible_focus (widget));
if (res == NULL)
return NULL;
node = gtk_css_gadget_get_render_node (priv->indicator_gadget,
renderer,
FALSE);
gsk_render_node_append_child (res, node);
gsk_render_node_unref (node);
gtk_container_propagate_render_node (GTK_CONTAINER (widget), renderer, res);
return res;
} }
GtkCssNode * GtkCssNode *

View File

@@ -3287,28 +3287,12 @@ gtk_container_get_path_for_child (GtkContainer *container,
return path; return path;
} }
typedef struct { void
GtkContainer *container; gtk_container_propagate_render_node_for_child (GtkContainer *container,
GskRenderer *renderer; GtkWidget *child,
GskRenderNode *parent; GskRenderer *renderer,
GArray *child_infos; GskRenderNode *parent)
} RenderData;
static gboolean
should_propagate_node (GtkWidget *child,
RenderData *data)
{ {
if (!_gtk_widget_is_drawable (child))
return FALSE;
return TRUE;
}
static void
propagate_render_node (GtkWidget *child,
gpointer data_)
{
RenderData *data = data_;
GskRenderNode *node; GskRenderNode *node;
GdkWindow *window, *w; GdkWindow *window, *w;
GtkAllocation allocation; GtkAllocation allocation;
@@ -3316,14 +3300,17 @@ propagate_render_node (GtkWidget *child,
graphene_matrix_t m; graphene_matrix_t m;
graphene_point3d_t tmp; graphene_point3d_t tmp;
node = gtk_widget_get_render_node (child, data->renderer); if (!_gtk_widget_is_drawable (child))
return;
node = gtk_widget_get_render_node (child, renderer);
if (node == NULL) if (node == NULL)
return; return;
/* translate coordinates. Ugly business, that. */ /* translate coordinates. Ugly business, that. */
if (!_gtk_widget_get_has_window (GTK_WIDGET (data->container))) if (!_gtk_widget_get_has_window (GTK_WIDGET (container)))
{ {
gtk_widget_get_clip (GTK_WIDGET (data->container), &allocation); gtk_widget_get_clip (GTK_WIDGET (container), &allocation);
x = -allocation.x; x = -allocation.x;
y = -allocation.y; y = -allocation.y;
} }
@@ -3333,7 +3320,7 @@ propagate_render_node (GtkWidget *child,
y = 0; y = 0;
} }
window = _gtk_widget_get_window (GTK_WIDGET (data->container)); window = _gtk_widget_get_window (GTK_WIDGET (container));
for (w = _gtk_widget_get_window (child); w && w != window; w = gdk_window_get_parent (w)) for (w = _gtk_widget_get_window (child); w && w != window; w = gdk_window_get_parent (w))
{ {
@@ -3359,10 +3346,39 @@ propagate_render_node (GtkWidget *child,
graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, x, y, 0)); graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, x, y, 0));
gsk_render_node_set_transform (node, &m); gsk_render_node_set_transform (node, &m);
gsk_render_node_append_child (data->parent, node); gsk_render_node_append_child (parent, node);
gsk_render_node_unref (node); gsk_render_node_unref (node);
} }
typedef struct {
GtkContainer *container;
GskRenderer *renderer;
GskRenderNode *parent;
GArray *child_infos;
} RenderData;
static gboolean
should_propagate_node (GtkWidget *child,
RenderData *data)
{
if (!_gtk_widget_is_drawable (child))
return FALSE;
return TRUE;
}
static void
propagate_render_node (GtkWidget *child,
gpointer data_)
{
RenderData *data = data_;
gtk_container_propagate_render_node_for_child (data->container,
child,
data->renderer,
data->parent);
}
static void static void
collect_child_infos (GtkWidget *widget, collect_child_infos (GtkWidget *widget,
gpointer data_) gpointer data_)

View File

@@ -46,6 +46,10 @@ void gtk_container_get_children_clip (GtkContainer *container,
void gtk_container_propagate_render_node (GtkContainer *container, void gtk_container_propagate_render_node (GtkContainer *container,
GskRenderer *renderer, GskRenderer *renderer,
GskRenderNode *parent_node); GskRenderNode *parent_node);
void gtk_container_propagate_render_node_for_child (GtkContainer *container,
GtkWidget *child,
GskRenderer *renderer,
GskRenderNode *parent_node);
G_END_DECLS G_END_DECLS

View File

@@ -261,6 +261,10 @@ gtk_css_gadget_has_content (GtkCssGadget *gadget)
return gadget_class->draw != gtk_css_gadget_real_draw; return gadget_class->draw != gtk_css_gadget_real_draw;
} }
static GskRenderNode * gtk_css_gadget_real_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus);
static void static void
gtk_css_gadget_class_init (GtkCssGadgetClass *klass) gtk_css_gadget_class_init (GtkCssGadgetClass *klass)
{ {
@@ -273,6 +277,7 @@ gtk_css_gadget_class_init (GtkCssGadgetClass *klass)
klass->get_preferred_size = gtk_css_gadget_real_get_preferred_size; klass->get_preferred_size = gtk_css_gadget_real_get_preferred_size;
klass->allocate = gtk_css_gadget_real_allocate; klass->allocate = gtk_css_gadget_real_allocate;
klass->draw = gtk_css_gadget_real_draw; klass->draw = gtk_css_gadget_real_draw;
klass->get_render_node = gtk_css_gadget_real_get_render_node;
klass->style_changed = gtk_css_gadget_real_style_changed; klass->style_changed = gtk_css_gadget_real_style_changed;
klass->has_content = gtk_css_gadget_has_content; klass->has_content = gtk_css_gadget_has_content;
@@ -812,10 +817,10 @@ gtk_css_gadget_allocate (GtkCssGadget *gadget,
priv->clip = *out_clip; priv->clip = *out_clip;
} }
GskRenderNode * static GskRenderNode *
gtk_css_gadget_get_render_node (GtkCssGadget *gadget, gtk_css_gadget_real_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer, GskRenderer *renderer,
gboolean draw_focus) gboolean draw_focus)
{ {
GtkCssGadgetPrivate *priv = gtk_css_gadget_get_instance_private (gadget); GtkCssGadgetPrivate *priv = gtk_css_gadget_get_instance_private (gadget);
GtkBorder clip, margin, border, padding; GtkBorder clip, margin, border, padding;
@@ -1112,6 +1117,14 @@ gtk_css_gadget_draw (GtkCssGadget *gadget,
#endif #endif
} }
GskRenderNode *
gtk_css_gadget_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus)
{
return GTK_CSS_GADGET_GET_CLASS (gadget)->get_render_node (gadget, renderer, draw_focus);
}
void void
gtk_css_gadget_queue_resize (GtkCssGadget *gadget) gtk_css_gadget_queue_resize (GtkCssGadget *gadget)
{ {

View File

@@ -68,6 +68,10 @@ struct _GtkCssGadgetClass
int width, int width,
int height); int height);
GskRenderNode * (* get_render_node) (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus);
void (* style_changed) (GtkCssGadget *gadget, void (* style_changed) (GtkCssGadget *gadget,
GtkCssStyleChange *change); GtkCssStyleChange *change);

View File

@@ -414,8 +414,8 @@ static void gtk_entry_map (GtkWidget *widget);
static void gtk_entry_unmap (GtkWidget *widget); static void gtk_entry_unmap (GtkWidget *widget);
static void gtk_entry_size_allocate (GtkWidget *widget, static void gtk_entry_size_allocate (GtkWidget *widget,
GtkAllocation *allocation); GtkAllocation *allocation);
static gint gtk_entry_draw (GtkWidget *widget, static GskRenderNode *gtk_entry_get_render_node (GtkWidget *widget,
cairo_t *cr); GskRenderer *renderer);
static gboolean gtk_entry_event (GtkWidget *widget, static gboolean gtk_entry_event (GtkWidget *widget,
GdkEvent *event); GdkEvent *event);
static gint gtk_entry_enter_notify (GtkWidget *widget, static gint gtk_entry_enter_notify (GtkWidget *widget,
@@ -761,7 +761,7 @@ gtk_entry_class_init (GtkEntryClass *class)
widget_class->unrealize = gtk_entry_unrealize; widget_class->unrealize = gtk_entry_unrealize;
widget_class->measure = gtk_entry_measure_; widget_class->measure = gtk_entry_measure_;
widget_class->size_allocate = gtk_entry_size_allocate; widget_class->size_allocate = gtk_entry_size_allocate;
widget_class->draw = gtk_entry_draw; widget_class->get_render_node = gtk_entry_get_render_node;
widget_class->enter_notify_event = gtk_entry_enter_notify; widget_class->enter_notify_event = gtk_entry_enter_notify;
widget_class->leave_notify_event = gtk_entry_leave_notify; widget_class->leave_notify_event = gtk_entry_leave_notify;
widget_class->event = gtk_entry_event; widget_class->event = gtk_entry_event;
@@ -3591,13 +3591,36 @@ should_prelight (GtkEntry *entry,
return TRUE; return TRUE;
} }
static gboolean static GskRenderNode *
gtk_entry_draw (GtkWidget *widget, gtk_entry_get_render_node (GtkWidget *widget,
cairo_t *cr) GskRenderer *renderer)
{ {
gtk_css_gadget_draw (GTK_ENTRY (widget)->priv->gadget, cr); GtkEntryPrivate *priv = GTK_ENTRY (widget)->priv;
GskRenderNode *res, *node;
int i;
return GDK_EVENT_PROPAGATE; res = gtk_css_gadget_get_render_node (priv->gadget, renderer, FALSE);
for (i = 0; i < MAX_ICONS; i++)
{
EntryIconInfo *icon_info = priv->icons[i];
if (icon_info == NULL)
continue;
node = gtk_css_gadget_get_render_node (icon_info->gadget, renderer, FALSE);
gsk_render_node_append_child (res, node);
gsk_render_node_unref (node);
}
if (priv->progress_gadget && gtk_css_gadget_get_visible (priv->progress_gadget))
{
node = gtk_css_gadget_get_render_node (priv->progress_gadget, renderer, FALSE);
gsk_render_node_append_child (res, node);
gsk_render_node_unref (node);
}
return res;
} }
#define UNDERSHOOT_SIZE 20 #define UNDERSHOOT_SIZE 20
@@ -3673,16 +3696,11 @@ gtk_entry_render (GtkCssGadget *gadget,
GtkWidget *widget; GtkWidget *widget;
GtkEntry *entry; GtkEntry *entry;
GtkEntryPrivate *priv; GtkEntryPrivate *priv;
int i;
widget = gtk_css_gadget_get_owner (gadget); widget = gtk_css_gadget_get_owner (gadget);
entry = GTK_ENTRY (widget); entry = GTK_ENTRY (widget);
priv = entry->priv; priv = entry->priv;
/* Draw progress */
if (priv->progress_gadget && gtk_css_gadget_get_visible (priv->progress_gadget))
gtk_css_gadget_draw (priv->progress_gadget, cr);
/* Draw text and cursor */ /* Draw text and cursor */
cairo_save (cr); cairo_save (cr);
@@ -3699,15 +3717,6 @@ gtk_entry_render (GtkCssGadget *gadget,
cairo_restore (cr); cairo_restore (cr);
/* Draw icons */
for (i = 0; i < MAX_ICONS; i++)
{
EntryIconInfo *icon_info = priv->icons[i];
if (icon_info != NULL)
gtk_css_gadget_draw (icon_info->gadget, cr);
}
gtk_entry_draw_undershoot (entry, cr); gtk_entry_draw_undershoot (entry, cr);
return FALSE; return FALSE;

View File

@@ -632,31 +632,7 @@ static GskRenderNode *
gtk_expander_get_render_node (GtkWidget *widget, gtk_expander_get_render_node (GtkWidget *widget,
GskRenderer *renderer) GskRenderer *renderer)
{ {
GskRenderNode *res; return gtk_css_gadget_get_render_node (GTK_EXPANDER (widget)->priv->gadget, renderer, FALSE);
GskRenderNode *node;
res = gtk_css_gadget_get_render_node (GTK_EXPANDER (widget)->priv->gadget,
renderer,
FALSE);
if (res == NULL)
return NULL;
node = gtk_css_gadget_get_render_node (GTK_EXPANDER (widget)->priv->title_gadget,
renderer,
FALSE);
gsk_render_node_append_child (res, node);
gsk_render_node_unref (node);
node = gtk_css_gadget_get_render_node (GTK_EXPANDER (widget)->priv->arrow_gadget,
renderer,
FALSE);
gsk_render_node_append_child (res, node);
gsk_render_node_unref (node);
gtk_container_propagate_render_node (GTK_CONTAINER (widget), renderer, res);
return res;
} }
static void static void