diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-07-25 02:03:46 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-07-25 02:03:46 +0000 |
commit | 4dc4c00267e6135412f5d06364bd7c8adf0540a6 (patch) | |
tree | 3896c7c9d1e656b83bab0537a0a5e15ce0e56d90 | |
parent | d44ce1987dbac3ca157cd4cf84bef9aa225d7ce0 (diff) | |
parent | d76460343a9b91afda6cfe6a5fab6ad4732c6b34 (diff) | |
download | gtk+-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.c | 28 | ||||
-rw-r--r-- | gsk/gskrendernodeprivate.h | 8 | ||||
-rw-r--r-- | gsk/gsktransform.c | 87 | ||||
-rw-r--r-- | gsk/ngl/gsknglglyphlibrary.c | 14 | ||||
-rw-r--r-- | gsk/ngl/gskngliconlibrary.c | 11 | ||||
-rw-r--r-- | gsk/ngl/gsknglrenderjob.c | 67 | ||||
-rw-r--r-- | gtk/gtkgridlayout.c | 36 | ||||
-rw-r--r-- | gtk/gtklayoutmanager.c | 2 | ||||
-rw-r--r-- | gtk/gtksizerequest.c | 20 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 50 | ||||
-rw-r--r-- | gtk/gtkwidgetfocus.c | 12 | ||||
-rw-r--r-- | gtk/gtkwidgetprivate.h | 14 |
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) { |