* AT-SPI - Assistive Technology Service Provider Interface
* (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
*
- * Copyright 2001 Sun Microsystems Inc.
+ * Copyright 2001, 2002 Sun Microsystems Inc.,
+ * Copyright 2001, 2002 Ximian, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
ETYPE_WINDOW,
ETYPE_TOOLKIT,
ETYPE_KEYBOARD,
-
+ ETYPE_MOUSE,
ETYPE_LAST_DEFINED
} EventTypeCategory;
typedef struct {
- char *event_name;
+ const char *event_name;
EventTypeCategory type_cat;
GQuark major; /* from string segment[1] */
GQuark minor; /* from string segment[1]+segment[2] */
EventTypeCategory event_type_cat;
} SpiListenerStruct;
-
SpiListenerStruct *
spi_listener_struct_new (Accessibility_EventListener listener, CORBA_Environment *ev)
{
g_free (ls);
}
-
static void
desktop_add_application (SpiDesktop *desktop,
guint index, gpointer data)
Accessibility_Event e;
CORBA_Environment ev;
- e.type = g_strdup ("object:children-changed:add");
+ e.type = "object:children-changed:add";
e.source = BONOBO_OBJREF (desktop);
e.detail1 = index;
e.detail2 = 0;
CORBA_exception_init (&ev);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
&e, &ev);
+ Accessibility_Desktop_unref (e.source, &ev);
CORBA_exception_free (&ev);
}
Accessibility_Event e;
CORBA_Environment ev;
- e.type = g_strdup ("object:children-changed:remove");
+ e.type = "object:children-changed:remove";
e.source = BONOBO_OBJREF (desktop);
e.detail1 = index;
e.detail2 = 0;
CORBA_exception_init (&ev);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
&e, &ev);
+ Accessibility_Desktop_unref (e.source, &ev);
CORBA_exception_free (&ev);
}
-
static void
spi_registry_object_finalize (GObject *object)
{
gchar *s;
split_string = g_strsplit (event_name, ":", 4);
- etype->event_name = g_strdup (event_name);
+ etype->event_name = event_name;
if (!g_ascii_strncasecmp (event_name, "focus:", 6))
{
etype->type_cat = ETYPE_FOCUS;
}
+ else if (!g_ascii_strncasecmp (event_name, "mouse:", 6))
+ {
+ etype->type_cat = ETYPE_MOUSE;
+ }
else if (!g_ascii_strncasecmp (event_name, "object:", 7))
{
etype->type_cat = ETYPE_OBJECT;
case ETYPE_WINDOW:
ret = ®istry->window_listeners;
break;
+ case ETYPE_MOUSE:
case ETYPE_TOOLKIT:
ret = ®istry->toolkit_listeners;
break;
EventTypeStruct etype;
GList **list;
-#ifdef SPI_DEBUG
+#ifdef SPI_LISTENER_DEBUG
fprintf (stderr, "registering");
fprintf (stderr, "registering for events of type %s\n", event_name);
#endif
/* parse, check major event type and add listener accordingly */
parse_event_type (&etype, event_name);
- ls->event_type_quark = etype.major;
+ ls->event_type_quark = etype.minor;
ls->event_type_cat = etype.type_cat;
list = get_listener_list (registry, etype.type_cat);
CORBA_free (s);
#endif
- ctx->e_out.source = bonobo_object_dup_ref (ctx->source, ctx->ev);
+ ctx->e_out.source = CORBA_Object_duplicate (ctx->source, ctx->ev);
+
if (BONOBO_EX (ctx->ev))
{
- return SPI_RE_ENTRANT_CONTINUE;;
+ return SPI_RE_ENTRANT_CONTINUE;
}
-
+
if ((*list) && (*list)->data == ls)
{
Accessibility_EventListener_notifyEvent (
(Accessibility_EventListener) ls->listener, &ctx->e_out, ctx->ev);
- if (ctx->ev->_major != CORBA_NO_EXCEPTION)
- {
- g_warning ("Accessibility app error: exception during "
- "event notification: %s\n",
- CORBA_exception_id (ctx->ev));
- }
+ if (ctx->ev->_major != CORBA_NO_EXCEPTION)
+ {
+ g_warning ("Accessibility app error: exception during "
+ "event notification: %s\n",
+ CORBA_exception_id (ctx->ev));
+ if (ctx->ev->_major == CORBA_SYSTEM_EXCEPTION)
+ CORBA_exception_init (ctx->ev);
+ /* clear system exception on notify, it means listener is dead but
+ * that's no concern of the event source :-) */
+ }
}
else /* dup re-entered */
{
- bonobo_object_release_unref (ctx->e_out.source, ctx->ev);
+ CORBA_Object_release (ctx->e_out.source, ctx->ev);
}
}
ctx.ev = ev;
ctx.e_out = *e;
ctx.source = e->source;
- parse_event_type (&ctx.etype, e->type);
spi_re_entrant_list_foreach (list, notify_listeners_cb, &ctx);
}
- if (e->source != CORBA_OBJECT_NIL)
- {
- Accessibility_Accessible_unref (e->source, ev);
- }
}
G_CALLBACK (desktop_remove_application),
registry);
- registry->de_controller = NULL;
+ registry->de_controller = spi_device_event_controller_new (registry);
}
BONOBO_TYPE_FUNC_FULL (SpiRegistry,