context = gtk_accessible_get_at_context (self);
if (context != NULL)
- parent = gtk_at_context_get_accessible_parent (context);
+ {
+ parent = gtk_at_context_get_accessible_parent (context);
+ g_object_unref (context);
+ }
if (parent != NULL)
return g_object_ref (parent);
g_return_if_fail (GTK_IS_ACCESSIBLE (self));
g_return_if_fail (parent == NULL || GTK_IS_ACCESSIBLE (parent));
g_return_if_fail (next_sibling == NULL || GTK_IS_ACCESSIBLE (parent));
+
GtkATContext *context;
context = gtk_accessible_get_at_context (self);
{
gtk_at_context_set_accessible_parent (context, parent);
gtk_at_context_set_next_accessible_sibling (context, next_sibling);
+ g_object_unref (context);
}
}
GtkAccessible *new_sibling)
{
GtkATContext *context;
+ GtkAccessible *parent;
g_return_if_fail (GTK_IS_ACCESSIBLE (self));
context = gtk_accessible_get_at_context (self);
- if (!context)
+ if (context == NULL)
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");
- return;
- }
+ parent = gtk_at_context_get_accessible_parent (context);
+ if (parent == NULL)
+ {
+ g_object_unref (context);
+ g_critical ("Failed to update next accessible sibling: no parent accessible set for this accessible");
+ return;
+ }
gtk_at_context_set_next_accessible_sibling (context, new_sibling);
+
+ g_object_unref (parent);
+ g_object_unref (context);
}
/**
GtkATContext *context;
context = gtk_accessible_get_at_context (self);
- if (context != NULL && gtk_at_context_get_accessible_parent (context) != NULL)
+ if (context != NULL)
{
- GtkAccessible *sibling = gtk_at_context_get_next_accessible_sibling (context);
+ GtkAccessible *sibling = NULL;
+
+ if (gtk_at_context_get_accessible_parent (context) != NULL)
+ {
+ sibling = gtk_at_context_get_next_accessible_sibling (context);
+ if (sibling != NULL)
+ sibling = g_object_ref (sibling);
+ }
- if (sibling != NULL)
- return g_object_ref (sibling);
+ g_object_unref (context);
- return NULL;
+ return sibling;
}
else
return GTK_ACCESSIBLE_GET_IFACE (self)->get_next_accessible_sibling (self);
GtkAccessibleRole
gtk_accessible_get_accessible_role (GtkAccessible *self)
{
- GtkAccessibleRole role;
+ GtkAccessibleRole role = GTK_ACCESSIBLE_ROLE_NONE;
g_return_val_if_fail (GTK_IS_ACCESSIBLE (self), GTK_ACCESSIBLE_ROLE_NONE);
GtkATContext *context = gtk_accessible_get_at_context (self);
- if (context != NULL && gtk_at_context_is_realized (context))
- return gtk_at_context_get_accessible_role (context);
+ if (context != NULL)
+ {
+ if (gtk_at_context_is_realized (context))
+ role = gtk_at_context_get_accessible_role (context);
+
+ g_object_unref (context);
+
+ if (role != GTK_ACCESSIBLE_ROLE_NONE)
+ return role;
+ }
g_object_get (G_OBJECT (self), "accessible-role", &role, NULL);
out:
va_end (args);
+
+ g_object_unref (context);
}
/**
}
gtk_at_context_update (context);
+ g_object_unref (context);
}
/**
gtk_at_context_set_accessible_state (context, state, NULL);
gtk_at_context_update (context);
+ g_object_unref (context);
}
/**
out:
va_end (args);
+
+ g_object_unref (context);
}
/**
}
gtk_at_context_update (context);
+ g_object_unref (context);
}
/**
gtk_at_context_set_accessible_property (context, property, NULL);
gtk_at_context_update (context);
+ g_object_unref (context);
}
/**
out:
va_end (args);
+
+ g_object_unref (context);
}
/**
g_return_if_fail (n_relations > 0);
context = gtk_accessible_get_at_context (self);
+ if (context == NULL)
+ return;
for (int i = 0; i < n_relations; i++)
{
break;
}
- if (context)
- gtk_at_context_set_accessible_relation (context, relation, real_value);
+ gtk_at_context_set_accessible_relation (context, relation, real_value);
if (real_value != NULL)
gtk_accessible_value_unref (real_value);
}
- if (context)
- gtk_at_context_update (context);
+ gtk_at_context_update (context);
+ g_object_unref (context);
}
/**
gtk_at_context_set_accessible_relation (context, relation, NULL);
gtk_at_context_update (context);
+ g_object_unref (context);
}
static const char *role_names[] = {
/* propagate changes up from ignored widgets */
if (gtk_accessible_get_accessible_role (self) == GTK_ACCESSIBLE_ROLE_NONE)
- context = gtk_accessible_get_at_context (gtk_accessible_get_accessible_parent (self));
+ {
+ GtkAccessible *parent = gtk_accessible_get_accessible_parent (self);
+
+ if (parent != NULL)
+ {
+ context = gtk_accessible_get_at_context (parent);
+ g_object_unref (parent);
+ }
+ }
if (context == NULL)
return;
gtk_at_context_platform_changed (context, change);
gtk_at_context_update (context);
+ g_object_unref (context);
}
/**
return;
gtk_at_context_bounds_changed (context);
+ g_object_unref (context);
}
/**
{
GtkAccessibleRole role;
GtkATContext *context;
+ gboolean res = TRUE;
if (GTK_IS_WIDGET (self) &&
!gtk_widget_get_visible (GTK_WIDGET (self)))
value = gtk_at_context_get_accessible_state (context, GTK_ACCESSIBLE_STATE_HIDDEN);
if (gtk_boolean_accessible_value_get (value))
- return FALSE;
+ res = FALSE;
}
- return TRUE;
+ g_object_unref (context);
+
+ return res;
}
void
gtk_widget_get_root (GTK_WIDGET (self)) == NULL)
return;
- context = gtk_accessible_get_at_context (self);
-
/* propagate changes up from ignored widgets */
if (gtk_accessible_get_accessible_role (self) == GTK_ACCESSIBLE_ROLE_NONE)
- context = gtk_accessible_get_at_context (gtk_accessible_get_accessible_parent (self));
+ {
+ GtkAccessible *parent = gtk_accessible_get_accessible_parent (self);
+
+ context = gtk_accessible_get_at_context (parent);
+
+ g_object_unref (parent);
+ }
+ else
+ {
+ context = gtk_accessible_get_at_context (self);
+ }
if (context == NULL)
return;
gtk_at_context_child_changed (context, 1 << state, child);
gtk_at_context_update (context);
+ g_object_unref (context);
}
GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
gtk_at_context_get_name_accumulate (rel_context, names, FALSE);
+
+ g_object_unref (rel_context);
}
}
GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
gtk_at_context_get_description_accumulate (rel_context, labels, FALSE);
+
+ g_object_unref (rel_context);
}
}
if (was_realized)
gtk_at_context_realize (context);
+
+ g_object_unref (context);
}
static void
* A GIcon that will be used if iconic appearance for the button is
* desired.
*/
- properties[PROP_ICON] =
+ properties[PROP_ICON] =
g_param_spec_object ("icon", NULL, NULL,
G_TYPE_ICON,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
GtkAccessibleProperty property)
{
GtkATContext *context;
+ gboolean res;
g_return_val_if_fail (GTK_IS_ACCESSIBLE (accessible), FALSE);
if (context == NULL)
return FALSE;
- return gtk_at_context_has_accessible_property (context, property);
+ res = gtk_at_context_has_accessible_property (context, property);
+
+ g_object_unref (context);
+
+ return res;
}
/**
out:
gtk_accessible_value_unref (check_value);
+ g_object_unref (context);
return res;
}
GtkAccessibleState state)
{
GtkATContext *context;
+ gboolean res;
g_return_val_if_fail (GTK_IS_ACCESSIBLE (accessible), FALSE);
if (context == NULL)
return FALSE;
- return gtk_at_context_has_accessible_state (context, state);
+ res = gtk_at_context_has_accessible_state (context, state);
+
+ g_object_unref (context);
+
+ return res;
}
/**
out:
gtk_accessible_value_unref (check_value);
+ g_object_unref (context);
return res;
}
GtkAccessibleRelation relation)
{
GtkATContext *context;
+ gboolean res;
g_return_val_if_fail (GTK_IS_ACCESSIBLE (accessible), FALSE);
if (context == NULL)
return FALSE;
- return gtk_at_context_has_accessible_relation (context, relation);
+ res = gtk_at_context_has_accessible_relation (context, relation);
+
+ g_object_unref (context);
+
+ return res;
}
/**
out:
gtk_accessible_value_unref (check_value);
+ g_object_unref (context);
return res;
}
static void add_parent_surface_transform_changed_listener (GtkWidget *widget);
static void gtk_widget_queue_compute_expand (GtkWidget *widget);
+static GtkATContext *create_at_context (GtkWidget *self);
static int GtkWidget_private_offset = 0;
GtkATContext *context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (self));
GtkWidgetClassPrivate *class_priv;
- if (context != NULL && gtk_at_context_is_realized (context))
- return gtk_at_context_get_accessible_role (context);
+ if (context != NULL)
+ {
+ GtkAccessibleRole role = GTK_ACCESSIBLE_ROLE_NONE;
+
+ if (gtk_at_context_is_realized (context))
+ role = gtk_at_context_get_accessible_role (context);
+
+ g_object_unref (context);
+
+ if (role != GTK_ACCESSIBLE_ROLE_NONE)
+ return role;
+ }
if (priv->accessible_role != GTK_ACCESSIBLE_ROLE_WIDGET)
return priv->accessible_role;
gtk_widget_add_controller (widget, controller);
}
- priv->at_context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
+ priv->at_context = create_at_context (widget);
}
static void
GtkWidget *widget = GTK_WIDGET (object);
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
GSList *sizegroups;
- GtkATContext *at_context;
if (priv->muxer != NULL)
g_object_run_dispose (G_OBJECT (priv->muxer));
gtk_size_group_remove_widget (size_group, widget);
}
- at_context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
- if (at_context != NULL)
- gtk_at_context_unrealize (at_context);
+ if (priv->at_context != NULL)
+ {
+ gtk_at_context_unrealize (priv->at_context);
+ g_clear_object (&priv->at_context);
+ }
g_clear_object (&priv->muxer);
*/
static GtkATContext *
-gtk_widget_accessible_get_at_context (GtkAccessible *accessible)
+create_at_context (GtkWidget *self)
{
- GtkWidget *self = GTK_WIDGET (accessible);
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (self);
GtkWidgetClass *widget_class = GTK_WIDGET_GET_CLASS (self);
GtkWidgetClassPrivate *class_priv = widget_class->priv;
return NULL;
}
- if (priv->at_context != NULL)
- return priv->at_context;
-
/* Widgets have two options to set the accessible role: either they
* define it in their class_init() function, and the role applies to
* all instances; or an instance is created with the :accessible-role
role = class_priv->accessible_role;
priv->accessible_role = role;
- priv->at_context = gtk_at_context_create (role, accessible, gdk_display_get_default ());
+ priv->at_context = gtk_at_context_create (role, GTK_ACCESSIBLE (self), gdk_display_get_default ());
+ if (priv->at_context != NULL)
+ return g_object_ref (priv->at_context);
- return priv->at_context;
+ return NULL;
+}
+
+static GtkATContext *
+gtk_widget_accessible_get_at_context (GtkAccessible *accessible)
+{
+ GtkWidget *self = GTK_WIDGET (accessible);
+ GtkWidgetPrivate *priv = gtk_widget_get_instance_private (self);
+
+ if (priv->in_destruction)
+ {
+ GTK_DEBUG (A11Y, "ATContext for widget ā%sā [%p] accessed during destruction",
+ G_OBJECT_TYPE_NAME (self),
+ self);
+ return NULL;
+ }
+
+ if (priv->at_context != NULL)
+ return g_object_ref (priv->at_context);
+
+ priv->at_context = create_at_context (self);
+ if (priv->at_context != NULL)
+ return g_object_ref (priv->at_context);
+
+ return NULL;
}
static gboolean
}
g_slist_free_full (attributes, accessibility_attribute_info_free);
+
+ g_object_unref (context);
}
static void
}
else
path = "not on bus";
+
+ g_clear_object (&context);
#endif
gtk_label_set_label (GTK_LABEL (sl->path), path);
gboolean has_value;
context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (sl->object));
- if (!context)
+ if (context == NULL)
return;
store = g_list_store_new (G_TYPE_OBJECT);
g_object_unref (selection);
gtk_widget_set_visible (sl->attributes, g_list_model_get_n_items (G_LIST_MODEL (filter_model)) > 0);
+
+ g_object_unref (context);
}
static void
if (sl->object && GTK_IS_ACCESSIBLE (sl->object))
{
context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (sl->object));
- if (context)
- g_signal_handlers_disconnect_by_func (context, refresh_all, sl);
+ if (context != NULL)
+ {
+ g_signal_handlers_disconnect_by_func (context, refresh_all, sl);
+ g_object_unref (context);
+ }
}
g_set_object (&sl->object, object);
if (GTK_IS_ACCESSIBLE (sl->object))
{
context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (sl->object));
- if (context)
- g_signal_connect_swapped (context, "state-change", G_CALLBACK (refresh_all), sl);
+ if (context != NULL)
+ {
+ g_signal_connect_swapped (context, "state-change", G_CALLBACK (refresh_all), sl);
+ g_object_unref (context);
+ }
+
gtk_stack_page_set_visible (page, TRUE);
update_role (sl);
update_path (sl);
GtkATContext *context;
context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (sl->object));
- g_signal_handlers_disconnect_by_func (context, refresh_all, sl);
+ if (context != NULL)
+ {
+ g_signal_handlers_disconnect_by_func (context, refresh_all, sl);
+ g_object_unref (context);
+ }
}
g_clear_object (&sl->object);
accessible,
gdk_display_get_default ());
- return self->at_context;
+ return g_object_ref (self->at_context);
}
static void