[at-spi] Set GTK_MODULES env var in at-spi-registryd.



commit 1119d5f964966a533c2259cd6b9c3cfecb3357af
Author: Li Yuan <li yuan sun com>
Date:   Tue Aug 25 15:13:34 2009 +0800

    Set GTK_MODULES env var in at-spi-registryd.
    
    Bug #592981. After fixing bug #578334, at-spi-registryd should set
    GTK_MODULES by itself since gnome-session will remove related code.

 configure.in              |    2 +
 registryd/registry-main.c |   78 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 0 deletions(-)
---
diff --git a/configure.in b/configure.in
index 2e06eea..ab8cad9 100644
--- a/configure.in
+++ b/configure.in
@@ -28,6 +28,7 @@ AC_SUBST(LT_AGE)
 dnl required versions of other tools.
 m4_define([req_ver_atk],	[1.17.0])
 m4_define([req_ver_gtk],	[2.10.0])
+m4_define([req_ver_dbus],	[0.76])
 m4_define([req_ver_gail],	[1.9.0])
 m4_define([req_ver_libbonobo],	[1.107.0])
 
@@ -100,6 +101,7 @@ PKG_CHECK_MODULES(REGISTRYD, [
 	libbonobo-2.0	>= req_ver_libbonobo
 	atk		>= req_ver_atk
 	gtk+-2.0	>= req_ver_gtk
+	dbus-glib-1     >= req_ver_dbus
 ])
 AC_SUBST(REGISTRYD_LIBS)
 AC_SUBST(REGISTRYD_CFLAGS)
diff --git a/registryd/registry-main.c b/registryd/registry-main.c
index bd98740..8f47e97 100644
--- a/registryd/registry-main.c
+++ b/registryd/registry-main.c
@@ -31,6 +31,7 @@
 #include <libbonobo.h>
 #include <glib.h>
 #include "registry.h"
+#include <dbus/dbus-glib.h>
 
 #ifdef HAVE_SM
 #include <X11/SM/SMlib.h>
@@ -42,6 +43,7 @@
 
 static void registry_set_ior (SpiRegistry *registry);
 static void registry_session_init (const char *previous_client_id, const char *exe);
+static void set_gtk_modules (DBusGProxy *gsm);
 #ifdef HAVE_SM
 static void die_callback (SmcConn smc_conn, SmPointer client_data);
 static void save_yourself_callback      (SmcConn   smc_conn,
@@ -63,6 +65,10 @@ main (int argc, char **argv)
   char        *cp, *dp;
   SpiRegistry *registry;
 
+  DBusGConnection *connection;
+  DBusGProxy      *gsm;
+  GError          *error;
+
   if (!bonobo_init (&argc, argv))
     {
       g_error ("Could not initialize oaf / Bonobo");
@@ -96,6 +102,18 @@ main (int argc, char **argv)
 #ifdef AT_SPI_DEBUG
       fprintf (stderr, "SpiRegistry Message: SpiRegistry daemon is running.\n");
 #endif
+      error = NULL;
+      connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
+      if (connection == NULL)
+        {
+          g_error ("couldn't get D-Bus connection: %s", error->message);
+        }
+      gsm = dbus_g_proxy_new_for_name (connection,
+                                       "org.gnome.SessionManager",
+                                       "/org/gnome/SessionManager",
+                                       "org.gnome.SessionManager");
+      set_gtk_modules (gsm);
+
       registry_set_ior (registry);
 
       /* If DESKTOP_AUTOSTART_ID exists, assume we're started by session
@@ -364,3 +382,63 @@ save_yourself_callback      (SmcConn   smc_conn,
 }
 #endif
 
+static void
+set_gtk_modules (DBusGProxy *gsm)
+{
+        const char *old;
+        char       *value;
+        gboolean    found_gail;
+        gboolean    found_atk_bridge;
+        GError     *error;
+        int         i;
+
+        found_gail = FALSE;
+        found_atk_bridge = FALSE;
+
+        old = g_getenv ("GTK_MODULES");
+        if (old != NULL) {
+                char **old_modules;
+                char **modules;
+
+                old_modules = g_strsplit (old, ":", -1);
+                for (i = 0; old_modules[i]; i++) {
+                        if (!strcmp (old_modules[i], "gail")) {
+                                found_gail = TRUE;
+                        } else if (!strcmp (old_modules[i], "atk-bridge")) {
+                                found_atk_bridge = TRUE;
+                        }
+                }
+
+                modules = g_new (char *, i + (found_gail ? 0 : 1) +
+                                 (found_atk_bridge ? 0 : 1) + 1);
+                for (i = 0; old_modules[i]; i++) {
+                        modules[i] = old_modules[i];
+                }
+                if (!found_gail) {
+                                modules[i++] = "gail";
+                }
+                if (!found_atk_bridge) {
+                        modules[i++] = "atk-bridge";
+                }
+                modules[i] = NULL;
+
+                value = g_strjoinv (":", modules);
+                g_free (modules);
+                g_strfreev (old_modules);
+        } else {
+                value = g_strdup ("gail:atk-bridge");
+        }
+
+        error = NULL;
+        if (!dbus_g_proxy_call (gsm, "Setenv", &error,
+                                G_TYPE_STRING, "GTK_MODULES",
+                                G_TYPE_STRING, value,
+                                G_TYPE_INVALID,
+                                G_TYPE_INVALID)) {
+                g_warning ("Could not set GTK_MODULES: %s", error->message);
+                g_error_free (error);
+        }
+
+        g_free (value);
+        return;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]