+<2001-10-09 Bill Haneman <bill.haneman@sun.com>
+
+ * at-bridge/bridge.c:
+ Re-worked listeners for toolkit events, now we have signal
+ and property listeners. Added a private method
+ register_atk_event_listeners(), which registers with the
+ various atk and gtk signals we need to monitor in order to emit
+ our at-spi events.
+ Added emission hook for AtkObject:property-change events, to
+ support the 'property listeners'.
+ Fixed some alloc()s of Accessibility_Event structs to use CORBA
+ allocation.
+
+ * cspi/spi-util.c: added methods spi_warn_ev and spi_check_ev,
+ which emit warnings and exit, respectively, if CORBA errors occur
+ during remote calls, and we now use these methods to check most of
+ our CORBA calls in the C bindings.
+
+ * cspi/spi_accessible.c:
+ Changed AccessibleSelection_refSelectedChild() to
+ AccessibleSelection_getSelectedChild(), since all our cspi 'gets'
+ now increment refcounts.
+
+ * cspi/spi_component.c:
+ Fixed some long pointer casts (dangerous!) to pass pointers to
+ CORBA_longs of the proper type to the CORBA stubs, and copy the
+ data into the longs that were passed into the C bindings code.
+
+ * at-bridge/bridge.c:
+
+ * libspi/accessible.c:
+ Removed ATK_IS_HYPERLINK() query, since AtkObjects are never
+ hyperlinks, AtkHyperlink is an object type.
+
+ * libspi/application.c:
+ Added various conversions to and from "generic" event types and
+ atk-specific types; this is really part of the 'bridge'
+ implementation but is valid for all AtkObject-based accessibility
+ implementations.
+
+ * libspi/editabletext.c:
+ Fixed nasty bug wherein editable text's finalize method was
+ unref'ing tha AtkObject reference that the text parent class was
+ about to unref _again_. There was also a nasty inheritance bug
+ that meant that the AccessibleEditableText class was corrupt.
+
+ * libspi/selection.c:
+ Provided implementations for some selection API that was broken.
+
+ * idl/Application.idl:
+ Added registerObjectEventListener () method.
+
+ * THROUGHOUT:
+ Fixed a number of return values that were Bonobo_Unknowns from
+ bonobo_object_corba_objref(), which I
+ forgot to dup before returning. Changed instances of
+ bonobo_object_corba_objref (bonobo_object(o)) to
+ BONOBO_OBJREF(o), for concision and clarity.
+
<2001-10-13 Louise Miller <louise.miller@sun.com>
* idl/Accessible.idl, idl/Application.idl, idl/Desktop.idl,
of Bonobo.idl
<2001-09-10 Marc Mulcahy <marc.mulcahy@sun.com
- libspi/component.c libspi/component.h:
- Fixed typo. Added assertions for object checks in AccessibleComponent code.
- <2001-10-09 Bill Haneman <bill.haneman@sun.com>
+ * libspi/component.c libspi/component.h:
+ Fixed typo. Added assertions for object checks in
+ AccessibleComponent code.
+
+<2001-10-09 Bill Haneman <bill.haneman@sun.com>
* idl/Accessible.idl:
Added 'isEqual (Accessible *object)'
#include "accessible.h"
#include "application.h"
+#define APP_STATIC_BUFF_SZ 64
+
typedef struct _ArgStruct ArgStruct;
struct _ArgStruct {
static gboolean bridge_register_app (gpointer p);
static void bridge_focus_tracker (AtkObject *object);
static void bridge_exit_func(void);
+static gboolean bridge_register_event_listener ();
+static void register_atk_event_listeners();
+static gboolean bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data);
+static gboolean bridge_signal_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data);
int
gtk_module_init(gint *argc, gchar **argv[])
bonobo_activate ();
- /* Register for focus event notifications, and register app with central registry */
- atk_add_focus_tracker (bridge_focus_tracker);
-
Accessibility_Registry_registerApplication (registry,
- bonobo_object_corba_objref (bonobo_object (this_app)),
+ CORBA_Object_duplicate (BONOBO_OBJREF (this_app), &ev),
&ev);
+
+ register_atk_event_listeners ();
+
return FALSE;
}
+static void
+register_atk_event_listeners ()
+{
+ /* Register for focus event notifications, and register app with central registry */
+
+/* kludge to make sure the Atk interface types are registered, otherwise
+ the AtkText signal handlers below won't get registered */
+
+ ATK_TYPE_TEXT;
+
+ atk_add_focus_tracker (bridge_focus_tracker);
+ atk_add_global_event_listener (bridge_property_event_listener, "Gtk:AtkObject:property-change");
+/* atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkObject:children-changed");
+ atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-changed");
+ atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-caret-moved");*/
+}
+
static void bridge_exit_func()
{
fprintf (stderr, "exiting bridge\n");
Accessibility_Registry_deregisterApplication (registry,
- bonobo_object_corba_objref (
- bonobo_object (this_app)),
+ CORBA_Object_duplicate (BONOBO_OBJREF (this_app), &ev),
&ev);
fprintf (stderr, "bridge exit func complete.\n");
}
{
Accessibility_Event *e = Accessibility_Event__alloc();
e->type = CORBA_string_dup ("focus:");
- e->source = bonobo_object_corba_objref (bonobo_object (accessible_new (object)));
+ e->source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (object)), &ev);
+ e->detail1 = 0;
+ e->detail2 = 0;
+ Accessibility_Registry_notifyEvent (registry, e, &ev);
+}
+
+static gboolean
+bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ Accessibility_Event *e = Accessibility_Event__alloc();
+ Bonobo_Unknown source = NULL;
+ AtkObject *aobject;
+ AtkPropertyValues *values;
+ GObject *gobject;
+ GSignalQuery signal_query;
+ gchar *name;
+ char sbuf[APP_STATIC_BUFF_SZ];
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+#ifdef SPI_BRIDGE_DEBUG
+ fprintf (stderr, "Received (property) signal %s:%s\n",
+ g_type_name (signal_query.itype), name);
+#endif
+ gobject = g_value_get_object (param_values + 0);
+ values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
+
+ /* notify the actual listeners */
+ if (ATK_IS_IMPLEMENTOR (gobject))
+ {
+ aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+ source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (aobject)), &ev);
+ g_object_unref (G_OBJECT(aobject));
+ }
+ else if (ATK_IS_OBJECT (gobject))
+ {
+ aobject = ATK_OBJECT (gobject);
+ source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (aobject)), &ev);
+ }
+ else
+ {
+ g_error("received property-change event from non-AtkImplementor");
+ }
+
+ snprintf(sbuf, APP_STATIC_BUFF_SZ, "object:property-change:%s", values->property_name);
+ e->type = CORBA_string_dup (sbuf);
+ e->source = source;
+ e->detail1 = 0;
+ e->detail2 = 0;
+ if (source)
+ Accessibility_Registry_notifyEvent (registry, e, &ev);
+ return TRUE;
+}
+
+static gboolean
+bridge_signal_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ Accessibility_Event *e = g_new0(Accessibility_Event, 1);
+ AtkObject *aobject;
+ Bonobo_Unknown source;
+ AtkPropertyValues *values;
+ GObject *gobject;
+ GSignalQuery signal_query;
+ gchar *name;
+ char sbuf[APP_STATIC_BUFF_SZ];
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+#ifdef SPI_BRIDGE_DEBUG
+ fprintf (stderr, "Received (property) signal %s:%s\n",
+ g_type_name (signal_query.itype), name);
+#endif
+ gobject = g_value_get_object (param_values + 0);
+
+ /* notify the actual listeners */
+ if (ATK_IS_IMPLEMENTOR (gobject))
+ {
+ aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+ }
+ else if (ATK_IS_OBJECT (gobject))
+ {
+ aobject = ATK_OBJECT (gobject);
+ g_object_ref (aobject);
+ }
+ else
+ {
+ g_error("received property-change event from non-AtkImplementor");
+ }
+
+ snprintf(sbuf, APP_STATIC_BUFF_SZ, "%s:%s", name, g_type_name (signal_query.itype));
+ source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (aobject)), &ev);
+ e->type = CORBA_string_dup (sbuf);
+ e->source = source;
e->detail1 = 0;
e->detail2 = 0;
Accessibility_Registry_notifyEvent (registry, e, &ev);
- /* CORBA_free (e); */
+ g_object_unref (aobject);
+ return TRUE;
}
static Accessibility_Registry bridge_get_registry ()
#include "accessible.h"
#include "application.h"
+#define APP_STATIC_BUFF_SZ 64
+
typedef struct _ArgStruct ArgStruct;
struct _ArgStruct {
static gboolean bridge_register_app (gpointer p);
static void bridge_focus_tracker (AtkObject *object);
static void bridge_exit_func(void);
+static gboolean bridge_register_event_listener ();
+static void register_atk_event_listeners();
+static gboolean bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data);
+static gboolean bridge_signal_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data);
int
gtk_module_init(gint *argc, gchar **argv[])
bonobo_activate ();
- /* Register for focus event notifications, and register app with central registry */
- atk_add_focus_tracker (bridge_focus_tracker);
-
Accessibility_Registry_registerApplication (registry,
- bonobo_object_corba_objref (bonobo_object (this_app)),
+ CORBA_Object_duplicate (BONOBO_OBJREF (this_app), &ev),
&ev);
+
+ register_atk_event_listeners ();
+
return FALSE;
}
+static void
+register_atk_event_listeners ()
+{
+ /* Register for focus event notifications, and register app with central registry */
+
+/* kludge to make sure the Atk interface types are registered, otherwise
+ the AtkText signal handlers below won't get registered */
+
+ ATK_TYPE_TEXT;
+
+ atk_add_focus_tracker (bridge_focus_tracker);
+ atk_add_global_event_listener (bridge_property_event_listener, "Gtk:AtkObject:property-change");
+/* atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkObject:children-changed");
+ atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-changed");
+ atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-caret-moved");*/
+}
+
static void bridge_exit_func()
{
fprintf (stderr, "exiting bridge\n");
Accessibility_Registry_deregisterApplication (registry,
- bonobo_object_corba_objref (
- bonobo_object (this_app)),
+ CORBA_Object_duplicate (BONOBO_OBJREF (this_app), &ev),
&ev);
fprintf (stderr, "bridge exit func complete.\n");
}
{
Accessibility_Event *e = Accessibility_Event__alloc();
e->type = CORBA_string_dup ("focus:");
- e->source = bonobo_object_corba_objref (bonobo_object (accessible_new (object)));
+ e->source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (object)), &ev);
+ e->detail1 = 0;
+ e->detail2 = 0;
+ Accessibility_Registry_notifyEvent (registry, e, &ev);
+}
+
+static gboolean
+bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ Accessibility_Event *e = Accessibility_Event__alloc();
+ Bonobo_Unknown source = NULL;
+ AtkObject *aobject;
+ AtkPropertyValues *values;
+ GObject *gobject;
+ GSignalQuery signal_query;
+ gchar *name;
+ char sbuf[APP_STATIC_BUFF_SZ];
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+#ifdef SPI_BRIDGE_DEBUG
+ fprintf (stderr, "Received (property) signal %s:%s\n",
+ g_type_name (signal_query.itype), name);
+#endif
+ gobject = g_value_get_object (param_values + 0);
+ values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
+
+ /* notify the actual listeners */
+ if (ATK_IS_IMPLEMENTOR (gobject))
+ {
+ aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+ source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (aobject)), &ev);
+ g_object_unref (G_OBJECT(aobject));
+ }
+ else if (ATK_IS_OBJECT (gobject))
+ {
+ aobject = ATK_OBJECT (gobject);
+ source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (aobject)), &ev);
+ }
+ else
+ {
+ g_error("received property-change event from non-AtkImplementor");
+ }
+
+ snprintf(sbuf, APP_STATIC_BUFF_SZ, "object:property-change:%s", values->property_name);
+ e->type = CORBA_string_dup (sbuf);
+ e->source = source;
+ e->detail1 = 0;
+ e->detail2 = 0;
+ if (source)
+ Accessibility_Registry_notifyEvent (registry, e, &ev);
+ return TRUE;
+}
+
+static gboolean
+bridge_signal_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ Accessibility_Event *e = g_new0(Accessibility_Event, 1);
+ AtkObject *aobject;
+ Bonobo_Unknown source;
+ AtkPropertyValues *values;
+ GObject *gobject;
+ GSignalQuery signal_query;
+ gchar *name;
+ char sbuf[APP_STATIC_BUFF_SZ];
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+#ifdef SPI_BRIDGE_DEBUG
+ fprintf (stderr, "Received (property) signal %s:%s\n",
+ g_type_name (signal_query.itype), name);
+#endif
+ gobject = g_value_get_object (param_values + 0);
+
+ /* notify the actual listeners */
+ if (ATK_IS_IMPLEMENTOR (gobject))
+ {
+ aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+ }
+ else if (ATK_IS_OBJECT (gobject))
+ {
+ aobject = ATK_OBJECT (gobject);
+ g_object_ref (aobject);
+ }
+ else
+ {
+ g_error("received property-change event from non-AtkImplementor");
+ }
+
+ snprintf(sbuf, APP_STATIC_BUFF_SZ, "%s:%s", name, g_type_name (signal_query.itype));
+ source = CORBA_Object_duplicate (BONOBO_OBJREF (accessible_new (aobject)), &ev);
+ e->type = CORBA_string_dup (sbuf);
+ e->source = source;
e->detail1 = 0;
e->detail2 = 0;
Accessibility_Registry_notifyEvent (registry, e, &ev);
- /* CORBA_free (e); */
+ g_object_unref (aobject);
+ return TRUE;
}
static Accessibility_Registry bridge_get_registry ()
#ifndef _SPI_IMPL_H_
#define _SPI_IMPL_H_
+#include <stdlib.h>
#include <orbit/orbit.h>
#include "Accessibility.h"
CORBA_free (s);
}
+boolean
+spi_warn_ev (CORBA_Environment *c_ev, char *error_string) {
+
+ if (c_ev->_major != CORBA_NO_EXCEPTION) {
+ fprintf (stderr,
+ "Warning: AT-SPI error: %s: %s\n",
+ error_string,
+ CORBA_exception_id(c_ev));
+ CORBA_exception_init (c_ev);
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+void
+spi_check_ev (CORBA_Environment *c_ev, char *error_string) {
+
+ if (c_ev->_major != CORBA_NO_EXCEPTION) {
+ fprintf (stderr,
+ ("AT-SPI error: %s: %s\n"),
+ error_string,
+ CORBA_exception_id(c_ev));
+ CORBA_exception_free(c_ev);
+ exit(-1);
+ }
+}
Obj_Add (Accessible object)
{
/* TODO: keep list of live object refs */
- Accessible *oref = g_malloc (sizeof (Accessible));
- *oref = object;
+ Accessible *oref = NULL;
+ if (!CORBA_Object_is_nil (object, &ev))
+ {
+ oref = g_malloc (sizeof (Accessible));
+ *oref = object;
+ }
return oref;
}
AccessibleSelection_getNSelectedChildren (AccessibleSelection *obj);
Accessible *
-AccessibleSelection_refSelectedChild (AccessibleSelection *obj,
+AccessibleSelection_getSelectedChild (AccessibleSelection *obj,
long selectedChildIndex);
boolean
Accessible_ref (Accessible *obj)
{
Accessibility_Accessible_ref (*obj, &ev);
+ spi_check_ev (&ev, "ref");
return 0;
}
Accessible_unref (Accessible *obj)
{
Accessibility_Accessible_unref (*obj, &ev);
+ spi_check_ev (&ev, "unref");
return 0;
}
char *
Accessible_getName (Accessible *obj)
{
- return (char *)
+ char *retval =
+ (char *)
Accessibility_Accessible__get_name (*obj, &ev);
+ spi_check_ev (&ev, "getName");
+ return retval;
}
/**
char *
Accessible_getDescription (Accessible *obj)
{
- return (char *)
+ char *retval = (char *)
Accessibility_Accessible__get_description (*obj, &ev);
+ spi_check_ev (&ev, "getDescription");
+ return retval;
}
/**
*
* Get an #Accessible object's parent container.
*
- * Returns: a pointer to the #Accessible object which contains the given
+ * Returns: a pointer tothe #Accessible object which contains the given
* #Accessible instance, or NULL if the @obj has no parent container.
*
**/
Accessible *
Accessible_getParent (Accessible *obj)
{
- return Obj_Add (Accessibility_Accessible__get_parent (*obj, &ev));
+ Accessible *retval =
+ Obj_Add (Accessibility_Accessible__get_parent (*obj, &ev));
+ spi_check_ev (&ev, "getParent");
+ return retval;
}
/**
long
Accessible_getChildCount (Accessible *obj)
{
- return Accessibility_Accessible__get_childCount (*obj, &ev);
+ long retval = (long) Accessibility_Accessible__get_childCount (*obj, &ev);
+ spi_check_ev (&ev, "getChildCount");
+ return retval;
}
/**
Accessible_getChildAtIndex (Accessible *obj,
long childIndex)
{
- return Obj_Add (Accessibility_Accessible_getChildAtIndex (*obj, childIndex, &ev));
+ Accessible *retval = Obj_Add (Accessibility_Accessible_getChildAtIndex (*obj, childIndex, &ev));
+ spi_check_ev (&ev, "getChildAtIndex");
+ return retval;
}
/**
long
Accessible_getIndexInParent (Accessible *obj)
{
- return Accessibility_Accessible_getIndexInParent (*obj, &ev);
+ long retval = (long) Accessibility_Accessible_getIndexInParent (*obj, &ev);
+ spi_check_ev (&ev, "getIndexInParent");
+ return retval;
}
/**
char *
Accessible_getRole (Accessible *obj)
{
- return Accessible_Role_getName (
+ char *retval = Accessible_Role_getName (
Accessibility_Accessible_getRole (*obj, &ev));
+ spi_check_ev (&ev, "getRole");
+ return retval;
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Action:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_warn_ev (&ev, "isAction");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Component:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_warn_ev (&ev, "isComponent");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/EditableText:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_check_ev (&ev, "isEditableText");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Hypertext:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+
+ spi_check_ev (&ev, "isHypertext");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Image:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_check_ev (&ev, "isImage");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Selection:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_warn_ev (&ev, "isSelection");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
+
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Table:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_check_ev (&ev, "isTable");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
+
}
/**
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Text:1.0",
&ev);
- return (iface != NULL) ? TRUE : FALSE;
+ spi_warn_ev (&ev, "isText");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
+}
+
+/**
+ * Accessible_isValue:
+ * @obj: a pointer to the #Accessible instance to query.
+ *
+ * Query whether the specified #Accessible implements #AccessibleValue.
+ * Not Yet Implemented.
+ *
+ * Returns: #TRUE if @obj implements the #AccessibleValue interface,
+ * #FALSE otherwise.
+**/
+boolean
+Accessible_isValue (Accessible *obj)
+{
+ Bonobo_Unknown iface =
+ Accessibility_Accessible_queryInterface (*obj,
+ "IDL:Accessibility/Value:1.0",
+ &ev);
+ spi_check_ev (&ev, "isValue");
+
+ return (CORBA_Object_is_nil (iface, &ev)) ? FALSE : TRUE;
}
/**
AccessibleAction *
Accessible_getAction (Accessible *obj)
{
- AccessibleComponent iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Action:1.0",
&ev);
- return Obj_Add (iface);
+ spi_check_ev (&ev, "getAction");
+
+ return (AccessibleAction *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
/**
AccessibleComponent *
Accessible_getComponent (Accessible *obj)
{
- AccessibleComponent iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Component:1.0",
&ev);
- return Obj_Add (iface);
+ spi_check_ev (&ev, "getComponent");
+
+ return (AccessibleComponent *) ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
AccessibleEditableText *
Accessible_getEditableText (Accessible *obj)
{
- AccessibleComponent iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/EditableText:1.0",
&ev);
- return Obj_Add (iface);
+ spi_check_ev (&ev, "getEditableText");
+
+ return (AccessibleEditableText *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
AccessibleHypertext *
Accessible_getHypertext (Accessible *obj)
{
- AccessibleComponent iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Hypertext:1.0",
&ev);
- return Obj_Add (iface);
+ spi_check_ev (&ev, "getHypertext");
+
+ return (AccessibleHypertext *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
AccessibleImage *
Accessible_getImage (Accessible *obj)
{
- AccessibleImage iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Image:1.0",
&ev);
- return Obj_Add (iface);
+ spi_check_ev (&ev, "getImage");
+
+ return (AccessibleImage *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
AccessibleSelection *
Accessible_getSelection (Accessible *obj)
{
- AccessibleSelection iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Selection:1.0",
&ev);
- return Obj_Add (iface);
+ spi_warn_ev (&ev, "getSelection");
+
+ return (AccessibleSelection *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
AccessibleTable *
Accessible_getTable (Accessible *obj)
{
- AccessibleTable iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Table:1.0",
&ev);
- return Obj_Add (iface);
-}
-
+ spi_check_ev (&ev, "getTable");
+ return (AccessibleTable *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
+}
AccessibleText *
Accessible_getText (Accessible *obj)
{
- AccessibleText iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Text:1.0",
&ev);
- return Obj_Add (iface);
+
+ spi_check_ev (&ev, "getText");
+
+ return (AccessibleText *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
AccessibleValue *
Accessible_getValue (Accessible *obj)
{
- AccessibleComponent iface =
+ Bonobo_Unknown iface =
Accessibility_Accessible_queryInterface (*obj,
"IDL:Accessibility/Value:1.0",
&ev);
- return Obj_Add (iface);
+ return (AccessibleValue *)
+ ((CORBA_Object_is_nil (iface, &ev)) ? 0 : Obj_Add (iface));
}
long *height,
AccessibleCoordType ctype)
{
- /* TODO: remove assumption that CORBA_long == long in typecast */
+ CORBA_long cx, cy, cw, ch;
Accessibility_Component_getExtents (*obj,
- (CORBA_long *) x,
- (CORBA_long *) y,
- (CORBA_long *) width,
- (CORBA_long *) height,
- ctype,
- &ev);
+ &cx,
+ &cy,
+ &cw,
+ &ch,
+ ctype,
+ &ev);
+ spi_warn_ev (&ev, "AccessibleComponent_getExtents");
+ *x = (long) cx;
+ *y = (long) cy;
+ *width = (long) cw;
+ *height = (long) ch;
}
/**
AccessibleSelection_getSelectedChild (AccessibleSelection *obj,
long selectedChildIndex)
{
- return (Accessible *)
+ Accessibility_Accessible child =
Accessibility_Selection_getSelectedChild (*obj,
(CORBA_long) selectedChildIndex, &ev);
-}
-
+ spi_warn_ev (&ev, "getSelectedChild");
+ return (Accessible *) ((CORBA_Object_is_nil (child, &ev)) ? NULL : Obj_Add (child));
+}
boolean
AccessibleSelection_selectChild (AccessibleSelection *obj,
i = rows->_buffer;
length = (long) rows->_length;
- j = *selectedRows = malloc (sizeof(long)*length);
+ j = *selectedRows = (long *) malloc (sizeof(long)*length);
while (length--)
*j++ = (CORBA_long) (*i++);
i = columns->_buffer;
length = (long) columns->_length;
- j = *selectedColumns = malloc (sizeof(long)*length);
+ j = *selectedColumns = (long *) malloc (sizeof(long)*length);
while (length--)
*j++ = (CORBA_long) (*i++);
long
AccessibleText_getCharacterCount (AccessibleText *obj)
{
- return (long)
+ long retval;
+
+ CORBA_exception_init (&ev);
+ retval = (long)
Accessibility_Text__get_characterCount (*obj, &ev);
+
+ spi_check_ev (&ev, "AccessibleText_getCharacterCount");
+
+ return retval;
}
char *
AccessibleText_getTextAtOffset (AccessibleText *obj,
- long offset,
- TEXT_BOUNDARY_TYPE type,
- long *startOffset, long *endOffset)
+ long offset,
+ TEXT_BOUNDARY_TYPE type,
+ long *startOffset, long *endOffset)
{
CORBA_long corbaStartOffset;
CORBA_long corbaEndOffset;
attribute long id;
/**
- * Register with this application's toolkit for "toolkit" event notifications.
+ * Register with this application's toolkit for "toolkit-specific" event notifications.
*
**/
void registerToolkitEventListener (in EventListener listener, in string eventName);
/**
+ * Register with this application's toolkit for "Accessibility::Accessible"
+ * event notifications.
+ *
+ **/
+ void registerObjectEventListener (in EventListener listener, in string eventName);
+
+ /**
* pause:
* Returns: %true if the request succeeded, %false otherwise.
*
attribute long id;
/**
- * Register with this application's toolkit for "toolkit" event notifications.
+ * Register with this application's toolkit for "toolkit-specific" event notifications.
*
**/
void registerToolkitEventListener (in EventListener listener, in string eventName);
/**
+ * Register with this application's toolkit for "Accessibility::Accessible"
+ * event notifications.
+ *
+ **/
+ void registerObjectEventListener (in EventListener listener, in string eventName);
+
+ /**
* pause:
* Returns: %true if the request succeeded, %false otherwise.
*
Accessible *accessible = ACCESSIBLE (object);
printf("accessible_object_finalize called\n");
- g_object_unref (accessible->atko);
+ ATK_OBJECT (accessible->atko); /* assertion */
+ g_object_unref (G_OBJECT(accessible->atko));
accessible->atko = NULL;
printf("atko freed, calling parent finalize\n");
retval = CORBA_string_dup (retval);
else
retval = CORBA_string_dup ("");
- fprintf (stderr, "Accessible get_name called: %s\n", retval);
+
return retval;
}
CORBA_char * retval;
Accessible *accessible = ACCESSIBLE (bonobo_object_from_servant (servant));
retval = CORBA_string_dup (atk_object_get_description (accessible->atko));
- fprintf (stderr, "Accessible get_description called: %s\n", retval);
+
return retval;
}
Accessible *accessible = ACCESSIBLE (bonobo_object_from_servant (servant));
AtkObject *parent;
parent = atk_object_get_parent (accessible->atko);
- retval = bonobo_object_corba_objref (bonobo_object (accessible_new (parent)));
+ retval = BONOBO_OBJREF (accessible_new (parent));
printf ("Accessible get_parent called\n");
- return retval;
+ return CORBA_Object_duplicate (retval, &ev);
}
/*
Accessibility_Accessible retval;
Accessible *accessible = ACCESSIBLE (bonobo_object_from_servant (servant));
AtkObject *child = atk_object_ref_accessible_child (accessible->atko, (gint) index);
- retval = bonobo_object_corba_objref ( bonobo_object (accessible_new (child)));
+ retval = BONOBO_OBJREF (accessible_new (child));
printf ("Accessible get_child_at_index called.\n");
- return retval;
+ return CORBA_Object_duplicate (retval, &ev);
}
/*
*/
static Accessibility_RelationSet *
impl_accessibility_accessible_get_relation_set (PortableServer_Servant servant,
- const CORBA_long index,
CORBA_Environment *ev)
{
Accessibility_RelationSet *retval;
*/
static Accessibility_Role
impl_accessibility_accessible_get_role (PortableServer_Servant servant,
- const CORBA_long index,
CORBA_Environment *ev)
{
Accessibility_Role retval;
{
Accessible *retval =
ACCESSIBLE (g_object_new (accessible_get_type (), NULL));
+ CORBA_Environment ev;
+ CORBA_exception_init (&ev);
g_object_ref (o);
retval->atko = ATK_OBJECT (o);
bonobo_object_add_interface (bonobo_object (retval),
BONOBO_OBJECT (action_interface_new (o)));
}
-
+
if (ATK_IS_COMPONENT (o))
{
bonobo_object_add_interface (bonobo_object (retval),
BONOBO_OBJECT (text_interface_new (o)));
}
- if (ATK_IS_HYPERLINK (o))
- {
- bonobo_object_add_interface (bonobo_object (retval),
- BONOBO_OBJECT (hyperlink_interface_new(o)));
- }
-
if (ATK_IS_IMAGE (o))
{
bonobo_object_add_interface (bonobo_object (retval),
BONOBO_OBJECT (value_interface_new (o)));
}
-
return retval;
}
(*cb) (e);
}
}
- Accessibility_Accessible_unref (e->source, ev);
+ /* Accessibility_Accessible_unref (e->source, ev); */
}
static void
#define ACTION_TYPE (action_get_type ())
#define ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ACTION_TYPE, Action))
#define ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), ACTION_TYPE, ActionClass))
-#define IS_ACTION(obj) (G_TYPE_CHECK__INSTANCE_TYPE ((obj), ACTION_TYPE))
+#define IS_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ACTION_TYPE))
#define IS_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), ACTION_TYPE))
typedef struct _Action Action;
* application.c: implements Application.idl
*
*/
+#include <string.h>
#include <config.h>
#include <bonobo/Bonobo.h>
#include <atk/atkutil.h>
*/
static AccessibleClass *application_parent_class;
-Accessibility_EventListener the_toolkit_listener;
+static Application *the_app;
+
+/* static methods */
+
+static void notify_listeners (GList *listeners,
+ Accessibility_Event *e,
+ CORBA_Environment *ev);
+
+static char* lookup_toolkit_event_for_name (char *generic_name);
+
+static char* reverse_lookup_name_for_toolkit_event (char *toolkit_name);
/*
* Implemented GObject::finalize
accessible_application_finalize (GObject *object)
{
/* TODO: any necessary cleanup */
- Accessible *accessible = ACCESSIBLE (object);
-
- g_object_unref (accessible->atko);
- accessible->atko = NULL;
-
- /* TODO: chain to parent class instead */
+ (G_OBJECT_CLASS (application_parent_class))->finalize (object);
}
static CORBA_string
#define APP_STATIC_BUFF_SZ 64
static gboolean
-application_toolkit_listener (GSignalInvocationHint *signal_hint,
- guint n_param_values,
- const GValue *param_values,
- gpointer data)
+application_object_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
+{
+ Accessibility_Event *e = Accessibility_Event__alloc();
+ AtkObject *aobject;
+ GObject *gobject;
+ Accessible *source;
+ CORBA_Environment ev;
+ GSignalQuery signal_query;
+ gchar *name;
+ char sbuf[APP_STATIC_BUFF_SZ];
+ char *generic_name;
+
+ g_signal_query (signal_hint->signal_id, &signal_query);
+ name = signal_query.signal_name;
+ fprintf (stderr, "Received (object) signal %s:%s\n",
+ g_type_name (signal_query.itype), name);
+
+ /* TODO: move GTK dependency out of app.c into bridge */
+ snprintf(sbuf, APP_STATIC_BUFF_SZ, "Gtk:%s:%s", g_type_name (signal_query.itype), name);
+
+ generic_name = reverse_lookup_name_for_toolkit_event (sbuf);
+ gobject = g_value_get_object (param_values + 0);
+
+ /* notify the actual listeners */
+ if (ATK_IS_IMPLEMENTOR (gobject))
+ {
+ aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+ }
+ else if (ATK_IS_OBJECT (gobject))
+ {
+ aobject = ATK_OBJECT (gobject);
+ g_object_ref (G_OBJECT (aobject));
+ }
+ else
+ {
+ g_error("received event from non-AtkImplementor");
+ }
+
+ g_return_val_if_fail (generic_name, FALSE);
+ if (generic_name)
+ {
+ source = accessible_new (aobject);
+ e->type = CORBA_string_dup (generic_name);
+ e->source = BONOBO_OBJREF (source);
+ /*
+ * no need to dup this ref, since it's inprocess
+ * and will be dup'ed by (inprocess) notify_listeners() call below
+ */
+ e->detail1 = 0;
+ e->detail2 = 0;
+ if (the_app) notify_listeners (the_app->toolkit_listeners, e, &ev);
+ /* unref because the in-process notify has called b_o_dup_ref (e->source) */
+ bonobo_object_release_unref (e->source, &ev);
+ }
+ /* and, decrement the refcount on atkobject, incremented moments ago:
+ * the call to accessible_new() above should have added an extra ref */
+ g_object_unref (G_OBJECT (aobject));
+
+ return TRUE;
+}
+
+
+static gboolean
+application_toolkit_event_listener (GSignalInvocationHint *signal_hint,
+ guint n_param_values,
+ const GValue *param_values,
+ gpointer data)
{
- Accessibility_Event *e = g_new0(Accessibility_Event, 1);
+ Accessibility_Event *e = Accessibility_Event__alloc();
AtkObject *aobject;
GObject *gobject;
+ Accessible *source;
CORBA_Environment ev;
GSignalQuery signal_query;
gchar *name;
/* TODO: move GTK dependency out of app.c into bridge */
snprintf(sbuf, APP_STATIC_BUFF_SZ, "Gtk:%s:%s", g_type_name (signal_query.itype), name);
-
gobject = g_value_get_object (param_values + 0);
/* notify the actual listeners */
if (ATK_IS_IMPLEMENTOR (gobject))
{
aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+ source = accessible_new (aobject);
e->type = CORBA_string_dup (sbuf);
- e->source = bonobo_object_corba_objref (bonobo_object (accessible_new (aobject)));
+ e->source = BONOBO_OBJREF (source);
e->detail1 = 0;
e->detail2 = 0;
- Accessibility_EventListener_notifyEvent (the_toolkit_listener, e, &ev);
- g_object_unref (aobject);
+ if (the_app) notify_listeners (the_app->toolkit_listeners, e, &ev);
+ bonobo_object_unref (source);
+ g_object_unref (G_OBJECT (aobject));
}
return TRUE;
}
static void
impl_accessibility_application_register_toolkit_event_listener (PortableServer_Servant servant,
- Accessibility_EventListener listener,
+ Accessibility_EventListener listener,
const CORBA_char *event_name,
CORBA_Environment *ev)
{
guint listener_id;
listener_id =
- atk_add_global_event_listener (application_toolkit_listener, event_name);
- the_toolkit_listener = CORBA_Object_duplicate (listener, ev);
+ atk_add_global_event_listener (application_toolkit_event_listener, event_name);
+ the_app->toolkit_listeners = g_list_append (the_app->toolkit_listeners,
+ CORBA_Object_duplicate (listener, ev));
#ifdef SPI_DEBUG
fprintf (stderr, "registered %d for toolkit events named: %s\n",
listener_id,
}
static void
+impl_accessibility_application_register_object_event_listener (PortableServer_Servant servant,
+ Accessibility_EventListener listener,
+ const CORBA_char *event_name,
+ CORBA_Environment *ev)
+{
+ guint listener_id;
+ char *toolkit_specific_event_name = lookup_toolkit_event_for_name (event_name);
+ if (toolkit_specific_event_name)
+ {
+ listener_id =
+ atk_add_global_event_listener (application_object_event_listener,
+ CORBA_string_dup (toolkit_specific_event_name));
+ the_app->toolkit_listeners = g_list_append (the_app->toolkit_listeners,
+ CORBA_Object_duplicate (listener, ev));
+ }
+#ifdef SPI_DEBUG
+ fprintf (stderr, "registered %d for object events named: %s\n",
+ listener_id,
+ event_name);
+#endif
+}
+
+static void
+notify_listeners (GList *listeners, Accessibility_Event *e, CORBA_Environment *ev)
+{
+ int n_listeners=0;
+ int i;
+ if (listeners) n_listeners = g_list_length (listeners);
+
+ for (i=0; i<n_listeners; ++i) {
+ Accessibility_EventListener listener;
+ e->source = bonobo_object_dup_ref (e->source, ev);
+ listener = (Accessibility_EventListener) g_list_nth_data (listeners, i);
+ Accessibility_EventListener_notifyEvent (listener, e, ev);
+ /*
+ * when this (oneway) call completes, the CORBA refcount and
+ * Bonobo_Unknown refcount will be decremented by the recipient
+ */
+ }
+}
+
+static char *
+lookup_toolkit_event_for_name (char *generic_name)
+{
+ char *toolkit_specific_name;
+ ApplicationClass *klass = g_type_class_peek (APPLICATION_TYPE);
+#ifdef SPI_DEBUG
+ fprintf (stderr, "looking for %s in hash table.\n", generic_name);
+#endif
+ toolkit_specific_name =
+ (char *) g_hash_table_lookup (klass->toolkit_event_names, generic_name);
+#ifdef SPI_DEBUG
+ fprintf (stderr, "generic event %s converted to %s\n", generic_name, toolkit_specific_name);
+#endif
+ return toolkit_specific_name;
+}
+
+static char *
+reverse_lookup_name_for_toolkit_event (char *toolkit_specific_name)
+{
+ char *generic_name;
+ ApplicationClass *klass = g_type_class_peek (APPLICATION_TYPE);
+#ifdef SPI_DEBUG
+ fprintf (stderr, "(reverse lookup) looking for %s in hash table.\n", toolkit_specific_name);
+#endif
+ generic_name =
+ (char *) g_hash_table_lookup (klass->generic_event_names, toolkit_specific_name);
+#ifdef SPI_DEBUG
+ fprintf (stderr, "toolkit event %s converted to %s\n", toolkit_specific_name, generic_name);
+#endif
+ return generic_name;
+}
+
+static void
+init_toolkit_names (GHashTable **generic_event_names, GHashTable **toolkit_event_names)
+{
+ *toolkit_event_names = g_hash_table_new (g_str_hash, g_str_equal);
+ *generic_event_names = g_hash_table_new (g_str_hash, g_str_equal);
+ g_hash_table_insert (*toolkit_event_names,
+ "object:property-change",
+ "Gtk:AtkObject:property-change");
+ g_hash_table_insert (*generic_event_names,
+ "Gtk:AtkObject:property-change",
+ "object:property-change");
+#ifdef SPI_DEBUG
+ fprintf (stderr, "inserted selection_changed hash\n");
+#endif
+}
+
+static void
application_class_init (ApplicationClass *klass)
{
GObjectClass * object_class = (GObjectClass *) klass;
epv->_get_id = impl_accessibility_application_get_id;
epv->_set_id = impl_accessibility_application_set_id;
epv->registerToolkitEventListener = impl_accessibility_application_register_toolkit_event_listener;
+ init_toolkit_names (&klass->generic_event_names, &klass->toolkit_event_names);
}
static void
application_init (Application *application)
{
ACCESSIBLE (application)->atko = g_object_new (atk_object_get_type(), NULL);
+ application->toolkit_listeners = (GList *) NULL;
+ the_app = application;
}
GType
Application *retval =
APPLICATION (g_object_new (application_get_type (), NULL));
ACCESSIBLE (retval)->atko = app_root;
+ g_object_ref (G_OBJECT (app_root));
return retval;
}
typedef struct {
Accessible parent;
long id;
+ GList *toolkit_listeners;
} Application;
typedef struct {
AccessibleClass parent_class;
POA_Accessibility_Application__epv epv;
+ GHashTable *toolkit_event_names;
+ GHashTable *generic_event_names;
} ApplicationClass;
GType application_get_type (void);
g_object_unref (component->atko);
component->atko = NULL;
- printf("atko freed, calling parent finalize\n");
+ printf("component atko freed, calling parent finalize\n");
component_parent_class->finalize (object);
}
(gint) x, (gint) y,
(AtkCoordType) coord_type);
retval = bonobo_object_corba_objref (bonobo_object (accessible_new (child)));
- return retval;
+ return CORBA_Object_duplicate (retval, ev);
}
/*
COMPONENT (g_object_new (accessibility_component_get_type (), NULL));
retval->atko = o;
g_object_ref (o);
-return retval;
+ return retval;
}
{
GObjectClass * object_class = (GObjectClass *) klass;
POA_Accessibility_EditableText__epv *epv = &klass->epv;
- parent_class = g_type_class_peek_parent (klass);
+ parent_class = g_type_interface_peek_parent (klass);
object_class->finalize = editable_text_finalize;
-
+
+/* */
+ fprintf(stderr, "INITIALIZING editabletext class!\n");
+
+ fprintf (stderr, "EditableText: get-character-count is at %p\n",
+ ((TEXT_CLASS(klass))->epv._get_characterCount));
/* Initialize epv table */
static void
editable_text_finalize (GObject *obj)
{
- EditableText *editable = EDITABLE_TEXT(obj);
- Text *text = TEXT(obj);
- g_object_unref (text->atko);
- text->atko = NULL;
parent_class->finalize (obj);
}
{
EditableText *new_editable =
EDITABLE_TEXT(g_object_new (EDITABLE_TEXT_TYPE, NULL));
- TEXT (new_editable)->atko = obj;
+ (TEXT (new_editable))->atko = obj;
g_object_ref (obj);
-return new_editable;
+ return new_editable;
}
(*cb) (e);
}
}
- Accessibility_Accessible_unref (e->source, ev);
+ /* Accessibility_Accessible_unref (e->source, ev); */
}
static void
typedef enum {
ETYPE_FOCUS,
+ ETYPE_OBJECT,
+ ETYPE_PROPERTY,
ETYPE_WINDOW,
ETYPE_TOOLKIT,
ETYPE_LAST_DEFINED
fprintf (stderr, "registering app %p\n", application);
#endif
registry->desktop->applications = g_list_append (registry->desktop->applications,
- CORBA_Object_duplicate (application, ev));
+ bonobo_object_dup_ref (application, ev));
/* TODO: create unique string here (with libuuid call ?) and hash ? */
Accessibility_Application__set_id (application, _get_unique_id(), ev);
Accessibility_Desktop desktop;
Accessibility_Application app;
Accessibility_Registry registry;
- registry = bonobo_object_corba_objref (bonobo_object (registry_bonobo_object));
+ registry = BONOBO_OBJREF (registry_bonobo_object);
/* for each app in each desktop, call ...Application_registerToolkitEventListener */
app = (Accessibility_Application) Accessibility_Desktop_getChildAtIndex (desktop,
j,
ev);
- /* TODO: should we be ref-ing the registry object before each call ? */
- Accessibility_Application_registerToolkitEventListener (app,
- registry,
- CORBA_string_dup (etype->event_name),
- ev);
+ Accessibility_Application_registerToolkitEventListener (app,
+ registry,
+ CORBA_string_dup (etype->event_name),
+
+ ev);
}
}
}
{
etype->type_cat = ETYPE_FOCUS;
}
+ else if (!g_ascii_strncasecmp (event_name, "object:", 7))
+ {
+ etype->type_cat = ETYPE_OBJECT;
+ }
else if (!g_ascii_strncasecmp (event_name, "window:", 7))
{
etype->type_cat = ETYPE_WINDOW;
Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
ListenerStruct *ls = g_malloc (sizeof (ListenerStruct));
EventTypeStruct etype;
+ gboolean is_toolkit_specific = TRUE;
fprintf(stderr, "registering for events of type %s\n", event_name);
switch (etype.type_cat)
{
case (ETYPE_FOCUS) :
+ case (ETYPE_OBJECT) :
+ case (ETYPE_PROPERTY) :
ls->listener = CORBA_Object_duplicate (listener, ev);
- registry->focus_listeners =
- g_list_append (registry->focus_listeners, ls);
+ registry->object_listeners =
+ g_list_append (registry->object_listeners, ls);
break;
case (ETYPE_WINDOW) :
/* Support for Window Manager Events is not yet implemented */
CORBA_Environment *ev)
{
Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
- GList *list = g_list_find_custom (registry->focus_listeners, listener, compare_corba_objects);
+ GList *list = g_list_find_custom (registry->object_listeners, listener, compare_corba_objects);
/*
* TODO : de-register with toolkit if the last instance of a listener
while (list)
{
fprintf (stderr, "deregistering listener\n");
- registry->focus_listeners = g_list_delete_link (registry->focus_listeners, list);
- list = g_list_find_custom (registry->focus_listeners, listener, compare_corba_objects);
+ registry->object_listeners = g_list_delete_link (registry->object_listeners, list);
+ list = g_list_find_custom (registry->object_listeners, listener, compare_corba_objects);
}
list = g_list_find_custom (registry->toolkit_listeners, listener, compare_corba_objects);
while (list)
parse_event_type (&etype, event_name);
switch (etype.type_cat)
{
+ case (ETYPE_OBJECT) :
+ case (ETYPE_PROPERTY) :
case (ETYPE_FOCUS) :
- listeners = ®istry->focus_listeners;
+ listeners = ®istry->object_listeners;
break;
case (ETYPE_WINDOW) :
/* Support for Window Manager Events is not yet implemented */
if (n == 0)
{
return (Accessibility_Desktop)
- CORBA_Object_duplicate (
- bonobo_object_corba_objref (bonobo_object (registry->desktop)), ev);
+ CORBA_Object_duplicate (BONOBO_OBJREF (registry->desktop), ev);
}
else
{
Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
if (!registry->device_event_controller)
registry->device_event_controller = g_object_new (DEVICE_EVENT_CONTROLLER_TYPE, NULL);
- return CORBA_Object_duplicate (
- bonobo_object_corba_objref (
- bonobo_object (registry->device_event_controller)), ev);
+ return CORBA_Object_duplicate (BONOBO_OBJREF (registry->device_event_controller), ev);
}
static void
switch (etype.type_cat)
{
+ case (ETYPE_OBJECT) :
+ case (ETYPE_PROPERTY) :
case (ETYPE_FOCUS) :
- _registry_notify_listeners (registry->focus_listeners, e, ev);
+ _registry_notify_listeners (registry->object_listeners, e, ev);
break;
case (ETYPE_WINDOW) :
_registry_notify_listeners (registry->window_listeners, e, ev);
break;
case (ETYPE_TOOLKIT) :
- _registry_notify_listeners (registry->toolkit_listeners, e, ev);
+ _registry_notify_listeners (registry->toolkit_listeners, e, ev);
break;
default:
break;
}
- Accessibility_Accessible_unref (e->source, ev);
+ /* Accessibility_Accessible_unref (e->source, ev);*/ /* This should be here! */
}
static long
for (n=0; n<len; ++n)
{
ls = (ListenerStruct *) g_list_nth_data (listeners, n);
-#ifdef SPI_DEBUG
+#ifdef SPI_LISTENER_DEBUG
fprintf(stderr, "event hashes: %lx %lx %lx\n", ls->event_type_hash, etype.hash, minor_hash);
fprintf(stderr, "event name: %s\n", etype.event_name);
#endif
{
#ifdef SPI_DEBUG
fprintf(stderr, "notifying listener #%d\n", n);
- fprintf(stderr, "event name %s\n", Accessibility_Accessible__get_name(e->source, ev));
+ fprintf(stderr, "event source name %s\n", Accessibility_Accessible__get_name(e->source, ev));
#endif
+ e->source = CORBA_Object_duplicate (e->source, ev);
Accessibility_Accessible_ref ( e->source, ev);
Accessibility_EventListener_notifyEvent ((Accessibility_EventListener) ls->listener,
e,
static void
registry_init (Registry *registry)
{
- registry->focus_listeners = NULL;
+ registry->object_listeners = NULL;
registry->window_listeners = NULL;
registry->toolkit_listeners = NULL;
registry->applications = NULL;
typedef struct {
Listener parent;
- GList *focus_listeners;
+ GList *object_listeners;
GList *window_listeners;
GList *toolkit_listeners;
GList *applications;
* This pulls the CORBA definitions for the "Accessibility::Accessible" server
*/
#include <libspi/Accessibility.h>
+#include "accessible.h"
/*
* This pulls the definition of the selection bonobo object
impl__get_nSelectedChildren (PortableServer_Servant _servant,
CORBA_Environment * ev)
{
- Selection *selection = SELECTION (bonobo_object_from_servant (_servant));
+ BonoboObject *obj = bonobo_object_from_servant (_servant);
+ Selection *selection;
+#ifdef SPI_DEBUG
+ fprintf (stderr, "calling impl__get_nSelectedChildren\n");
+#endif
+ g_return_val_if_fail (IS_SELECTION (obj), 0);
+ selection = SELECTION (obj);
+ g_return_val_if_fail (ATK_IS_SELECTION (selection->atko), 0);
return (CORBA_long)
atk_selection_get_selection_count (ATK_SELECTION(selection->atko));
-}
-
-
+}
static Accessibility_Accessible
const CORBA_long selectedChildIndex,
CORBA_Environment * ev)
{
- Selection *selection = SELECTION (bonobo_object_from_servant (_servant));
+ BonoboObject *obj = bonobo_object_from_servant (_servant);
+ Selection
+ *selection;
AtkObject *atk_object;
Accessibility_Accessible rv;
-
- atk_object = atk_selection_ref_selection (ATK_SELECTION(selection->atko), (gint) selectedChildIndex);
- rv = bonobo_object_corba_objref (BONOBO_OBJECT(accessible_new(atk_object)));
- return rv;
+#ifdef SPI_DEBUG
+ fprintf (stderr, "calling impl_getSelectedChild\n");
+#endif
+ g_return_val_if_fail (IS_SELECTION (obj), 0);
+ selection = SELECTION (obj);
+ g_return_val_if_fail (ATK_IS_SELECTION (selection->atko), 0);
+
+ atk_object = atk_selection_ref_selection (ATK_SELECTION (selection->atko),
+ (gint) selectedChildIndex);
+ g_return_val_if_fail (ATK_IS_OBJECT (atk_object), NULL);
+#ifdef SPI_DEBUG
+ fprintf (stderr, "child type is %s\n", g_type_name (G_OBJECT_TYPE (atk_object)));
+#endif
+ rv = bonobo_object_corba_objref (bonobo_object (accessible_new (atk_object)));
+ g_object_unref (atk_object);
+ return CORBA_Object_duplicate (rv, ev);
}
#define SELECTION_TYPE (selection_get_type ())
#define SELECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SELECTION_TYPE, Selection))
#define SELECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), SELECTION_TYPE, SelectionClass))
-#define IS_SELECTION(obj) (G_TYPE_CHECK__INSTANCE_TYPE ((obj), SELECTION_TYPE))
+#define IS_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SELECTION_TYPE))
#define IS_SELECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SELECTION_TYPE))
typedef struct _Selection Selection;
atk_object = atk_table_get_caption (ATK_TABLE(table-> atko));
rv = bonobo_object_corba_objref (BONOBO_OBJECT(accessible_new(atk_object)));
- return rv;
+ return CORBA_Object_duplicate (rv, ev);
}
atk_object = atk_table_get_summary (ATK_TABLE(table->atko));
rv = bonobo_object_corba_objref (BONOBO_OBJECT(accessible_new(atk_object)));
- return rv;
+ return CORBA_Object_duplicate (rv, ev);
}
atk_object = atk_table_ref_at (ATK_TABLE(table->atko),
(gint) row, (gint) column);
rv = bonobo_object_corba_objref (BONOBO_OBJECT(accessible_new(atk_object)));
- return rv;
+ return CORBA_Object_duplicate (rv, ev);
}
header = atk_table_get_row_header (ATK_TABLE(table->atko), (gint) row);
rv = bonobo_object_corba_objref (BONOBO_OBJECT(accessible_new(header)));
- return rv;
+ return CORBA_Object_duplicate (rv, ev);
}
header = atk_table_get_column_header (ATK_TABLE(table->atko), (gint) column);
rv = bonobo_object_corba_objref (BONOBO_OBJECT(accessible_new(header)));
- return rv;
+ return CORBA_Object_duplicate (rv, ev);
}
#include "text.h"
/*
+ * Our parent Gtk object type
+ */
+#define PARENT_TYPE BONOBO_OBJECT_TYPE
+
+
+/*
+ * A pointer to our parent object class
+ */
+static GObjectClass *text_parent_class;
+
+/*
* Static function declarations
*/
static void
-text_class_init (TextClass *klass);
+accessibility_text_class_init (TextClass *klass);
+
static void
-text_init (Text *text);
+accessibility_text_init (Text *text);
+
static void
-text_finalize (GObject *obj);
+accessibility_text_object_finalize (GObject *obj);
+
static CORBA_string
impl_getText (PortableServer_Servant _servant,
const CORBA_long startOffset,
const CORBA_long endOffset,
CORBA_Environment * ev);
-CORBA_string
+
+static CORBA_string
impl_getTextAfterOffset (PortableServer_Servant _servant,
const CORBA_long offset,
const
impl_getCharacterAtOffset (PortableServer_Servant _servant,
const CORBA_long offset,
CORBA_Environment * ev);
+
static CORBA_string
impl_getTextBeforeOffset (PortableServer_Servant _servant,
const CORBA_long offset,
type, CORBA_long * startOffset,
CORBA_long * endOffset,
CORBA_Environment * ev);
+
static CORBA_long
impl__get_caretOffset (PortableServer_Servant _servant,
CORBA_Environment * ev);
+
static CORBA_string
impl_getAttributes (PortableServer_Servant _servant,
const CORBA_long offset,
CORBA_long * startOffset,
CORBA_long * endOffset,
CORBA_Environment * ev);
+
static void
impl_getCharacterExtents (PortableServer_Servant _servant,
const CORBA_long offset, CORBA_long * x,
CORBA_long * height,
const CORBA_short coordType,
CORBA_Environment * ev);
+
static CORBA_long
impl__get_characterCount (PortableServer_Servant _servant,
CORBA_Environment * ev);
+
static CORBA_long
impl_getOffsetAtPoint (PortableServer_Servant _servant,
const CORBA_long x, const CORBA_long y,
const CORBA_short coordType,
CORBA_Environment * ev);
+
static CORBA_long
impl_getNSelections (PortableServer_Servant _servant,
CORBA_Environment * ev);
+
static void
impl_getSelection (PortableServer_Servant _servant,
const CORBA_long selectionNum,
CORBA_long * startOffset, CORBA_long * endOffset,
CORBA_Environment * ev);
+
static CORBA_boolean
impl_addSelection (PortableServer_Servant _servant,
const CORBA_long startOffset,
const CORBA_long endOffset,
CORBA_Environment * ev);
+
static CORBA_boolean
impl_removeSelection (PortableServer_Servant _servant,
const CORBA_long selectionNum,
CORBA_Environment * ev);
+
static CORBA_boolean
impl_setSelection (PortableServer_Servant _servant,
const CORBA_long selectionNum,
const CORBA_long startOffset,
const CORBA_long endOffset,
CORBA_Environment * ev);
+
static CORBA_boolean
impl_setCaretOffset (PortableServer_Servant _servant,
const CORBA_long value,
- CORBA_Environment * ev);
-
-
-
-static GObjectClass *parent_class;
+ CORBA_Environment * ev);
GType
-text_get_type (void)
+accessibility_text_get_type (void)
{
static GType type = 0;
sizeof (TextClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
- (GClassInitFunc) text_class_init,
+ (GClassInitFunc) accessibility_text_class_init,
(GClassFinalizeFunc) NULL,
NULL, /* class data */
sizeof (Text),
0, /* n preallocs */
- (GInstanceInitFunc) text_init,
- NULL /* value table */
+ (GInstanceInitFunc) accessibility_text_init,
+ NULL /* value table */
};
/*
* use bonobo_type_unique.
*/
type = bonobo_type_unique (
- BONOBO_OBJECT_TYPE,
+ PARENT_TYPE,
POA_Accessibility_Text__init,
NULL,
G_STRUCT_OFFSET (TextClass, epv),
}
static void
-text_class_init (TextClass *klass)
+accessibility_text_class_init (TextClass *klass)
{
GObjectClass * object_class = (GObjectClass *) klass;
POA_Accessibility_Text__epv *epv = &klass->epv;
- parent_class = g_type_class_peek_parent (klass);
-
- object_class->finalize = text_finalize;
+ text_parent_class = g_type_class_peek_parent (klass);
+ object_class->finalize = accessibility_text_object_finalize;
/* Initialize epv table */
}
static void
-text_init (Text *text)
+accessibility_text_init (Text *text)
{
}
static void
-text_finalize (GObject *obj)
+accessibility_text_object_finalize (GObject *obj)
{
Text *text = TEXT (obj);
g_object_unref (text->atko);
text->atko = NULL;
- parent_class->finalize (obj);
+ text_parent_class->finalize (obj);
}
Text *
text_interface_new (AtkObject *obj)
{
Text *new_text =
- TEXT(g_object_new (TEXT_TYPE, NULL));
+ TEXT (g_object_new (accessibility_text_get_type (), NULL));
new_text->atko = obj;
g_object_ref (obj);
return new_text;
{
Text *text;
gchar *txt;
- CORBA_char *rv;
+ CORBA_string rv;
BonoboObject *obj;
obj = (bonobo_object_from_servant (_servant));
{
Text *text;
BonoboObject *obj;
+ CORBA_long retval;
obj = (bonobo_object_from_servant (_servant));
g_return_val_if_fail (IS_TEXT (obj), (CORBA_long)0);
text = TEXT (obj);
- return (CORBA_long)
+ retval = (CORBA_long)
atk_text_get_character_count (ATK_TEXT(text->atko));
+
+ return retval;
}
#include <libspi/Accessibility.h>
#include "accessible.h"
-#define TEXT_TYPE (text_get_type ())
+#define TEXT_TYPE (accessibility_text_get_type ())
#define TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEXT_TYPE, Text))
#define TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), TEXT_TYPE, TextClass))
#define IS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEXT_TYPE))
};
GType
-text_get_type (void);
+accessibility_text_get_type (void);
Text *
text_interface_new (AtkObject *obj);
typedef enum {
ETYPE_FOCUS,
+ ETYPE_OBJECT,
+ ETYPE_PROPERTY,
ETYPE_WINDOW,
ETYPE_TOOLKIT,
ETYPE_LAST_DEFINED
fprintf (stderr, "registering app %p\n", application);
#endif
registry->desktop->applications = g_list_append (registry->desktop->applications,
- CORBA_Object_duplicate (application, ev));
+ bonobo_object_dup_ref (application, ev));
/* TODO: create unique string here (with libuuid call ?) and hash ? */
Accessibility_Application__set_id (application, _get_unique_id(), ev);
Accessibility_Desktop desktop;
Accessibility_Application app;
Accessibility_Registry registry;
- registry = bonobo_object_corba_objref (bonobo_object (registry_bonobo_object));
+ registry = BONOBO_OBJREF (registry_bonobo_object);
/* for each app in each desktop, call ...Application_registerToolkitEventListener */
app = (Accessibility_Application) Accessibility_Desktop_getChildAtIndex (desktop,
j,
ev);
- /* TODO: should we be ref-ing the registry object before each call ? */
- Accessibility_Application_registerToolkitEventListener (app,
- registry,
- CORBA_string_dup (etype->event_name),
- ev);
+ Accessibility_Application_registerToolkitEventListener (app,
+ registry,
+ CORBA_string_dup (etype->event_name),
+
+ ev);
}
}
}
{
etype->type_cat = ETYPE_FOCUS;
}
+ else if (!g_ascii_strncasecmp (event_name, "object:", 7))
+ {
+ etype->type_cat = ETYPE_OBJECT;
+ }
else if (!g_ascii_strncasecmp (event_name, "window:", 7))
{
etype->type_cat = ETYPE_WINDOW;
Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
ListenerStruct *ls = g_malloc (sizeof (ListenerStruct));
EventTypeStruct etype;
+ gboolean is_toolkit_specific = TRUE;
fprintf(stderr, "registering for events of type %s\n", event_name);
switch (etype.type_cat)
{
case (ETYPE_FOCUS) :
+ case (ETYPE_OBJECT) :
+ case (ETYPE_PROPERTY) :
ls->listener = CORBA_Object_duplicate (listener, ev);
- registry->focus_listeners =
- g_list_append (registry->focus_listeners, ls);
+ registry->object_listeners =
+ g_list_append (registry->object_listeners, ls);
break;
case (ETYPE_WINDOW) :
/* Support for Window Manager Events is not yet implemented */
CORBA_Environment *ev)
{
Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
- GList *list = g_list_find_custom (registry->focus_listeners, listener, compare_corba_objects);
+ GList *list = g_list_find_custom (registry->object_listeners, listener, compare_corba_objects);
/*
* TODO : de-register with toolkit if the last instance of a listener
while (list)
{
fprintf (stderr, "deregistering listener\n");
- registry->focus_listeners = g_list_delete_link (registry->focus_listeners, list);
- list = g_list_find_custom (registry->focus_listeners, listener, compare_corba_objects);
+ registry->object_listeners = g_list_delete_link (registry->object_listeners, list);
+ list = g_list_find_custom (registry->object_listeners, listener, compare_corba_objects);
}
list = g_list_find_custom (registry->toolkit_listeners, listener, compare_corba_objects);
while (list)
parse_event_type (&etype, event_name);
switch (etype.type_cat)
{
+ case (ETYPE_OBJECT) :
+ case (ETYPE_PROPERTY) :
case (ETYPE_FOCUS) :
- listeners = ®istry->focus_listeners;
+ listeners = ®istry->object_listeners;
break;
case (ETYPE_WINDOW) :
/* Support for Window Manager Events is not yet implemented */
if (n == 0)
{
return (Accessibility_Desktop)
- CORBA_Object_duplicate (
- bonobo_object_corba_objref (bonobo_object (registry->desktop)), ev);
+ CORBA_Object_duplicate (BONOBO_OBJREF (registry->desktop), ev);
}
else
{
Registry *registry = REGISTRY (bonobo_object_from_servant (servant));
if (!registry->device_event_controller)
registry->device_event_controller = g_object_new (DEVICE_EVENT_CONTROLLER_TYPE, NULL);
- return CORBA_Object_duplicate (
- bonobo_object_corba_objref (
- bonobo_object (registry->device_event_controller)), ev);
+ return CORBA_Object_duplicate (BONOBO_OBJREF (registry->device_event_controller), ev);
}
static void
switch (etype.type_cat)
{
+ case (ETYPE_OBJECT) :
+ case (ETYPE_PROPERTY) :
case (ETYPE_FOCUS) :
- _registry_notify_listeners (registry->focus_listeners, e, ev);
+ _registry_notify_listeners (registry->object_listeners, e, ev);
break;
case (ETYPE_WINDOW) :
_registry_notify_listeners (registry->window_listeners, e, ev);
break;
case (ETYPE_TOOLKIT) :
- _registry_notify_listeners (registry->toolkit_listeners, e, ev);
+ _registry_notify_listeners (registry->toolkit_listeners, e, ev);
break;
default:
break;
}
- Accessibility_Accessible_unref (e->source, ev);
+ /* Accessibility_Accessible_unref (e->source, ev);*/ /* This should be here! */
}
static long
for (n=0; n<len; ++n)
{
ls = (ListenerStruct *) g_list_nth_data (listeners, n);
-#ifdef SPI_DEBUG
+#ifdef SPI_LISTENER_DEBUG
fprintf(stderr, "event hashes: %lx %lx %lx\n", ls->event_type_hash, etype.hash, minor_hash);
fprintf(stderr, "event name: %s\n", etype.event_name);
#endif
{
#ifdef SPI_DEBUG
fprintf(stderr, "notifying listener #%d\n", n);
- fprintf(stderr, "event name %s\n", Accessibility_Accessible__get_name(e->source, ev));
+ fprintf(stderr, "event source name %s\n", Accessibility_Accessible__get_name(e->source, ev));
#endif
+ e->source = CORBA_Object_duplicate (e->source, ev);
Accessibility_Accessible_ref ( e->source, ev);
Accessibility_EventListener_notifyEvent ((Accessibility_EventListener) ls->listener,
e,
static void
registry_init (Registry *registry)
{
- registry->focus_listeners = NULL;
+ registry->object_listeners = NULL;
registry->window_listeners = NULL;
registry->toolkit_listeners = NULL;
registry->applications = NULL;
typedef struct {
Listener parent;
- GList *focus_listeners;
+ GList *object_listeners;
GList *window_listeners;
GList *toolkit_listeners;
GList *applications;
check_ev (&ev, "register:button_press");
fprintf (stderr, "AT callback registered.\n");
-
n_desktops = Accessibility_Registry_getDesktopCount (registry, &ev);
for (i=0; i<n_desktops; ++i)
static void report_focus_event (void *fp);
static void report_button_press (void *fp);
static boolean report_key_event (void *fp);
+static void check_property_change (void *fp);
static void get_environment_vars (void);
static int _festival_init ();
Accessible *desktop;
Accessible *application;
AccessibleEventListener *focus_listener;
+ AccessibleEventListener *property_listener;
AccessibleEventListener *button_listener;
KeystrokeListener *key_listener;
SPI_init();
focus_listener = createEventListener (report_focus_event);
+ property_listener = createEventListener (check_property_change);
button_listener = createEventListener (report_button_press);
-
registerGlobalEventListener (focus_listener, "focus:");
+ registerGlobalEventListener (property_listener, "object:property-change:accessible-selection");
registerGlobalEventListener (button_listener, "Gtk:GtkWidget:button-press-event");
-
n_desktops = getDesktopCount ();
for (i=0; i<n_desktops; ++i)
{
application = Accessible_getChildAtIndex (desktop, j);
fprintf (stderr, "app %d name: %s\n", j, Accessible_getName (application));
+ Accessible_unref (application);
}
}
}
void
-report_focus_event (void *p)
+report_focussed_accessible (Accessible *obj, boolean shutup_previous_speech)
{
- AccessibleEvent *ev = (AccessibleEvent *) p;
- fprintf (stderr, "%s event from %s\n", ev->type,
- Accessible_getName (&ev->source));
-
if (use_festival)
{
if (festival_chatty)
{
- _festival_say (Accessible_getRole (&ev->source), "voice_don_diphone", TRUE);
+ _festival_say (Accessible_getRole (obj), "voice_don_diphone", shutup_previous_speech);
}
- _festival_say (Accessible_getName (&ev->source), "voice_kal_diphone", festival_chatty==FALSE);
+ fprintf (stderr, "getting Name\n");
+ _festival_say (Accessible_getName (obj), "voice_kal_diphone",
+ shutup_previous_speech || festival_chatty);
}
- if (Accessible_isComponent (&ev->source))
+ if (Accessible_isComponent (obj))
{
long x, y, width, height;
- AccessibleComponent *component = Accessible_getComponent (&ev->source);
+ AccessibleComponent *component = Accessible_getComponent (obj);
AccessibleComponent_getExtents (component, &x, &y, &width, &height,
COORD_TYPE_SCREEN);
fprintf (stderr, "Bounding box: (%ld, %ld) ; (%ld, %ld)\n",
magnifier_set_roi (x, y, width, height);
}
}
- if (Accessible_isText(&ev->source))
- /* if this is a text object, speak the first sentence. */
+ /* if this is a text object, speak the first sentence. */
+ if (Accessible_isText(obj))
{
- AccessibleText *text_interface = Accessible_getText (&ev->source);
+ AccessibleText *text_interface;
long start_offset, end_offset;
- char *first_sentence = "";
+ char *first_sentence = "empty";
+ text_interface = Accessible_getText (obj);
+ fprintf (stderr, "isText...%p %p\n", text_interface, (void *)*text_interface);
first_sentence = AccessibleText_getTextAtOffset (
- text_interface, (long) 0, TEXT_BOUNDARY_WORD_END,
- &start_offset, &end_offset);
- _festival_say(first_sentence, "voice_don_diphone", festival_chatty==FALSE);
+ text_interface, (long) 0, TEXT_BOUNDARY_SENTENCE_START, &start_offset, &end_offset);
+ if (first_sentence) _festival_say(first_sentence, "voice_don_diphone", FALSE);
+ fprintf (stderr, "done reporting on focussed object\n");
}
}
void
+report_focus_event (void *p)
+{
+ AccessibleEvent *ev = (AccessibleEvent *) p;
+ fprintf (stderr, "%s event from %s\n", ev->type,
+ Accessible_getName (&ev->source));
+ report_focussed_accessible (&ev->source, TRUE);
+}
+
+void
report_button_press (void *p)
{
AccessibleEvent *ev = (AccessibleEvent *) p;
Accessible_getName (&ev->source));
}
+
+void
+check_property_change (void *p)
+{
+ AccessibleEvent *ev = (AccessibleEvent *) p;
+ AccessibleSelection *selection = Accessible_getSelection (&ev->source);
+ int n_selections;
+ int i;
+ if (selection)
+ {
+ n_selections = (int) AccessibleSelection_getNSelectedChildren (selection);
+ fprintf (stderr, "(Property) %s event from %s, %d selected children\n", ev->type,
+ Accessible_getName (&ev->source), n_selections);
+ /* for now, speak entire selection set */
+ for (i=0; i<n_selections; ++i)
+ {
+ Accessible *obj = AccessibleSelection_getSelectedChild (selection, (long) i);
+ g_return_if_fail (obj);
+ fprintf (stderr, "Child %d, name=%s\n", i, Accessible_getName (obj));
+ report_focussed_accessible (obj, i==0);
+ }
+ }
+}
+
static boolean
report_key_event (void *p)
{