diff --git a/libjava/ChangeLog b/libjava/ChangeLog index dee9617a4f9..7954a43ebc3 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,33 @@ +2003-09-19 Thomas Fitzsimmons + + * gnu/java/awt/peer/gtk/GtkDialogPeer.java (create()): Create a + top-level GTK window. + (getArgs): Add "title" property. + * gnu/java/awt/peer/gtk/GtkWindowPeer.java (setResizable): Use + "allow_shrink" and "allow_grow" properties. + * java/awt/Dialog.java: Initialize resizable to true and change + comments accordingly. Initialize visible to false in + constructors. + * java/awt/Frame.java (dispose): Remove method. + * java/awt/Window.java (ownedWindows): New field. + (Window(Window,GraphicsConfiguration)): Add a weak reference to + owner's ownedWindows vector. + (finalize): Remove method. + (hide): Hide owned windows. + (dispose): Dispose of owned windows. + (getOwnedWindows): Implement. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Remove + unused GtkArg code. + (set(String,boolean)): Clamp gboolean parameter to g_object_set + to TRUE or FALSE. + * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c + (create): Set window's size requisition. + (connectHooks): Fix indentation. + (setResizable): Remove function. + (static setBounds): Likewise. + (setBounds): Replace call to setBounds with GTK size requisition + and resize calls. + 2003-09-19 Mohan Embar * win32-threads.cc: (ensure_interrupt_event_initialized) New diff --git a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java index b5ea4b0158f..8c0f5ee510f 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java @@ -53,7 +53,7 @@ public class GtkDialogPeer extends GtkWindowPeer void create () { - create (GTK_WINDOW_POPUP, + create (GTK_WINDOW_TOPLEVEL, awtComponent.getWidth(), awtComponent.getHeight()); } @@ -64,6 +64,7 @@ public class GtkDialogPeer extends GtkWindowPeer Dialog dialog = (Dialog) component; + args.add ("title", dialog.getTitle ()); args.add ("modal", dialog.isModal ()); args.add ("allow_shrink", dialog.isResizable ()); args.add ("allow_grow", dialog.isResizable ()); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java index 2f598cb84da..043c08276db 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -84,6 +84,7 @@ public class GtkFramePeer extends GtkWindowPeer args.add ("allow_shrink", frame.isResizable ()); args.add ("allow_grow", frame.isResizable ()); } + public void setIconImage (Image image) { /* TODO: Waiting on Toolkit Image routines */ diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 7451947b7db..08b2bf67e90 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -53,7 +53,9 @@ public class GtkWindowPeer extends GtkContainerPeer void create (int type) { - create (type, awtComponent.getWidth(), awtComponent.getHeight()); + create (type, + awtComponent.getWidth(), + awtComponent.getHeight()); } void create () @@ -75,7 +77,7 @@ public class GtkWindowPeer extends GtkContainerPeer args.add ("visible", component.isVisible ()); args.add ("sensitive", component.isEnabled ()); } - + native public void toBack (); native public void toFront (); @@ -86,7 +88,11 @@ public class GtkWindowPeer extends GtkContainerPeer set ("title", title); } - native public void setResizable (boolean r); + public void setResizable (boolean resizable) + { + set ("allow_shrink", resizable); + set ("allow_grow", resizable); + } protected void postConfigureEvent (int x, int y, int width, int height, int top, int left, int bottom, int right) diff --git a/libjava/java/awt/Dialog.java b/libjava/java/awt/Dialog.java index aba409812aa..eee8361146a 100644 --- a/libjava/java/awt/Dialog.java +++ b/libjava/java/awt/Dialog.java @@ -70,7 +70,7 @@ private boolean modal; /** * @serial Indicates whether or not this dialog box is resizable. */ -private boolean resizable; +private boolean resizable = true; /** * @serial The title string for this dialog box, which can be @@ -91,7 +91,7 @@ private String title; /** * Initializes a new instance of Dialog with the specified - * parent, that is not resizable and not modal, and which has no title. + * parent, that is resizable and not modal, and which has no title. * * @param parent The parent frame of this dialog box. * @@ -109,7 +109,7 @@ Dialog(Frame parent) /** * Initializes a new instance of Dialog with the specified - * parent and modality, that is not resizable and which has no title. + * parent and modality, that is resizable and which has no title. * * @param parent The parent frame of this dialog box. * @param modal if this dialog box is modal, false @@ -129,7 +129,7 @@ Dialog(Frame parent, boolean modal) /** * Initializes a new instance of Dialog with the specified - * parent, that is not resizable and not modal, and which has the specified + * parent, that is resizable and not modal, and which has the specified * title. * * @param parent The parent frame of this dialog box. @@ -149,7 +149,7 @@ Dialog(Frame parent, String title) /** * Initializes a new instance of Dialog with the specified, - * parent, title, and modality, that is not resizable. + * parent, title, and modality, that is resizable. * * @param parent The parent frame of this dialog box. * @param title The title string for this dialog box. @@ -168,7 +168,7 @@ Dialog(Frame parent, String title, boolean modal) /** * Initializes a new instance of Dialog with the specified, * parent, title, modality and GraphicsConfiguration, - * that is not resizable. + * that is resizable. * * @param parent The parent frame of this dialog box. * @param title The title string for this dialog box. @@ -189,14 +189,14 @@ Dialog (Frame parent, String title, boolean modal, GraphicsConfiguration gc) this.title = title; this.modal = modal; - resizable = false; + visible = false; setLayout(new BorderLayout()); } /** * Initializes a new instance of Dialog with the specified, - * parent, that is not resizable. + * parent, that is resizable. * * @exception IllegalArgumentException If parent is null. This exception is * always thrown when GraphicsEnvironment.isHeadless() returns true. @@ -211,7 +211,7 @@ Dialog (Dialog owner) /** * Initializes a new instance of Dialog with the specified, - * parent and title, that is not resizable. + * parent and title, that is resizable. * * @exception IllegalArgumentException If parent is null. This exception is * always thrown when GraphicsEnvironment.isHeadless() returns true. @@ -226,7 +226,7 @@ Dialog (Dialog owner, String title) /** * Initializes a new instance of Dialog with the specified, - * parent, title and modality, that is not resizable. + * parent, title and modality, that is resizable. * * @exception IllegalArgumentException If parent is null. This exception is * always thrown when GraphicsEnvironment.isHeadless() returns true. @@ -242,7 +242,7 @@ Dialog (Dialog owner, String title, boolean modal) /** * Initializes a new instance of Dialog with the specified, * parent, title, modality and GraphicsConfiguration, - * that is not resizable. + * that is resizable. * * @exception IllegalArgumentException If parent is null, the * GraphicsConfiguration is not a screen device or @@ -255,10 +255,10 @@ Dialog (Dialog parent, String title, boolean modal, GraphicsConfiguration gc) { super (parent, parent.getGraphicsConfiguration ()); - this.modal = modal; this.title = title; - resizable = false; - + this.modal = modal; + visible = false; + setLayout (new BorderLayout ()); } diff --git a/libjava/java/awt/Frame.java b/libjava/java/awt/Frame.java index 1df98322ce7..b6a34272449 100644 --- a/libjava/java/awt/Frame.java +++ b/libjava/java/awt/Frame.java @@ -437,25 +437,6 @@ addNotify() /*************************************************************************/ -/** - * Destroys any resources associated with this frame. This includes - * all components in the frame and all owned toplevel windows. - */ -public void -dispose() -{ - Enumeration e = ownedWindows.elements(); - while(e.hasMoreElements()) - { - Window w = (Window)e.nextElement(); - w.dispose(); - } - - super.dispose(); -} - -/*************************************************************************/ - /** * Returns a debugging string describing this window. * @@ -472,8 +453,6 @@ getFrames() { //Frame[] array = new Frames[frames.size()]; //return frames.toArray(array); - - // see finalize() comment String msg = "FIXME: can't be implemented without weak references"; throw new UnsupportedOperationException(msg); } diff --git a/libjava/java/awt/Window.java b/libjava/java/awt/Window.java index 2f625aa6d81..9f102751230 100644 --- a/libjava/java/awt/Window.java +++ b/libjava/java/awt/Window.java @@ -43,9 +43,13 @@ import java.awt.event.WindowFocusListener; import java.awt.event.WindowListener; import java.awt.event.WindowStateListener; import java.awt.peer.WindowPeer; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.Iterator; import java.util.EventListener; import java.util.Locale; import java.util.ResourceBundle; +import java.util.Vector; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; @@ -69,6 +73,9 @@ public class Window extends Container implements Accessible /** @since 1.4 */ private boolean focusableWindowState = true; + // A list of other top-level windows owned by this window. + private transient Vector ownedWindows = new Vector(); + private transient WindowListener windowListener; private transient WindowFocusListener windowFocusListener; private transient WindowStateListener windowStateListener; @@ -139,11 +146,13 @@ public class Window extends Container implements Accessible if (owner == null) throw new IllegalArgumentException ("owner must not be null"); - this.parent = owner; - - // FIXME: add to owner's "owned window" list - //owner.owned.add(this); // this should be a weak reference - + parent = owner; + + synchronized (owner.ownedWindows) + { + owner.ownedWindows.add(new WeakReference(this)); + } + // FIXME: make this text visible in the window. SecurityManager s = System.getSecurityManager(); if (s != null && ! s.checkTopLevelWindow(this)) @@ -170,18 +179,6 @@ public class Window extends Container implements Accessible return super.getGraphicsConfigurationImpl(); } - /** - * Disposes of the input methods and context, and removes the WeakReference - * which formerly pointed to this Window from the parent's owned Window list. - * - * @exception Throwable The Exception raised by this method. - */ - protected void finalize() throws Throwable - { - // FIXME: remove from owner's "owned window" list (Weak References) - super.finalize(); - } - /** * Creates the native peer for this window. */ @@ -227,7 +224,23 @@ public class Window extends Container implements Accessible public void hide() { - // FIXME: call hide() on any "owned" children here. + synchronized (ownedWindows) + { + Iterator e = ownedWindows.iterator(); + while(e.hasNext()) + { + Window w = (Window)(((Reference) e.next()).get()); + if (w != null) + w.hide(); + else + // Remove null weak reference from ownedWindows. + // Unfortunately this can't be done in the Window's + // finalize method because there is no way to guarantee + // synchronous access to ownedWindows there. + e.remove(); + } + } + super.hide(); } @@ -239,15 +252,26 @@ public class Window extends Container implements Accessible } /** - * Called to free any resource associated with this window. + * Destroys any resources associated with this window. This includes + * all components in the window and all owned top-level windows. */ public void dispose() { hide(); - Window[] list = getOwnedWindows(); - for (int i=0; iGetStringUTFChars (env, jname, NULL); value = (*env)->GetStringUTFChars (env, jvalue, NULL); - arg.type = GTK_TYPE_STRING; - arg.name = (char *) name; - GTK_VALUE_STRING (arg) = (char *) value; gdk_threads_enter(); g_object_set(ptr, name, value, NULL); gdk_threads_leave(); @@ -512,20 +508,20 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_S } JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Z - (JNIEnv *env, jobject obj, jstring jname, jboolean value) + (JNIEnv *env, jobject obj, jstring jname, jboolean jvalue) { const char *name; + gboolean value; void *ptr; - GtkArg arg; ptr = NSA_GET_PTR (env, obj); + name = (*env)->GetStringUTFChars (env, jname, NULL); + /* Apparently a jboolean can have a value greater than 1. gboolean + variables may only contain the value TRUE or FALSE. */ + value = jvalue ? TRUE : FALSE; - arg.type = GTK_TYPE_BOOL; - arg.name = (char *) name; - GTK_VALUE_BOOL (arg) = value; - - gdk_threads_enter(); + gdk_threads_enter(); g_object_set(ptr, name, value, NULL); gdk_threads_leave(); @@ -537,15 +533,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_la { const char *name; void *ptr; - GtkArg arg; ptr = NSA_GET_PTR (env, obj); name = (*env)->GetStringUTFChars (env, jname, NULL); - arg.type = GTK_TYPE_INT; - arg.name = (char *) name; - GTK_VALUE_INT (arg) = value; - gdk_threads_enter(); g_object_set(ptr, name, value, NULL); gdk_threads_leave(); @@ -558,15 +549,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_la { const char *name; void *ptr; - GtkArg arg; ptr = NSA_GET_PTR (env, obj); name = (*env)->GetStringUTFChars (env, jname, NULL); - arg.type = GTK_TYPE_FLOAT; - arg.name = (char *) name; - GTK_VALUE_FLOAT (arg) = value; - gdk_threads_enter(); g_object_set(ptr, name, value, NULL); gdk_threads_leave(); @@ -580,7 +566,6 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_O { const char *name; void *ptr1, *ptr2; - GtkArg arg; ptr1 = NSA_GET_PTR (env, obj1); ptr2 = NSA_GET_PTR (env, obj2); @@ -598,10 +583,6 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_O return; } - arg.type = GTK_TYPE_OBJECT; - arg.name = (char *) name; - GTK_VALUE_OBJECT (arg) = GTK_OBJECT (ptr2); - gdk_threads_enter(); g_object_set(ptr1, name, ptr2, NULL); gdk_threads_leave(); diff --git a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c index 35f7a20f66a..982a5cb6052 100644 --- a/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c +++ b/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c @@ -42,8 +42,6 @@ exception statement from your version. */ #include #include -static void setBounds (GtkWidget *, jint, jint, jint, jint); - /* * Make a new window (any type) */ @@ -60,6 +58,13 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create gtk_window_set_default_size (GTK_WINDOW(window), width, height); + /* We must set this window's size requisition. Otherwise when a + resize is queued (when gtk_widget_queue_resize is called) the + window will snap to its default requisition of 0x0. If we omit + this call, Frames and Dialogs shrink to degenerate 1x1 windows + when their resizable property changes. */ + gtk_widget_set_size_request (window, width, height); + vbox = gtk_vbox_new (0, 0); layout = gtk_layout_new (NULL, NULL); gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0); @@ -88,6 +93,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setVisible gtk_widget_hide (GTK_WIDGET (ptr)); XFlush (GDK_DISPLAY ()); + gdk_threads_leave (); } @@ -102,20 +108,20 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks gdk_threads_enter (); - children = gtk_container_get_children(GTK_CONTAINER(ptr)); - vbox = children->data; + children = gtk_container_get_children(GTK_CONTAINER(ptr)); + vbox = children->data; - if(!GTK_IS_VBOX(vbox)) - { - printf("*** this is not a vbox\n"); - } - children = gtk_container_get_children(GTK_CONTAINER(vbox)); - layout = children->data; + if(!GTK_IS_VBOX(vbox)) + { + printf("*** this is not a vbox\n"); + } + children = gtk_container_get_children(GTK_CONTAINER(vbox)); + layout = children->data; - if(!GTK_IS_LAYOUT(layout)) - { + if(!GTK_IS_LAYOUT(layout)) + { printf("*** widget is not a layout ***"); - } + } gtk_widget_realize (layout); @@ -176,24 +182,6 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setTitle (*env)->ReleaseStringUTFChars (env, title, str); } -/* - * Set a window's resizing policy - */ - -JNIEXPORT void JNICALL -Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setResizable - (JNIEnv *env, jobject obj, jboolean resize) -{ - void *ptr; - - ptr = NSA_GET_PTR (env, obj); - - gdk_threads_enter (); - gtk_window_set_policy (GTK_WINDOW (ptr), resize, resize, 0); - gdk_threads_leave (); -} - - /* * Lower the z-level of a window. */ @@ -230,12 +218,6 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env, gdk_threads_leave (); } -static void -setBounds (GtkWidget *widget, jint x, jint y, jint width, jint height) -{ - gtk_window_resize (GTK_WINDOW(widget), width, height); -} - JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBounds (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height) { @@ -247,7 +229,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBounds gdk_threads_enter (); widget = GTK_WIDGET (ptr); - setBounds (widget, x, y, width, height); + gtk_widget_set_size_request (widget, width, height); + gtk_window_resize (GTK_WINDOW(widget), width, height); gdk_threads_leave (); } @@ -306,7 +289,7 @@ gdk_window_get_root_geometry (GdkWindow *window, gint *depth) { GdkWindow *private; - + g_return_if_fail (window != NULL); private = (GdkWindow*) window;