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
This commit is contained in:
parent
01d28c3ff9
commit
b59b508138
12 changed files with 316 additions and 107 deletions
|
@ -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);
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
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, int width, int height);
|
||||
native void create (int type, boolean decorated,
|
||||
int width, int height,
|
||||
GtkWindowPeer parent);
|
||||
|
||||
void create (int type)
|
||||
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 ();
|
||||
}
|
||||
|
||||
insets.top = top;
|
||||
insets.left = left;
|
||||
insets.bottom = bottom;
|
||||
insets.right = right;
|
||||
// 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);
|
||||
|
||||
awtComponent.setBounds (x, y, width, height);
|
||||
awtComponent.validate ();
|
||||
// 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
native public void setVisible (boolean b);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue