6960655: GTKFileDialogPeer shouldn't be a singletone
Reviewed-by: art, dcherepanov
This commit is contained in:
parent
a77052796a
commit
28dedbec71
@ -429,6 +429,7 @@ SUNWprivate_1.1 {
|
|||||||
Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue;
|
Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetClassValue;
|
||||||
Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName;
|
Java_com_sun_java_swing_plaf_gtk_GTKStyle_nativeGetPangoFontName;
|
||||||
|
|
||||||
|
Java_sun_awt_X11_GtkFileDialogPeer_initIDs;
|
||||||
Java_sun_awt_X11_GtkFileDialogPeer_run;
|
Java_sun_awt_X11_GtkFileDialogPeer_run;
|
||||||
Java_sun_awt_X11_GtkFileDialogPeer_quit;
|
Java_sun_awt_X11_GtkFileDialogPeer_quit;
|
||||||
|
|
||||||
|
@ -42,11 +42,19 @@ class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer {
|
|||||||
|
|
||||||
private FileDialog fd;
|
private FileDialog fd;
|
||||||
|
|
||||||
|
// A pointer to the native GTK FileChooser widget
|
||||||
|
private volatile long widget = 0L;
|
||||||
|
|
||||||
public GtkFileDialogPeer(FileDialog fd) {
|
public GtkFileDialogPeer(FileDialog fd) {
|
||||||
super((Dialog) fd);
|
super((Dialog) fd);
|
||||||
this.fd = fd;
|
this.fd = fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static native void initIDs();
|
||||||
|
static {
|
||||||
|
initIDs();
|
||||||
|
}
|
||||||
|
|
||||||
private native void run(String title, int mode, String dir, String file,
|
private native void run(String title, int mode, String dir, String file,
|
||||||
FilenameFilter filter, boolean isMultipleMode);
|
FilenameFilter filter, boolean isMultipleMode);
|
||||||
|
|
||||||
|
@ -4,13 +4,29 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "gtk2_interface.h"
|
#include "gtk2_interface.h"
|
||||||
#include "sun_awt_X11_GtkFileDialogPeer.h"
|
#include "sun_awt_X11_GtkFileDialogPeer.h"
|
||||||
|
#include "debug_assert.h"
|
||||||
|
|
||||||
static JavaVM *jvm;
|
static JavaVM *jvm;
|
||||||
static GtkWidget *dialog = NULL;
|
|
||||||
|
|
||||||
/* To cache some method IDs */
|
/* To cache some method IDs */
|
||||||
static jmethodID filenameFilterCallbackMethodID = NULL;
|
static jmethodID filenameFilterCallbackMethodID = NULL;
|
||||||
static jmethodID setFileInternalMethodID = NULL;
|
static jmethodID setFileInternalMethodID = NULL;
|
||||||
|
static jfieldID widgetFieldID = NULL;
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
|
||||||
|
(JNIEnv *env, jclass cx)
|
||||||
|
{
|
||||||
|
filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx,
|
||||||
|
"filenameFilterCallback", "(Ljava/lang/String;)Z");
|
||||||
|
DASSERT(filenameFilterCallbackMethodID != NULL);
|
||||||
|
|
||||||
|
setFileInternalMethodID = (*env)->GetMethodID(env, cx,
|
||||||
|
"setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V");
|
||||||
|
DASSERT(setFileInternalMethodID != NULL);
|
||||||
|
|
||||||
|
widgetFieldID = (*env)->GetFieldID(env, cx, "widget", "J");
|
||||||
|
DASSERT(widgetFieldID != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gpointer obj)
|
static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gpointer obj)
|
||||||
{
|
{
|
||||||
@ -20,30 +36,17 @@ static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gp
|
|||||||
|
|
||||||
env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2);
|
env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2);
|
||||||
|
|
||||||
if (filenameFilterCallbackMethodID == NULL) {
|
|
||||||
cx = (*env)->GetObjectClass(env, (jobject) obj);
|
|
||||||
if (cx == NULL) {
|
|
||||||
JNU_ThrowInternalError(env, "Could not get file filter class");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
filenameFilterCallbackMethodID = (*env)->GetMethodID(env, cx,
|
|
||||||
"filenameFilterCallback", "(Ljava/lang/String;)Z");
|
|
||||||
if (filenameFilterCallbackMethodID == NULL) {
|
|
||||||
JNU_ThrowInternalError(env,
|
|
||||||
"Could not get filenameFilterCallback method id");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
filename = (*env)->NewStringUTF(env, filter_info->filename);
|
filename = (*env)->NewStringUTF(env, filter_info->filename);
|
||||||
|
|
||||||
return (*env)->CallBooleanMethod(env, obj, filenameFilterCallbackMethodID,
|
return (*env)->CallBooleanMethod(env, obj, filenameFilterCallbackMethodID,
|
||||||
filename);
|
filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void quit(gboolean isSignalHandler)
|
static void quit(JNIEnv * env, jobject jpeer, gboolean isSignalHandler)
|
||||||
{
|
{
|
||||||
|
GtkWidget * dialog = (GtkWidget*)jlong_to_ptr(
|
||||||
|
(*env)->GetLongField(env, jpeer, widgetFieldID));
|
||||||
|
|
||||||
if (dialog != NULL)
|
if (dialog != NULL)
|
||||||
{
|
{
|
||||||
// Callbacks from GTK signals are made within the GTK lock
|
// Callbacks from GTK signals are made within the GTK lock
|
||||||
@ -57,7 +60,8 @@ static void quit(gboolean isSignalHandler)
|
|||||||
fp_gtk_widget_destroy (dialog);
|
fp_gtk_widget_destroy (dialog);
|
||||||
|
|
||||||
fp_gtk_main_quit ();
|
fp_gtk_main_quit ();
|
||||||
dialog = NULL;
|
|
||||||
|
(*env)->SetLongField(env, jpeer, widgetFieldID, 0);
|
||||||
|
|
||||||
if (!isSignalHandler) {
|
if (!isSignalHandler) {
|
||||||
fp_gdk_threads_leave();
|
fp_gdk_threads_leave();
|
||||||
@ -73,7 +77,7 @@ static void quit(gboolean isSignalHandler)
|
|||||||
JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit
|
JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit
|
||||||
(JNIEnv * env, jobject jpeer)
|
(JNIEnv * env, jobject jpeer)
|
||||||
{
|
{
|
||||||
quit(FALSE);
|
quit(env, jpeer, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,24 +136,8 @@ static void handle_response(GtkWidget* aDialog, gint responseId, gpointer obj)
|
|||||||
|
|
||||||
if (responseId == GTK_RESPONSE_ACCEPT) {
|
if (responseId == GTK_RESPONSE_ACCEPT) {
|
||||||
current_folder = fp_gtk_file_chooser_get_current_folder(
|
current_folder = fp_gtk_file_chooser_get_current_folder(
|
||||||
GTK_FILE_CHOOSER(dialog));
|
GTK_FILE_CHOOSER(aDialog));
|
||||||
filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog));
|
filenames = fp_gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(aDialog));
|
||||||
}
|
|
||||||
|
|
||||||
if (setFileInternalMethodID == NULL) {
|
|
||||||
cx = (*env)->GetObjectClass(env, (jobject) obj);
|
|
||||||
if (cx == NULL) {
|
|
||||||
JNU_ThrowInternalError(env, "Could not get GTK peer class");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setFileInternalMethodID = (*env)->GetMethodID(env, cx,
|
|
||||||
"setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V");
|
|
||||||
if (setFileInternalMethodID == NULL) {
|
|
||||||
JNU_ThrowInternalError(env,
|
|
||||||
"Could not get setFileInternalMethodID method id");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jcurrent_folder = (*env)->NewStringUTF(env, current_folder);
|
jcurrent_folder = (*env)->NewStringUTF(env, current_folder);
|
||||||
@ -159,7 +147,7 @@ static void handle_response(GtkWidget* aDialog, gint responseId, gpointer obj)
|
|||||||
jfilenames);
|
jfilenames);
|
||||||
fp_g_free(current_folder);
|
fp_g_free(current_folder);
|
||||||
|
|
||||||
quit(TRUE);
|
quit(env, (jobject)obj, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -172,6 +160,7 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer,
|
|||||||
jstring jtitle, jint mode, jstring jdir, jstring jfile,
|
jstring jtitle, jint mode, jstring jdir, jstring jfile,
|
||||||
jobject jfilter, jboolean multiple)
|
jobject jfilter, jboolean multiple)
|
||||||
{
|
{
|
||||||
|
GtkWidget *dialog = NULL;
|
||||||
GtkFileFilter *filter;
|
GtkFileFilter *filter;
|
||||||
|
|
||||||
if (jvm == NULL) {
|
if (jvm == NULL) {
|
||||||
@ -233,8 +222,12 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer,
|
|||||||
|
|
||||||
fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
|
fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
|
||||||
handle_response), jpeer);
|
handle_response), jpeer);
|
||||||
|
|
||||||
|
(*env)->SetLongField(env, jpeer, widgetFieldID, ptr_to_jlong(dialog));
|
||||||
|
|
||||||
fp_gtk_widget_show(dialog);
|
fp_gtk_widget_show(dialog);
|
||||||
|
|
||||||
fp_gtk_main();
|
fp_gtk_main();
|
||||||
fp_gdk_threads_leave();
|
fp_gdk_threads_leave();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,14 @@ extern "C"
|
|||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: sun_awt_X11_GtkFileDialogPeer
|
||||||
|
* Method: initIDs
|
||||||
|
* Signature: ()V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
|
||||||
|
(JNIEnv *, jclass);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: sun_awt_X11_GtkFileDialogPeer
|
* Class: sun_awt_X11_GtkFileDialogPeer
|
||||||
* Method: run
|
* Method: run
|
||||||
|
Loading…
Reference in New Issue
Block a user