NULL, NULL, NULL, NULL
};
+static gchar* atspi_dbus_name;
+static gboolean atspi_no_register;
+
+static GOptionEntry atspi_option_entries[] =
+{
+ {"atspi-dbus-name", 0, 0, G_OPTION_ARG_STRING, &atspi_dbus_name, "D-Bus bus name to register as", NULL},
+ {"atspi-no-register", 0, 0, G_OPTION_ARG_NONE, &atspi_no_register, "Do not register with Registry Daemon", NULL},
+ {NULL}
+};
+
static SpiAppData *
-spi_app_init (AtkObject *root)
+spi_app_init (AtkObject *root, gint *argc, gchar **argv[])
{
+ GOptionContext *opt;
+ SpiAppData *ad = g_new0(SpiAppData, 1);
+ GError *err = NULL;
DBusError error;
+ int i;
+
+ opt = g_option_context_new(NULL);
+ g_option_context_add_main_entries(opt, atspi_option_entries, NULL);
+ g_option_context_set_ignore_unknown_options(opt, TRUE);
+ if (!g_option_context_parse(opt, argc, argv, &err))
+ g_warning("Option parsing failed: %s\n", err->message);
+
dbus_error_init(&error);
- SpiAppData *ad = (SpiAppData *)calloc(sizeof(SpiAppData), 1);
- if (!ad) return NULL;
ad->root = root;
ad->droute.bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
+
if (!ad->droute.bus)
{
g_warning("Couldn't connect to dbus: %s\n", error.message);
free(ad);
return NULL;
}
- //dbus_connection_set_exit_on_disconnect(ad->droute.bus, FALSE);
- //dbus_bus_register(ad->droute.bus, &error);
- 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");
- 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))
+ if (atspi_dbus_name != NULL && dbus_bus_request_name(ad->droute.bus,
+ atspi_dbus_name,
+ 0,
+ &error))
+ {
+ g_print("\nRecieved D-Bus name - %s\n", atspi_dbus_name);
+ }
+ spi_register_tree_object(ad->droute.bus, &ad->droute, "/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");
+ free(ad);
+ return NULL;
}
+
dbus_connection_setup_with_g_main(ad->droute.bus, g_main_context_default());
+
+ spi_dbus_initialize (&ad->droute);
return ad;
}
_dbg = (int) g_ascii_strtod (debug_env_string, NULL);
/* Connect to dbus */
- this_app = spi_app_init (atk_get_root ());
+ this_app = spi_app_init (atk_get_root (), argc, argv);
/*
* We only want to enable the bridge for top level
/* Create the accessible application server object */
if (this_app == NULL)
- this_app = spi_app_init (atk_get_root ());
+ this_app = spi_app_init (atk_get_root (), 0, NULL);
DBG (1, g_message ("About to register application\n"));
static void
spi_atk_bridge_register_application (const char *registry)
{
+ DBusMessage *message, *reply;
+ DBusError error;
+
bridge_threads_leave ();
- // TODO: register
+ message = dbus_message_new_method_call (SPI_DBUS_NAME_REGISTRY, SPI_DBUS_PATH_REGISTRY, SPI_DBUS_INTERFACE_REGISTRY, "registerApplication");
+ dbus_error_init (&error);
+ reply = dbus_connection_send_with_reply_and_block(this_app->droute.bus, message, 1000, &error);
+ if (error.message) g_warning (error.message);
+ if (reply) dbus_message_unref (reply);
+ if (message) dbus_message_unref (message);
bridge_threads_enter ();
}
int
gtk_module_init (gint *argc, gchar **argv[])
{
+ //printf("Pointer to argc %x %x\n", (short) ((argc && 0xffff0000) >> 16), (short) (argc && 0xffff));
return atk_bridge_init (argc, argv);
}
void
gnome_accessibility_module_init (void)
{
- atk_bridge_init (NULL, NULL);
+ atk_bridge_init (0, NULL);
if (g_getenv ("AT_BRIDGE_SHUTDOWN"))
{
misc = NULL;
}
-static void emit(AtkObject *object, const char *name, int first_arg_type, ...)
-{
- va_list args;
- DBusMessage *sig;
- char *path = spi_dbus_get_path(object);
-
- spi_dbus_update_cache(&this_app->droute);
- sig = dbus_message_new_signal(path, "org.freedesktop.atspi.Accessible", name);
- va_start(args, first_arg_type);
- if (first_arg_type != DBUS_TYPE_INVALID)
- {
- dbus_message_append_args_valist(sig, first_arg_type, args);
- }
- va_end(args);
- dbus_connection_send(this_app->droute.bus, sig, NULL);
- g_free(path);
- dbus_message_unref(sig);
-}
-
-static void
-spi_atk_bridge_focus_tracker (AtkObject *object)
-{
- emit(object, "focus", DBUS_TYPE_INVALID);
-}
-
-static void emit_property_change(AtkObject *object, const char *name, int type, void *val)
+static void emit(AtkObject *object, const char *name, const char *detail, dbus_int32_t detail1, dbus_int32_t detail2, int type, const void *val)
{
DBusMessage *sig;
char *path = spi_dbus_get_path(object);
DBusMessageIter iter, sub;
const char *type_as_string = NULL;
+ dbus_int32_t dummy = 0;
spi_dbus_update_cache(&this_app->droute);
if (type == DBUS_TYPE_OBJECT_PATH)
type_as_string = "o";
if (!val) val = "";
}
- else if (type == DBUS_TYPE_STRING) type_as_string = "s";
+ else if (type == DBUS_TYPE_STRING)
+ {
+ type_as_string = "s";
+ if (!val) val = "";
+ }
else if (type == DBUS_TYPE_INT32) type_as_string = "i";
- else if (type == DBUS_TYPE_UINT32) type_as_string = "o";
+ else if (type == DBUS_TYPE_UINT32) type_as_string = "u";
+ else if (type == DBUS_TYPE_INVALID)
+ {
+ type = DBUS_TYPE_UINT32;
+ type_as_string = "u";
+ if (!val) val = &dummy;
+ }
else
{
g_warning("Unknown type %d in property change signal", type);
}
- sig = dbus_message_new_signal(path, "org.freedesktop.atspi.Accessible", "PropertyChanged");
+ sig = dbus_message_new_signal(path, SPI_DBUS_INTERFACE_ACCESSIBLE, name);
dbus_message_iter_init_append(sig, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
+ if (!detail) detail = "";
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &detail);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail1);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &detail2);
dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT, type_as_string, &sub);
- dbus_message_iter_append_basic(&sub, type, val);
+ dbus_message_iter_append_basic(&sub, type, &val);
dbus_message_iter_close_container(&iter, &sub);
dbus_connection_send(this_app->droute.bus, sig, NULL);
g_free(path);
dbus_message_unref(sig);
}
-static void emit_rect(AtkObject *object, const char *name, AtkRectangle *rect)
+static void
+spi_atk_bridge_focus_tracker (AtkObject *object)
+{
+ emit(object, "focus", NULL, 0, 0, DBUS_TYPE_INVALID, NULL);
+}
+
+static void emit_rect(AtkObject *object, const char *name, const char *detail, AtkRectangle *rect)
{
DBusMessage *sig;
char *path = spi_dbus_get_path(object);
- DBusMessageIter iter, sub;
+ DBusMessageIter iter, iter_variant, sub;
dbus_uint32_t x, y, width, height;
+ dbus_int32_t dummy = 0;
spi_dbus_update_cache(&this_app->droute);
x = rect->x;
y = rect->y;
width = rect->width;
height = rect->height;
- sig = dbus_message_new_signal(path, "org.freedesktop.atspi.Accessible", "PropertyChanged");
+ sig = dbus_message_new_signal(path, SPI_DBUS_INTERFACE_ACCESSIBLE, name);
+ if (!detail) detail = "";
if (sig)
{
dbus_message_iter_init_append (sig, &iter);
- dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &name);
- if (!dbus_message_iter_open_container
- (&iter, DBUS_TYPE_STRUCT, NULL, &sub))
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &detail);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &dummy);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_INT32, &dummy);
+ if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_VARIANT, "(iiii)", &iter_variant))
+ goto oom;
+ if (!dbus_message_iter_open_container (&iter_variant, DBUS_TYPE_STRUCT, NULL, &sub))
goto oom;
dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &x);
dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &y);
dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &width);
dbus_message_iter_append_basic (&sub, DBUS_TYPE_INT32, &height);
- if (!dbus_message_iter_close_container (&iter, &sub))
+ if (!dbus_message_iter_close_container (&iter_variant, &sub))
+ goto oom;
+ if (!dbus_message_iter_close_container (&iter, &iter_variant))
goto oom;
}
dbus_connection_send(this_app->droute.bus, sig, NULL);
dbus_message_unref(sig);
}
+static const char *PropertyChange = "object_property_change";
+
static gboolean
spi_atk_bridge_property_event_listener (GSignalInvocationHint *signal_hint,
guint n_param_values,
{
ao = atk_table_get_summary (ATK_TABLE (obj));
s_ao = spi_dbus_get_path(ao);
- emit_property_change(obj, prop_name, DBUS_TYPE_OBJECT_PATH, s_ao);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_OBJECT_PATH, s_ao);
}
else if (strcmp (prop_name, "accessible-table-column-header") == 0)
{
i = g_value_get_int (&(values->new_value));
ao = atk_table_get_column_header (ATK_TABLE (obj), i);
s_ao = spi_dbus_get_path(ao);
- emit_property_change(obj, prop_name, DBUS_TYPE_OBJECT_PATH, s_ao);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_OBJECT_PATH, s_ao);
}
else if (strcmp (prop_name, "accessible-table-row-header") == 0)
{
i = g_value_get_int (&(values->new_value));
ao = atk_table_get_row_header (ATK_TABLE (obj), i);
s_ao = spi_dbus_get_path(ao);
- emit_property_change(obj, prop_name, DBUS_TYPE_OBJECT_PATH, s_ao);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_OBJECT_PATH, s_ao);
}
else if (strcmp (prop_name, "accessible-table-row-description") == 0)
{
i = g_value_get_int (&(values->new_value));
sp = atk_table_get_row_description (ATK_TABLE (obj), i);
- emit_property_change(obj, prop_name, DBUS_TYPE_STRING, (void *)&sp);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_STRING, sp);
}
else if (strcmp (prop_name, "accessible-table-column-description") == 0)
{
i = g_value_get_int (&(values->new_value));
sp = atk_table_get_column_description (ATK_TABLE(obj), i);
- emit_property_change(obj, prop_name, DBUS_TYPE_STRING, (void *)&sp);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_STRING, sp);
}
else if (strcmp (prop_name, "accessible-table-caption-object") == 0)
{
ao = atk_table_get_caption (ATK_TABLE(obj));
sp = atk_object_get_name (ao);
- emit_property_change(obj, prop_name, DBUS_TYPE_STRING, (void *)&sp);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_STRING, sp);
}
else
{
- long v = 0;
- emit_property_change(obj, prop_name, DBUS_TYPE_INT32, &v);
+ emit(obj, PropertyChange, prop_name, 0, 0, DBUS_TYPE_INVALID, NULL);
}
if (s_ao) g_free(s_ao);
return TRUE;
}
detail1 = (g_value_get_boolean (param_values + 2))
? 1 : 0;
- emit(obj, "StateChanged", DBUS_TYPE_STRING, &property_name, DBUS_TYPE_UINT32, &detail1, DBUS_TYPE_INVALID);
+ emit(obj, "object_state_changed", property_name, detail1, 0, DBUS_TYPE_INVALID, NULL);
g_free (property_name);
return TRUE;
}
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");
+ DBusMessage *message = dbus_message_new_method_call(SPI_DBUS_NAME_REGISTRY, SPI_DBUS_PATH_REGISTRY, SPI_DBUS_INTERFACE_DEC, "notifyListenersSync");
DBusError error;
dbus_bool_t consumed = FALSE;
dbus_error_init(&error);
- if (spi_dbus_marshall_deviceEvent(message, key_event))
+ if (spi_dbus_marshal_deviceEvent(message, key_event))
{
DBusMessage *reply = dbus_connection_send_with_reply_and_block(this_app->droute.bus, message, 1000, &error);
if (reply)
AtkObject *obj;
GSignalQuery signal_query;
const gchar *name;
- const gchar *detail;
+ const gchar *detail = NULL;
char *sp = NULL;
AtkObject *ao;
gint detail1 = 0, detail2 = 0;
if (signal_hint->detail)
{
detail = g_quark_to_string (signal_hint->detail);
- sig_name = g_strdup_printf("object_%s_%s", name, detail);
- }
- else
- {
- detail = NULL;
- sig_name = g_strdup_printf("object_%s", name);
}
+ sig_name = g_strdup_printf("object_%s", name);
while ((p = strchr(sig_name, '-')) != NULL) *p = '_';
#ifdef SPI_BRIDGE_DEBUG
detail1 = atk_object_get_index_in_parent (ao);
s_ao = spi_dbus_get_path(child);
- emit(obj, "name", DBUS_TYPE_OBJECT_PATH, s_ao, DBUS_TYPE_UINT32, &detail1, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, detail, detail1, 0, DBUS_TYPE_OBJECT_PATH, s_ao);
g_free(s_ao);
}
else if (signal_query.signal_id == atk_signal_link_selected)
{
if (G_VALUE_TYPE (param_values + 1) == G_TYPE_INT)
detail1 = g_value_get_int (param_values + 1);
- emit(obj, "LinkSelected", DBUS_TYPE_UINT32, &detail1, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, detail, detail1, 0, DBUS_TYPE_INVALID, NULL);
}
else if (signal_query.signal_id == atk_signal_bounds_changed)
{
if (G_VALUE_HOLDS_BOXED (param_values + 1))
atk_rect = g_value_get_boxed (param_values + 1);
- emit_rect(obj, "BoundsChanged", atk_rect);
+ emit_rect(obj, sig_name, detail, atk_rect);
}
else if ((signal_query.signal_id == atk_signal_children_changed) && obj)
{
sp = atk_text_get_text (ATK_TEXT (obj),
detail1,
detail1+detail2);
- emit(obj, sig_name, DBUS_TYPE_UINT32, &detail1, DBUS_TYPE_UINT32, &detail2, DBUS_TYPE_STRING, &sp, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, detail, detail1, detail2, DBUS_TYPE_STRING, sp);
}
else if (signal_query.signal_id == atk_signal_text_selection_changed)
{
/* Return NULL as the selected string */
- // TODO
- emit(obj, sig_name, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, detail, detail1, detail2, DBUS_TYPE_STRING, "");
}
else
{
- emit(obj, sig_name, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, detail, 0, 0, DBUS_TYPE_INVALID, NULL);
}
}
s = atk_object_get_name (obj);
sig_name = g_strdup_printf("window_%s", name);
- emit(obj, sig_name, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, NULL, 0, 0, DBUS_TYPE_STRING, s);
g_free(sig_name);
return TRUE;
s = atk_object_get_name (obj);
sig_name = g_strdup_printf("document_%s", name);
- emit(obj, sig_name, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID);
+ emit(obj, sig_name, NULL, 0, 0, DBUS_TYPE_STRING, s);
g_free(sig_name);
return TRUE;
}
name = atk_object_get_name (child);
if (atk_state_set_contains_state (stateset, ATK_STATE_ACTIVE))
{
- emit(child, "window:deactivate", DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
+ emit(child, "window_deactivate", NULL, 0, 0, DBUS_TYPE_STRING, name);
}
g_object_unref (stateset);
- emit(child, "window:destroy", DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID);
+ emit(child, "window_destroy", NULL, 0, 0, DBUS_TYPE_STRING, name);
g_object_unref (child);
}
}