2008-03-10 Li Yuan <li.yuan@sun.com>
[platform/core/uifw/at-spi2-atk.git] / atk-bridge / bridge.c
index ef4bb40..f76d693 100644 (file)
@@ -47,9 +47,9 @@
 #define DBG(a,b) if(_dbg>=(a))b
 
 #define bridge_threads_leave() \
-  if (!during_init_shutdown) atk_misc_threads_leave(misc)
+  if (!during_init_shutdown && !g_main_context_is_owner (NULL)) atk_misc_threads_leave(misc);
 #define bridge_threads_enter() \
-  if (!during_init_shutdown) atk_misc_threads_enter(misc)
+  if (!during_init_shutdown && !g_main_context_is_owner (NULL)) atk_misc_threads_enter(misc);
 
 int _dbg = 0;
 static CORBA_Environment ev;
@@ -201,13 +201,13 @@ atk_bridge_init (gint *argc, gchar **argv[])
   misc = atk_misc_get_instance();
 
   if (g_getenv ("ATK_BRIDGE_REDIRECT_LOG"))
-  {
+    {
       fname = g_strconcat ("/tmp/", g_get_prgname (), ".at-spi-log", NULL);
       /* make sure we're not being redirected - security issue */
       if (!g_file_test (fname, G_FILE_TEST_IS_SYMLINK))
          freopen (fname, "w", stderr);
       g_free (fname);
-  }
+    }
 
   if (debug_env_string) 
       _dbg = (int) g_ascii_strtod (debug_env_string, NULL);
@@ -344,30 +344,30 @@ 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;
 }
 
@@ -407,40 +407,46 @@ spi_atk_bridge_get_registry (void)
   CORBA_Environment ev;
   char *ior =  NULL;
 
-  if (registry_died || (registry == CORBA_OBJECT_NIL)) {
-         CORBA_exception_init (&ev);
-         if (registry_died) 
-            {
-              if (exiting)
-                return CORBA_OBJECT_NIL;
-              else
-               DBG (1, g_warning ("registry died! restarting..."));
-            }
+  if (registry_died || (registry == CORBA_OBJECT_NIL))
+    {
+      CORBA_exception_init (&ev);
+      if (registry_died) 
+        {
+          if (exiting)
+            return CORBA_OBJECT_NIL;
+          else
+            DBG (1, g_warning ("registry died! restarting..."));
+        }
 
-         /* XXX: This presumes that the registry has successfully restarted itself already...*/
-         ior = (char *) spi_atk_bridge_get_registry_ior ();
+      /* XXX: This presumes that the registry has successfully restarted itself already...*/
+      ior = (char *) spi_atk_bridge_get_registry_ior ();
 
-         if (ior != NULL)
-              registry = CORBA_ORB_string_to_object (bonobo_activation_orb_get (), 
-                                                     ior, &ev);
-         else {
-              g_warning ("IOR not set.");  
-              registry = CORBA_OBJECT_NIL;
-         }
+      if (ior != NULL) 
+        {
+          registry = CORBA_ORB_string_to_object (bonobo_activation_orb_get (), 
+                                                ior, &ev);
+          XFree (ior);
+        }
+      else
+        {
+          g_warning ("IOR not set.");  
+          registry = CORBA_OBJECT_NIL;
+        }
          
-         if (ev._major != CORBA_NO_EXCEPTION)
-         {
-                 g_error ("Accessibility app error: exception during "
-                          "registry activation from id: %s\n",
-                          CORBA_exception_id (&ev));
-                 CORBA_exception_free (&ev);
-         }
+      if (ev._major != CORBA_NO_EXCEPTION)
+        {
+          g_error ("Accessibility app error: exception during "
+                  "registry activation from id: %s\n",
+                  CORBA_exception_id (&ev));
+          CORBA_exception_free (&ev);
+        }
          
-         if (registry_died && registry) {
-                 registry_died = FALSE;
-                 spi_atk_bridge_register_application (registry);
-         }
-  }
+      if (registry_died && registry) 
+        {
+          registry_died = FALSE;
+          spi_atk_bridge_register_application (registry);
+        }
+    }
   return registry;
 }
 
@@ -501,7 +507,12 @@ spi_atk_register_event_listeners (void)
   AtkObject *bo = atk_no_op_object_new (ao);
 
 
-  if (atk_listeners_registered) return;
+  if (atk_listeners_registered) 
+    {
+      g_object_unref (G_OBJECT (bo));
+      g_object_unref (ao);
+      return;
+    }
 
   atk_listeners_registered = TRUE;
 
@@ -675,9 +686,9 @@ gnome_accessibility_module_shutdown (void)
         atk_remove_focus_tracker (atk_bridge_focus_tracker_id);
   
   for (i = 0; ids && i < ids->len; i++)
-  {
+    {
           atk_remove_global_event_listener (g_array_index (ids, guint, i));
-  }
+    }
   
   if (atk_bridge_key_event_listener_id)
           atk_remove_key_event_listener (atk_bridge_key_event_listener_id);
@@ -704,17 +715,21 @@ spi_atk_bridge_focus_tracker (AtkObject *object)
   spi_atk_bridge_init_nil (&e.any_data, object);
   if (BONOBO_EX (&ev))
       registry_died = TRUE;
-  else {
+  else
+    {
       bridge_threads_leave ();   
       Accessibility_Registry_notifyEvent (spi_atk_bridge_get_registry (), 
                                          &e, &ev);
       bridge_threads_enter ();
-  }
+    }
   if (BONOBO_EX (&ev))
     registry_died = TRUE;
 
   bonobo_object_unref (source);
-  
+
+  if (e.any_data._release)
+    CORBA_free (e.any_data._value);
+
   CORBA_exception_free (&ev);
 }
 
@@ -776,7 +791,7 @@ spi_atk_emit_eventv (const GObject         *gobject,
   CORBA_exception_init (&ev);
   registry = spi_atk_bridge_get_registry ();
   if (!registry_died)
-  {
+    {
     bridge_threads_leave (); 
     Accessibility_Registry_notifyEvent (registry, 
                                         &e, &ev);
@@ -789,7 +804,7 @@ spi_atk_emit_eventv (const GObject         *gobject,
                    CORBA_exception_id(&ev));
 #endif       
     if (BONOBO_EX (&ev)) registry_died = TRUE;
-  }
+    }
 
   if (source)
       bonobo_object_unref (BONOBO_OBJECT (source));
@@ -1061,15 +1076,18 @@ spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 
   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);
+  bridge_threads_enter ();
 
   if (key_event.event_string) CORBA_free (key_event.event_string);
 
-  if (BONOBO_EX(&ev)) {
+  if (BONOBO_EX(&ev))
+    {
       result = FALSE;
       CORBA_exception_free (&ev);
-  }
+    }
 
   return result;
 }