summaryrefslogtreecommitdiff
path: root/atspi/atspi-event-listener.c
diff options
context:
space:
mode:
authorMike Gorse <mgorse@suse.com>2012-10-26 16:01:35 -0500
committerMike Gorse <mgorse@suse.com>2012-10-26 16:01:35 -0500
commit0927d749d332c1719856545f53a00ea28a7d4e25 (patch)
tree23300c539bc4e9db7951085b6bb0a22482293e0d /atspi/atspi-event-listener.c
parent1d2cfd39d4d99723d2662ae96512a6dc8877d1a8 (diff)
downloadat-spi2-core-0927d749d332c1719856545f53a00ea28a7d4e25.tar.gz
Only call an event listener once per event
If an event listener is registered for an event more than once (ie, registering both the event and its superset), then only notify it once.
Diffstat (limited to 'atspi/atspi-event-listener.c')
-rw-r--r--atspi/atspi-event-listener.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/atspi/atspi-event-listener.c b/atspi/atspi-event-listener.c
index 26f1105d..ba5d1262 100644
--- a/atspi/atspi-event-listener.c
+++ b/atspi/atspi-event-listener.c
@@ -788,6 +788,7 @@ _atspi_send_event (AtspiEvent *e)
{
char *category, *name, *detail;
GList *l;
+ GList *called_listeners = NULL;
/* Ensure that the value is set to avoid a Python exception */
/* TODO: Figure out how to do this without using a private field */
@@ -809,12 +810,24 @@ _atspi_send_event (AtspiEvent *e)
(entry->name == NULL || !strcmp (name, entry->name)) &&
detail_matches_listener (detail, entry->detail))
{
+ GList *l2;
+ for (l2 = called_listeners; l2; l2 = l2->next)
+ {
+ EventListenerEntry *e2 = l2->data;
+ if (entry->callback == e2->callback && entry->user_data == e2->user_data)
+ break;
+ }
+ if (!l2)
+ {
entry->callback (atspi_event_copy (e), entry->user_data);
+ called_listeners = g_list_prepend (called_listeners, entry);
+ }
}
}
if (detail) g_free (detail);
g_free (name);
g_free (category);
+ g_list_free (called_listeners);
}
DBusHandlerResult