diff options
| author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2003-10-02 18:39:53 +0000 |
|---|---|---|
| committer | Thomas Fitzsimmons <fitzsim@redhat.com> | 2003-10-02 18:39:53 +0000 |
| commit | c19fd095e8880641285bd34b0f88f232a55c0fd5 (patch) | |
| tree | 7fa4273a6e8ad837dfc3084c3c59f768c0accbad /gnu/java/awt/peer/gtk/GtkWindowPeer.java | |
| parent | 8df86ee4d7af0a6f0db403496d51dc4b61c730e2 (diff) | |
| download | classpath-c19fd095e8880641285bd34b0f88f232a55c0fd5.tar.gz | |
2003-10-02 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkComponentPeer.java (insets): New
field.
(initializeInsets): New method.
(GtkComponentPeer): Call initializeInsets. Call setCursor and
setBounds unconditionally.
(setBounds): Convert coordinates if parent is a Window.
* gnu/java/awt/peer/gtk/GtkContainerPeer.java (insets): Move
field to GtkComponentPeer.
(GtkContainerPeer): Don't initialize insets.
* gnu/java/awt/peer/gtk/GtkDialogPeer.java (initializeInsets):
New method.
(create): Call new GtkWindowPeer create method.
* gnu/java/awt/peer/gtk/GtkFramePeer.java (initializeInsets):
New method.
(create): Call new GtkWindowPeer create method.
(setBounds): Remove method.
(postConfigureEvent): Likewise.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java: Replace GTK window
type constants with GDK window type constants.
(create(int,boolean,int,int,GtkWindowPeer)): New method.
(create(int,boolean)): Likewise.
(create()): Call create(int,boolean).
(nativeSetBounds): New native method declaration.
(setBounds): Call native method declaration.
(setSize): New native method declaration.
(setBoundsCallback): Likewise.
(postConfigureEvent): Handle change in insets. Call setSize and
setBoundsCallback methods.
* java/awt/Window.java (Window): Set visible to false.
(setBoundsCallback): New method.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(gtkWidgetGetLocationOnScreen): If this component is not a
container, adjust the location returned based on the peer's
allocation.
(set(String,boolean)): Revert change from 2003-09-19.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
(awt_event_handler): Fix inset calculation.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c: Add JNI
glue for Window.setBoundsCallback.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (create):
Set up stacking order, window decorations and window manager
hints.
(setBoundsCallback): New method.
(setSize): New method.
(nativeSetBounds): New method.
* jni/gtk-peer/gtkpeer.h: Declare setBoundsCallbackID.
Diffstat (limited to 'gnu/java/awt/peer/gtk/GtkWindowPeer.java')
| -rw-r--r-- | gnu/java/awt/peer/gtk/GtkWindowPeer.java | 123 |
1 files changed, 96 insertions, 27 deletions
diff --git a/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 08b2bf67e..be6150425 100644 --- a/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -40,29 +40,43 @@ package gnu.java.awt.peer.gtk; import java.awt.Component; import java.awt.Dimension; +import java.awt.Insets; import java.awt.Window; import java.awt.peer.WindowPeer; public class GtkWindowPeer extends GtkContainerPeer implements WindowPeer { - static protected final int GTK_WINDOW_TOPLEVEL = 0; - static protected final int GTK_WINDOW_POPUP = 1; - - native void create (int type, int width, int height); - - void create (int type) + static protected final int GDK_WINDOW_TYPE_HINT_NORMAL = 0; + static protected final int GDK_WINDOW_TYPE_HINT_DIALOG = 1; + static protected final int GDK_WINDOW_TYPE_HINT_MENU = 2; + static protected final int GDK_WINDOW_TYPE_HINT_TOOLBAR = 3; + static protected final int GDK_WINDOW_TYPE_HINT_SPLASHSCREEN = 4; + static protected final int GDK_WINDOW_TYPE_HINT_UTILITY = 5; + static protected final int GDK_WINDOW_TYPE_HINT_DOCK = 6; + static protected final int GDK_WINDOW_TYPE_HINT_DESKTOP = 7; + + native void create (int type, boolean decorated, + int width, int height, + GtkWindowPeer parent); + + void create (int type, boolean decorated) { - create (type, + GtkWindowPeer parent_peer = null; + Component parent = awtComponent.getParent(); + if (parent != null) + parent_peer = (GtkWindowPeer) awtComponent.getParent().getPeer(); + + create (type, decorated, awtComponent.getWidth(), - awtComponent.getHeight()); + awtComponent.getHeight(), + parent_peer); } void create () { - create (GTK_WINDOW_POPUP, - awtComponent.getWidth(), - awtComponent.getHeight()); + // Create a normal undecorated window. + create (GDK_WINDOW_TYPE_HINT_NORMAL, false); } native void connectHooks (); @@ -81,7 +95,14 @@ public class GtkWindowPeer extends GtkContainerPeer native public void toBack (); native public void toFront (); - native public void setBounds (int x, int y, int width, int height); + native void nativeSetBounds (int x, int y, int width, int height); + + public void setBounds (int x, int y, int width, int height) + { + nativeSetBounds (x, y, + width - insets.left - insets.right, + height - insets.top - insets.bottom); + } public void setTitle (String title) { @@ -90,34 +111,82 @@ public class GtkWindowPeer extends GtkContainerPeer public void setResizable (boolean resizable) { + // Call setSize; otherwise when resizable is changed from true to + // false the window will shrink to the dimensions it had before it + // was resizable. + setSize (awtComponent.getWidth() - insets.left - insets.right, + awtComponent.getHeight() - insets.top - insets.bottom); set ("allow_shrink", resizable); set ("allow_grow", resizable); } + native void setSize (int width, int height); + native void setBoundsCallback (Window window, + int x, int y, + int width, int height); + protected void postConfigureEvent (int x, int y, int width, int height, int top, int left, int bottom, int right) { - /* - If our borders change (which often happens when we opaque resize), - we need to make sure that a new layout will happen, since Sun - forgets to handle this case. - */ + // Configure events tell us the location and dimensions of the + // window within the frame borders, and the dimensions of the + // frame borders (top, left, bottom, right). + + // If our borders change we need to make sure that a new layout + // will happen, since Sun forgets to handle this case. if (insets.top != top || insets.left != left || insets.bottom != bottom || insets.right != right) { - awtComponent.invalidate (); + // When our insets change, we receive a configure event with + // the new insets, the old window location and the old window + // dimensions. We update our Window object's location and + // size using our old inset values. + setBoundsCallback ((Window) awtComponent, + x - insets.left, + y - insets.top, + width + insets.left + insets.right, + height + insets.top + insets.bottom); + + // The peer's dimensions do not get updated automatically when + // insets change so we need to do it manually. + setSize (width + (insets.left - left) + (insets.right - right), + height + (insets.top - top) + (insets.bottom - bottom)); + + insets.top = top; + insets.left = left; + insets.bottom = bottom; + insets.right = right; + + awtComponent.validate(); + } + else + { + int frame_x = x - insets.left; + int frame_y = y - insets.top; + int frame_width = width + insets.left + insets.right; + int frame_height = height + insets.top + insets.bottom; + + if (frame_x != awtComponent.getX() + || frame_y != awtComponent.getY() + || frame_width != awtComponent.getWidth() + || frame_height != awtComponent.getHeight()) + { + setBoundsCallback ((Window) awtComponent, + frame_x, + frame_y, + frame_width, + frame_height); + + if (frame_width != awtComponent.getWidth() + || frame_height != awtComponent.getHeight()) + setSize (width, height); + + awtComponent.validate(); + } } - - insets.top = top; - insets.left = left; - insets.bottom = bottom; - insets.right = right; - - awtComponent.setBounds (x, y, width, height); - awtComponent.validate (); } - + native public void setVisible (boolean b); } |
