src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -21,24 +21,28 @@
  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
 
+#include <X11/Xlib.h>
 #include <jni.h>
 #include <stdio.h>
 #include <jni_util.h>
 #include <string.h>
 #include "gtk2_interface.h"
 #include "sun_awt_X11_GtkFileDialogPeer.h"
 #include "java_awt_FileDialog.h"
 #include "debug_assert.h"
 
+extern Display *awt_display;
+
 static JavaVM *jvm;
 
 /* To cache some method IDs */
 static jmethodID filenameFilterCallbackMethodID = NULL;
 static jmethodID setFileInternalMethodID = NULL;
+static jmethodID notifyConfigureMethodID = NULL;
 static jfieldID  widgetFieldID = NULL;
 
 JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs
 (JNIEnv *env, jclass cx)
 {

@@ -48,10 +52,14 @@
 
     setFileInternalMethodID = (*env)->GetMethodID(env, cx,
             "setFileInternal", "(Ljava/lang/String;[Ljava/lang/String;)V");
     DASSERT(setFileInternalMethodID != NULL);
 
+    notifyConfigureMethodID = (*env)->GetMethodID(env, cx,
+            "notifyConfigure", "(JIIII)V");
+    DASSERT(notifyConfigureMethodID != NULL);
+
     widgetFieldID = (*env)->GetFieldID(env, cx, "widget", "J");
     DASSERT(widgetFieldID != NULL);
 }
 
 static gboolean filenameFilterCallback(const GtkFileFilterInfo * filter_info, gpointer obj)

@@ -279,17 +287,27 @@
     fp_g_free(current_folder);
 
     quit(env, (jobject)obj, TRUE);
 }
 
+gboolean handle_configure(GtkWidget *dialog, GdkEventConfigure *e, gpointer obj) {
+    JNIEnv *env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2);
+
+    (*env)->CallVoidMethod(env, obj, notifyConfigureMethodID,
+            fp_gdk_x11_drawable_get_xid(dialog->window), e->x, e->y, e->width, e->height);
+
+    return FALSE;
+}
+
 /*
  * Class:     sun_awt_X11_GtkFileDialogPeer
  * Method:    run
  * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;ZII)V
  */
 JNIEXPORT void JNICALL
 Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer,
+        jlong owner,
         jstring jtitle, jint mode, jstring jdir, jstring jfile,
         jobject jfilter, jboolean multiple, int x, int y)
 {
     GtkWidget *dialog = NULL;
     GtkFileFilter *filter;

@@ -363,14 +381,21 @@
 
         // NOTE: it doesn't set the initial size for the file chooser
         // as it seems like the file chooser overrides the size internally
     }
 
+    (*env)->SetLongField(env, jpeer, widgetFieldID, ptr_to_jlong(dialog));
+
     fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(
             handle_response), jpeer);
+    fp_g_signal_connect(G_OBJECT(dialog), "configure-event", G_CALLBACK(
+            handle_configure), jpeer);
 
-    (*env)->SetLongField(env, jpeer, widgetFieldID, ptr_to_jlong(dialog));
+    if (owner && dialog) {
+        fp_gtk_widget_realize(dialog);
+        XSetTransientForHint(awt_display, fp_gdk_x11_drawable_get_xid(dialog->window), owner);
+    }
 
     fp_gtk_widget_show(dialog);
 
     fp_gtk_main();
     fp_gdk_threads_leave();