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 "gtksizerequest.h"
#include "gtkwidgetprivate.h"
#include "gtkcontainerprivate.h"
/* GtkBoxGadget is a container gadget implementation that arranges its
* children in a row, either horizontally or vertically. Children can
@@ -518,6 +519,36 @@ gtk_box_gadget_draw (GtkCssGadget *gadget,
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
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->allocate = gtk_box_gadget_allocate;
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;
}

View File

@@ -387,28 +387,13 @@ gtk_check_button_get_render_node (GtkWidget *widget,
GskRenderer *renderer)
{
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)))
return GTK_WIDGET_CLASS (gtk_check_button_parent_class)->get_render_node (widget, renderer);
res = gtk_css_gadget_get_render_node (priv->gadget,
renderer,
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;
else
return gtk_css_gadget_get_render_node (priv->gadget,
renderer,
gtk_widget_has_visible_focus (widget));
}
GtkCssNode *

View File

@@ -3287,28 +3287,12 @@ gtk_container_get_path_for_child (GtkContainer *container,
return path;
}
typedef struct {
GtkContainer *container;
GskRenderer *renderer;
GskRenderNode *parent;
GArray *child_infos;
} RenderData;
static gboolean
should_propagate_node (GtkWidget *child,
RenderData *data)
void
gtk_container_propagate_render_node_for_child (GtkContainer *container,
GtkWidget *child,
GskRenderer *renderer,
GskRenderNode *parent)
{
if (!_gtk_widget_is_drawable (child))
return FALSE;
return TRUE;
}
static void
propagate_render_node (GtkWidget *child,
gpointer data_)
{
RenderData *data = data_;
GskRenderNode *node;
GdkWindow *window, *w;
GtkAllocation allocation;
@@ -3316,14 +3300,17 @@ propagate_render_node (GtkWidget *child,
graphene_matrix_t m;
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)
return;
/* 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;
y = -allocation.y;
}
@@ -3333,7 +3320,7 @@ propagate_render_node (GtkWidget *child,
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))
{
@@ -3359,10 +3346,39 @@ propagate_render_node (GtkWidget *child,
graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, x, y, 0));
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);
}
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
collect_child_infos (GtkWidget *widget,
gpointer data_)

View File

@@ -46,6 +46,10 @@ void gtk_container_get_children_clip (GtkContainer *container,
void gtk_container_propagate_render_node (GtkContainer *container,
GskRenderer *renderer,
GskRenderNode *parent_node);
void gtk_container_propagate_render_node_for_child (GtkContainer *container,
GtkWidget *child,
GskRenderer *renderer,
GskRenderNode *parent_node);
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;
}
static GskRenderNode * gtk_css_gadget_real_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus);
static void
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->allocate = gtk_css_gadget_real_allocate;
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->has_content = gtk_css_gadget_has_content;
@@ -812,10 +817,10 @@ gtk_css_gadget_allocate (GtkCssGadget *gadget,
priv->clip = *out_clip;
}
GskRenderNode *
gtk_css_gadget_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus)
static GskRenderNode *
gtk_css_gadget_real_get_render_node (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus)
{
GtkCssGadgetPrivate *priv = gtk_css_gadget_get_instance_private (gadget);
GtkBorder clip, margin, border, padding;
@@ -1112,6 +1117,14 @@ gtk_css_gadget_draw (GtkCssGadget *gadget,
#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
gtk_css_gadget_queue_resize (GtkCssGadget *gadget)
{

View File

@@ -68,6 +68,10 @@ struct _GtkCssGadgetClass
int width,
int height);
GskRenderNode * (* get_render_node) (GtkCssGadget *gadget,
GskRenderer *renderer,
gboolean draw_focus);
void (* style_changed) (GtkCssGadget *gadget,
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_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static gint gtk_entry_draw (GtkWidget *widget,
cairo_t *cr);
static GskRenderNode *gtk_entry_get_render_node (GtkWidget *widget,
GskRenderer *renderer);
static gboolean gtk_entry_event (GtkWidget *widget,
GdkEvent *event);
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->measure = gtk_entry_measure_;
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->leave_notify_event = gtk_entry_leave_notify;
widget_class->event = gtk_entry_event;
@@ -3591,13 +3591,36 @@ should_prelight (GtkEntry *entry,
return TRUE;
}
static gboolean
gtk_entry_draw (GtkWidget *widget,
cairo_t *cr)
static GskRenderNode *
gtk_entry_get_render_node (GtkWidget *widget,
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
@@ -3673,16 +3696,11 @@ gtk_entry_render (GtkCssGadget *gadget,
GtkWidget *widget;
GtkEntry *entry;
GtkEntryPrivate *priv;
int i;
widget = gtk_css_gadget_get_owner (gadget);
entry = GTK_ENTRY (widget);
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 */
cairo_save (cr);
@@ -3699,15 +3717,6 @@ gtk_entry_render (GtkCssGadget *gadget,
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);
return FALSE;

View File

@@ -632,31 +632,7 @@ static GskRenderNode *
gtk_expander_get_render_node (GtkWidget *widget,
GskRenderer *renderer)
{
GskRenderNode *res;
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;
return gtk_css_gadget_get_render_node (GTK_EXPANDER (widget)->priv->gadget, renderer, FALSE);
}
static void