* 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
/* A pointer to our parent object class */
static SpiListenerClass *spi_registry_parent_class;
+int _dbg = 0;
+
typedef enum {
ETYPE_FOCUS,
ETYPE_OBJECT,
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;
+static void
+spi_registry_set_debug (const char *debug_flag_string)
+{
+ if (debug_flag_string)
+ _dbg = (int) g_ascii_strtod (debug_flag_string, NULL);
+}
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)
BonoboObject *registry = BONOBO_OBJECT (data);
Accessibility_Event e;
CORBA_Environment ev;
+ Accessibility_Accessible a;
- e.type = g_strdup ("object:children-changed:add");
+ CORBA_exception_init (&ev);
+ e.type = "object:children-changed:add";
e.source = BONOBO_OBJREF (desktop);
e.detail1 = index;
e.detail2 = 0;
- CORBA_exception_init (&ev);
+ a = Accessibility_Accessible_getChildAtIndex (BONOBO_OBJREF (desktop),
+ index, &ev);
+ /* FIXME
+ spi_init_any_object (&e.any_data, a);
+ */
+ spi_init_any_nil (&e.any_data);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
&e, &ev);
- Accessibility_Desktop_unref (e.source, &ev);
+ bonobo_object_release_unref (a, &ev);
CORBA_exception_free (&ev);
}
{
BonoboObject *registry = BONOBO_OBJECT (data);
Accessibility_Event e;
+ Accessibility_Accessible a;
CORBA_Environment ev;
- e.type = g_strdup ("object:children-changed:remove");
+ CORBA_exception_init (&ev);
+
+ e.type = "object:children-changed:remove";
e.source = BONOBO_OBJREF (desktop);
e.detail1 = index;
e.detail2 = 0;
- CORBA_exception_init (&ev);
+ a = Accessibility_Accessible_getChildAtIndex (BONOBO_OBJREF (desktop),
+ index, &ev);
+ /* FIXME
+ spi_init_any_object (&e.any_data, a);
+ */
+ spi_init_any_nil (&e.any_data);
+ Accessibility_Accessible_unref (a, &ev);
Accessibility_Registry_notifyEvent (BONOBO_OBJREF (registry),
&e, &ev);
Accessibility_Desktop_unref (e.source, &ev);
static void
spi_registry_object_finalize (GObject *object)
{
- printf ("spi_registry_object_finalize called\n");
+ DBG (1, g_warning ("spi_registry_object_finalize called\n"));
/* TODO: unref deviceeventcontroller, which disconnects key listener */
G_OBJECT_CLASS (spi_registry_parent_class)->finalize (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;
{
etype->type_cat = ETYPE_WINDOW;
}
+ else if (!g_ascii_strncasecmp (event_name, "keyboard:", 9))
+ {
+ etype->type_cat = ETYPE_KEYBOARD;
+ }
else
{
etype->type_cat = ETYPE_TOOLKIT;
case ETYPE_OBJECT:
case ETYPE_PROPERTY:
case ETYPE_FOCUS:
+ case ETYPE_KEYBOARD:
ret = ®istry->object_listeners;
break;
case ETYPE_WINDOW:
ret = ®istry->window_listeners;
break;
+ case ETYPE_MOUSE:
case ETYPE_TOOLKIT:
ret = ®istry->toolkit_listeners;
break;
- case ETYPE_KEYBOARD:
default:
ret = NULL;
break;
EventTypeStruct etype;
GList **list;
-#ifdef SPI_DEBUG
- fprintf (stderr, "registering");
+#ifdef SPI_LISTENER_DEBUG
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_Environment *ev)
{
int i;
- GList **lists[2];
+ GList **lists[3];
SpiRegistry *registry = SPI_REGISTRY (bonobo_object_from_servant (servant));
lists[0] = ®istry->object_listeners;
#endif
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) ls->listener, &ctx->e_out, ctx->ev);
if (ctx->ev->_major != CORBA_NO_EXCEPTION)
{
- g_warning ("Accessibility app error: exception during "
+ DBG (1, g_warning ("Accessibility app error: exception during "
"event notification: %s\n",
- CORBA_exception_id (ctx->ev));
+ 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 */
list = get_listener_list (registry, ctx.etype.type_cat);
- if (list)
+ if (list && *list)
{
ctx.ev = ev;
ctx.e_out = *e;
+ CORBA_any__copy (&ctx.e_out.any_data, &e->any_data);
ctx.source = e->source;
- parse_event_type (&ctx.etype, e->type);
-
spi_re_entrant_list_foreach (list, notify_listeners_cb, &ctx);
}
-
}
-
static void
spi_registry_class_init (SpiRegistryClass *klass)
{
static void
spi_registry_init (SpiRegistry *registry)
{
+ spi_registry_set_debug (g_getenv ("AT_SPI_DEBUG"));
registry->object_listeners = NULL;
registry->window_listeners = NULL;
registry->toolkit_listeners = NULL;
G_CALLBACK (desktop_remove_application),
registry);
- registry->de_controller = NULL;
+ registry->de_controller = spi_device_event_controller_new (registry);
}
BONOBO_TYPE_FUNC_FULL (SpiRegistry,