Merge branch 'mdoff' of ssh://git.codethink.co.uk/git/atspi-dbus into mgorse
authorMike Gorse <mgorse@boston.site>
Tue, 13 May 2008 20:52:09 +0000 (16:52 -0400)
committerMike Gorse <mgorse@boston.site>
Tue, 13 May 2008 20:52:09 +0000 (16:52 -0400)
Conflicts:

libspi/Makefile.am

1  2 
atk-bridge/bridge.c
libspi/Makefile.am
libspi/accessible.h
libspi/dbus.c

diff --combined atk-bridge/bridge.c
@@@ -22,7 -22,7 +22,7 @@@
   */
  
  #include "config.h"
 -#include "dbus/dbus-glib.h"
 +#include "dbus/dbus-glib-lowlevel.h"
  
  #include <X11/Xlib.h>
  #include <X11/Xatom.h>
@@@ -121,7 -121,7 +121,7 @@@ static gboolean spi_atk_bridge_signal_l
  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 */
@@@ -166,7 -166,7 +166,7 @@@ spi_atk_bridge_init_event_type_consts (
  }
  
  static gboolean
 -post_init (void)
 +post_init (gpointer data)
  {
    during_init_shutdown = FALSE;
    return FALSE;
@@@ -199,7 -199,8 +199,8 @@@ spi_app_init (AtkObject *root
    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");
    }
@@@ -420,7 -421,7 +421,7 @@@ spi_atk_bridge_get_registry (void
  }
  
  static const char *
 -spi_atk_bridget_get_dec (void)
 +spi_atk_bridge_get_dec (void)
  {
    return "/dec";
  }
@@@ -842,7 -843,7 +843,7 @@@ spi_atk_bridge_state_event_listener (GS
        !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;
  }
  
diff --combined libspi/Makefile.am
@@@ -10,6 -10,7 +10,7 @@@ INCLUDES = -I$(top_srcdir)    
             $(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
@@@ -18,20 -19,22 +19,21 @@@ libspiinclude_HEADERS =            
        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 $< >$@
diff --combined libspi/accessible.h
@@@ -24,6 -24,7 +24,6 @@@
  #ifndef SPI_ACCESSIBLE_H_
  #define SPI_ACCESSIBLE_H_
  
 -#include <libspi/dbus.h>
  #include <libspi/droute.h>
  #include "Accessibility.h"
  #include "atk/atk.h"
@@@ -43,74 -44,14 +43,76 @@@ void spi_initialize_hypertext(DRouteDat
  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_ */
diff --combined libspi/dbus.c
@@@ -24,6 -24,7 +24,6 @@@
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 -#include "dbus.h"
  
  static GHashTable *path2ptr;
  static guint objindex;
@@@ -182,24 -183,11 +182,24 @@@ spi_dbus_initialize (DRouteData * data
    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);
 +}