*/
#include "config.h"
-#include "dbus/dbus-glib.h"
+#include "dbus/dbus-glib-lowlevel.h"
#include <X11/Xlib.h>
#include <X11/Xatom.h>
static gint spi_atk_bridge_key_listener (AtkKeyEventStruct *event,
gpointer data);
static void spi_atk_tidy_windows (void);
-static void deregister_application ();
+static void deregister_application (SpiAppData *app);
static void reinit_register_vars (void);
/* For automatic libgnome init */
}
static gboolean
-post_init (void)
+post_init (gpointer data)
{
during_init_shutdown = FALSE;
return FALSE;
spi_dbus_initialize (&ad->droute);
/* Below line for testing -- it should be removed once at-spi-registryd is working */
if (dbus_bus_request_name(ad->droute.bus, "test.atspi.tree", 0, &error)) printf("Got test name.\n");
- if (!dbus_connection_try_register_fallback (ad->droute.bus, "/org/freedesktop/atspi", &droute_vtable, &ad->droute, &error))
+ spi_register_tree_object(ad->droute.bus, "/org/freedesktop/atspi/tree");
+ if (!dbus_connection_try_register_fallback (ad->droute.bus, "/org/freedesktop/atspi/accessible/", &droute_vtable, &ad->droute, &error))
{
g_warning("Couldn't register droute.\n");
}
}
static const char *
-spi_atk_bridget_get_dec (void)
+spi_atk_bridge_get_dec (void)
{
return "/dec";
}
!spi_dbus_object_is_known(obj))
{
g_free(property_name);
- return;
+ return TRUE;
}
detail1 = (g_value_get_boolean (param_values + 2))
? 1 : 0;
return TRUE;
}
-#if 0
static void
spi_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent *keystroke,
AtkKeyEventStruct *event)
g_print (_("WARNING: NULL key event reported."));
}
- keystroke->id = (CORBA_long) event->keyval;
- keystroke->hw_code = (CORBA_short) event->keycode;
- keystroke->timestamp = (CORBA_unsigned_long) event->timestamp;
- keystroke->modifiers = (CORBA_unsigned_short) (event->state & 0xFFFF);
+ keystroke->id = (dbus_int32_t) event->keyval;
+ keystroke->hw_code = (dbus_int16_t) event->keycode;
+ keystroke->timestamp = (dbus_uint32_t) event->timestamp;
+ keystroke->modifiers = (dbus_uint16_t) (event->state & 0xFFFF);
if (event->string)
{
gunichar c;
- keystroke->event_string = CORBA_string_dup (event->string);
+ keystroke->event_string = g_strdup (event->string);
c = g_utf8_get_char_validated (event->string, -1);
if (c > 0 && g_unichar_isprint (c))
- keystroke->is_text = CORBA_TRUE;
+ keystroke->is_text = TRUE;
else
- keystroke->is_text = CORBA_FALSE;
+ keystroke->is_text = FALSE;
}
else
{
- keystroke->event_string = CORBA_string_dup ("");
- keystroke->is_text = CORBA_FALSE;
+ keystroke->event_string = g_strdup ("");
+ keystroke->is_text = FALSE;
}
switch (event->type)
{
keystroke->event_string, (int) keystroke->is_text, (unsigned long) keystroke->timestamp);
#endif
}
-#endif
+
+static gboolean Accessibility_DeviceEventController_notifyListenersSync(const Accessibility_DeviceEvent *key_event)
+{
+ DBusMessage *message = dbus_message_new_method_call(SPI_DBUS_NAME_REGISTRY, SPI_DBUS_PATH_REGISTRY, "org.freedesktop.atspi.DeviceEventController", "notifyListenersSync");
+ DBusError error;
+ dbus_bool_t consumed = FALSE;
+
+ dbus_error_init(&error);
+ if (spi_dbus_marshall_deviceEvent(message, key_event))
+ {
+ DBusMessage *reply = dbus_connection_send_with_reply_and_block(this_app->droute.bus, message, 1000, &error);
+ if (reply)
+ {
+ DBusError error;
+ dbus_error_init(&error);
+ dbus_message_get_args(reply, &error, DBUS_TYPE_BOOLEAN, &consumed, DBUS_TYPE_INVALID);
+ dbus_message_unref(reply);
+ }
+ }
+ dbus_message_unref(message);
+ return consumed;
+}
static gint
spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
{
gboolean result;
-#if 0
Accessibility_DeviceEvent key_event;
- CORBA_exception_init (&ev);
-
spi_init_keystroke_from_atk_key_event (&key_event, event);
bridge_threads_leave ();
- result = Accessibility_DeviceEventController_notifyListenersSync (
- spi_atk_bridget_get_dec (), &key_event, &ev);
+ result = Accessibility_DeviceEventController_notifyListenersSync (&key_event);
bridge_threads_enter ();
- if (key_event.event_string) CORBA_free (key_event.event_string);
+ if (key_event.event_string) g_free (key_event.event_string);
- if (BONOBO_EX(&ev))
- {
- result = FALSE;
- CORBA_exception_free (&ev);
- }
-
-#endif
return result;
}
$(X_CFLAGS)
libspi_la_LDFLAGS = @LT_VERSION_INFO@ -no-undefined
+ libspi_la_CFLAGS = -DATSPI_DBUS_INTROSPECTION_DIRECTORY="\"$(datadir)/at-spi/dbus\""
libspi_la_LIBADD = $(LIBSPI_LIBS) $(XTST_LIBS)
libspiincludedir = $(includedir)/at-spi-1.0/libspi
Accessibility.h \
accessible.h \
bitarray.h \
- droute.h
- dbus.h \
+ droute.h \
+ introspect-loader.h
BUILT_SOURCES = Accessibility.h
CLEANFILES = Accessibility.h
libspi_la_SOURCES = \
- Accessibility.h \
+ Accessibility.h \
accessible.c \
- action.c \
+ action.c \
application.c \
component.c \
- dbus.c \
+ dbus.c \
document.c \
- droute.c \
+ droute.c \
editabletext.c \
hyperlink.c \
hypertext.c \
selection.c \
table.c \
text.c \
- tree.c \
+ tree.c \
+ util.c \
- value.c
+ value.c \
+ introspect-loader.c \
+ introspectable.c
Accessibility.h: ../xml/spec.xml ../tools/c-constants-generator.xsl
xsltproc --stringparam mixed-case-prefix Accessibility_ ../tools/c-constants-generator.xsl $< >$@
#ifndef SPI_ACCESSIBLE_H_
#define SPI_ACCESSIBLE_H_
-#include <libspi/dbus.h>
#include <libspi/droute.h>
#include "Accessibility.h"
#include "atk/atk.h"
void spi_initialize_image(DRouteData *data);
void spi_initialize_selection(DRouteData *data);
void spi_initialize_table(DRouteData *data);
- void spi_initialize_tree(DRouteData *data);
void spi_initialize_text(DRouteData *data);
void spi_initialize_value(DRouteData *data);
+ void spi_initialize_introspectable(DRouteData *data);
+
+ void spi_register_tree_object(DBusConnection *bus, const char *path);
dbus_bool_t spi_dbus_append_tree (DBusMessage * message, AtkObject * obj, DRouteData * data);
+typedef unsigned long Accessibility_ControllerEventMask;
+
+// TODO: auto-generate the below structs
+typedef struct _Accessibility_DeviceEvent Accessibility_DeviceEvent;
+struct _Accessibility_DeviceEvent
+{
+ Accessibility_EventType type;
+ dbus_uint32_t id;
+dbus_uint16_t hw_code;
+ dbus_uint16_t modifiers;
+ dbus_uint32_t timestamp;
+ char * event_string;
+ dbus_bool_t is_text;
+};
+
+typedef struct _Accessibility_EventListenerMode Accessibility_EventListenerMode;
+struct _Accessibility_EventListenerMode
+{
+ dbus_bool_t synchronous;
+ dbus_bool_t preemptive;
+ dbus_bool_t global;
+};
+
+typedef struct _Accessibility_KeyDefinition Accessibility_KeyDefinition;
+struct _Accessibility_KeyDefinition
+{
+ dbus_int32_t keycode;
+ dbus_int32_t keysym;
+ char *keystring;
+ dbus_int32_t unused;
+};
+
+#define SPI_DBUS_NAME_REGISTRY "org.freedesktop.atspi.registry"
+#define SPI_DBUS_PATH_REGISTRY "/org/freedesktop/atspi/registry"
+#define SPI_DBUS_INTERFACE_REGISTRY "org.freedesktop.atspi.registry"
+#define SPI_DBUS_PATH_DEC "/org/freedesktop/atspi/registry/dec"
+#define SPI_DBUS_INTERFACE_DEC "org.freedesktop.atspi.deviceEventController"
+#define SPI_DBUS_PATH_DESKTOP "/org/freedesktop/atspi/registry/desktop"
+#define SPI_DBUS_PATH_NULL "/"
+
+AtkObject *spi_dbus_get_object(const char *path);
+
+gchar *spi_dbus_get_path(AtkObject *obj);
+DBusMessage *spi_dbus_general_error(DBusMessage *message);
+DBusMessage *spi_dbus_return_rect(DBusMessage *message, gint ix, gint iy, gint iwidth, gint iheight);
+DBusMessage *spi_dbus_return_object(DBusMessage *message, AtkObject *obj, int unref);
+dbus_bool_t spi_dbus_return_v_object(DBusMessageIter *iter, AtkObject *obj, int unref);
+
+#define SPI_DBUS_RETURN_ERROR(m, e) dbus_message_new_error(m, (e)->name, (e)->message)
+
+void spi_dbus_initialize(DRouteData *data);
+void spi_dbus_emit_valist(DBusConnection *bus, const char *path, const char *interface, const char *name, int first_arg_type, va_list args);
+dbus_bool_t spi_dbus_message_iter_get_struct(DBusMessageIter *iter, ...);
+dbus_bool_t spi_dbus_message_iter_append_struct(DBusMessageIter *iter, ...);
+dbus_bool_t spi_dbus_marshall_deviceEvent(DBusMessage *message, const Accessibility_DeviceEvent *e);
+dbus_bool_t spi_dbus_demarshall_deviceEvent(DBusMessage *message, Accessibility_DeviceEvent *e);
+
+/* tree.c */
+void spi_dbus_notify_change(AtkObject *obj, gboolean new, DRouteData *data);
+void spi_dbus_notify_remove(AtkObject *obj, DRouteData *data);
+gboolean spi_dbus_update_cache(DRouteData *data);
+gboolean spi_dbus_object_is_known(AtkObject *obj);
G_END_DECLS
#endif /* SPI_ACCESSIBLE_H_ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "dbus.h"
static GHashTable *path2ptr;
static guint objindex;
spi_initialize_image (data);
spi_initialize_selection (data);
spi_initialize_table (data);
- spi_initialize_tree (data);
spi_initialize_text (data);
spi_initialize_value (data);
+ spi_initialize_introspectable(data);
}
+void spi_dbus_emit_valist(DBusConnection *bus, const char *path, const char *interface, const char *name, int first_arg_type, va_list args)
+{
+ DBusMessage *sig;
+
+ sig = dbus_message_new_signal(path, interface, name);
+ if (first_arg_type != DBUS_TYPE_INVALID)
+ {
+ dbus_message_append_args_valist(sig, first_arg_type, args);
+ }
+ dbus_connection_send(bus, sig, NULL);
+ dbus_message_unref(sig);
+}
+
static GString *
spi_get_tree (AtkObject * obj, GString * str, DRouteData * data)
{
str = g_string_append (str, "</object>\n");
return str;
}
+
+dbus_bool_t spi_dbus_message_iter_get_struct(DBusMessageIter *iter, ...)
+{
+ va_list args;
+ DBusMessageIter iter_struct;
+ int type;
+ void *ptr;
+
+ dbus_message_iter_recurse(iter, &iter_struct);
+ va_start(args, iter);
+ for (;;)
+ {
+ type = va_arg(args, int);
+ if (type == DBUS_TYPE_INVALID) break;
+ if (type != dbus_message_iter_get_arg_type(&iter_struct))
+ {
+ va_end(args);
+ return FALSE;
+ }
+ ptr = va_arg(args, void *);
+ dbus_message_iter_get_basic(&iter_struct, ptr);
+ dbus_message_iter_next(&iter_struct);
+ }
+ dbus_message_iter_next(iter);
+ va_end(args);
+ return TRUE;
+}
+
+dbus_bool_t spi_dbus_message_iter_append_struct(DBusMessageIter *iter, ...)
+{
+ va_list args;
+ DBusMessageIter iter_struct;
+ int type;
+ void *ptr;
+
+ if (!dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, NULL, &iter_struct)) return FALSE;
+ va_start(args, iter);
+ for (;;)
+ {
+ type = va_arg(args, int);
+ if (type == DBUS_TYPE_INVALID) break;
+ ptr = va_arg(args, void *);
+ dbus_message_iter_append_basic(&iter_struct, type, ptr);
+ }
+ if (!dbus_message_iter_close_container(iter, &iter_struct)) return FALSE;
+ va_end(args);
+ return TRUE;
+}
+
+dbus_bool_t spi_dbus_marshall_deviceEvent(DBusMessage *message, const Accessibility_DeviceEvent *e)
+{
+ DBusMessageIter iter;
+
+ if (!message) return FALSE;
+ dbus_message_iter_init_append(message, &iter);
+ return spi_dbus_message_iter_append_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}
+
+dbus_bool_t spi_dbus_demarshall_deviceEvent(DBusMessage *message, Accessibility_DeviceEvent *e)
+{
+ DBusMessageIter iter;
+
+ dbus_message_iter_init(message, &iter);
+ return spi_dbus_message_iter_get_struct(&iter, DBUS_TYPE_UINT32, &e->type, DBUS_TYPE_INT32, &e->id, DBUS_TYPE_INT16, &e->hw_code, DBUS_TYPE_INT16, &e->modifiers, DBUS_TYPE_INT32, &e->timestamp, DBUS_TYPE_STRING, &e->event_string, DBUS_TYPE_BOOLEAN, &e->is_text, DBUS_TYPE_INVALID);
+}