18046
|
1 |
diff --git a/jni/src/AtkWrapper.c b/jni/src/AtkWrapper.c
|
|
2 |
index 640b559..fb4324a 100644
|
|
3 |
--- a/jni/src/AtkWrapper.c
|
|
4 |
+++ b/jni/src/AtkWrapper.c
|
|
5 |
@@ -37,15 +37,6 @@
|
|
6 |
#define GDK_MOD1_MASK (1 << 3)
|
|
7 |
#define GDK_META_MASK (1 << 28)
|
|
8 |
|
|
9 |
-typedef struct _DummyDispatch DummyDispatch;
|
|
10 |
-
|
|
11 |
-struct _DummyDispatch
|
|
12 |
-{
|
|
13 |
- GSourceFunc func;
|
|
14 |
- gpointer data;
|
|
15 |
- GDestroyNotify destroy;
|
|
16 |
-};
|
|
17 |
-
|
|
18 |
gboolean jaw_debug = FALSE;
|
|
19 |
|
|
20 |
GMutex *atk_bridge_mutex = NULL;
|
|
21 |
@@ -53,8 +44,9 @@ GCond *atk_bridge_cond = NULL;
|
|
22 |
|
|
23 |
GMutex *key_dispatch_mutex = NULL;
|
|
24 |
GCond *key_dispatch_cond = NULL;
|
|
25 |
+static GMainContext *jaw_main_context = NULL;
|
|
26 |
+
|
|
27 |
static gint key_dispatch_result = KEY_DISPATCH_NOT_DISPATCHED;
|
|
28 |
-static gboolean (*origin_g_idle_dispatch) (GSource*, GSourceFunc, gpointer);
|
|
29 |
|
|
30 |
static GModule* module_atk_bridge = NULL;
|
|
31 |
|
|
32 |
@@ -66,32 +58,21 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVM, void *reserve) {
|
|
33 |
JNIEXPORT void JNICALL JNI_OnUnload(JavaVM *javaVM, void *reserve) {
|
|
34 |
}
|
|
35 |
|
|
36 |
-static gboolean
|
|
37 |
-jaw_dummy_idle_func (gpointer p)
|
|
38 |
-{
|
|
39 |
- return FALSE;
|
|
40 |
-}
|
|
41 |
-
|
|
42 |
-static gboolean
|
|
43 |
-jaw_idle_dispatch (GSource *source,
|
|
44 |
- GSourceFunc callback,
|
|
45 |
- gpointer user_data)
|
|
46 |
+static guint
|
|
47 |
+jaw_idle_add (GSourceFunc function,
|
|
48 |
+ gpointer data,
|
|
49 |
+ GMainContext *context)
|
|
50 |
{
|
|
51 |
- static GSourceFunc gdk_dispatch_func = NULL;
|
|
52 |
+ GSource *source;
|
|
53 |
+ guint id;
|
|
54 |
|
|
55 |
- if (gdk_dispatch_func == NULL
|
|
56 |
- && user_data != NULL
|
|
57 |
- && ((DummyDispatch*)user_data)->func == jaw_dummy_idle_func) {
|
|
58 |
- gdk_dispatch_func = callback;
|
|
59 |
-
|
|
60 |
- return FALSE;
|
|
61 |
- }
|
|
62 |
+ source = g_idle_source_new ();
|
|
63 |
|
|
64 |
- if (gdk_dispatch_func == callback) {
|
|
65 |
- return FALSE;
|
|
66 |
- }
|
|
67 |
+ g_source_set_callback (source, function, data, NULL);
|
|
68 |
+ id = g_source_attach (source, context);
|
|
69 |
+ g_source_unref (source);
|
|
70 |
|
|
71 |
- return origin_g_idle_dispatch(source, callback, user_data);
|
|
72 |
+ return id;
|
|
73 |
}
|
|
74 |
|
|
75 |
static void jaw_exit_func ()
|
|
76 |
@@ -107,6 +88,8 @@ jaw_load_atk_bridge (gpointer p)
|
|
77 |
GVoidFunc dl_init;
|
|
78 |
if (!g_module_symbol( module_atk_bridge, "gnome_accessibility_module_init", (gpointer*)&dl_init)) {
|
|
79 |
g_module_close(module_atk_bridge);
|
|
80 |
+ g_cond_signal(atk_bridge_cond);
|
|
81 |
+ g_mutex_unlock(atk_bridge_mutex);
|
|
82 |
return FALSE;
|
|
83 |
}
|
|
84 |
|
|
85 |
@@ -124,6 +107,7 @@ jaw_load_atk_bridge (gpointer p)
|
|
86 |
}
|
|
87 |
|
|
88 |
gpointer jni_main_loop(gpointer data) {
|
|
89 |
+ g_main_context_push_thread_default( jaw_main_context );
|
|
90 |
g_main_loop_run( (GMainLoop*)data );
|
|
91 |
|
|
92 |
return NULL;
|
|
93 |
@@ -132,9 +116,7 @@ gpointer jni_main_loop(gpointer data) {
|
|
94 |
JNIEXPORT jboolean JNICALL Java_org_GNOME_Accessibility_AtkWrapper_initNativeLibrary(JNIEnv *jniEnv, jclass jClass) {
|
|
95 |
g_type_init();
|
|
96 |
|
|
97 |
- // Hook up g_idle_dispatch
|
|
98 |
- origin_g_idle_dispatch = g_idle_funcs.dispatch;
|
|
99 |
- g_idle_funcs.dispatch = jaw_idle_dispatch;
|
|
100 |
+ jaw_main_context = g_main_context_new();
|
|
101 |
|
|
102 |
const gchar* debug_env = g_getenv("JAW_DEBUG");
|
|
103 |
if (g_strcmp0(debug_env, "1") == 0) {
|
|
104 |
@@ -192,10 +174,6 @@ JNIEXPORT jboolean JNICALL Java_org_GNOME_Accessibility_AtkWrapper_initNativeLib
|
|
105 |
|
|
106 |
key_dispatch_mutex = g_mutex_new();
|
|
107 |
key_dispatch_cond = g_cond_new();
|
|
108 |
-
|
|
109 |
- // Dummy idle function for jaw_idle_dispatch to get
|
|
110 |
- // the address of gdk_threads_dispatch
|
|
111 |
- gdk_threads_add_idle(jaw_dummy_idle_func, NULL);
|
|
112 |
|
|
113 |
return JNI_TRUE;
|
|
114 |
}
|
|
115 |
@@ -204,9 +182,9 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_loadAtkBridge(JNI
|
|
116 |
// Enable ATK Bridge so we can load it now
|
|
117 |
g_setenv("NO_AT_BRIDGE", "0", TRUE);
|
|
118 |
|
|
119 |
- GMainLoop *main_loop = g_main_loop_new( NULL, FALSE );
|
|
120 |
+ GMainLoop *main_loop = g_main_loop_new( jaw_main_context, FALSE );
|
|
121 |
|
|
122 |
- g_idle_add(jaw_load_atk_bridge, NULL);
|
|
123 |
+ jaw_idle_add(jaw_load_atk_bridge, NULL, jaw_main_context);
|
|
124 |
|
|
125 |
// We need to wait for the completion of the loading of ATK Bridge
|
|
126 |
// in order to ensure event listeners in ATK Bridge are properly
|
|
127 |
@@ -304,7 +282,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_focusNotify(
|
|
128 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
129 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
130 |
|
|
131 |
- g_idle_add(focus_notify_handler, para);
|
|
132 |
+ jaw_idle_add(focus_notify_handler, para, jaw_main_context);
|
|
133 |
}
|
|
134 |
|
|
135 |
static gboolean
|
|
136 |
@@ -350,7 +328,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowOpen(
|
|
137 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
138 |
para->is_toplevel = (jIsToplevel == JNI_TRUE) ? TRUE : FALSE;
|
|
139 |
|
|
140 |
- g_idle_add(window_open_handler, para);
|
|
141 |
+ jaw_idle_add(window_open_handler, para, jaw_main_context);
|
|
142 |
}
|
|
143 |
|
|
144 |
static gboolean
|
|
145 |
@@ -402,7 +380,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowClose(
|
|
146 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
147 |
para->is_toplevel = (jIsToplevel == JNI_TRUE) ? TRUE : FALSE;
|
|
148 |
|
|
149 |
- g_idle_add(window_close_handler, para);
|
|
150 |
+ jaw_idle_add(window_close_handler, para, jaw_main_context);
|
|
151 |
}
|
|
152 |
|
|
153 |
static gboolean
|
|
154 |
@@ -432,7 +410,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowMinimize(
|
|
155 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
156 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
157 |
|
|
158 |
- g_idle_add(window_minimize_handler, para);
|
|
159 |
+ jaw_idle_add(window_minimize_handler, para, jaw_main_context);
|
|
160 |
}
|
|
161 |
|
|
162 |
static gboolean
|
|
163 |
@@ -463,7 +441,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowMaximize(
|
|
164 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
165 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
166 |
|
|
167 |
- g_idle_add(window_maximize_handler, para);
|
|
168 |
+ jaw_idle_add(window_maximize_handler, para, jaw_main_context);
|
|
169 |
}
|
|
170 |
|
|
171 |
static gboolean
|
|
172 |
@@ -494,7 +472,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowRestore(
|
|
173 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
174 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
175 |
|
|
176 |
- g_idle_add(window_restore_handler, para);
|
|
177 |
+ jaw_idle_add(window_restore_handler, para, jaw_main_context);
|
|
178 |
}
|
|
179 |
|
|
180 |
static gboolean
|
|
181 |
@@ -525,7 +503,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowActivate(
|
|
182 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
183 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
184 |
|
|
185 |
- g_idle_add(window_activate_handler, para);
|
|
186 |
+ jaw_idle_add(window_activate_handler, para, jaw_main_context);
|
|
187 |
}
|
|
188 |
|
|
189 |
static gboolean
|
|
190 |
@@ -556,7 +534,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowDeactivate(
|
|
191 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
192 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
193 |
|
|
194 |
- g_idle_add(window_deactivate_handler, para);
|
|
195 |
+ jaw_idle_add(window_deactivate_handler, para, jaw_main_context);
|
|
196 |
}
|
|
197 |
|
|
198 |
static gboolean
|
|
199 |
@@ -587,7 +565,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_windowStateChange
|
|
200 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
201 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
202 |
|
|
203 |
- //g_idle_add(window_state_change_handler, para);
|
|
204 |
+ //jaw_idle_add(window_state_change_handler, para, jaw_main_context);
|
|
205 |
}
|
|
206 |
|
|
207 |
static gchar
|
|
208 |
@@ -884,7 +862,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_emitSignal(
|
|
209 |
para->signal_id = (gint)id;
|
|
210 |
para->args = global_args;
|
|
211 |
|
|
212 |
- g_idle_add(signal_emit_handler, para);
|
|
213 |
+ jaw_idle_add(signal_emit_handler, para, jaw_main_context);
|
|
214 |
}
|
|
215 |
|
|
216 |
static gboolean
|
|
217 |
@@ -923,7 +901,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_objectStateChange
|
|
218 |
para->state_value = FALSE;
|
|
219 |
}
|
|
220 |
|
|
221 |
- g_idle_add(object_state_change_handler, para);
|
|
222 |
+ jaw_idle_add(object_state_change_handler, para, jaw_main_context);
|
|
223 |
}
|
|
224 |
|
|
225 |
static gboolean
|
|
226 |
@@ -950,7 +928,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_componentAdded(
|
|
227 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
228 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
229 |
|
|
230 |
- g_idle_add(component_added_handler, para);
|
|
231 |
+ jaw_idle_add(component_added_handler, para, jaw_main_context);
|
|
232 |
}
|
|
233 |
|
|
234 |
static gboolean
|
|
235 |
@@ -982,7 +960,7 @@ JNIEXPORT void JNICALL Java_org_GNOME_Accessibility_AtkWrapper_componentRemoved(
|
|
236 |
jobject global_ac = (*jniEnv)->NewGlobalRef(jniEnv, jAccContext);
|
|
237 |
CallbackPara *para = alloc_callback_para(global_ac);
|
|
238 |
|
|
239 |
- g_idle_add(component_removed_handler, para);
|
|
240 |
+ jaw_idle_add(component_removed_handler, para, jaw_main_context);
|
|
241 |
}
|
|
242 |
|
|
243 |
static gboolean
|
|
244 |
@@ -1080,7 +1058,7 @@ JNIEXPORT jboolean JNICALL Java_org_GNOME_Accessibility_AtkWrapper_dispatchKeyEv
|
|
245 |
|
|
246 |
g_mutex_lock(key_dispatch_mutex);
|
|
247 |
|
|
248 |
- g_idle_add(key_dispatch_handler, (gpointer)global_key_event);
|
|
249 |
+ jaw_idle_add(key_dispatch_handler, (gpointer)global_key_event, jaw_main_context);
|
|
250 |
|
|
251 |
while (key_dispatch_result == KEY_DISPATCH_NOT_DISPATCHED) {
|
|
252 |
g_cond_wait(key_dispatch_cond, key_dispatch_mutex);
|