Compare commits
6 Commits
wip/sadiq/
...
wip/matthi
Author | SHA1 | Date | |
---|---|---|---|
|
dd5c64488f | ||
|
cb0ba8b0c8 | ||
|
7577d28db3 | ||
|
20f44f7918 | ||
|
bf1c7be738 | ||
|
4f5eb6a852 |
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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 *
|
||||
|
@@ -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_)
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user