Hi Costantino,
Costantino Cerbo wrote:
What do you mean by "doesn't start"? Doesn't gtk_main() print out any
diagnostic output to stderr? Or does it get invoked at all?
Unfortunately no diagnostic output is printed to stderr... try yourself...
I've also init the GLib thread system and call gdk_threads_enter() and
gdk_threads_leave() but the problem remains.
It worked for me today - i just added minimal code to start a new
thread, and added wrapping to Java_sun_awt_X11_GtkFileDialogPeer_run().
File dialog was shown, and EDT was not blocked. Makes me think i'm
missing something.
Anyway, I attach a patch relative to
http://cr.openjdk.java.net/~anthony/7-43-GTKFileDialog-6913179.1/
Please let me know what you think.
--
Peter
diff --git a/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java b/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java
--- a/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java
+++ b/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java
@@ -82,8 +82,13 @@
XToolkit.awtLock();
try {
if (b) {
- run(fd.getTitle(), fd.getMode(), fd.getDirectory(), fd.getFile(), fd.getFilenameFilter());
- fd.setVisible(false);
+ Thread t = new Thread() {
+ public void run() {
+ GtkFileDialogPeer.this.run(fd.getTitle(), fd.getMode(), fd.getDirectory(), fd.getFile(), fd.getFilenameFilter());
+ fd.setVisible(false);
+ }
+ };
+ t.start();
} else {
quit();
fd.setVisible(false);
diff --git a/src/solaris/native/sun/awt/gtk2_interface.c b/src/solaris/native/sun/awt/gtk2_interface.c
--- a/src/solaris/native/sun/awt/gtk2_interface.c
+++ b/src/solaris/native/sun/awt/gtk2_interface.c
@@ -446,6 +446,9 @@
fp_g_thread_get_initialized = dl_symbol_gthread("g_thread_get_initialized");
fp_g_thread_init = dl_symbol_gthread("g_thread_init");
+ fp_gdk_threads_init = dl_symbol("gdk_threads_init");
+ fp_gdk_threads_enter = dl_symbol("gdk_threads_enter");
+ fp_gdk_threads_leave = dl_symbol("gdk_threads_leave");
}
gboolean gtk2_load()
diff --git a/src/solaris/native/sun/awt/gtk2_interface.h b/src/solaris/native/sun/awt/gtk2_interface.h
--- a/src/solaris/native/sun/awt/gtk2_interface.h
+++ b/src/solaris/native/sun/awt/gtk2_interface.h
@@ -776,5 +776,8 @@
gboolean (*fp_g_thread_get_initialized)(void);
void (*fp_g_thread_init)(GThreadFunctions *vtable);
+void (*fp_gdk_threads_init)();
+void (*fp_gdk_threads_enter)();
+void (*fp_gdk_threads_leave)();
#endif /* !_GTK2_INTERFACE_H */
diff --git a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c
--- a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c
+++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c
@@ -96,6 +96,9 @@
init_GtkFileDialogPeer(env);
+ fp_gdk_threads_init();
+ fp_gdk_threads_enter();
+
const char *title = (*env)->GetStringUTFChars(env, jtitle, 0);
if (mode == 1) {
@@ -146,4 +149,5 @@
fp_gtk_widget_show(dialog);
fp_gtk_main();
+ fp_gdk_threads_leave();
}