diff options
author | Mike Gorse <mgorse@suse.com> | 2014-04-21 18:08:19 -0500 |
---|---|---|
committer | Mike Gorse <mgorse@suse.com> | 2014-04-28 18:13:20 -0500 |
commit | c8c5b688e57d0da1fd2d50b5f4c13414ac1021f7 (patch) | |
tree | 29aa721e808183569eb4e664dd4848db14fb79c0 | |
parent | 7e9fc5bff35eced62167417b1b3b273c5a641d3c (diff) | |
download | at-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.c | 19 |
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)); |