From 09f0c96b9b1b52103be19790aa117976047e6f3e Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 1 Aug 2022 20:08:58 +0000 Subject: [PATCH 1/2] Fix g_object_new(GTK_TYPE_SNAPSHOT) GJS apparent likes g_object_new() over actual constructors, so make that work. --- gtk/gtksnapshot.c | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index cdf61845d5..1896a207de 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -179,11 +179,6 @@ gtk_snapshot_class_init (GtkSnapshotClass *klass) gobject_class->dispose = gtk_snapshot_dispose; } -static void -gtk_snapshot_init (GtkSnapshot *self) -{ -} - static GskRenderNode * gtk_snapshot_collect_default (GtkSnapshot *snapshot, GtkSnapshotState *state, @@ -270,6 +265,18 @@ gtk_snapshot_state_clear (GtkSnapshotState *state) gsk_transform_unref (state->transform); } +static void +gtk_snapshot_init (GtkSnapshot *self) +{ + gtk_snapshot_states_init (&self->state_stack); + gtk_snapshot_nodes_init (&self->nodes); + + gtk_snapshot_push_state (self, + NULL, + gtk_snapshot_collect_default, + NULL); +} + /** * gtk_snapshot_new: * @@ -280,19 +287,7 @@ gtk_snapshot_state_clear (GtkSnapshotState *state) GtkSnapshot * gtk_snapshot_new (void) { - GtkSnapshot *snapshot; - - snapshot = g_object_new (GTK_TYPE_SNAPSHOT, NULL); - - gtk_snapshot_states_init (&snapshot->state_stack); - gtk_snapshot_nodes_init (&snapshot->nodes); - - gtk_snapshot_push_state (snapshot, - NULL, - gtk_snapshot_collect_default, - NULL); - - return snapshot; + return g_object_new (GTK_TYPE_SNAPSHOT, NULL); } /** @@ -761,7 +756,7 @@ gtk_snapshot_ensure_translate (GtkSnapshot *snapshot, gtk_snapshot_autopush_transform (snapshot); state = gtk_snapshot_get_current_state (snapshot); } - + gsk_transform_to_translate (state->transform, dx, dy); } @@ -850,7 +845,7 @@ gtk_snapshot_push_clip (GtkSnapshot *snapshot, { GtkSnapshotState *state; float scale_x, scale_y, dx, dy; - + gtk_snapshot_ensure_affine (snapshot, &scale_x, &scale_y, &dx, &dy); state = gtk_snapshot_push_state (snapshot, @@ -2517,7 +2512,7 @@ gtk_snapshot_append_border (GtkSnapshot *snapshot, gsk_rounded_rect_scale_affine (&real_outline, outline, scale_x, scale_y, dx, dy); node = gsk_border_node_new (&real_outline, - (float[4]) { + (float[4]) { border_width[0] * scale_y, border_width[1] * scale_x, border_width[2] * scale_y, From dbab69c453fbba563d126efcd23aea4d04f32327 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 1 Aug 2022 20:28:46 +0000 Subject: [PATCH 2/2] snapshot: Don't critical on dispose When there's remaining state that draws nothing, it returns no rendernode. So do a NULL-check before unreffing it. --- gtk/gtksnapshot.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gtk/gtksnapshot.c b/gtk/gtksnapshot.c index 1896a207de..afa27b45f1 100644 --- a/gtk/gtksnapshot.c +++ b/gtk/gtksnapshot.c @@ -163,7 +163,10 @@ gtk_snapshot_dispose (GObject *object) GtkSnapshot *snapshot = GTK_SNAPSHOT (object); if (!gtk_snapshot_states_is_empty (&snapshot->state_stack)) - gsk_render_node_unref (gtk_snapshot_to_node (snapshot)); + { + GskRenderNode *node = gtk_snapshot_to_node (snapshot); + g_clear_pointer (&node, gsk_render_node_unref); + } g_assert (gtk_snapshot_states_is_empty (&snapshot->state_stack)); g_assert (gtk_snapshot_nodes_is_empty (&snapshot->nodes));