JBR-4673 Focus moves to another application on file dialog closing

(cherry picked from commit 7468974488)
(cherry picked from commit 72a74312b7)
This commit is contained in:
Dmitry Batrak
2022-07-27 18:36:30 +03:00
committed by jbrbot
parent 2d4077e0d2
commit 910a4bc2ff
2 changed files with 16 additions and 8 deletions

View File

@@ -114,12 +114,7 @@ final class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer {
try {
quit = !b;
if (b) {
Runnable task = () -> {
showNativeDialog();
standaloneWindow = 0;
fd.setVisible(false);
};
new Thread(null, task, "ShowDialog", 0, false).start();
new Thread(null, this::showNativeDialog, "ShowDialog", 0, false).start();
} else {
quit();
fd.setVisible(false);
@@ -209,4 +204,13 @@ final class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer {
}
return false;
}
/**
* Called by native code when GTK dialog is closing.
*/
private void onClose() {
widget = 0;
standaloneWindow = 0;
fd.setVisible(false);
}
}

View File

@@ -46,6 +46,7 @@ static jmethodID filenameFilterCallbackMethodID = NULL;
static jmethodID setFileInternalMethodID = NULL;
static jfieldID widgetFieldID = NULL;
static jmethodID setWindowMethodID = NULL;
static jmethodID onCloseMethodID = NULL;
JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
(JNIEnv *env, jclass cx)
@@ -66,6 +67,9 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
setWindowMethodID = (*env)->GetMethodID(env, cx, "setWindow", "(J)Z");
DASSERT(setWindowMethodID != NULL);
onCloseMethodID = (*env)->GetMethodID(env, cx, "onClose", "()V");
DASSERT(onCloseMethodID != NULL);
}
static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gpointer obj)
@@ -92,6 +96,8 @@ static void quit(JNIEnv * env, jobject jpeer, gboolean isSignalHandler)
GtkWidget * dialog = (GtkWidget*)jlong_to_ptr(
(*env)->GetLongField(env, jpeer, widgetFieldID));
(*env)->CallVoidMethod(env, jpeer, onCloseMethodID);
if (dialog != NULL)
{
// Callbacks from GTK signals are made within the GTK lock
@@ -106,8 +112,6 @@ static void quit(JNIEnv * env, jobject jpeer, gboolean isSignalHandler)
gtk->gtk_main_quit ();
(*env)->SetLongField(env, jpeer, widgetFieldID, 0);
if (!isSignalHandler) {
gtk->gdk_threads_leave();
}