[at-spi2-core] Use the new 'Accessibility' bus if the bus address is available on
- From: Mark Doffman <markdoffman src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [at-spi2-core] Use the new 'Accessibility' bus if the bus address is available on
- Date: Wed, 9 Dec 2009 12:13:23 +0000 (UTC)
commit 80141b4cee1220bfd7e5b24b16b8e73a8ccbac2a
Author: Mark Doffman <mark doffman codethink co uk>
Date: Tue Dec 8 14:39:41 2009 -0800
Use the new 'Accessibility' bus if the bus address is available on
the X property AT_SPI_BUS.
registryd/registry-main.c | 109 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 106 insertions(+), 3 deletions(-)
---
diff --git a/registryd/registry-main.c b/registryd/registry-main.c
index 52fd9b2..c5bcab8 100644
--- a/registryd/registry-main.c
+++ b/registryd/registry-main.c
@@ -170,6 +170,108 @@ register_client (void)
return TRUE;
}
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Returns a 'canonicalized' value for DISPLAY,
+ * with the screen number stripped off if present.
+ *
+ */
+static const gchar*
+spi_display_name (void)
+{
+ static const char *canonical_display_name = NULL;
+ if (!canonical_display_name)
+ {
+ const gchar *display_env = g_getenv ("AT_SPI_DISPLAY");
+ if (!display_env)
+ {
+ display_env = g_getenv ("DISPLAY");
+ if (!display_env || !display_env[0])
+ canonical_display_name = ":0";
+ else
+ {
+ gchar *display_p, *screen_p;
+ canonical_display_name = g_strdup (display_env);
+ display_p = strrchr (canonical_display_name, ':');
+ screen_p = strrchr (canonical_display_name, '.');
+ if (screen_p && display_p && (screen_p > display_p))
+ {
+ *screen_p = '\0';
+ }
+ }
+ }
+ else
+ {
+ canonical_display_name = display_env;
+ }
+ }
+ return canonical_display_name;
+}
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * Gets the IOR from the XDisplay.
+ * Not currently used in D-Bus version, but something similar
+ * may be employed in the future for accessing the registry daemon
+ * bus name.
+ */
+
+static DBusConnection *
+spi_get_bus (void)
+{
+ Atom AT_SPI_BUS;
+ Atom actual_type;
+ Display *bridge_display;
+ int actual_format;
+ unsigned char *data = NULL;
+ unsigned long nitems;
+ unsigned long leftover;
+
+ DBusConnection *bus = NULL;
+ DBusError error;
+
+ bridge_display = XOpenDisplay (spi_display_name ());
+ if (!bridge_display)
+ g_error ("AT_SPI: Could not get the display");
+
+ AT_SPI_BUS = XInternAtom (bridge_display, "AT_SPI_BUS", FALSE);
+ XGetWindowProperty(bridge_display,
+ XDefaultRootWindow (bridge_display),
+ AT_SPI_BUS, 0L,
+ (long)BUFSIZ, False,
+ (Atom) 31, &actual_type, &actual_format,
+ &nitems, &leftover, &data);
+
+ dbus_error_init (&error);
+
+ if (data == NULL)
+ {
+ g_warning ("AT-SPI: Accessibility bus not found - Using session bus.");
+ bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
+ if (!bus)
+ g_error ("AT-SPI: Couldn't connect to bus: %s\n", error.message);
+ }
+ else
+ {
+ bus = dbus_connection_open (data, &error);
+ if (!bus)
+ {
+ g_error ("AT-SPI: Couldn't connect to bus: %s\n", error.message);
+ }
+ else
+ {
+ if (!dbus_bus_register (bus, &error))
+ g_error ("AT-SPI: Couldn't register with bus: %s\n");
+ }
+ }
+
+ return bus;
+}
+
+/*---------------------------------------------------------------------------*/
+
int
main (int argc, char **argv)
{
@@ -177,7 +279,7 @@ main (int argc, char **argv)
SpiDEController *dec;
gchar *introspection_directory;
- DBusConnection *bus;
+ DBusConnection *bus = NULL;
GOptionContext *opt;
@@ -202,13 +304,14 @@ main (int argc, char **argv)
dbus_error_init (&error);
bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
+ bus = spi_get_bus ();
if (!bus)
{
- g_warning("Couldn't connect to dbus: %s\n", error.message);
+ return 0;
}
mainloop = g_main_loop_new (NULL, FALSE);
- dbus_connection_setup_with_g_main(bus, g_main_context_default());
+ dbus_connection_setup_with_g_main(bus, NULL);
ret = dbus_bus_request_name(bus, dbus_name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error);
if (ret == DBUS_REQUEST_NAME_REPLY_EXISTS)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]