Hi,

These patches allow ORBit2 and ATK-Bridge to use a customized GMainContext instead of the default one.

Thanks,

Ke
diff -ur ORBit2-2.14.18-old/include/orbit/GIOP/giop.h 
ORBit2-2.14.18-new/include/orbit/GIOP/giop.h
--- ORBit2-2.14.18-old/include/orbit/GIOP/giop.h        2009-04-18 
20:20:54.000000000 +0800
+++ ORBit2-2.14.18-new/include/orbit/GIOP/giop.h        2010-05-28 
14:35:56.012926304 +0800
@@ -14,6 +14,7 @@
 
 #ifdef ORBIT2_INTERNAL_API
 
+void        giop_set_main_context  (GMainContext *context);
 void        giop_init              (gboolean thread_safe,
                                    gboolean blank_wire_data);
 void        giop_main_run          (void);
diff -ur ORBit2-2.14.18-old/include/orbit/orb-core/corba-orb.h 
ORBit2-2.14.18-new/include/orbit/orb-core/corba-orb.h
--- ORBit2-2.14.18-old/include/orbit/orb-core/corba-orb.h       2009-04-18 
20:20:54.000000000 +0800
+++ ORBit2-2.14.18-new/include/orbit/orb-core/corba-orb.h       2010-05-28 
14:36:31.612946110 +0800
@@ -32,6 +32,8 @@
  */
 glong ORBit_get_giop_recv_limit (void);
 
+void ORBit_set_giop_main_context (GMainContext *context);
+
 #ifdef ORBIT2_INTERNAL_API
 
 void      ORBit_ORB_forw_bind (CORBA_ORB                   orb,
diff -ur ORBit2-2.14.18-old/src/orb/GIOP/giop.c 
ORBit2-2.14.18-new/src/orb/GIOP/giop.c
--- ORBit2-2.14.18-old/src/orb/GIOP/giop.c      2009-04-18 20:20:54.000000000 
+0800
+++ ORBit2-2.14.18-new/src/orb/GIOP/giop.c      2010-05-28 14:34:39.517566265 
+0800
@@ -21,6 +21,7 @@
 static int      corba_wakeup_fds[2];
 #define WAKEUP_POLL  corba_wakeup_fds [0]
 #define WAKEUP_WRITE corba_wakeup_fds [1]
+static GMainContext *giop_main_context = NULL;
 static GSource *giop_main_source = NULL;
 static GIOPThread *giop_main_thread = NULL;
 
@@ -530,19 +531,26 @@
 }
 
 void
+giop_set_main_context (GMainContext *context)
+{
+       giop_main_context = context;
+}
+
+void
 giop_init (gboolean thread_safe, gboolean blank_wire_data)
 {
        link_init (thread_safe);
 
        if (giop_thread_safe ()) {
                GIOPThread *tdata;
+               if (!giop_main_context)
+                       giop_main_context = g_main_context_default();
 
                /* We need a destructor to clean up if giopthreads are used
                 * outside of ORBit controlled threads */
                giop_tdata_private = g_private_new 
((GDestroyNotify)giop_thread_free);
 
-               giop_main_thread = tdata = giop_thread_new (
-                       g_main_context_default ()); /* main thread */
+               giop_main_thread = tdata = giop_thread_new (giop_main_context); 
/* main thread */
 
                if (link_pipe (corba_wakeup_fds) < 0) /* cf. 
g_main_context_init_pipe */
                        g_error ("Can't create CORBA main-thread wakeup pipe");
@@ -556,7 +564,7 @@
                fcntl (WAKEUP_WRITE, F_SETFL, O_NONBLOCK);
 #endif
                giop_main_source = link_source_create_watch (
-                       g_main_context_default (), WAKEUP_POLL,
+                       giop_main_context, WAKEUP_POLL,
                        NULL, (G_IO_IN | G_IO_PRI),
                        giop_mainloop_handle_input, NULL);
                
diff -ur ORBit2-2.14.18-old/src/orb/orb-core/corba-orb.c 
ORBit2-2.14.18-new/src/orb/orb-core/corba-orb.c
--- ORBit2-2.14.18-old/src/orb/orb-core/corba-orb.c     2009-04-18 
20:20:54.000000000 +0800
+++ ORBit2-2.14.18-new/src/orb/orb-core/corba-orb.c     2010-05-28 
14:35:25.821387536 +0800
@@ -1442,6 +1442,12 @@
        return giop_recv_get_limit ();
 }
 
+void
+ORBit_set_giop_main_context (GMainContext *context)
+{
+       giop_set_main_context (context);
+}
+
 const ORBit_option orbit_supported_options[] = {
        { "ORBid",              ORBIT_OPTION_STRING,  NULL }, /* FIXME: 
unimplemented */
        { "ORBImplRepoIOR",     ORBIT_OPTION_STRING,  NULL }, /* FIXME: 
unimplemented */
diff -ur at-spi-1.30.1-old/atk-bridge/bridge.c 
at-spi-1.30.1-new/atk-bridge/bridge.c
--- at-spi-1.30.1-old/atk-bridge/bridge.c       2010-03-12 18:34:17.000000000 
+0800
+++ at-spi-1.30.1-new/atk-bridge/bridge.c       2010-05-28 14:40:04.892313223 
+0800
@@ -213,11 +213,25 @@
   if (debug_env_string) 
       _dbg = (int) g_ascii_strtod (debug_env_string, NULL);
 
+  GMainContext* orb_context = g_main_context_get_thread_default();
+  ORBit_set_giop_main_context (orb_context);
+
   if (!bonobo_init (argc, argv ? *argv : NULL))
     {
       g_error ("Could not initialize Bonobo");
     }
 
+  if ( orb_context != NULL ) {
+         CORBA_ORB orb = bonobo_activation_orb_get();
+         PortableServer_POA poa = (PortableServer_POA)
+                 CORBA_ORB_resolve_initial_references (orb, "RootPOA", &ev);
+         ORBit_ObjectAdaptor_set_thread_hint((ORBit_ObjectAdaptor)poa,
+                         ORBIT_THREAD_HINT_ON_CONTEXT, orb_context);
+  }
+
   bonobo_activate ();
 
   /* Create the accessible application server object */
diff --git a/jni/src/AtkWrapper.c b/jni/src/AtkWrapper.c
index 640b559..fb4324a 100644
--- a/jni/src/AtkWrapper.c
+++ b/jni/src/AtkWrapper.c
@@ -37,15 +37,6 @@
 #define GDK_MOD1_MASK (1 << 3)
 #define GDK_META_MASK (1 << 28)
 
-typedef struct _DummyDispatch DummyDispatch;
-
-struct _DummyDispatch
-{
-       GSourceFunc func;
-       gpointer data;
-       GDestroyNotify destroy;
-};
-
 gboolean jaw_debug = FALSE;
 
 GMutex *atk_bridge_mutex = NULL;
@@ -53,8 +44,9 @@ GCond *atk_bridge_cond = NULL;
 
 GMutex *key_dispatch_mutex = NULL;
 GCond *key_dispatch_cond = NULL;
+static GMainContext *jaw_main_context = NULL;
+
 static gint key_dispatch_result = KEY_DISPATCH_NOT_DISPATCHED;
-static gboolean (*origin_g_idle_dispatch) (GSource*, GSourceFunc, gpointer);
 
 static GModule* module_atk_bridge = NULL;
 
@@ -66,32 +58,21 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVM, void 
*reserve) {
 JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *javaVM, void *reserve) {
 }
 
-static gboolean
-jaw_dummy_idle_func (gpointer p)
-{
-       return FALSE;
-}
-
-static gboolean
-jaw_idle_dispatch (GSource    *source, 
-               GSourceFunc callback,
-               gpointer    user_data)
+static guint  
+jaw_idle_add (GSourceFunc      function,
+               gpointer        data,
+               GMainContext    *context)
 {
-       static GSourceFunc gdk_dispatch_func = NULL;
+       GSource *source;
+       guint id;                                  
 
-       if (gdk_dispatch_func == NULL
-                       && user_data != NULL
-                       && ((DummyDispatch*)user_data)->func == 
jaw_dummy_idle_func) {
-               gdk_dispatch_func = callback;
-
-               return FALSE;
-       }
+       source = g_idle_source_new ();             
 
-       if (gdk_dispatch_func == callback) {
-               return FALSE;
-       }
+       g_source_set_callback (source, function, data, NULL);
+       id = g_source_attach (source, context);
+       g_source_unref (source);                   
 
-       return origin_g_idle_dispatch(source, callback, user_data);
+       return id;
 }
 
 static void jaw_exit_func ()
@@ -107,6 +88,8 @@ jaw_load_atk_bridge (gpointer p)
        GVoidFunc dl_init;
        if (!g_module_symbol( module_atk_bridge, 
"gnome_accessibility_module_init", (gpointer*)&dl_init)) {
                g_module_close(module_atk_bridge);
+               g_cond_signal(atk_bridge_cond);
+               g_mutex_unlock(atk_bridge_mutex);
                return FALSE;
        }
 
@@ -124,6 +107,7 @@ jaw_load_atk_bridge (gpointer p)
 }
 
 gpointer jni_main_loop(gpointer data) {
+       g_main_context_push_thread_default( jaw_main_context );
        g_main_loop_run( (GMainLoop*)data );
 
        return NULL;
@@ -132,9 +116,7 @@ gpointer jni_main_loop(gpointer data) {
 JNIEXPORT jboolean JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_initNativeLibrary(JNIEnv *jniEnv, 
jclass jClass) {
        g_type_init();
 
-       // Hook up g_idle_dispatch
-       origin_g_idle_dispatch = g_idle_funcs.dispatch;
-       g_idle_funcs.dispatch = jaw_idle_dispatch;
+       jaw_main_context = g_main_context_new();
 
        const gchar* debug_env = g_getenv("JAW_DEBUG");
        if (g_strcmp0(debug_env, "1") == 0) {
@@ -192,10 +174,6 @@ JNIEXPORT jboolean JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_initNativeLib
 
        key_dispatch_mutex = g_mutex_new();
        key_dispatch_cond = g_cond_new();
-       
-       // Dummy idle function for jaw_idle_dispatch to get
-       // the address of gdk_threads_dispatch
-       gdk_threads_add_idle(jaw_dummy_idle_func, NULL);
 
        return JNI_TRUE;
 }
@@ -204,9 +182,9 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_loadAtkBridge(JNI
        // Enable ATK Bridge so we can load it now
        g_setenv("NO_AT_BRIDGE", "0", TRUE);
 
-       GMainLoop *main_loop = g_main_loop_new( NULL, FALSE );
+       GMainLoop *main_loop = g_main_loop_new( jaw_main_context, FALSE );
        
-       g_idle_add(jaw_load_atk_bridge, NULL);
+       jaw_idle_add(jaw_load_atk_bridge, NULL, jaw_main_context);
 
        // We need to wait for the completion of the loading of ATK Bridge
        // in order to ensure event listeners in ATK Bridge are properly
@@ -304,7 +282,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_focusNotify(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(focus_notify_handler, para);
+       jaw_idle_add(focus_notify_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -350,7 +328,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowOpen(
        CallbackPara *para = alloc_callback_para(global_ac);
        para->is_toplevel = (jIsToplevel == JNI_TRUE) ? TRUE : FALSE;
 
-       g_idle_add(window_open_handler, para);
+       jaw_idle_add(window_open_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -402,7 +380,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowClose(
        CallbackPara *para = alloc_callback_para(global_ac);
        para->is_toplevel = (jIsToplevel == JNI_TRUE) ? TRUE : FALSE;
 
-       g_idle_add(window_close_handler, para);
+       jaw_idle_add(window_close_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -432,7 +410,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowMinimize(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(window_minimize_handler, para);
+       jaw_idle_add(window_minimize_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -463,7 +441,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowMaximize(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(window_maximize_handler, para);
+       jaw_idle_add(window_maximize_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -494,7 +472,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowRestore(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(window_restore_handler, para);
+       jaw_idle_add(window_restore_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -525,7 +503,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowActivate(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(window_activate_handler, para);
+       jaw_idle_add(window_activate_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -556,7 +534,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowDeactivate(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(window_deactivate_handler, para);
+       jaw_idle_add(window_deactivate_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -587,7 +565,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_windowStateChange
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       //g_idle_add(window_state_change_handler, para);
+       //jaw_idle_add(window_state_change_handler, para, jaw_main_context);
 }
 
 static gchar
@@ -884,7 +862,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_emitSignal(
        para->signal_id = (gint)id;
        para->args = global_args;
 
-       g_idle_add(signal_emit_handler, para);
+       jaw_idle_add(signal_emit_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -923,7 +901,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_objectStateChange
                para->state_value = FALSE;
        }
 
-       g_idle_add(object_state_change_handler, para);
+       jaw_idle_add(object_state_change_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -950,7 +928,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_componentAdded(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(component_added_handler, para);
+       jaw_idle_add(component_added_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -982,7 +960,7 @@ JNIEXPORT void JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_componentRemoved(
        jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
        CallbackPara *para = alloc_callback_para(global_ac);
 
-       g_idle_add(component_removed_handler, para);
+       jaw_idle_add(component_removed_handler, para, jaw_main_context);
 }
 
 static gboolean
@@ -1080,7 +1058,7 @@ JNIEXPORT jboolean JNICALL 
Java_org_GNOME_Accessibility_AtkWrapper_dispatchKeyEv
 
        g_mutex_lock(key_dispatch_mutex);
        
-       g_idle_add(key_dispatch_handler, (gpointer)global_key_event);
+       jaw_idle_add(key_dispatch_handler, (gpointer)global_key_event, 
jaw_main_context);
 
        while (key_dispatch_result == KEY_DISPATCH_NOT_DISPATCHED) {
                g_cond_wait(key_dispatch_cond, key_dispatch_mutex);

Reply via email to