From c4e9a49b59083fb04d169e4c34b1547576159a26 Mon Sep 17 00:00:00 2001 From: dcherepanov Date: Fri, 25 Feb 2011 15:33:50 +0300 Subject: [PATCH] 7009114: GTK FileDialog lies about it's Bounds Reviewed-by: art, anthony --- make/sun/xawt/mapfile-vers | 1 + .../sun/awt/X11/GtkFileDialogPeer.java | 9 +++-- src/solaris/native/sun/awt/gtk2_interface.c | 5 ++- src/solaris/native/sun/awt/gtk2_interface.h | 3 +- .../sun/awt/sun_awt_X11_GtkFileDialogPeer.c | 39 ++++++++++++++++++- .../sun/awt/sun_awt_X11_GtkFileDialogPeer.h | 12 +++++- 6 files changed, 59 insertions(+), 10 deletions(-) diff --git a/make/sun/xawt/mapfile-vers b/make/sun/xawt/mapfile-vers index 479a55a80..90ce5d858 100644 --- a/make/sun/xawt/mapfile-vers +++ b/make/sun/xawt/mapfile-vers @@ -432,6 +432,7 @@ SUNWprivate_1.1 { Java_sun_awt_X11_GtkFileDialogPeer_run; Java_sun_awt_X11_GtkFileDialogPeer_quit; Java_sun_awt_X11_GtkFileDialogPeer_toFront; + Java_sun_awt_X11_GtkFileDialogPeer_setBounds; Java_sun_print_CUPSPrinter_initIDs; Java_sun_print_CUPSPrinter_getCupsServer; diff --git a/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java b/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java index 572a92000..e41bbb65d 100644 --- a/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java +++ b/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java @@ -56,12 +56,14 @@ class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer { } private native void run(String title, int mode, String dir, String file, - FilenameFilter filter, boolean isMultipleMode); + FilenameFilter filter, boolean isMultipleMode, int x, int y); private native void quit(); @Override public native void toFront(); + @Override + public native void setBounds(int x, int y, int width, int height, int op); /** * Called exclusively by the native C code. @@ -106,9 +108,8 @@ class GtkFileDialogPeer extends XDialogPeer implements FileDialogPeer { Thread t = new Thread() { public void run() { GtkFileDialogPeer.this.run(fd.getTitle(), fd.getMode(), - fd.getDirectory(), fd.getFile(), fd - .getFilenameFilter(), fd - .isMultipleMode()); + fd.getDirectory(), fd.getFile(), fd.getFilenameFilter(), fd.isMultipleMode(), + fd.getX(), fd.getY()); fd.setVisible(false); } }; diff --git a/src/solaris/native/sun/awt/gtk2_interface.c b/src/solaris/native/sun/awt/gtk2_interface.c index 767fe47cf..291edc3fb 100644 --- a/src/solaris/native/sun/awt/gtk2_interface.c +++ b/src/solaris/native/sun/awt/gtk2_interface.c @@ -608,7 +608,10 @@ gboolean gtk2_load() fp_gtk_viewport_new = dl_symbol("gtk_viewport_new"); fp_gtk_window_new = dl_symbol("gtk_window_new"); fp_gtk_window_present = dl_symbol("gtk_window_present"); - fp_gtk_dialog_new = dl_symbol("gtk_dialog_new"); + fp_gtk_window_move = dl_symbol("gtk_window_move"); + fp_gtk_window_resize = dl_symbol("gtk_window_resize"); + + fp_gtk_dialog_new = dl_symbol("gtk_dialog_new"); fp_gtk_frame_new = dl_symbol("gtk_frame_new"); fp_gtk_adjustment_new = dl_symbol("gtk_adjustment_new"); diff --git a/src/solaris/native/sun/awt/gtk2_interface.h b/src/solaris/native/sun/awt/gtk2_interface.h index c7265bff4..addbc99d6 100644 --- a/src/solaris/native/sun/awt/gtk2_interface.h +++ b/src/solaris/native/sun/awt/gtk2_interface.h @@ -750,7 +750,8 @@ int (*fp_gdk_pixbuf_get_width)(const GdkPixbuf *pixbuf); GdkPixbuf *(*fp_gdk_pixbuf_new_from_file)(const char *filename, GError **error); void (*fp_gtk_widget_destroy)(GtkWidget *widget); void (*fp_gtk_window_present)(GtkWindow *window); - +void (*fp_gtk_window_move)(GtkWindow *window, gint x, gint y); +void (*fp_gtk_window_resize)(GtkWindow *window, gint width, gint height); /** * Function Pointers for GtkFileChooser diff --git a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c index 63addde83..a5bdbec6c 100644 --- a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c +++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.c @@ -102,6 +102,33 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_toFront fp_gdk_threads_leave(); } +/* + * Class: sun_awt_X11_GtkFileDialogPeer + * Method: setBounds + * Signature: (IIIII)V + */ +JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_setBounds +(JNIEnv * env, jobject jpeer, jint x, jint y, jint width, jint height, jint op) +{ + GtkWindow* dialog; + + fp_gdk_threads_enter(); + + dialog = (GtkWindow*)jlong_to_ptr( + (*env)->GetLongField(env, jpeer, widgetFieldID)); + + if (dialog != NULL) { + if (x >= 0 && y >= 0) { + fp_gtk_window_move(dialog, (gint)x, (gint)y); + } + if (width > 0 && height > 0) { + fp_gtk_window_resize(dialog, (gint)width, (gint)height); + } + } + + fp_gdk_threads_leave(); +} + /** * Convert a GSList to an array of filenames (without the parent folder) */ @@ -175,12 +202,12 @@ static void handle_response(GtkWidget* aDialog, gint responseId, gpointer obj) /* * Class: sun_awt_X11_GtkFileDialogPeer * Method: run - * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;Z;)V + * 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, jstring jtitle, jint mode, jstring jdir, jstring jfile, - jobject jfilter, jboolean multiple) + jobject jfilter, jboolean multiple, int x, int y) { GtkWidget *dialog = NULL; GtkFileFilter *filter; @@ -244,6 +271,14 @@ Java_sun_awt_X11_GtkFileDialogPeer_run(JNIEnv * env, jobject jpeer, dialog), TRUE); } + /* Set the initial location */ + if (x >= 0 && y >= 0) { + fp_gtk_window_move((GtkWindow*)dialog, (gint)x, (gint)y); + + // NOTE: it doesn't set the initial size for the file chooser + // as it seems like the file chooser overrides the size internally + } + fp_g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK( handle_response), jpeer); diff --git a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h index 81ed11ae5..8bdf81549 100644 --- a/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h +++ b/src/solaris/native/sun/awt/sun_awt_X11_GtkFileDialogPeer.h @@ -20,10 +20,10 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_initIDs /* * Class: sun_awt_X11_GtkFileDialogPeer * Method: run - * Signature: (Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/io/FilenameFilter;Z;)V + * 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 *, jobject, jstring, jint, jstring, jstring, jobject, jboolean); +(JNIEnv *, jobject, jstring, jint, jstring, jstring, jobject, jboolean, jint, jint); /* * Class: sun_awt_X11_GtkFileDialogPeer @@ -41,6 +41,14 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_quit JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_toFront (JNIEnv *, jobject); +/* + * Class: sun_awt_X11_GtkFileDialogPeer + * Method: setBounds + * Signature: (IIIII)V + */ +JNIEXPORT void JNICALL Java_sun_awt_X11_GtkFileDialogPeer_setBounds +(JNIEnv * env, jobject jpeer, jint x, jint y, jint width, jint height, jint op); + #ifdef __cplusplus } #endif -- GitLab