From 0927d749d332c1719856545f53a00ea28a7d4e25 Mon Sep 17 00:00:00 2001 From: Mike Gorse Date: Fri, 26 Oct 2012 16:01:35 -0500 Subject: 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. --- atspi/atspi-event-listener.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'atspi/atspi-event-listener.c') 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 -- cgit v1.2.1