- desktops = Accessibility_DesktopSeq__alloc ();
- desktops->_length = desktops->_maximum = 1;
- desktops->_buffer = Accessibility_DesktopSeq_allocbuf (desktops->_length);
- desktops->_buffer [0] = bonobo_object_dup_ref (BONOBO_OBJREF (registry->desktop), ev);
-
- return desktops;
-}
-
-
-static Accessibility_DeviceEventController
-impl_accessibility_registry_get_device_event_controller (PortableServer_Servant servant,
- CORBA_Environment *ev)
-{
- SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
-
- if (!registry->de_controller)
- {
- registry->de_controller = spi_device_event_controller_new (registry);
- }
-
- return bonobo_object_dup_ref (BONOBO_OBJREF (registry->de_controller), ev);
-}
-
-typedef struct {
- CORBA_Environment *ev;
- Bonobo_Unknown source;
- EventTypeStruct etype;
- Accessibility_Event *e_out;
-} NotifyContext;
-
-static SpiReEntrantContinue
-notify_listeners_cb (GList * const *list, gpointer user_data)
-{
- SpiListenerStruct *ls;
- NotifyContext *ctx = user_data;
-
- ls = (*list)->data;
-
-#ifdef SPI_LISTENER_DEBUG
- fprintf (stderr, "event quarks: %lx %lx %lx\n", ls->event_type_quark, ctx->etype.major, ctx->etype.minor);
- fprintf (stderr, "event name: %s\n", ctx->etype.event_name);
-#endif
- if ((ls->event_type_quark == ctx->etype.major) ||
- (ls->event_type_quark == ctx->etype.minor))
- {
-#ifdef SPI_DEBUG
- CORBA_string s;
- fprintf (stderr, "notifying listener %d\n", 0);
-/* g_list_index (list, l->data)); */
- s = Accessibility_Accessible__get_name (ctx->source, ctx->ev);
- fprintf (stderr, "event source name %s\n", s);
- CORBA_free (s);
- if (BONOBO_EX (ctx->ev))
- {
- CORBA_exception_free (ctx->ev);
- return SPI_RE_ENTRANT_CONTINUE;
- }
-#endif
-
- ctx->e_out->source = ctx->source;
-
- if ((*list) && (*list)->data == ls)
- {
- Accessibility_EventListener_notifyEvent (
- (Accessibility_EventListener) ls->listener, ctx->e_out, ctx->ev);
- if (ctx->ev->_major != CORBA_NO_EXCEPTION)
- {
- DBG (1, g_warning ("Accessibility app error: exception during "
- "event notification: %s\n",
- CORBA_exception_id (ctx->ev)));
- CORBA_exception_free (ctx->ev);
- /* FIXME: check that this item is removed from the list
- * on system exception by a 'broken' listener */
- }
- }
- }
-
- return SPI_RE_ENTRANT_CONTINUE;
-}
-
-static void
-registry_emit_event (SpiRegistry *registry, NotifyContext *ctx)
-{
- GList **list = get_listener_list (registry, ctx->etype.type_cat);
-
- if (list && *list)
- {
-
- spi_re_entrant_list_foreach (list, notify_listeners_cb, ctx);
- }
-}
-
-static NotifyContext*
-registry_clone_notify_context (NotifyContext *ctx)
-{
- NotifyContext *new_ctx = g_new0 (NotifyContext, 1);
-
- new_ctx->ev = NULL;
- new_ctx->source = bonobo_object_dup_ref (ctx->source, NULL);
- new_ctx->etype.event_name = CORBA_string_dup (ctx->etype.event_name);
- new_ctx->etype.type_cat = ctx->etype.type_cat;
- new_ctx->etype.major = ctx->etype.major;
- new_ctx->etype.minor = ctx->etype.minor;
- new_ctx->etype.detail = ctx->etype.detail;
- new_ctx->e_out = ORBit_copy_value (ctx->e_out, TC_Accessibility_Event);
- return new_ctx;
-}
-
-static void
-registry_flush_event_queue (SpiRegistry *registry,
- gboolean discard,
- CORBA_Environment *ev)
-{
- NotifyContext *q_ctx;
- while (!g_queue_is_empty (registry->deferred_event_queue)) {
- q_ctx = g_queue_pop_tail (registry->deferred_event_queue);
-#ifdef SPI_QUEUE_DEBUG
- fprintf (stderr, "%s! %s [n=%d] %p\n", (discard ? "discard" : "pop"),
- q_ctx->etype.event_name,
- (int) registry->deferred_event_queue->length, q_ctx);
-#endif
- if (!discard) {
- q_ctx->ev = ev;
- registry_emit_event (registry, q_ctx);
- }
- if (discard &&
- (q_ctx->etype.type_cat == ETYPE_OBJECT) &&
- (q_ctx->etype.major == _state_quark) &&
- (q_ctx->etype.minor == _state_changed_focused_quark)) {
- registry->focus_object = q_ctx->source;
-#ifdef SPI_QUEUE_DEBUG
- fprintf (stderr, "discard!: set focus_object %p\n", registry->focus_object);
-#endif
- }
- else {
- bonobo_object_release_unref (q_ctx->source, NULL);
- }
- CORBA_free ((void *)q_ctx->etype.event_name);
- CORBA_free (q_ctx->e_out);
- g_free (q_ctx);
- }
- registry->is_queueing = FALSE;
-}
-
-static gboolean
-registry_timeout_flush_queue (gpointer data)
-{
- SpiRegistry *registry = data;
- CORBA_Environment ev;
-#ifdef SPI_QUEUE_DEBUG
- fprintf (stderr, "timeout! flushing queue...\n");
-#endif
- CORBA_exception_init (&ev);
- registry->queue_handler_id = 0;
- registry_flush_event_queue (registry, FALSE, &ev);
- return FALSE;
-}
-
-static gboolean
-registry_discard_on_event (SpiRegistry *registry, NotifyContext *ctx)
-{
- gboolean retval = FALSE;
- NotifyContext *q_ctx = g_queue_peek_tail (registry->deferred_event_queue);
- if ((q_ctx != NULL) &&
- (ctx->etype.type_cat == ETYPE_WINDOW) &&
- (ctx->etype.major == _activate_quark)) {
- if (CORBA_Object_is_equivalent (ctx->source, q_ctx->source, NULL)) {
- retval = TRUE;
- }
- }
- return retval;
-}
-
-static gboolean
-registry_reset_on_event (SpiRegistry *registry, NotifyContext *ctx)
-{
- return (ctx->etype.type_cat == ETYPE_WINDOW) ? TRUE : FALSE;