summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Gorse <mgorse@suse.com>2014-04-21 18:08:19 -0500
committerMike Gorse <mgorse@suse.com>2014-04-28 18:13:20 -0500
commitc8c5b688e57d0da1fd2d50b5f4c13414ac1021f7 (patch)
tree29aa721e808183569eb4e664dd4848db14fb79c0
parent7e9fc5bff35eced62167417b1b3b273c5a641d3c (diff)
downloadat-spi2-atk-c8c5b688e57d0da1fd2d50b5f4c13414ac1021f7.tar.gz
Only send cache-related events for transients when explicitly requested
Hopefully this will improve performance when, ie, gtk floods us with children-changed events when populating a large treeview. https://bugzilla.gnome.org/show_bug.cgi?id=728319
-rw-r--r--atk-adaptor/event.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/atk-adaptor/event.c b/atk-adaptor/event.c
index 0430271..42d359d 100644
--- a/atk-adaptor/event.c
+++ b/atk-adaptor/event.c
@@ -376,8 +376,8 @@ append_properties (GArray *properties, event_data *evdata)
}
static gboolean
-signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor,
- GArray **properties)
+signal_is_needed (AtkObject *obj, const gchar *klass, const gchar *major,
+ const gchar *minor, GArray **properties)
{
gchar *data [4];
event_data *evdata;
@@ -403,7 +403,18 @@ signal_is_needed (const gchar *klass, const gchar *major, const gchar *minor,
!g_strcmp0 (data [2], "accessible-parent") ||
!g_strcmp0 (data [2], "accessible-role"))) ||
!g_strcmp0 (data [1], "StateChanged"))
- ret = TRUE;
+ {
+ if (minor && !g_strcmp0 (minor, "defunct"))
+ ret = TRUE;
+ else
+ {
+ AtkStateSet *set = atk_object_ref_state_set (obj);
+ AtkState state = ((!g_strcmp0 (data[1], "ChildrenChanged")) ?
+ ATK_STATE_MANAGES_DESCENDANTS : ATK_STATE_TRANSIENT);
+ ret = !atk_state_set_contains_state (set, state);
+ g_object_unref (set);
+ }
+ }
/* Hack: events such as "object::text-changed::insert:system" as
generated by Gecko */
@@ -483,7 +494,7 @@ emit_event (AtkObject *obj,
if (!minor) minor = "";
if (!type) type = "u";
- if (!signal_is_needed (klass, major, minor, &properties))
+ if (!signal_is_needed (obj, klass, major, minor, &properties))
return;
path = spi_register_object_to_path (spi_global_register, G_OBJECT (obj));