diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2023-02-24 12:10:16 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2023-03-03 02:13:26 +0000 |
commit | eb0f33d76b4853b071cf03bad571e8f6dc628b76 (patch) | |
tree | 4709fe5e9fd92f18db65bfcfa27eca911a9f2716 | |
parent | 1b4f240883568910f253dcab0eebd85f1be7a6be (diff) | |
download | gtk+-eb0f33d76b4853b071cf03bad571e8f6dc628b76.tar.gz |
Mark Accessible getters as transfer full
GtkAccessible implementations in C can get away returning objects just
by shuffling pointers around, but higher level languages prefer using
full ownership transfer in virtual functions.
Fixes: #5615
-rw-r--r-- | gtk/a11y/gtkatspicomponent.c | 5 | ||||
-rw-r--r-- | gtk/a11y/gtkatspicontext.c | 105 | ||||
-rw-r--r-- | gtk/a11y/gtkatspiroot.c | 6 | ||||
-rw-r--r-- | gtk/a11y/gtkatspiselection.c | 17 | ||||
-rw-r--r-- | gtk/gtkaccessible.c | 30 | ||||
-rw-r--r-- | gtk/gtkaccessible.h | 8 | ||||
-rw-r--r-- | gtk/gtkstack.c | 32 | ||||
-rw-r--r-- | gtk/gtkwidget.c | 21 |
8 files changed, 163 insertions, 61 deletions
diff --git a/gtk/a11y/gtkatspicomponent.c b/gtk/a11y/gtkatspicomponent.c index 7da968d1d1..3a21a8a97f 100644 --- a/gtk/a11y/gtkatspicomponent.c +++ b/gtk/a11y/gtkatspicomponent.c @@ -158,9 +158,12 @@ component_handle_method (GDBusConnection *connection, } else { - GtkAtSpiContext *ctx = GTK_AT_SPI_CONTEXT (gtk_accessible_get_at_context (GTK_ACCESSIBLE (child))); + GtkATContext *context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (child)); + GtkAtSpiContext *ctx = GTK_AT_SPI_CONTEXT (context); g_dbus_method_invocation_return_value (invocation, g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (ctx))); + + g_object_unref (context); } } else if (g_strcmp0 (method_name, "GetExtents") == 0) diff --git a/gtk/a11y/gtkatspicontext.c b/gtk/a11y/gtkatspicontext.c index 18e5bcfce1..d292e9e2cc 100644 --- a/gtk/a11y/gtkatspicontext.c +++ b/gtk/a11y/gtkatspicontext.c @@ -331,7 +331,6 @@ collect_relations (GtkAtSpiContext *self, }; GtkAccessibleValue *value; GList *list, *l; - GtkATContext *target_ctx; int i; for (i = 0; i < G_N_ELEMENTS (map); i++) @@ -346,13 +345,16 @@ collect_relations (GtkAtSpiContext *self, for (l = list; l; l = l->next) { - target_ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (l->data)); + GtkATContext *target_ctx = + gtk_accessible_get_at_context (GTK_ACCESSIBLE (l->data)); /* Realize the ATContext of the target, so we can ask for its ref */ gtk_at_context_realize (target_ctx); g_variant_builder_add (&b, "@(so)", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (target_ctx))); + + g_object_unref (target_ctx); } g_variant_builder_add (builder, "(ua(so))", map[i].s, &b); @@ -364,24 +366,30 @@ static int get_index_in (GtkAccessible *parent, GtkAccessible *child) { - GtkAccessible *candidate; - guint res; - if (parent == NULL) return -1; - res = 0; + guint res = 0; + GtkAccessible *candidate; for (candidate = gtk_accessible_get_first_accessible_child (parent); candidate != NULL; candidate = gtk_accessible_get_next_accessible_sibling (candidate)) { if (candidate == child) - return res; + { + g_object_unref (candidate); + return res; + } if (!gtk_accessible_should_present (candidate)) - continue; + { + g_object_unref (candidate); + continue; + } res++; + + g_object_unref (candidate); } return -1; @@ -393,7 +401,13 @@ get_index_in_parent (GtkAccessible *accessible) GtkAccessible *parent = gtk_accessible_get_accessible_parent (accessible); if (parent != NULL) - return get_index_in (parent, accessible); + { + int res = get_index_in (parent, accessible); + + g_object_unref (parent); + + return res; + } return -1; } @@ -429,7 +443,6 @@ static GVariant * get_parent_context_ref (GtkAccessible *accessible) { GVariant *res = NULL; - GtkAccessible *parent = gtk_accessible_get_accessible_parent (accessible); if (parent == NULL) @@ -438,13 +451,19 @@ get_parent_context_ref (GtkAccessible *accessible) GtkAtSpiContext *self = GTK_AT_SPI_CONTEXT (context); res = gtk_at_spi_root_to_ref (self->root); + + g_object_unref (context); } else { GtkATContext *parent_context = gtk_accessible_get_at_context (parent); + gtk_at_context_realize (parent_context); res = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (parent_context)); + + g_object_unref (parent_context); + g_object_unref (parent); } if (res == NULL) @@ -525,30 +544,37 @@ handle_accessible_method (GDBusConnection *connection, { GtkATContext *context = NULL; GtkAccessible *accessible; + GtkAccessible *child = NULL; int idx, presentable_idx; g_variant_get (parameters, "(i)", &idx); accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self)); - GtkAccessible *child; - presentable_idx = 0; + for (child = gtk_accessible_get_first_accessible_child (accessible); child != NULL; child = gtk_accessible_get_next_accessible_sibling (child)) { if (!gtk_accessible_should_present (child)) + { + g_object_unref (child); continue; + } if (presentable_idx == idx) break; - presentable_idx++; + presentable_idx += 1; + + g_object_unref (child); } - if (child) + + if (child != NULL) { context = gtk_accessible_get_at_context (child); + g_object_unref (child); } if (context == NULL) @@ -564,22 +590,26 @@ handle_accessible_method (GDBusConnection *connection, gtk_at_context_realize (context); GVariant *ref = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (context)); - g_dbus_method_invocation_return_value (invocation, g_variant_new ("(@(so))", ref)); + + g_object_unref (context); } else if (g_strcmp0 (method_name, "GetChildren") == 0) { GVariantBuilder builder = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE ("a(so)")); GtkAccessible *accessible = gtk_at_context_get_accessible (GTK_AT_CONTEXT (self)); + GtkAccessible *child = NULL; - GtkAccessible *child; for (child = gtk_accessible_get_first_accessible_child (accessible); child != NULL; child = gtk_accessible_get_next_accessible_sibling (child)) - { + { if (!gtk_accessible_should_present (child)) - continue; + { + g_object_unref (child); + continue; + } GtkATContext *context = gtk_accessible_get_at_context (child); @@ -590,6 +620,9 @@ handle_accessible_method (GDBusConnection *connection, if (ref != NULL) g_variant_builder_add (&builder, "@(so)", ref); + + g_object_unref (context); + g_object_unref (child); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(so))", &builder)); @@ -878,8 +911,6 @@ gtk_at_spi_context_state_change (GtkATContext *ctx, if (changed_states & GTK_ACCESSIBLE_STATE_CHANGE_HIDDEN) { - GtkAccessible *parent; - GtkATContext *context; GtkAccessibleChildChange change; value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_HIDDEN); @@ -895,10 +926,15 @@ gtk_at_spi_context_state_change (GtkATContext *ctx, } else { - parent = gtk_accessible_get_accessible_parent (accessible); + GtkAccessible *parent = + gtk_accessible_get_accessible_parent (accessible); + GtkATContext *context = + gtk_accessible_get_at_context (parent); - context = gtk_accessible_get_at_context (parent); gtk_at_context_child_changed (context, change, accessible); + + g_object_unref (context); + g_object_unref (parent); } } @@ -1147,9 +1183,18 @@ gtk_at_spi_context_child_change (GtkATContext *ctx, int idx = 0; if (parent == NULL) - idx = -1; + { + idx = -1; + } else if (parent == accessible) - idx = get_index_in (accessible, child); + { + idx = get_index_in (accessible, child); + g_object_unref (parent); + } + else + { + g_object_unref (parent); + } if (change & GTK_ACCESSIBLE_CHILD_CHANGE_ADDED) emit_children_changed (self, @@ -1161,6 +1206,8 @@ gtk_at_spi_context_child_change (GtkATContext *ctx, GTK_AT_SPI_CONTEXT (child_context), idx, GTK_ACCESSIBLE_CHILD_STATE_REMOVED); + + g_object_unref (child_context); } /* }}} */ /* {{{ D-Bus Registration */ @@ -1729,15 +1776,19 @@ gtk_at_spi_context_get_child_count (GtkAtSpiContext *self) int n_children = 0; GtkAccessible *child = NULL; - for (child = gtk_accessible_get_first_accessible_child (accessible); child != NULL; child = gtk_accessible_get_next_accessible_sibling (child)) { if (!gtk_accessible_should_present (child)) - continue; + { + g_object_unref (child); + continue; + } + + n_children += 1; - n_children++; + g_object_unref (child); } return n_children; diff --git a/gtk/a11y/gtkatspiroot.c b/gtk/a11y/gtkatspiroot.c index 78c4d7c0de..d3b488b0ae 100644 --- a/gtk/a11y/gtkatspiroot.c +++ b/gtk/a11y/gtkatspiroot.c @@ -314,6 +314,8 @@ handle_accessible_method (GDBusConnection *connection, const char *path = gtk_at_spi_context_get_context_path (GTK_AT_SPI_CONTEXT (context)); g_dbus_method_invocation_return_value (invocation, g_variant_new ("((so))", name, path)); + + g_object_unref (context); } else if (g_strcmp0 (method_name, "GetChildren") == 0) { @@ -334,6 +336,8 @@ handle_accessible_method (GDBusConnection *connection, const char *path = gtk_at_spi_context_get_context_path (GTK_AT_SPI_CONTEXT (context)); g_variant_builder_add (&builder, "(so)", name, path); + + g_object_unref (context); } g_dbus_method_invocation_return_value (invocation, g_variant_new ("(a(so))", &builder)); @@ -453,6 +457,8 @@ gtk_at_spi_root_child_changed (GtkAtSpiRoot *self, GtkATContext *context = gtk_accessible_get_at_context (child); window_ref = gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (context)); + + g_object_unref (context); } switch (change) diff --git a/gtk/a11y/gtkatspiselection.c b/gtk/a11y/gtkatspiselection.c index e5d9172f14..db2c76c03e 100644 --- a/gtk/a11y/gtkatspiselection.c +++ b/gtk/a11y/gtkatspiselection.c @@ -94,7 +94,9 @@ listbox_handle_method (GDBusConnection *connection, else { GtkATContext *ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (counter.child)); - g_dbus_method_invocation_return_value (invocation, g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_object_unref (ctx); } } else if (g_strcmp0 (method_name, "SelectChild") == 0) @@ -271,7 +273,8 @@ listview_handle_method (GDBusConnection *connection, { GtkATContext *ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (child)); g_dbus_method_invocation_return_value (invocation, - g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_object_unref (ctx); } } else if (g_strcmp0 (method_name, "SelectChild") == 0) @@ -495,7 +498,9 @@ flowbox_handle_method (GDBusConnection *connection, else { GtkATContext *ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (counter.child)); - g_dbus_method_invocation_return_value (invocation, g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_dbus_method_invocation_return_value (invocation, + g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_object_unref (ctx); } } else if (g_strcmp0 (method_name, "SelectChild") == 0) @@ -761,7 +766,8 @@ stackswitcher_handle_method (GDBusConnection *connection, { GtkATContext *ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (child)); g_dbus_method_invocation_return_value (invocation, - g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_object_unref (ctx); } } else if (g_strcmp0 (method_name, "SelectChild") == 0) @@ -891,7 +897,8 @@ notebook_handle_method (GDBusConnection *connection, { GtkATContext *ctx = gtk_accessible_get_at_context (GTK_ACCESSIBLE (child)); g_dbus_method_invocation_return_value (invocation, - g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_variant_new ("(@(so))", gtk_at_spi_context_to_ref (GTK_AT_SPI_CONTEXT (ctx)))); + g_object_unref (ctx); } } else if (g_strcmp0 (method_name, "SelectChild") == 0) diff --git a/gtk/gtkaccessible.c b/gtk/gtkaccessible.c index e12ec8f3c3..3d3839cb68 100644 --- a/gtk/gtkaccessible.c +++ b/gtk/gtkaccessible.c @@ -91,9 +91,9 @@ gtk_accessible_default_init (GtkAccessibleInterface *iface) * gtk_accessible_get_at_context: * @self: a `GtkAccessible` * - * Retrieves the `GtkATContext` for the given `GtkAccessible`. + * Retrieves the accessible implementation for the given `GtkAccessible`. * - * Returns: (transfer none): the `GtkATContext` + * Returns: (transfer full): the accessible implementation object * * Since: 4.10 */ @@ -109,11 +109,11 @@ gtk_accessible_get_at_context (GtkAccessible *self) * gtk_accessible_get_accessible_parent: * @self: a `GtkAccessible` * - * Retrieves the accessible accessible for an accessible object + * Retrieves the accessible parent for an accessible object. * - * This function returns `NULL` for top level widgets + * This function returns `NULL` for top level widgets. * - * Returns: (transfer none) (nullable): the accessible parent + * Returns: (transfer full) (nullable): the accessible parent * * Since: 4.10 */ @@ -128,9 +128,9 @@ gtk_accessible_get_accessible_parent (GtkAccessible *self) context = gtk_accessible_get_at_context (self); if (context != NULL) parent = gtk_at_context_get_accessible_parent (context); - + if (parent != NULL) - return parent; + return g_object_ref (parent); else return GTK_ACCESSIBLE_GET_IFACE (self)->get_accessible_parent (self); } @@ -177,6 +177,7 @@ gtk_accessible_set_accessible_parent (GtkAccessible *self, * @new_sibling: (nullable): the new next accessible sibling to set * * Updates the next accessible sibling of @self. + * * That might be useful when a new child of a custom `GtkAccessible` * is created, and it needs to be linked to a previous child. * @@ -193,7 +194,7 @@ gtk_accessible_update_next_accessible_sibling (GtkAccessible *self, context = gtk_accessible_get_at_context (self); if (!context) return; - + if (gtk_at_context_get_accessible_parent (context) == NULL) { g_critical ("Failed to update next accessible sibling: no parent accessible set for this accessible"); @@ -209,7 +210,7 @@ gtk_accessible_update_next_accessible_sibling (GtkAccessible *self, * * Retrieves the first accessible child of an accessible object. * - * Returns: (transfer none) (nullable): the first accessible child + * Returns: (transfer full) (nullable): the first accessible child * * since: 4.10 */ @@ -227,7 +228,7 @@ gtk_accessible_get_first_accessible_child (GtkAccessible *self) * * Retrieves the next accessible sibling of an accessible object * - * Returns: (transfer none) (nullable): the next accessible sibling + * Returns: (transfer full) (nullable): the next accessible sibling * * since: 4.10 */ @@ -240,7 +241,14 @@ gtk_accessible_get_next_accessible_sibling (GtkAccessible *self) context = gtk_accessible_get_at_context (self); if (context != NULL && gtk_at_context_get_accessible_parent (context) != NULL) - return gtk_at_context_get_next_accessible_sibling (context); + { + GtkAccessible *sibling = gtk_at_context_get_next_accessible_sibling (context); + + if (sibling != NULL) + return g_object_ref (sibling); + + return NULL; + } else return GTK_ACCESSIBLE_GET_IFACE (self)->get_next_accessible_sibling (self); } diff --git a/gtk/gtkaccessible.h b/gtk/gtkaccessible.h index 8b40cf8272..f4c1531f40 100644 --- a/gtk/gtkaccessible.h +++ b/gtk/gtkaccessible.h @@ -73,7 +73,7 @@ struct _GtkAccessibleInterface * Retrieves the platform-specific accessibility context for the * accessible implementation. * - * Returns: (transfer none) (nullable): the accessibility context + * Returns: (transfer full) (nullable): the accessibility context * * Since: 4.10 */ @@ -101,7 +101,7 @@ struct _GtkAccessibleInterface * * This virtual function should return `NULL` for top level objects. * - * Returns: (nullable) (transfer none): the accessible parent + * Returns: (nullable) (transfer full): the accessible parent * * Since: 4.10 */ @@ -113,7 +113,7 @@ struct _GtkAccessibleInterface * * Retrieves the first accessible child of an accessible object. * - * Returns: (transfer none) (nullable): an accessible object + * Returns: (transfer full) (nullable): an accessible object * * Since: 4.10 */ @@ -125,7 +125,7 @@ struct _GtkAccessibleInterface * * Retrieves the next accessible sibling of an accessible object. * - * Returns: (transfer none) (nullable): an accessible object + * Returns: (transfer full) (nullable): an accessible object * * Since: 4.10 */ diff --git a/gtk/gtkstack.c b/gtk/gtkstack.c index 05ad60504b..8669493d4f 100644 --- a/gtk/gtkstack.c +++ b/gtk/gtkstack.c @@ -246,9 +246,11 @@ gtk_stack_page_accessible_get_at_context (GtkAccessible *accessible) display = gdk_display_get_default (); page->at_context = gtk_at_context_create (role, accessible, display); + if (page->at_context == NULL) + return NULL; } - return page->at_context; + return g_object_ref (page->at_context); } static gboolean @@ -262,30 +264,39 @@ static GtkAccessible * gtk_stack_page_accessible_get_accessible_parent (GtkAccessible *accessible) { GtkStackPage *page = GTK_STACK_PAGE (accessible); + GtkWidget *parent; if (page->widget == NULL) return NULL; - else - return GTK_ACCESSIBLE (gtk_widget_get_parent (page->widget)); + + parent = _gtk_widget_get_parent (page->widget); + + return GTK_ACCESSIBLE (g_object_ref (parent)); } static GtkAccessible * -gtk_stack_page_accessible_get_first_accessible_child(GtkAccessible *accessible) +gtk_stack_page_accessible_get_first_accessible_child (GtkAccessible *accessible) { GtkStackPage *page = GTK_STACK_PAGE (accessible); + GtkWidget *child; - if (page->widget != NULL) - return GTK_ACCESSIBLE (page->widget); - else + if (page->widget == NULL) return NULL; + + child = _gtk_widget_get_first_child (page->widget); + + return GTK_ACCESSIBLE (g_object_ref (child)); } static GtkAccessible * -gtk_stack_page_accessible_get_next_accessible_sibling(GtkAccessible *accessible) +gtk_stack_page_accessible_get_next_accessible_sibling (GtkAccessible *accessible) { GtkStackPage *page = GTK_STACK_PAGE (accessible); - return GTK_ACCESSIBLE (page->next_page); + if (page->next_page == NULL) + return NULL; + + return GTK_ACCESSIBLE (g_object_ref (page->next_page)); } static gboolean @@ -791,7 +802,8 @@ gtk_stack_accessible_get_first_accessible_child (GtkAccessible *accessible) GtkStack *stack = GTK_STACK (accessible); GtkStackPrivate *priv = gtk_stack_get_instance_private (stack); GtkStackPage *page = g_ptr_array_index (priv->children, 0); - return GTK_ACCESSIBLE (page); + + return GTK_ACCESSIBLE (g_object_ref (page)); } static void diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 0560b63840..f67893837f 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -8486,19 +8486,34 @@ gtk_widget_accessible_get_platform_state (GtkAccessible *self, static GtkAccessible * gtk_widget_accessible_get_accessible_parent (GtkAccessible *self) { - return GTK_ACCESSIBLE (gtk_widget_get_parent (GTK_WIDGET (self))); + GtkWidget *parent = _gtk_widget_get_parent (GTK_WIDGET (self)); + + if (parent == NULL) + return NULL; + + return GTK_ACCESSIBLE (g_object_ref (parent)); } static GtkAccessible * gtk_widget_accessible_get_next_accessible_sibling (GtkAccessible *self) { - return GTK_ACCESSIBLE (gtk_widget_get_next_sibling (GTK_WIDGET (self))); + GtkWidget *sibling = _gtk_widget_get_next_sibling (GTK_WIDGET (self)); + + if (sibling == NULL) + return NULL; + + return GTK_ACCESSIBLE (g_object_ref (sibling)); } static GtkAccessible * gtk_widget_accessible_get_first_accessible_child (GtkAccessible *self) { - return GTK_ACCESSIBLE (gtk_widget_get_first_child (GTK_WIDGET (self))); + GtkWidget *child = _gtk_widget_get_first_child (GTK_WIDGET (self)); + + if (child == NULL) + return NULL; + + return GTK_ACCESSIBLE (g_object_ref (child)); } static gboolean |