diff options
author | Thomas Fitzsimmons <fitzsim@redhat.com> | 2003-10-02 18:34:56 +0000 |
---|---|---|
committer | Thomas Fitzsimmons <fitzsim@gcc.gnu.org> | 2003-10-02 18:34:56 +0000 |
commit | b59b5081384b68e33c1a50ef4d047f95e171c05d (patch) | |
tree | ad4d3237b7756c048c153b6523f2ac2e1afded13 /libjava/gnu | |
parent | 01d28c3ff91870a620f7a5a699e509e103afb8b9 (diff) | |
download | gcc-b59b5081384b68e33c1a50ef4d047f95e171c05d.zip gcc-b59b5081384b68e33c1a50ef4d047f95e171c05d.tar.gz gcc-b59b5081384b68e33c1a50ef4d047f95e171c05d.tar.bz2 |
GtkComponentPeer.java (insets): New field.
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.
From-SVN: r72043
Diffstat (limited to 'libjava/gnu')
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java | 29 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java | 2 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java | 15 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java | 37 | ||||
-rw-r--r-- | libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java | 123 |
5 files changed, 140 insertions, 66 deletions
diff --git a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java index ac092c8..0f97d53 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -72,6 +72,8 @@ public class GtkComponentPeer extends GtkGenericPeer { Component awtComponent; + Insets insets; + /* this isEnabled differs from Component.isEnabled, in that it knows if a parent is disabled. In that case Component.isEnabled may return true, but our isEnabled will always return false */ @@ -90,6 +92,11 @@ public class GtkComponentPeer extends GtkGenericPeer throw new RuntimeException (); } + void initializeInsets () + { + insets = new Insets (0, 0, 0, 0); + } + native void connectHooks (); protected GtkComponentPeer (Component awtComponent) @@ -115,13 +122,13 @@ public class GtkComponentPeer extends GtkGenericPeer // c.setFont (cp.getFont ()); if (awtComponent.getFont() != null) setFont(awtComponent.getFont()); - - if (! (awtComponent instanceof Window)) - { - setCursor (awtComponent.getCursor ()); - Rectangle bounds = awtComponent.getBounds (); - setBounds (bounds.x, bounds.y, bounds.width, bounds.height); - } + + initializeInsets (); + + setCursor (awtComponent.getCursor ()); + Rectangle bounds = awtComponent.getBounds (); + setBounds (bounds.x, bounds.y, bounds.width, bounds.height); + } catch (RuntimeException ex) { ; } } @@ -278,11 +285,11 @@ public class GtkComponentPeer extends GtkGenericPeer { Component parent = awtComponent.getParent (); - if (parent instanceof Frame) + if (parent instanceof Window) { - Insets insets = ((Frame)parent).getInsets (); - /* convert Java's coordinate space into GTK+'s coordinate space */ - setNativeBounds (x-insets.left, y-insets.top, width, height); + Insets insets = ((Window) parent).getInsets (); + // Convert from Java coordinates to GTK coordinates. + setNativeBounds (x - insets.left, y - insets.top, width, height); } else setNativeBounds (x, y, width, height); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java index 7e2c549..5225ccc 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java @@ -48,14 +48,12 @@ import java.awt.peer.ContainerPeer; public class GtkContainerPeer extends GtkComponentPeer implements ContainerPeer { - Insets insets; Container c; public GtkContainerPeer(Container c) { super (c); this.c = c; - insets = new Insets (0, 0, 0, 0); } public void beginValidate() diff --git a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java index 8c0f5ee..e7b047e 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java @@ -41,6 +41,7 @@ package gnu.java.awt.peer.gtk; import java.awt.AWTEvent; import java.awt.Component; import java.awt.Dialog; +import java.awt.Insets; import java.awt.peer.DialogPeer; public class GtkDialogPeer extends GtkWindowPeer @@ -51,11 +52,19 @@ public class GtkDialogPeer extends GtkWindowPeer super (dialog); } + void initializeInsets () + { + // Unfortunately, X does not provide a clean way to calculate the + // dimensions of a dialog's borders before it has been displayed. + // So we guess and then fix the dimensions upon receipt of the + // first configure event. + insets = new Insets (20, 6, 6, 6); + } + void create () { - create (GTK_WINDOW_TOPLEVEL, - awtComponent.getWidth(), - awtComponent.getHeight()); + // Create a decorated dialog window. + create (GDK_WINDOW_TYPE_HINT_DIALOG, true); } public void getArgs (Component component, GtkArgList args) diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java index 043c082..b44a02d 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -42,6 +42,7 @@ import java.awt.Component; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; +import java.awt.Insets; import java.awt.MenuBar; import java.awt.Rectangle; import java.awt.event.PaintEvent; @@ -69,9 +70,19 @@ public class GtkFramePeer extends GtkWindowPeer super (frame); } + void initializeInsets () + { + // Unfortunately, X does not provide a clean way to calculate the + // dimensions of a frame's borders before it has been displayed. + // So we guess and then fix the dimensions upon receipt of the + // first configure event. + insets = new Insets (20, 6, 6, 6); + } + void create () { - create (GTK_WINDOW_TOPLEVEL); + // Create a normal decorated window. + create (GDK_WINDOW_TYPE_HINT_NORMAL, true); } public void getArgs (Component component, GtkArgList args) @@ -97,26 +108,8 @@ public class GtkFramePeer extends GtkWindowPeer return g; } - public void setBounds (int x, int y, int width, int height) - { - super.setBounds (0, 0, width - insets.left - insets.right, - height - insets.top - insets.bottom + menuBarHeight); - } - - protected void postConfigureEvent (int x, int y, int width, int height, - int top, int left, int bottom, int right) - { - if (((Frame)awtComponent).getMenuBar () != null) - { - menuBarHeight = getMenuBarHeight (); - top += menuBarHeight; - } - - super.postConfigureEvent (0, 0, - width + left + right, - height + top + bottom - menuBarHeight, - top, left, bottom, right); - } + // FIXME: When MenuBars work, override postConfigureEvent and + // setBounds to account for MenuBar dimensions. protected void postMouseEvent(int id, long when, int mods, int x, int y, int clickCount, boolean popupTrigger) @@ -128,8 +121,6 @@ public class GtkFramePeer extends GtkWindowPeer protected void postExposeEvent (int x, int y, int width, int height) { -// System.out.println ("x + insets.left:" + (x + insets.left)); -// System.out.println ("y + insets.top :" + (y + insets.top)); q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, new Rectangle (x + insets.left, y + insets.top, diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index 08b2bf6..be61504 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/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); } |