summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-07-25 02:03:46 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-07-25 02:03:46 +0000
commit4dc4c00267e6135412f5d06364bd7c8adf0540a6 (patch)
tree3896c7c9d1e656b83bab0537a0a5e15ce0e56d90
parentd44ce1987dbac3ca157cd4cf84bef9aa225d7ce0 (diff)
parentd76460343a9b91afda6cfe6a5fab6ad4732c6b34 (diff)
downloadgtk+-4dc4c00267e6135412f5d06364bd7c8adf0540a6.tar.gz
Merge branch 'misc-speedups' into 'master'
ngl: Speed up clipping calculations a bit See merge request GNOME/gtk!3784
-rw-r--r--gsk/gskrendernodeimpl.c28
-rw-r--r--gsk/gskrendernodeprivate.h8
-rw-r--r--gsk/gsktransform.c87
-rw-r--r--gsk/ngl/gsknglglyphlibrary.c14
-rw-r--r--gsk/ngl/gskngliconlibrary.c11
-rw-r--r--gsk/ngl/gsknglrenderjob.c67
-rw-r--r--gtk/gtkgridlayout.c36
-rw-r--r--gtk/gtklayoutmanager.c2
-rw-r--r--gtk/gtksizerequest.c20
-rw-r--r--gtk/gtkwidget.c50
-rw-r--r--gtk/gtkwidgetfocus.c12
-rw-r--r--gtk/gtkwidgetprivate.h14
12 files changed, 190 insertions, 159 deletions
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c
index c7751b8e3a..9a9705d0fd 100644
--- a/gsk/gskrendernodeimpl.c
+++ b/gsk/gskrendernodeimpl.c
@@ -2780,6 +2780,17 @@ gsk_container_node_get_child (const GskRenderNode *node,
return self->children[idx];
}
+GskRenderNode **
+gsk_container_node_get_children (const GskRenderNode *node,
+ guint *n_children)
+{
+ const GskContainerNode *self = (const GskContainerNode *) node;
+
+ *n_children = self->n_children;
+
+ return self->children;
+}
+
/*** GSK_TRANSFORM_NODE ***/
/**
@@ -2793,6 +2804,7 @@ struct _GskTransformNode
GskRenderNode *child;
GskTransform *transform;
+ float dx, dy;
};
static void
@@ -2944,6 +2956,11 @@ gsk_transform_node_new (GskRenderNode *child,
self->child = gsk_render_node_ref (child);
self->transform = gsk_transform_ref (transform);
+ if (gsk_transform_get_category (transform) >= GSK_TRANSFORM_CATEGORY_2D_TRANSLATE)
+ gsk_transform_to_translate (transform, &self->dx, &self->dy);
+ else
+ self->dx = self->dy = 0;
+
gsk_transform_transform_bounds (self->transform,
&child->bounds,
&node->bounds);
@@ -2983,6 +3000,17 @@ gsk_transform_node_get_transform (const GskRenderNode *node)
return self->transform;
}
+void
+gsk_transform_node_get_translate (const GskRenderNode *node,
+ float *dx,
+ float *dy)
+{
+ const GskTransformNode *self = (const GskTransformNode *) node;
+
+ *dx = self->dx;
+ *dy = self->dy;
+}
+
/*** GSK_OPACITY_NODE ***/
/**
diff --git a/gsk/gskrendernodeprivate.h b/gsk/gskrendernodeprivate.h
index 8fef8e7aa4..ac20813b65 100644
--- a/gsk/gskrendernodeprivate.h
+++ b/gsk/gskrendernodeprivate.h
@@ -103,6 +103,14 @@ bool gsk_border_node_get_uniform_color (const GskRenderNode
void gsk_text_node_serialize_glyphs (GskRenderNode *self,
GString *str);
+GskRenderNode ** gsk_container_node_get_children (const GskRenderNode *node,
+ guint *n_children);
+
+void gsk_transform_node_get_translate (const GskRenderNode *node,
+ float *dx,
+ float *dy);
+
+
G_END_DECLS
#endif /* __GSK_RENDER_NODE_PRIVATE_H__ */
diff --git a/gsk/gsktransform.c b/gsk/gsktransform.c
index 38a1b598d3..b58eb55aad 100644
--- a/gsk/gsktransform.c
+++ b/gsk/gsktransform.c
@@ -1487,21 +1487,21 @@ gsk_transform_to_2d (GskTransform *self,
float *out_dx,
float *out_dy)
{
- if (self == NULL ||
- self->category < GSK_TRANSFORM_CATEGORY_2D)
+ *out_xx = 1.0f;
+ *out_yx = 0.0f;
+ *out_xy = 0.0f;
+ *out_yy = 1.0f;
+ *out_dx = 0.0f;
+ *out_dy = 0.0f;
+
+ if (self == NULL)
+ return;
+
+ if (G_UNLIKELY (self->category < GSK_TRANSFORM_CATEGORY_2D))
{
- if (self != NULL)
- {
- char *s = gsk_transform_to_string (self);
- g_warning ("Given transform \"%s\" is not a 2D transform.", s);
- g_free (s);
- }
- *out_xx = 1.0f;
- *out_yx = 0.0f;
- *out_xy = 0.0f;
- *out_yy = 1.0f;
- *out_dx = 0.0f;
- *out_dy = 0.0f;
+ char *s = gsk_transform_to_string (self);
+ g_warning ("Given transform \"%s\" is not a 2D transform.", s);
+ g_free (s);
return;
}
@@ -1544,41 +1544,25 @@ gsk_transform_to_affine (GskTransform *self,
float *out_dx,
float *out_dy)
{
+ *out_scale_x = 1.0f;
+ *out_scale_y = 1.0f;
+ *out_dx = 0.0f;
+ *out_dy = 0.0f;
+
if (self == NULL)
- {
- *out_scale_x = 1.0f;
- *out_scale_y = 1.0f;
- *out_dx = 0.0f;
- *out_dy = 0.0f;
- return;
- }
+ return;
if (G_UNLIKELY (self->category < GSK_TRANSFORM_CATEGORY_2D_AFFINE))
{
char *s = gsk_transform_to_string (self);
g_warning ("Given transform \"%s\" is not an affine 2D transform.", s);
g_free (s);
-
- *out_scale_x = 1.0f;
- *out_scale_y = 1.0f;
- *out_dx = 0.0f;
- *out_dy = 0.0f;
return;
}
- if (self->next != NULL)
- {
- gsk_transform_to_affine (self->next,
- out_scale_x, out_scale_y,
- out_dx, out_dy);
- }
- else
- {
- *out_scale_x = 1.0f;
- *out_scale_y = 1.0f;
- *out_dx = 0.0f;
- *out_dy = 0.0f;
- }
+ gsk_transform_to_affine (self->next,
+ out_scale_x, out_scale_y,
+ out_dx, out_dy);
self->transform_class->apply_affine (self,
out_scale_x, out_scale_y,
@@ -1607,12 +1591,11 @@ gsk_transform_to_translate (GskTransform *self,
float *out_dx,
float *out_dy)
{
+ *out_dx = 0.0f;
+ *out_dy = 0.0f;
+
if (self == NULL)
- {
- *out_dx = 0.0f;
- *out_dy = 0.0f;
- return;
- }
+ return;
if (G_UNLIKELY (self->category < GSK_TRANSFORM_CATEGORY_2D_TRANSLATE))
{
@@ -1620,24 +1603,12 @@ gsk_transform_to_translate (GskTransform *self,
g_warning ("Given transform \"%s\" is not an affine 2D translation.", s);
g_free (s);
- *out_dx = 0.0f;
- *out_dy = 0.0f;
return;
}
- if (self->next != NULL)
- {
- gsk_transform_to_translate (self->next,
- out_dx, out_dy);
- }
- else
- {
- *out_dx = 0.0f;
- *out_dy = 0.0f;
- }
+ gsk_transform_to_translate (self->next, out_dx, out_dy);
- self->transform_class->apply_translate (self,
- out_dx, out_dy);
+ self->transform_class->apply_translate (self, out_dx, out_dy);
}
/**
diff --git a/gsk/ngl/gsknglglyphlibrary.c b/gsk/ngl/gsknglglyphlibrary.c
index 0339f4590f..627f35f59e 100644
--- a/gsk/ngl/gsknglglyphlibrary.c
+++ b/gsk/ngl/gsknglglyphlibrary.c
@@ -88,7 +88,7 @@ gsk_ngl_glyph_library_begin_frame (GskNglTextureLibrary *library,
gint64 frame_id,
GPtrArray *removed_atlases)
{
- GskNglGlyphLibrary *self = GSK_NGL_GLYPH_LIBRARY (library);
+ GskNglGlyphLibrary *self = (GskNglGlyphLibrary *)library;
memset (self->front, 0, sizeof self->front);
}
@@ -117,8 +117,10 @@ gsk_ngl_glyph_library_class_init (GskNglGlyphLibraryClass *klass)
static void
gsk_ngl_glyph_library_init (GskNglGlyphLibrary *self)
{
- GSK_NGL_TEXTURE_LIBRARY (self)->max_entry_size = MAX_GLYPH_SIZE;
- gsk_ngl_texture_library_set_funcs (GSK_NGL_TEXTURE_LIBRARY (self),
+ GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
+
+ tl->max_entry_size = MAX_GLYPH_SIZE;
+ gsk_ngl_texture_library_set_funcs (tl,
gsk_ngl_glyph_key_hash,
gsk_ngl_glyph_key_equal,
gsk_ngl_glyph_key_free,
@@ -200,6 +202,7 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self,
int height,
double device_scale)
{
+ GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
cairo_scaled_font_t *scaled_font;
cairo_surface_t *surface;
@@ -264,7 +267,7 @@ gsk_ngl_glyph_library_upload_glyph (GskNglGlyphLibrary *self,
gdk_gl_context_pop_debug_group (gdk_gl_context_get_current ());
- GSK_NGL_TEXTURE_LIBRARY (self)->driver->command_queue->n_uploads++;
+ tl->driver->command_queue->n_uploads++;
if (gdk_profiler_is_running ())
{
@@ -279,6 +282,7 @@ gsk_ngl_glyph_library_add (GskNglGlyphLibrary *self,
GskNglGlyphKey *key,
const GskNglGlyphValue **out_value)
{
+ GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
PangoRectangle ink_rect;
GskNglGlyphValue *value;
int width;
@@ -301,7 +305,7 @@ gsk_ngl_glyph_library_add (GskNglGlyphLibrary *self,
width = (int) ceil (ink_rect.width * key->scale / 1024.0);
height = (int) ceil (ink_rect.height * key->scale / 1024.0);
- value = gsk_ngl_texture_library_pack (GSK_NGL_TEXTURE_LIBRARY (self),
+ value = gsk_ngl_texture_library_pack (tl,
key,
sizeof *value,
width,
diff --git a/gsk/ngl/gskngliconlibrary.c b/gsk/ngl/gskngliconlibrary.c
index 4d84cb2354..977c201051 100644
--- a/gsk/ngl/gskngliconlibrary.c
+++ b/gsk/ngl/gskngliconlibrary.c
@@ -63,8 +63,10 @@ gsk_ngl_icon_library_class_init (GskNglIconLibraryClass *klass)
static void
gsk_ngl_icon_library_init (GskNglIconLibrary *self)
{
- GSK_NGL_TEXTURE_LIBRARY (self)->max_entry_size = 128;
- gsk_ngl_texture_library_set_funcs (GSK_NGL_TEXTURE_LIBRARY (self),
+ GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
+
+ tl->max_entry_size = 128;
+ gsk_ngl_texture_library_set_funcs (tl,
NULL, NULL, NULL,
gsk_ngl_icon_data_free);
}
@@ -74,6 +76,7 @@ gsk_ngl_icon_library_add (GskNglIconLibrary *self,
GdkTexture *key,
const GskNglIconData **out_value)
{
+ GskNglTextureLibrary *tl = (GskNglTextureLibrary *)self;
G_GNUC_UNUSED gint64 start_time = GDK_PROFILER_CURRENT_TIME;
cairo_surface_t *surface;
GskNglIconData *icon_data;
@@ -95,7 +98,7 @@ gsk_ngl_icon_library_add (GskNglIconLibrary *self,
width = key->width;
height = key->height;
- icon_data = gsk_ngl_texture_library_pack (GSK_NGL_TEXTURE_LIBRARY (self),
+ icon_data = gsk_ngl_texture_library_pack (tl,
key,
sizeof (GskNglIconData),
width, height, 1,
@@ -202,7 +205,7 @@ gsk_ngl_icon_library_add (GskNglIconLibrary *self,
cairo_surface_destroy (surface);
g_free (free_data);
- GSK_NGL_TEXTURE_LIBRARY (self)->driver->command_queue->n_uploads++;
+ tl->driver->command_queue->n_uploads++;
if (gdk_profiler_is_running ())
{
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 72efcae92a..2351379b2e 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -89,6 +89,8 @@ typedef struct _GskNglRenderModelview
GskTransform *transform;
float scale_x;
float scale_y;
+ float dx;
+ float dy;
float offset_x_before;
float offset_y_before;
graphene_matrix_t matrix;
@@ -347,31 +349,38 @@ intersect_rounded_rectilinear (const graphene_rect_t *non_rounded,
corners[0] = rounded_rect_has_corner (rounded, 0) &&
rect_intersects (non_rounded,
&rounded_rect_corner (rounded, 0));
- /* top right? */
+ if (corners[0] && !rect_contains_rect (non_rounded,
+ &rounded_rect_corner (rounded, 0)))
+ return FALSE;
+
+ /* top right ? */
corners[1] = rounded_rect_has_corner (rounded, 1) &&
rect_intersects (non_rounded,
&rounded_rect_corner (rounded, 1));
- /* bottom right? */
+ if (corners[1] && !rect_contains_rect (non_rounded,
+ &rounded_rect_corner (rounded, 1)))
+ return FALSE;
+
+ /* bottom right ? */
corners[2] = rounded_rect_has_corner (rounded, 2) &&
rect_intersects (non_rounded,
&rounded_rect_corner (rounded, 2));
- /* bottom left */
+ if (corners[2] && !rect_contains_rect (non_rounded,
+ &rounded_rect_corner (rounded, 2)))
+ return FALSE;
+
+ /* bottom left ? */
corners[3] = rounded_rect_has_corner (rounded, 3) &&
rect_intersects (non_rounded,
&rounded_rect_corner (rounded, 3));
-
- if (corners[0] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 0)))
- return FALSE;
- if (corners[1] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 1)))
- return FALSE;
- if (corners[2] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 2)))
- return FALSE;
- if (corners[3] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 3)))
+ if (corners[3] && !rect_contains_rect (non_rounded,
+ &rounded_rect_corner (rounded, 3)))
return FALSE;
/* We do intersect with at least one of the corners, but in such a way that the
* intersection between the two clips can still be represented by a single rounded
- * rect in a trivial way. do that. */
+ * rect in a trivial way. do that.
+ */
graphene_rect_intersection (non_rounded, &rounded->bounds, &result->bounds);
for (guint i = 0; i < 4; i++)
@@ -417,22 +426,28 @@ gsk_ngl_render_job_set_alpha (GskNglRenderJob *job,
static void
extract_matrix_metadata (GskNglRenderModelview *modelview)
{
- float dummy;
-
gsk_transform_to_matrix (modelview->transform, &modelview->matrix);
switch (gsk_transform_get_category (modelview->transform))
{
case GSK_TRANSFORM_CATEGORY_IDENTITY:
+ modelview->scale_x = 1;
+ modelview->scale_y = 1;
+ modelview->dx = 0;
+ modelview->dy = 0;
+ break;
+
case GSK_TRANSFORM_CATEGORY_2D_TRANSLATE:
modelview->scale_x = 1;
modelview->scale_y = 1;
+ gsk_transform_to_translate (modelview->transform,
+ &modelview->dx, &modelview->dy);
break;
case GSK_TRANSFORM_CATEGORY_2D_AFFINE:
gsk_transform_to_affine (modelview->transform,
&modelview->scale_x, &modelview->scale_y,
- &dummy, &dummy);
+ &modelview->dx, &modelview->dy);
break;
case GSK_TRANSFORM_CATEGORY_UNKNOWN:
@@ -457,6 +472,8 @@ extract_matrix_metadata (GskNglRenderModelview *modelview)
modelview->scale_x = graphene_vec3_length (&col1);
modelview->scale_y = graphene_vec3_length (&col2);
+ modelview->dx = 0;
+ modelview->dy = 0;
}
break;
@@ -736,9 +753,10 @@ gsk_ngl_render_job_transform_bounds (GskNglRenderJob *job,
*/
if G_LIKELY (category >= GSK_TRANSFORM_CATEGORY_2D_AFFINE)
{
- float dx, dy, scale_x, scale_y;
-
- gsk_transform_to_affine (transform, &scale_x, &scale_y, &dx, &dy);
+ float scale_x = job->current_modelview->scale_x;
+ float scale_y = job->current_modelview->scale_y;
+ float dx = job->current_modelview->dx;
+ float dy = job->current_modelview->dy;
/* Init directly into out rect */
out_rect->origin.x = ((rect->origin.x + job->offset_x) * scale_x) + dx;
@@ -1949,7 +1967,7 @@ gsk_ngl_render_job_visit_transform_node (GskNglRenderJob *job,
{
float dx, dy;
- gsk_transform_to_translate (transform, &dx, &dy);
+ gsk_transform_node_get_translate (node, &dx, &dy);
gsk_ngl_render_job_offset (job, dx, dy);
gsk_ngl_render_job_visit_node (job, child);
gsk_ngl_render_job_offset (job, -dx, -dy);
@@ -3325,7 +3343,7 @@ gsk_ngl_render_job_upload_texture (GskNglRenderJob *job,
GdkTexture *texture,
GskNglRenderOffscreen *offscreen)
{
- if (gsk_ngl_texture_library_can_cache (GSK_NGL_TEXTURE_LIBRARY (job->driver->icons),
+ if (gsk_ngl_texture_library_can_cache ((GskNglTextureLibrary *)job->driver->icons,
texture->width,
texture->height) &&
!GDK_IS_GL_TEXTURE (texture))
@@ -3529,18 +3547,21 @@ gsk_ngl_render_job_visit_node (GskNglRenderJob *job,
case GSK_CONTAINER_NODE:
{
- guint n_children = gsk_container_node_get_n_children (node);
+ GskRenderNode **children;
+ guint n_children;
+
+ children = gsk_container_node_get_children (node, &n_children);
for (guint i = 0; i < n_children; i++)
{
- const GskRenderNode *child = gsk_container_node_get_child (node, i);
+ const GskRenderNode *child = children[i];
if (i + 1 < n_children &&
job->current_clip->is_fully_contained &&
gsk_render_node_get_node_type (child) == GSK_ROUNDED_CLIP_NODE)
{
const GskRenderNode *grandchild = gsk_rounded_clip_node_get_child (child);
- const GskRenderNode *child2 = gsk_container_node_get_child (node, i + 1);
+ const GskRenderNode *child2 = children[i + 1];
if (gsk_render_node_get_node_type (grandchild) == GSK_COLOR_NODE &&
gsk_render_node_get_node_type (child2) == GSK_BORDER_NODE &&
gsk_border_node_get_uniform_color (child2) &&
diff --git a/gtk/gtkgridlayout.c b/gtk/gtkgridlayout.c
index fcf067adba..c9b6195abe 100644
--- a/gtk/gtkgridlayout.c
+++ b/gtk/gtkgridlayout.c
@@ -462,7 +462,7 @@ get_grid_child (GtkGridLayout *self,
{
GtkLayoutManager *manager = GTK_LAYOUT_MANAGER (self);
- return GTK_GRID_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (manager, child));
+ return (GtkGridLayoutChild *) gtk_layout_manager_get_layout_child (manager, child);
}
static int
@@ -496,9 +496,9 @@ grid_request_count_lines (GridRequest *request)
min[0] = min[1] = G_MAXINT;
max[0] = max[1] = G_MININT;
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
GridChildAttach *attach = grid_child->attach;
@@ -541,9 +541,9 @@ grid_request_init (GridRequest *request,
}
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
GridChildAttach *attach;
@@ -637,9 +637,9 @@ grid_request_non_spanning (GridRequest *request,
lines = &request->lines[orientation];
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
GridChildAttach *attach;
@@ -776,9 +776,9 @@ grid_request_spanning (GridRequest *request,
lines = &request->lines[orientation];
spacing = get_spacing (request->layout, request->widget, orientation);
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
@@ -915,9 +915,9 @@ grid_request_compute_expand (GridRequest *request,
lines->lines[i].empty = TRUE;
}
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
@@ -937,9 +937,9 @@ grid_request_compute_expand (GridRequest *request,
line->expand = TRUE;
}
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
@@ -1365,7 +1365,7 @@ gtk_grid_layout_get_size (GtkGridLayout *self,
if (natural_baseline)
*natural_baseline = -1;
- if (gtk_widget_get_first_child (widget) == NULL)
+ if (_gtk_widget_get_first_child (widget) == NULL)
return;
request.layout = self;
@@ -1405,7 +1405,7 @@ gtk_grid_layout_get_size_for_size (GtkGridLayout *self,
if (natural_baseline)
*natural_baseline = -1;
- if (gtk_widget_get_first_child (widget) == NULL)
+ if (_gtk_widget_get_first_child (widget) == NULL)
return;
request.layout = self;
@@ -1495,9 +1495,9 @@ grid_request_allocate_children (GridRequest *request,
int x, y, width, height, baseline, ignore;
- for (child = gtk_widget_get_first_child (request->widget);
+ for (child = _gtk_widget_get_first_child (request->widget);
child != NULL;
- child = gtk_widget_get_next_sibling (child))
+ child = _gtk_widget_get_next_sibling (child))
{
GtkGridLayoutChild *grid_child = get_grid_child (request->layout, child);
@@ -1533,7 +1533,7 @@ gtk_grid_layout_allocate (GtkLayoutManager *manager,
GridLines *lines;
GtkOrientation orientation;
- if (gtk_widget_get_first_child (widget) == NULL)
+ if (_gtk_widget_get_first_child (widget) == NULL)
return;
request.layout = self;
diff --git a/gtk/gtklayoutmanager.c b/gtk/gtklayoutmanager.c
index 2d6901103c..57746fd03e 100644
--- a/gtk/gtklayoutmanager.c
+++ b/gtk/gtklayoutmanager.c
@@ -517,7 +517,7 @@ gtk_layout_manager_get_layout_child (GtkLayoutManager *manager,
g_return_val_if_fail (GTK_IS_LAYOUT_MANAGER (manager), NULL);
g_return_val_if_fail (GTK_IS_WIDGET (child), NULL);
- parent = gtk_widget_get_parent (child);
+ parent = _gtk_widget_get_parent (child);
g_return_val_if_fail (parent != NULL, NULL);
if (priv->widget != parent)
diff --git a/gtk/gtksizerequest.c b/gtk/gtksizerequest.c
index 935112061a..45770d5498 100644
--- a/gtk/gtksizerequest.c
+++ b/gtk/gtksizerequest.c
@@ -234,13 +234,16 @@ gtk_widget_query_size_for_orientation (GtkWidget *widget,
&minimum_for_size, &natural_for_size,
NULL, NULL);
- if (for_size < MAX (minimum_for_size, css_min_for_size))
- for_size = MAX (minimum_for_size, css_min_for_size);
+ if (minimum_for_size < css_min_for_size)
+ minimum_for_size = css_min_for_size;
+
+ if (for_size < minimum_for_size)
+ for_size = minimum_for_size;
adjusted_for_size = for_size - widget_margins_for_size;
adjusted_for_size -= css_extra_for_size;
if (adjusted_for_size < 0)
- adjusted_for_size = MAX (minimum_for_size, css_min_for_size);
+ adjusted_for_size = minimum_for_size;
push_recursion_check (widget, orientation);
gtk_layout_manager_measure (layout_manager, widget,
@@ -272,13 +275,16 @@ gtk_widget_query_size_for_orientation (GtkWidget *widget,
gtk_widget_measure (widget, OPPOSITE_ORIENTATION (orientation), -1,
&minimum_for_size, &natural_for_size, NULL, NULL);
- /* TODO: Warn if the given for_size is too small? */
- if (for_size < MAX (minimum_for_size, css_min_for_size))
- for_size = MAX (minimum_for_size, css_min_for_size);
+ if (minimum_for_size < css_min_for_size)
+ minimum_for_size = css_min_for_size;
- adjusted_for_size = for_size - widget_margins_for_size;
+ if (for_size < minimum_for_size)
+ for_size = minimum_for_size;
+ adjusted_for_size = for_size - widget_margins_for_size;
adjusted_for_size -= css_extra_for_size;
+ if (adjusted_for_size < 0)
+ adjusted_for_size = minimum_for_size;
push_recursion_check (widget, orientation);
widget_class->measure (widget,
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 724ee32eae..a032876e55 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -623,7 +623,6 @@ static GQuark quark_pango_context = 0;
static GQuark quark_mnemonic_labels = 0;
static GQuark quark_size_groups = 0;
static GQuark quark_auto_children = 0;
-static GQuark quark_action_muxer = 0;
static GQuark quark_font_options = 0;
static GQuark quark_font_map = 0;
static GQuark quark_builder_set_id = 0;
@@ -1147,7 +1146,6 @@ gtk_widget_class_init (GtkWidgetClass *klass)
quark_mnemonic_labels = g_quark_from_static_string ("gtk-mnemonic-labels");
quark_size_groups = g_quark_from_static_string ("gtk-widget-size-groups");
quark_auto_children = g_quark_from_static_string ("gtk-widget-auto-children");
- quark_action_muxer = g_quark_from_static_string ("gtk-widget-action-muxer");
quark_font_options = g_quark_from_static_string ("gtk-widget-font-options");
quark_font_map = g_quark_from_static_string ("gtk-widget-font-map");
@@ -6783,7 +6781,7 @@ _gtk_widget_scale_changed (GtkWidget *widget)
int
gtk_widget_get_scale_factor (GtkWidget *widget)
{
- GtkRoot *root;
+ GtkWidget *root;
GdkDisplay *display;
GdkMonitor *monitor;
@@ -6797,9 +6795,9 @@ gtk_widget_get_scale_factor (GtkWidget *widget)
return gdk_surface_get_scale_factor (surface);
}
- root = _gtk_widget_get_root (widget);
- if (root && GTK_WIDGET (root) != widget)
- return gtk_widget_get_scale_factor (GTK_WIDGET (root));
+ root = (GtkWidget *)_gtk_widget_get_root (widget);
+ if (root && root != widget)
+ return gtk_widget_get_scale_factor (root);
/* else fall back to something that is more likely to be right than
* just returning 1:
@@ -7367,12 +7365,10 @@ gtk_widget_dispose (GObject *object)
GtkWidget *widget = GTK_WIDGET (object);
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GSList *sizegroups;
- GtkActionMuxer *muxer;
GtkATContext *at_context;
- muxer = g_object_get_qdata (G_OBJECT (widget), quark_action_muxer);
- if (muxer != NULL)
- g_object_run_dispose (G_OBJECT (muxer));
+ if (priv->muxer != NULL)
+ g_object_run_dispose (G_OBJECT (priv->muxer));
if (priv->children_observer)
gtk_list_list_model_clear (priv->children_observer);
@@ -7423,7 +7419,7 @@ gtk_widget_dispose (GObject *object)
if (at_context != NULL)
gtk_at_context_unrealize (at_context);
- g_object_set_qdata (object, quark_action_muxer, NULL);
+ g_clear_object (&priv->muxer);
G_OBJECT_CLASS (gtk_widget_parent_class)->dispose (object);
}
@@ -10530,11 +10526,6 @@ gtk_widget_set_alloc_needed (GtkWidget *widget)
if (GTK_IS_NATIVE (widget))
gtk_native_queue_relayout (GTK_NATIVE (widget));
- if (!priv->parent && GTK_IS_ROOT (widget))
- {
- break;
- }
-
widget = priv->parent;
if (widget == NULL)
break;
@@ -10781,7 +10772,7 @@ gtk_widget_get_parent_muxer (GtkWidget *widget,
GtkWidget *parent;
if (GTK_IS_WINDOW (widget))
- return gtk_application_get_parent_muxer_for_window (GTK_WINDOW (widget));
+ return gtk_application_get_parent_muxer_for_window ((GtkWindow *)widget);
parent = _gtk_widget_get_parent (widget);
@@ -10794,14 +10785,13 @@ gtk_widget_get_parent_muxer (GtkWidget *widget,
void
_gtk_widget_update_parent_muxer (GtkWidget *widget)
{
- GtkActionMuxer *muxer;
+ GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GtkWidget *child;
- muxer = (GtkActionMuxer*)g_object_get_qdata (G_OBJECT (widget), quark_action_muxer);
- if (muxer == NULL)
+ if (priv->muxer == NULL)
return;
- gtk_action_muxer_set_parent (muxer,
+ gtk_action_muxer_set_parent (priv->muxer,
gtk_widget_get_parent_muxer (widget, FALSE));
for (child = gtk_widget_get_first_child (widget);
child != NULL;
@@ -10813,24 +10803,18 @@ GtkActionMuxer *
_gtk_widget_get_action_muxer (GtkWidget *widget,
gboolean create)
{
- GtkActionMuxer *muxer;
GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS (widget);
- GtkWidgetClassPrivate *priv = widget_class->priv;
+ GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
- muxer = (GtkActionMuxer*)g_object_get_qdata (G_OBJECT (widget), quark_action_muxer);
- if (muxer)
- return muxer;
+ if (priv->muxer)
+ return priv->muxer;
- if (create || priv->actions)
+ if (create || widget_class->priv->actions)
{
- muxer = gtk_action_muxer_new (widget);
- g_object_set_qdata_full (G_OBJECT (widget),
- quark_action_muxer,
- muxer,
- g_object_unref);
+ priv->muxer = gtk_action_muxer_new (widget);
_gtk_widget_update_parent_muxer (widget);
- return muxer;
+ return priv->muxer;
}
else
return gtk_widget_get_parent_muxer (widget, FALSE);
diff --git a/gtk/gtkwidgetfocus.c b/gtk/gtkwidgetfocus.c
index b4f793dfeb..df1c562ac6 100644
--- a/gtk/gtkwidgetfocus.c
+++ b/gtk/gtkwidgetfocus.c
@@ -81,8 +81,8 @@ tab_sort_func (gconstpointer a,
GtkTextDirection text_direction = GPOINTER_TO_INT (user_data);
float y1, y2;
- if (!gtk_widget_compute_bounds (child1, gtk_widget_get_parent (child1), &child_bounds1) ||
- !gtk_widget_compute_bounds (child2, gtk_widget_get_parent (child2), &child_bounds2))
+ if (!gtk_widget_compute_bounds (child1, _gtk_widget_get_parent (child1), &child_bounds1) ||
+ !gtk_widget_compute_bounds (child2, _gtk_widget_get_parent (child2), &child_bounds2))
return 0;
y1 = child_bounds1.origin.y + (child_bounds1.size.height / 2.0f);
@@ -136,7 +136,7 @@ find_old_focus (GtkWidget *widget,
parent = _gtk_widget_get_parent (child_ptr);
- if (parent && (gtk_widget_get_focus_child (parent) != child_ptr))
+ if (parent && (_gtk_widget_get_focus_child (parent) != child_ptr))
{
child = NULL;
break;
@@ -210,7 +210,7 @@ focus_sort_left_right (GtkWidget *widget,
GPtrArray *focus_order)
{
CompareInfo compare_info;
- GtkWidget *old_focus = gtk_widget_get_focus_child (widget);
+ GtkWidget *old_focus = _gtk_widget_get_focus_child (widget);
graphene_rect_t old_bounds;
compare_info.widget = widget;
@@ -312,7 +312,7 @@ focus_sort_up_down (GtkWidget *widget,
GPtrArray *focus_order)
{
CompareInfo compare_info;
- GtkWidget *old_focus = gtk_widget_get_focus_child (widget);
+ GtkWidget *old_focus = _gtk_widget_get_focus_child (widget);
graphene_rect_t old_bounds;
compare_info.widget = widget;
@@ -455,7 +455,7 @@ gtk_widget_focus_move (GtkWidget *widget,
GtkDirectionType direction)
{
GPtrArray *focus_order;
- GtkWidget *focus_child = gtk_widget_get_focus_child (widget);
+ GtkWidget *focus_child = _gtk_widget_get_focus_child (widget);
int i;
gboolean ret = FALSE;
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index bc6eb0bf7f..5110b0263c 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -115,13 +115,12 @@ struct _GtkWidgetPrivate
guint8 verifying_invariants_count;
#endif
- guint8 n_active;
-
int width_request;
int height_request;
/* Animations and other things to update on clock ticks */
guint clock_tick_id;
+ guint8 n_active;
GList *tick_callbacks;
void (* resize_func) (GtkWidget *);
@@ -185,6 +184,7 @@ struct _GtkWidgetPrivate
/* only created on-demand */
GtkListListModel *children_observer;
GtkListListModel *controller_observer;
+ GtkActionMuxer *muxer;
GtkWidget *focus_child;
@@ -196,8 +196,8 @@ struct _GtkWidgetPrivate
char *tooltip_text;
/* Accessibility */
- GtkAccessibleRole accessible_role;
GtkATContext *at_context;
+ GtkAccessibleRole accessible_role;
};
typedef struct
@@ -211,11 +211,11 @@ struct _GtkWidgetClassPrivate
{
GtkWidgetTemplate *template;
GListStore *shortcuts;
- GQuark css_name;
GType layout_manager_type;
GtkWidgetAction *actions;
GtkAccessibleRole accessible_role;
guint activate_signal;
+ GQuark css_name;
};
void gtk_widget_root (GtkWidget *widget);
@@ -378,6 +378,12 @@ _gtk_widget_get_parent (GtkWidget *widget)
return widget->priv->parent;
}
+static inline GtkWidget *
+_gtk_widget_get_focus_child (GtkWidget *widget)
+{
+ return widget->priv->focus_child;
+}
+
static inline gboolean
_gtk_widget_get_visible (GtkWidget *widget)
{