{
EventHandler *eh = l->data;
next = l->next;
-
- list = g_list_delete_link (list, l);
-
- cspi_event_handler_free (eh);
+
+ if (eh->cb.method == callback)
+ {
+ list = g_list_delete_link (list, l);
+ cspi_event_handler_free (eh);
+ }
}
return list;
{
GList *l;
CSpiEventListener *clistener = (CSpiEventListener *) listener;
- InternalEvent aevent;
+ InternalEvent *ievent;
+ AccessibleEvent *aevent;
Accessible *source = cspi_object_borrow (event->source);
- aevent.event.type = event->type;
- aevent.event.source = source;
- aevent.event.detail1 = event->detail1;
- aevent.event.detail2 = event->detail2;
- aevent.id = _e_id++;
- aevent.magic = SPI_INTERNAL_EVENT_MAGIC;
- aevent.ref_count = 0;
- aevent.data = &event->any_data;
+ ievent = g_new0(InternalEvent, 1);
+ ievent->event.type = g_strdup (event->type);
+ ievent->event.source = source;
+ ievent->event.detail1 = event->detail1;
+ ievent->event.detail2 = event->detail2;
+ ievent->id = _e_id++;
+ ievent->magic = SPI_INTERNAL_EVENT_MAGIC;
+ ievent->ref_count = 0;
+ ievent->data = CORBA_any__alloc ();
+ CORBA_any__copy (ievent->data, &event->any_data);
+ aevent = (AccessibleEvent *)ievent;
+ Accessible_ref (source);
+ AccessibleEvent_ref (aevent);
/* FIXME: re-enterancy hazard on this list */
for (l = clistener->callbacks; l; l = l->next)
{
EventHandler *eh = l->data;
/* cast hides our private stuff from client handlers */
- eh->cb.event ((AccessibleEvent *) &aevent, eh->user_data);
+ eh->cb.event (aevent, eh->user_data);
}
+ AccessibleEvent_unref (aevent);
cspi_object_return (source);
}
break;
}
}
-
+ g_free (anevent.keystring);
+
return handled;
}