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);