aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2003-10-02 18:34:56 +0000
committerThomas Fitzsimmons <fitzsim@gcc.gnu.org>2003-10-02 18:34:56 +0000
commitb59b5081384b68e33c1a50ef4d047f95e171c05d (patch)
treead4d3237b7756c048c153b6523f2ac2e1afded13 /libjava/gnu
parent01d28c3ff91870a620f7a5a699e509e103afb8b9 (diff)
downloadgcc-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.java29
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java2
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java15
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java37
-rw-r--r--libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java123
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);
}