summaryrefslogtreecommitdiff
path: root/gtk/gtkatcontext.c
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2020-08-05 18:05:46 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2020-08-25 16:36:08 +0100
commit797b3bd1b11167b100add40e5f5b5f5815ab85f8 (patch)
tree05daeebe2703b3228f679bcf65ed8164fc94d184 /gtk/gtkatcontext.c
parent32a1cd13c8abd3015af5923344d463eee6a6d3a5 (diff)
downloadgtk+-797b3bd1b11167b100add40e5f5b5f5815ab85f8.tar.gz
a11y: Do not notify of empty state changes
If the ATContext state hasn't changed—for instance, if the accessible attributes have been set to their default value, or have been set to the same value—do not emit an accessible state change. State changes can be arbitrarily expensive, so we want to ensure that they are meaningful.
Diffstat (limited to 'gtk/gtkatcontext.c')
-rw-r--r--gtk/gtkatcontext.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/gtk/gtkatcontext.c b/gtk/gtkatcontext.c
index 9cdbd0e9f3..e1e2edd599 100644
--- a/gtk/gtkatcontext.c
+++ b/gtk/gtkatcontext.c
@@ -425,6 +425,12 @@ gtk_at_context_update (GtkATContext *self)
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
+ /* There's no point in notifying of state changes if there weren't any */
+ if (self->updated_properties == 0 &&
+ self->updated_relations == 0 &&
+ self->updated_states == 0)
+ return;
+
GtkAccessibleStateChange changed_states =
gtk_accessible_attribute_set_get_changed (self->states);
GtkAccessiblePropertyChange changed_properties =
@@ -435,6 +441,10 @@ gtk_at_context_update (GtkATContext *self)
g_signal_emit (self, obj_signals[STATE_CHANGE], 0,
changed_states, changed_properties, changed_relations,
self->states, self->properties, self->relations);
+
+ self->updated_properties = 0;
+ self->updated_relations = 0;
+ self->updated_states = 0;
}
/*< private >
@@ -457,10 +467,15 @@ gtk_at_context_set_accessible_state (GtkATContext *self,
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
+ gboolean res = FALSE;
+
if (value != NULL)
- gtk_accessible_attribute_set_add (self->states, state, value);
+ res = gtk_accessible_attribute_set_add (self->states, state, value);
else
- gtk_accessible_attribute_set_remove (self->states, state);
+ res = gtk_accessible_attribute_set_remove (self->states, state);
+
+ if (res)
+ self->updated_states |= (1 << state);
}
/*< private >
@@ -519,10 +534,15 @@ gtk_at_context_set_accessible_property (GtkATContext *self,
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
+ gboolean res = FALSE;
+
if (value != NULL)
- gtk_accessible_attribute_set_add (self->properties, property, value);
+ res = gtk_accessible_attribute_set_add (self->properties, property, value);
else
- gtk_accessible_attribute_set_remove (self->properties, property);
+ res = gtk_accessible_attribute_set_remove (self->properties, property);
+
+ if (res)
+ self->updated_properties |= (1 << property);
}
/*< private >
@@ -581,10 +601,15 @@ gtk_at_context_set_accessible_relation (GtkATContext *self,
{
g_return_if_fail (GTK_IS_AT_CONTEXT (self));
+ gboolean res = FALSE;
+
if (value != NULL)
- gtk_accessible_attribute_set_add (self->relations, relation, value);
+ res = gtk_accessible_attribute_set_add (self->relations, relation, value);
else
- gtk_accessible_attribute_set_remove (self->relations, relation);
+ res = gtk_accessible_attribute_set_remove (self->relations, relation);
+
+ if (res)
+ self->updated_relations |= (1 << relation);
}
/*< private >