diff options
Diffstat (limited to 'libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c')
-rw-r--r-- | libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c index 3a2e41f21a7..791916174ed 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c @@ -41,8 +41,8 @@ exception statement from your version. */ #include "gnu_java_awt_peer_gtk_GtkFileDialogPeer.h" static void handle_response (GtkDialog *dialog, - gint responseId, - jobject peer_obj); + gint responseId, + jobject peer_obj); /* * Make a new file selection dialog @@ -62,15 +62,17 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create gdk_threads_enter (); - widget = gtk_file_chooser_dialog_new("", - GTK_WINDOW(parentp), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_OK, GTK_RESPONSE_OK, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - NULL); - - /* GtkFileChooser doesn't show hidden files by default. */ - g_object_set(GTK_FILE_CHOOSER(widget), "show_hidden", TRUE); + /* FIXME: we should be using the default gnome-vfs backend but it is + not currently thread-safe. See: + http://bugzilla.gnome.org/show_bug.cgi?id=166852 */ + widget = gtk_file_chooser_dialog_new_with_backend + ("Open File", + GTK_WINDOW(parentp), + GTK_FILE_CHOOSER_ACTION_OPEN, + "gtk+", + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); /* GtkFileSelect is not modal by default */ gtk_window_set_modal (GTK_WINDOW (widget), TRUE); @@ -97,7 +99,7 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectSignals g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)), "response", GTK_SIGNAL_FUNC (handle_response), *gref); - + gdk_threads_leave (); /* Connect the superclass signals. */ @@ -112,7 +114,7 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeGetDirectory const char *str; ptr = NSA_GET_PTR (env, obj); - + gdk_threads_enter (); str = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER(ptr)); @@ -135,14 +137,14 @@ static gboolean filenameFilterCallback (const GtkFileFilterInfo *filter_info, jstring *filename; gboolean accepted; - cx = (*gdk_env)->GetObjectClass (gdk_env, (jobject) obj); - id = (*gdk_env)->GetMethodID (gdk_env, cx, "filenameFilterCallback", + cx = (*gdk_env())->GetObjectClass (gdk_env(), (jobject) obj); + id = (*gdk_env())->GetMethodID (gdk_env(), cx, "filenameFilterCallback", "(Ljava/lang/String;)Z"); - filename = (*gdk_env)->NewStringUTF(gdk_env, filter_info->filename); - + filename = (*gdk_env())->NewStringUTF(gdk_env(), filter_info->filename); + gdk_threads_leave(); - accepted = (*gdk_env)->CallBooleanMethod(gdk_env, obj, id, filename); + accepted = (*gdk_env())->CallBooleanMethod(gdk_env(), obj, id, filename); gdk_threads_enter(); return accepted; @@ -166,8 +168,8 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFilenameFilter gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(ptr), filter); gdk_threads_leave (); - } - +} + JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetDirectory (JNIEnv *env, jobject obj, jstring directory) @@ -196,7 +198,7 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile ptr = NSA_GET_PTR (env, obj); str = (*env)->GetStringUTFChars (env, filename, 0); - + gdk_threads_enter (); gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (ptr), str); gdk_threads_leave (); @@ -207,7 +209,7 @@ Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_nativeSetFile static void handle_response (GtkDialog *dialog __attribute__((unused)), gint responseId, - jobject peer_obj) + jobject peer_obj) { static int isDisposeIDSet = 0; static int isIDSet = 0; @@ -221,51 +223,51 @@ handle_response (GtkDialog *dialog __attribute__((unused)), /* We only need this for the case when the user closed the window, or clicked ok or cancel. */ if (responseId != GTK_RESPONSE_DELETE_EVENT - && responseId != GTK_RESPONSE_OK + && responseId != GTK_RESPONSE_ACCEPT && responseId != GTK_RESPONSE_CANCEL) return; - - ptr = NSA_GET_PTR (gdk_env, peer_obj); - + + ptr = NSA_GET_PTR (gdk_env(), peer_obj); + if (responseId == GTK_RESPONSE_DELETE_EVENT) { if (!isDisposeIDSet) - { - jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj); - disposeID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkDisposeFileDialog", "()V"); + { + jclass cx = (*gdk_env())->GetObjectClass (gdk_env(), peer_obj); + disposeID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkDisposeFileDialog", "()V"); isDisposeIDSet = 1; - } - - gdk_threads_leave (); + } + gdk_threads_leave (); + /* We can dispose of the dialog now (and unblock show) */ - (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, disposeID); + (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, disposeID); - gdk_threads_enter (); + gdk_threads_enter (); return; -} + } - if (responseId == GTK_RESPONSE_OK) { + if (responseId == GTK_RESPONSE_ACCEPT) { fileName = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (GTK_WIDGET (ptr))); - str_fileName = (*gdk_env)->NewStringUTF (gdk_env, fileName); + str_fileName = (*gdk_env())->NewStringUTF (gdk_env(), fileName); } - + if (!isIDSet) { - jclass cx = (*gdk_env)->GetObjectClass (gdk_env, peer_obj); - hideID = (*gdk_env)->GetMethodID (gdk_env, cx, "gtkHideFileDialog", "()V"); - gtkSetFilenameID = (*gdk_env)->GetMethodID (gdk_env, cx, + jclass cx = (*gdk_env())->GetObjectClass (gdk_env(), peer_obj); + hideID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkHideFileDialog", "()V"); + gtkSetFilenameID = (*gdk_env())->GetMethodID (gdk_env(), cx, "gtkSetFilename", "(Ljava/lang/String;)V"); isIDSet = 1; } gdk_threads_leave (); - + /* Set the Java object field 'file' with this value. */ - (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, gtkSetFilenameID, str_fileName); + (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, gtkSetFilenameID, str_fileName); /* We can hide the dialog now (and unblock show) */ - (*gdk_env)->CallVoidMethod (gdk_env, peer_obj, hideID); + (*gdk_env())->CallVoidMethod (gdk_env(), peer_obj, hideID); gdk_threads_enter (); } |