This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui][PATCH] Fix layout order of GTK peers
- From: Thomas Fitzsimmons <fitzsim at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Thu, 07 Oct 2004 18:26:22 -0400
- Subject: [gui][PATCH] Fix layout order of GTK peers
Hi,
I committed this patch to java-gui-branch. It eliminates
force-realization of widgets (calls to gtk_widget_realize) instead
leaving realization to GTK. This change was needed to fix a problem
with how we were laying out components when adding a container to an
already-visible parent container.
Before this patch we were first setting each widget's size to 1x1,
showing it, and then sizing and positioning it properly. This resulted
in many spurious 1x1 pixel paint events being delivered and was
inefficient.
With this patch, we build up widget hierarchies from the bottom up,
properly sizing and positioning widgets before they're shown. Then we
add the child container in one step. This eliminates all the unneeded
paint events.
Tom
2004-10-07 Thomas Fitzsimmons <fitzsim@redhat.com>
* javax/swing/JList.java (init): Revert accidental commit.
* gnu/java/awt/peer/gtk/GdkGraphics.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c (GdkGraphics):
Call initComponentGraphics or connectSignals depending on
component's realization status.
(realize_cb): New function.
(initComponentGraphics): New method.
(connectSignals): New method.
(clipRect): Return immediately if component is not realized.
(setClip): Likewise.
(translate): Likewise.
(drawImage variants): Return false immediately if component is
not realized.
* gnu/java/awt/peer/gtk/GdkGraphics2D.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
(connectSignals): New method.
(GdkGraphics2D): Call initComponentGraphics2D or connectSignals
depending on component's realization status. Move other
initialization calls to ...
(initComponentGraphics2D): New method.
(realize_cb): New function.
(cairoSetMatrix): Return immediately if gr is NULL.
(cairoNewPath): Likewise.
(cairoRectangle): Likewise.
(cairoClip): Likewise.
* gnu/java/awt/peer/gtk/GtkComponentPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
(gtkWidgetRepaintArea): Remove method.
(isRealized): New method.
(GtkComponentPeer): Move setParent, connectJObject and setCursor
calls to setParentAndBounds. Call setParentAndBounds.
(setParentAndBounds): New method.
(setComponentBounds): Return immediately if bounds are all zero.
(repaint): Remove call to gtkWidgetRepaintArea. Return
immediately if requested paint region is 0x0.
(setCursor): New method.
(gtkWidgetSetParent): Only set widget's parent if its parent is
currently NULL.
(setNativeBounds): Only set widget's bounds if it has a parent.
(connectSignals): Don't call gtk_widget_realize. Connect
"realize" signal to connect_awt_hook_cb handler.
* gnu/java/awt/peer/gtk/GtkContainerPeer.java (isValidating):
New field.
(beginValidate): Set isValidating true.
(endValidate): Set parents and bounds for children first, then
for this. Set isValidating false.
* gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
(connectJObject): Remove method.
(connectSignals): Don't call gtk_widget_realize.
* gnu/java/awt/peer/gtk/GtkListPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
(connectJObject): Remove method.
(connectSignals): Don't call gtk_widget_realize.
* gnu/java/awt/peer/gtk/GtkPanelPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
(connectJObject): Remove method.
* gnu/java/awt/peer/gtk/GtkScrollbarPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
(connectJObject): Remove method.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java,
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(create): Don't call gtk_widget_realize.
(connectJObject): Remove method.
(connectSignals): Don't call gtk_widget_realize. Connect
"realize" signal to connect_awt_hook_cb handler.
(nativeSetBounds): Don't attempt to move GDK window if it is
NULL.
* java/awt/Container.java (addImpl): Don't call comp.addNotify
if peer is not null.
(validateTree): Create peers for all children before calling
doLayout.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
(connectSignals): Don't call gtk_widget_realize.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
(connect_awt_hook_cb): New function.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
(initComponentGraphicsID): New variable.
(initComponentGraphics2DID): Likewise.
(setCursorID): Likewise.
(gtkInit): Initialize new fields with method IDs.
* jni/gtk-peer/gtkpeer.h (initComponentGraphicsID): Declare
extern.
(initComponentGraphics2DID): Declare extern.
(setCursorID): Likewise.
(connect_awt_hook_cb): Declare function.
Index: gnu/java/awt/peer/gtk/GdkGraphics.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java,v
retrieving revision 1.4.16.9
diff -u -r1.4.16.9 GdkGraphics.java
--- gnu/java/awt/peer/gtk/GdkGraphics.java 4 Oct 2004 16:45:46 -0000 1.4.16.9
+++ gnu/java/awt/peer/gtk/GdkGraphics.java 7 Oct 2004 22:08:18 -0000
@@ -90,17 +90,31 @@
GdkGraphics (GtkComponentPeer component)
{
this.component = component;
+ font = component.awtComponent.getFont ();
+
+ if (component.isRealized ())
+ initComponentGraphics ();
+ else
+ connectSignals (component);
+ }
+
+ void initComponentGraphics ()
+ {
initState (component);
color = component.awtComponent.getForeground ();
- font = component.awtComponent.getFont ();
Dimension d = component.awtComponent.getSize ();
clip = new Rectangle (0, 0, d.width, d.height);
}
+ native void connectSignals (GtkComponentPeer component);
+
public native void clearRect (int x, int y, int width, int height);
public void clipRect (int x, int y, int width, int height)
{
+ if (component != null && ! component.isRealized ())
+ return;
+
clip = clip.intersection (new Rectangle (x, y, width, height));
setClipRectangle (clip.x, clip.y, clip.width, clip.height);
}
@@ -133,6 +147,9 @@
public boolean drawImage (Image img, int x, int y,
Color bgcolor, ImageObserver observer)
{
+ if (component != null && ! component.isRealized ())
+ return false;
+
if (img instanceof GtkOffScreenImage)
{
copyPixmap (img.getGraphics (),
@@ -147,6 +164,9 @@
public boolean drawImage (Image img, int x, int y, ImageObserver observer)
{
+ if (component != null && ! component.isRealized ())
+ return false;
+
if (img instanceof GtkOffScreenImage)
{
copyPixmap (img.getGraphics (),
@@ -163,6 +183,9 @@
public boolean drawImage (Image img, int x, int y, int width, int height,
Color bgcolor, ImageObserver observer)
{
+ if (component != null && ! component.isRealized ())
+ return false;
+
if (img instanceof GtkOffScreenImage)
{
copyAndScalePixmap (img.getGraphics (), false, false,
@@ -179,6 +202,9 @@
public boolean drawImage (Image img, int x, int y, int width, int height,
ImageObserver observer)
{
+ if (component != null && ! component.isRealized ())
+ return false;
+
if (component != null)
return drawImage (img, x, y, width, height, component.getBackground (),
observer);
@@ -191,6 +217,9 @@
int sx1, int sy1, int sx2, int sy2,
Color bgcolor, ImageObserver observer)
{
+ if (component != null && ! component.isRealized ())
+ return false;
+
if (img instanceof GtkOffScreenImage)
{
int dx_start, dy_start, d_width, d_height;
@@ -259,6 +288,9 @@
int sx1, int sy1, int sx2, int sy2,
ImageObserver observer)
{
+ if (component != null && ! component.isRealized ())
+ return false;
+
if (component != null)
return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,
component.getBackground (), observer);
@@ -377,6 +409,9 @@
public void setClip (int x, int y, int width, int height)
{
+ if (component != null && ! component.isRealized ())
+ return;
+
clip.x = x;
clip.y = y;
clip.width = width;
@@ -441,6 +476,9 @@
public void translate (int x, int y)
{
+ if (component != null && ! component.isRealized ())
+ return;
+
clip.x -= x;
clip.y -= y;
Index: gnu/java/awt/peer/gtk/GdkGraphics2D.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java,v
retrieving revision 1.7.2.18
diff -u -r1.7.2.18 GdkGraphics2D.java
--- gnu/java/awt/peer/gtk/GdkGraphics2D.java 7 Oct 2004 07:20:31 -0000 1.7.2.18
+++ gnu/java/awt/peer/gtk/GdkGraphics2D.java 7 Oct 2004 22:08:18 -0000
@@ -134,6 +134,7 @@
native public void dispose ();
native private int[] getImagePixels();
native private void cairoSurfaceSetFilter(int filter);
+ native void connectSignals (GtkComponentPeer component);
public void finalize ()
{
@@ -209,12 +210,22 @@
GdkGraphics2D (GtkComponentPeer component)
{
this.component = component;
+
+ setFont (new Font("SansSerif", Font.PLAIN, 12));
+
+ if (component.isRealized ())
+ initComponentGraphics2D ();
+ else
+ connectSignals (component);
+ }
+
+ void initComponentGraphics2D ()
+ {
initState (component);
setColor (component.awtComponent.getForeground ());
setBackground (component.awtComponent.getBackground ());
setPaint (getColor());
- setFont (new Font("SansSerif", Font.PLAIN, 12));
setTransform (new AffineTransform ());
setStroke (new BasicStroke ());
setRenderingHints (getDefaultHints());
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.16.2.20
diff -u -r1.16.2.20 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 4 Oct 2004 16:45:47 -0000 1.16.2.20
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 7 Oct 2004 22:08:18 -0000
@@ -99,7 +99,8 @@
native void gtkWidgetRequestFocus ();
native void gtkWidgetDispatchKeyEvent (int id, long when, int mods,
int keyCode, int keyLocation);
- native void gtkWidgetRepaintArea(int x, int y, int width, int height);
+
+ native boolean isRealized ();
void create ()
{
@@ -117,9 +118,6 @@
create ();
- setParent ();
-
- connectJObject ();
connectSignals ();
if (awtComponent.getForeground () != null)
@@ -129,7 +127,19 @@
if (awtComponent.getFont() != null)
setFont(awtComponent.getFont());
- setCursor (awtComponent.getCursor ());
+ Component parent = awtComponent.getParent ();
+
+ // Only set our parent on the GTK side if our parent on the AWT
+ // side is not showing. Otherwise the gtk peer will be shown
+ // before we've had a chance to position and size it properly.
+ if (awtComponent instanceof Window
+ || (parent != null && ! parent.isShowing ()))
+ setParentAndBounds ();
+ }
+
+ void setParentAndBounds ()
+ {
+ setParent ();
setComponentBounds ();
@@ -171,6 +181,11 @@
void setComponentBounds ()
{
Rectangle bounds = awtComponent.getBounds ();
+
+ if (bounds.x == 0 && bounds.y == 0
+ && bounds.width == 0 && bounds.height == 0)
+ return;
+
setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
}
@@ -365,9 +380,9 @@
public void repaint (long tm, int x, int y, int width, int height)
{
- beginNativeRepaint ();
- gtkWidgetRepaintArea (x, y, width, height);
- endNativeRepaint ();
+ if (x == 0 && y == 0 && width == 0 && height == 0)
+ return;
+
q.postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE,
new Rectangle (x, y, width, height)));
}
@@ -436,6 +451,11 @@
setNativeBounds (x, y, width, height);
}
+ void setCursor ()
+ {
+ setCursor (awtComponent.getCursor ());
+ }
+
public void setCursor (Cursor cursor)
{
gtkWidgetSetCursor (cursor.getType ());
Index: gnu/java/awt/peer/gtk/GtkContainerPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java,v
retrieving revision 1.8.2.4
diff -u -r1.8.2.4 GtkContainerPeer.java
--- gnu/java/awt/peer/gtk/GtkContainerPeer.java 6 Jul 2004 14:55:50 -0000 1.8.2.4
+++ gnu/java/awt/peer/gtk/GtkContainerPeer.java 7 Oct 2004 22:08:18 -0000
@@ -45,13 +45,16 @@
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Insets;
+import java.awt.Window;
import java.awt.event.PaintEvent;
+import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
public class GtkContainerPeer extends GtkComponentPeer
implements ContainerPeer
{
Container c;
+ boolean isValidating;
public GtkContainerPeer(Container c)
{
@@ -59,22 +62,36 @@
this.c = c;
}
- public void beginValidate()
+ public void beginValidate ()
{
+ isValidating = true;
}
- public void endValidate()
+ public void endValidate ()
{
-// q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT,
-// new Rectangle (x, y, width, height)));
-// Graphics gc = getGraphics ();
-// if (gc != null)
-// {
-// awtComponent.update (gc);
-// gc.dispose ();
-// }
-// System.out.println ("got here");
-// awtComponent.repaint ();
+ Component parent = awtComponent.getParent ();
+
+ // Only set our parent on the GTK side if our parent on the AWT
+ // side is not showing. Otherwise the gtk peer will be shown
+ // before we've had a chance to position and size it properly.
+ if (parent != null && parent.isShowing ())
+ {
+ Component[] components = ((Container) awtComponent).getComponents ();
+ int ncomponents = components.length;
+
+ for (int i = 0; i < ncomponents; i++)
+ {
+ ComponentPeer peer = components[i].getPeer ();
+
+ // Skip lightweight peers.
+ if (peer instanceof GtkComponentPeer)
+ ((GtkComponentPeer) peer).setParentAndBounds ();
+ }
+
+ setParentAndBounds ();
+ }
+
+ isValidating = false;
}
public Insets getInsets()
Index: gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,v
retrieving revision 1.6.4.5
diff -u -r1.6.4.5 GtkFileDialogPeer.java
--- gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 7 Oct 2004 07:20:31 -0000 1.6.4.5
+++ gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 7 Oct 2004 22:08:18 -0000
@@ -57,7 +57,6 @@
private FilenameFilter filter;
native void create (GtkContainerPeer parent);
- native void connectJObject ();
native void connectSignals ();
native void nativeSetFile (String file);
native public String nativeGetDirectory();
Index: gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.7.2.6
diff -u -r1.7.2.6 GtkListPeer.java
--- gnu/java/awt/peer/gtk/GtkListPeer.java 7 Oct 2004 07:20:31 -0000 1.7.2.6
+++ gnu/java/awt/peer/gtk/GtkListPeer.java 7 Oct 2004 22:08:18 -0000
@@ -58,7 +58,6 @@
}
native void create (int rows);
- native void connectJObject ();
native void connectSignals ();
native void gtkWidgetModifyFont (String name, int style, int size);
native void gtkWidgetRequestFocus ();
Index: gnu/java/awt/peer/gtk/GtkPanelPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java,v
retrieving revision 1.3.8.2
diff -u -r1.3.8.2 GtkPanelPeer.java
--- gnu/java/awt/peer/gtk/GtkPanelPeer.java 10 Jul 2004 05:15:40 -0000 1.3.8.2
+++ gnu/java/awt/peer/gtk/GtkPanelPeer.java 7 Oct 2004 22:08:18 -0000
@@ -47,7 +47,6 @@
implements PanelPeer
{
native void create ();
- native void connectJObject ();
public GtkPanelPeer (Panel p)
{
Index: gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java,v
retrieving revision 1.3
diff -u -r1.3 GtkScrollbarPeer.java
--- gnu/java/awt/peer/gtk/GtkScrollbarPeer.java 11 Dec 2003 13:50:50 -0000 1.3
+++ gnu/java/awt/peer/gtk/GtkScrollbarPeer.java 7 Oct 2004 22:08:18 -0000
@@ -60,7 +60,6 @@
int min, int max, int stepIncr, int pageIncr,
int visibleAmount);
- native void connectJObject ();
native void connectSignals ();
public GtkScrollbarPeer (Scrollbar s)
Index: gnu/java/awt/peer/gtk/GtkWindowPeer.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java,v
retrieving revision 1.10.8.2
diff -u -r1.10.8.2 GtkWindowPeer.java
--- gnu/java/awt/peer/gtk/GtkWindowPeer.java 7 Oct 2004 07:20:31 -0000 1.10.8.2
+++ gnu/java/awt/peer/gtk/GtkWindowPeer.java 7 Oct 2004 22:08:18 -0000
@@ -106,7 +106,6 @@
{
}
- native void connectJObject ();
native void connectSignals ();
public GtkWindowPeer (Window window)
Index: java/awt/Container.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Container.java,v
retrieving revision 1.34.2.21
diff -u -r1.34.2.21 Container.java
--- java/awt/Container.java 27 Sep 2004 15:14:25 -0000 1.34.2.21
+++ java/awt/Container.java 7 Oct 2004 22:08:18 -0000
@@ -42,6 +42,8 @@
import java.awt.event.ContainerListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
+import java.awt.event.KeyEvent;
+import java.awt.peer.ComponentPeer;
import java.awt.peer.ContainerPeer;
import java.awt.peer.LightweightPeer;
import java.beans.PropertyChangeListener;
@@ -340,8 +342,6 @@
comp.parent = this;
if (peer != null)
{
- comp.addNotify();
-
if (comp.isLightweight ())
{
enableEvents (comp.eventMask);
@@ -555,10 +555,19 @@
cPeer.beginValidate();
}
- doLayout();
for (int i = 0; i < ncomponents; ++i)
{
Component comp = component[i];
+
+ if (comp.getPeer () == null)
+ comp.addNotify();
+ }
+
+ doLayout ();
+ for (int i = 0; i < ncomponents; ++i)
+ {
+ Component comp = component[i];
+
if (! comp.isValid())
{
if (comp instanceof Container)
Index: javax/swing/JList.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/javax/swing/JList.java,v
retrieving revision 1.4.2.8
diff -u -r1.4.2.8 JList.java
--- javax/swing/JList.java 25 Aug 2004 17:52:11 -0000 1.4.2.8
+++ javax/swing/JList.java 7 Oct 2004 22:08:18 -0000
@@ -360,7 +360,9 @@
valueIsAdjusting = false;
visibleRowCount = 8;
- cellRenderer = new DefaultListCellRenderer();
+ System.out.println ("here!");
+ // cellRenderer = new DefaultListCellRenderer();
+ System.out.println ("done here!");
listListener = new ListListener();
setModel(new DefaultListModel());
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c,v
retrieving revision 1.5.2.8
diff -u -r1.5.2.8 gnu_java_awt_peer_gtk_GdkGraphics.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 4 Oct 2004 16:45:49 -0000 1.5.2.8
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics.c 7 Oct 2004 22:08:18 -0000
@@ -46,6 +46,7 @@
GdkPoint *
translate_points (JNIEnv *env, jintArray xpoints, jintArray ypoints,
jint npoints, jint x_offset, jint y_offset);
+static void realize_cb (GtkWidget *widget, jobject peer);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_copyState
(JNIEnv *env, jobject obj, jobject old)
@@ -124,6 +125,23 @@
NSA_SET_PTR (env, obj, g);
}
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GdkGraphics_connectSignals
+ (JNIEnv *env, jobject obj, jobject peer)
+{
+ void *ptr;
+ jobject *gref;
+
+ ptr = NSA_GET_PTR (env, peer);
+
+ gdk_threads_enter ();
+
+ g_signal_connect_after (G_OBJECT (ptr), "realize",
+ G_CALLBACK (realize_cb), obj);
+
+ gdk_threads_leave ();
+}
+
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics_dispose
(JNIEnv *env, jobject obj)
{
@@ -620,3 +638,12 @@
gdk_gc_set_clip_rectangle (g->gc, &rectangle);
gdk_threads_leave ();
}
+
+static void realize_cb (GtkWidget *widget, jobject peer)
+{
+ gdk_threads_leave ();
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphicsID);
+
+ gdk_threads_enter ();
+}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c,v
retrieving revision 1.5.8.10
diff -u -r1.5.8.10 gnu_java_awt_peer_gtk_GdkGraphics2D.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 6 Oct 2004 23:12:16 -0000 1.5.8.10
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 7 Oct 2004 22:08:18 -0000
@@ -315,6 +315,16 @@
gr->debug = (gboolean)(getenv("DEBUGJ2D") != NULL);
}
+static void
+realize_cb (GtkWidget *widget, jobject peer)
+{
+ gdk_threads_leave ();
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer, initComponentGraphics2DID);
+
+ gdk_threads_enter ();
+}
+
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_copyState
(JNIEnv *env, jobject obj, jobject old)
{
@@ -467,6 +477,21 @@
gdk_threads_leave();
}
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_connectSignals
+ (JNIEnv *env, jobject obj, jobject peer)
+{
+ void *ptr;
+
+ ptr = NSA_GET_PTR (env, peer);
+
+ gdk_threads_enter ();
+
+ g_signal_connect_after (G_OBJECT (ptr), "realize",
+ G_CALLBACK (realize_cb), obj);
+
+ gdk_threads_leave ();
+}
+
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_dispose
(JNIEnv *env, jobject obj)
{
@@ -828,7 +853,9 @@
if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
+ /* cairoSetMatrix was called before this graphics object's component
+ was realized. */
+ if (gr == NULL) { gdk_threads_leave (); return; }
native_matrix = (*env)->GetDoubleArrayElements (env, java_matrix, NULL);
g_assert (native_matrix != NULL);
@@ -1518,7 +1545,7 @@
if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
+ if (gr == NULL) { gdk_threads_leave (); return; }
if (gr->debug) printf ("cairo_new_path\n");
cairo_new_path (gr->cr);
gdk_threads_leave();
@@ -1623,7 +1650,7 @@
if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
+ if (gr == NULL) { gdk_threads_leave (); return; }
if (gr->debug) printf ("cairo_rectangle (%f, %f) (%f, %f)\n", x, y, width, height);
cairo_rectangle (gr->cr, x, y, width, height);
gdk_threads_leave();
@@ -1687,7 +1714,7 @@
if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; }
gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj);
- g_assert (gr != NULL);
+ if (gr == NULL) { gdk_threads_leave (); return; }
if (gr->debug) printf ("cairo_clip\n");
begin_drawing_operation (gr);
cairo_init_clip (gr->cr);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.8.2.5
diff -u -r1.8.2.5 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 2 Sep 2004 21:26:26 -0000 1.8.2.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 7 Oct 2004 22:08:18 -0000
@@ -84,7 +84,6 @@
gdk_threads_enter ();
- gtk_widget_realize (GTK_WIDGET (ptr));
button = gtk_bin_get_child (GTK_BIN (ptr));
g_signal_connect (G_OBJECT (ptr), "event",
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.15.2.23
diff -u -r1.15.2.23 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 2 Sep 2004 21:26:26 -0000 1.15.2.23
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 7 Oct 2004 22:08:18 -0000
@@ -490,27 +490,33 @@
widget = GTK_WIDGET (ptr);
parent_widget = GTK_WIDGET (parent_ptr);
- if (GTK_IS_WINDOW (parent_widget))
+ if (widget->parent == NULL)
{
- GList *children = gtk_container_children
- (GTK_CONTAINER (parent_widget));
-
- if (GTK_IS_MENU_BAR (children->data))
- gtk_fixed_put (GTK_FIXED (children->next->data), widget, 0, 0);
+ if (GTK_IS_WINDOW (parent_widget))
+ {
+ GList *children = gtk_container_children
+ (GTK_CONTAINER (parent_widget));
+
+ if (GTK_IS_MENU_BAR (children->data))
+ gtk_fixed_put (GTK_FIXED (children->next->data), widget, 0, 0);
+ else
+ gtk_fixed_put (GTK_FIXED (children->data), widget, 0, 0);
+ }
else
- gtk_fixed_put (GTK_FIXED (children->data), widget, 0, 0);
+ if (GTK_IS_SCROLLED_WINDOW (parent_widget))
+ {
+ gtk_scrolled_window_add_with_viewport
+ (GTK_SCROLLED_WINDOW (parent_widget), widget);
+ gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent),
+ GTK_SHADOW_NONE);
+
+ }
+ else
+ {
+ if (widget->parent == NULL)
+ gtk_fixed_put (GTK_FIXED (parent_widget), widget, 0, 0);
+ }
}
- else
- if (GTK_IS_SCROLLED_WINDOW (parent_widget))
- {
- gtk_scrolled_window_add_with_viewport
- (GTK_SCROLLED_WINDOW (parent_widget), widget);
- gtk_viewport_set_shadow_type (GTK_VIEWPORT (widget->parent),
- GTK_SHADOW_NONE);
-
- }
- else
- gtk_fixed_put (GTK_FIXED (parent_widget), widget, 0, 0);
gdk_threads_leave ();
}
@@ -788,14 +794,19 @@
width = width < 0 ? 0 : width;
height = height < 0 ? 0 : height;
- if (GTK_IS_VIEWPORT (widget->parent))
- gtk_widget_set_size_request (widget, width, height);
- else
+ if (widget->parent != NULL)
{
- gtk_widget_set_size_request (widget, width, height);
- gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y);
+ if (GTK_IS_VIEWPORT (widget->parent))
+ gtk_widget_set_size_request (widget, width, height);
+ else
+ {
+ if (!(width == 0 && height == 0))
+ {
+ gtk_widget_set_size_request (widget, width, height);
+ gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y);
+ }
+ }
}
-
gdk_threads_leave ();
}
@@ -951,55 +962,37 @@
}
JNIEXPORT jboolean JNICALL
-Java_gnu_java_awt_peer_gtk_GtkComponentPeer_modalHasGrab
- (JNIEnv *env __attribute__((unused)), jclass clazz __attribute__((unused)))
-{
- GtkWidget *widget;
- jboolean retval;
-
- gdk_threads_enter ();
- widget = gtk_grab_get_current ();
- retval = (widget && GTK_IS_WINDOW (widget) && GTK_WINDOW (widget)->modal);
- gdk_threads_leave ();
-
- return retval;
-}
-
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetRepaintArea
- (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isRealized
+ (JNIEnv *env, jobject obj)
{
- GdkRectangle rect;
void *ptr;
+ jboolean ret_val;
ptr = NSA_GET_PTR (env, obj);
- gdk_threads_enter ();
-
- rect.x = x;
- rect.y = y;
- rect.width = width;
- rect.height = height;
-
- gdk_window_invalidate_rect (GTK_WIDGET (ptr)->window, &rect, 0);
- gdk_window_process_updates (GTK_WIDGET (ptr)->window, TRUE);
+ if (ptr == NULL)
+ return FALSE;
+ gdk_threads_enter ();
+ ret_val = GTK_WIDGET_REALIZED (GTK_WIDGET (ptr));
gdk_threads_leave ();
+
+ return ret_val;
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject
- (JNIEnv *env, jobject obj)
+JNIEXPORT jboolean JNICALL
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_modalHasGrab
+ (JNIEnv *env __attribute__((unused)), jclass clazz __attribute__((unused)))
{
- void *ptr;
-
- ptr = NSA_GET_PTR (env, obj);
+ GtkWidget *widget;
+ jboolean retval;
gdk_threads_enter ();
-
- gtk_widget_realize (GTK_WIDGET (ptr));
-
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
-
+ widget = gtk_grab_get_current ();
+ retval = (widget && GTK_IS_WINDOW (widget) && GTK_WINDOW (widget)->modal);
gdk_threads_leave ();
+
+ return retval;
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
@@ -1013,8 +1006,6 @@
gdk_threads_enter ();
- gtk_widget_realize (GTK_WIDGET (ptr));
-
/* Connect EVENT signal, which happens _before_ any specific signal. */
g_signal_connect (GTK_OBJECT (ptr), "event",
@@ -1026,6 +1017,9 @@
g_signal_connect (G_OBJECT (ptr), "focus-out-event",
G_CALLBACK (focus_out_cb), *gref);
+ g_signal_connect_after (G_OBJECT (ptr), "realize",
+ G_CALLBACK (connect_awt_hook_cb), *gref);
+
gdk_threads_leave ();
}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v
retrieving revision 1.19.2.11
diff -u -r1.19.2.11 gnu_java_awt_peer_gtk_GtkEvents.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 2 Sep 2004 21:26:26 -0000 1.19.2.11
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 7 Oct 2004 22:08:18 -0000
@@ -1122,3 +1122,23 @@
va_end (ap);
}
+/*
+ * Attach a Java object that is backed by widget. This callback is
+ * called after the widget's window has been realized. That way, we
+ * can be sure that widget->window is non-NULL, and so can have data
+ * connected to it.
+ */
+void connect_awt_hook_cb (GtkWidget *widget, jobject peer)
+{
+ void *ptr;
+
+ ptr = NSA_GET_PTR (gdk_env, peer);
+
+ connect_awt_hook (gdk_env, peer, 1, GTK_WIDGET (ptr)->window);
+
+ gdk_threads_leave ();
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer, setCursorID);
+
+ gdk_threads_enter ();
+}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v
retrieving revision 1.4.8.5
diff -u -r1.4.8.5 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 30 Jul 2004 14:29:33 -0000 1.4.8.5
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 7 Oct 2004 22:08:18 -0000
@@ -84,21 +84,6 @@
NSA_SET_PTR (env, obj, widget);
}
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject
- (JNIEnv *env, jobject obj)
-{
- void *ptr = NSA_GET_PTR (env, obj);
-
- gdk_threads_enter ();
-
- gtk_widget_realize (GTK_WIDGET (ptr));
-
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
-
- gdk_threads_leave ();
-}
-
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectSignals
(JNIEnv *env, jobject obj)
@@ -109,8 +94,6 @@
gdk_threads_enter ();
- gtk_widget_realize (GTK_WIDGET (ptr));
-
g_signal_connect (G_OBJECT (GTK_DIALOG (ptr)),
"response",
GTK_SIGNAL_FUNC (handle_response), *gref);
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.7.8.6
diff -u -r1.7.8.6 gnu_java_awt_peer_gtk_GtkListPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 2 Sep 2004 21:26:26 -0000 1.7.8.6
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 7 Oct 2004 22:08:18 -0000
@@ -117,22 +117,6 @@
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject
- (JNIEnv *env, jobject obj)
-{
- void *ptr;
-
- ptr = NSA_GET_PTR (env, obj);
-
- gdk_threads_enter ();
-
- gtk_widget_realize (GTK_WIDGET (ptr));
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
-
- gdk_threads_leave ();
-}
-
-JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
(JNIEnv *env, jobject obj)
{
@@ -148,8 +132,6 @@
g_assert (gref);
- gtk_widget_realize (GTK_WIDGET (ptr));
-
list = TREE_VIEW_FROM_SW (ptr);
g_signal_connect (G_OBJECT (list), "event",
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.12.8.4
diff -u -r1.12.8.4 gnu_java_awt_peer_gtk_GtkMainThread.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 23 Sep 2004 17:31:53 -0000 1.12.8.4
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 7 Oct 2004 22:08:18 -0000
@@ -61,6 +61,10 @@
jmethodID postTextEventID;
jmethodID postWindowEventID;
+jmethodID initComponentGraphicsID;
+jmethodID initComponentGraphics2DID;
+jmethodID setCursorID;
+
JNIEnv *gdk_env;
GtkWindowGroup *global_gtk_window_group;
@@ -93,7 +97,7 @@
char *homedir, *rcpath = NULL;
/* jclass gtkgenericpeer; */
jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
- gtkmenuitempeer, gtktextcomponentpeer, window;
+ gtkmenuitempeer, gtktextcomponentpeer, window, gdkgraphics, gdkgraphics2d;
NSA_INIT (env, clazz);
gdk_env = env;
@@ -159,6 +163,10 @@
"gnu/java/awt/peer/gtk/GtkMenuItemPeer");
gtktextcomponentpeer = (*env)->FindClass (env,
"gnu/java/awt/peer/gtk/GtkTextComponentPeer");
+ gdkgraphics = (*env)->FindClass (env,
+ "gnu/java/awt/peer/gtk/GdkGraphics");
+ gdkgraphics2d = (*env)->FindClass (env,
+ "gnu/java/awt/peer/gtk/GdkGraphics2D");
/* gdkColor = (*env)->FindClass (env, */
/* "gnu/java/awt/peer/gtk/GdkColor"); */
/* gdkColorID = (*env)->GetMethodID (env, gdkColor, "<init>", "(III)V"); */
@@ -175,6 +183,8 @@
"()V");
postMouseEventID = (*env)->GetMethodID (env, gtkcomponentpeer,
"postMouseEvent", "(IJIIIIZ)V");
+ setCursorID = (*env)->GetMethodID (env, gtkcomponentpeer,
+ "setCursor", "()V");
postConfigureEventID = (*env)->GetMethodID (env, gtkwindowpeer,
"postConfigureEvent", "(IIII)V");
postWindowEventID = (*env)->GetMethodID (env, gtkwindowpeer,
@@ -201,6 +211,12 @@
postTextEventID = (*env)->GetMethodID (env, gtktextcomponentpeer,
"postTextEvent",
"()V");
+ initComponentGraphicsID = (*env)->GetMethodID (env, gdkgraphics,
+ "initComponentGraphics",
+ "()V");
+ initComponentGraphics2DID = (*env)->GetMethodID (env, gdkgraphics2d,
+ "initComponentGraphics2D",
+ "()V");
global_gtk_window_group = gtk_window_group_new ();
init_dpi_conversion_factor ();
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v
retrieving revision 1.4.8.3
diff -u -r1.4.8.3 gnu_java_awt_peer_gtk_GtkPanelPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 2 Sep 2004 21:26:26 -0000 1.4.8.3
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 7 Oct 2004 22:08:18 -0000
@@ -60,18 +60,3 @@
NSA_SET_PTR (env, obj, widget);
}
-
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject
- (JNIEnv *env, jobject obj)
-{
- void *ptr;
-
- ptr = NSA_GET_PTR (env, obj);
-
- gdk_threads_enter ();
- gtk_widget_realize (GTK_WIDGET (ptr));
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
-
- gdk_threads_leave ();
-}
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 5 Feb 2004 19:45:02 -0000 1.7
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 7 Oct 2004 22:08:18 -0000
@@ -78,23 +78,6 @@
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectJObject
- (JNIEnv *env, jobject obj)
-{
- void *ptr;
-
- ptr = NSA_GET_PTR (env, obj);
-
- gdk_threads_enter ();
-
- gtk_widget_realize (GTK_WIDGET (ptr));
-
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
-
- gdk_threads_leave ();
-}
-
-JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
(JNIEnv *env, jobject obj)
{
Index: jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.24.2.15
diff -u -r1.24.2.15 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 2 Sep 2004 21:26:26 -0000 1.24.2.15
+++ jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 7 Oct 2004 22:08:18 -0000
@@ -123,7 +123,6 @@
gtk_container_add (GTK_CONTAINER (window_widget), fixed);
gtk_widget_show (fixed);
- gtk_widget_realize (window_widget);
if (decorated)
window_get_frame_extents (window_widget, &top, &left, &bottom, &right);
@@ -224,23 +223,6 @@
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject
- (JNIEnv *env, jobject obj)
-{
- void *ptr;
-
- ptr = NSA_GET_PTR (env, obj);
-
- gdk_threads_enter ();
-
- gtk_widget_realize (GTK_WIDGET (ptr));
-
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
-
- gdk_threads_leave ();
-}
-
-JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals
(JNIEnv *env, jobject obj)
{
@@ -252,8 +234,6 @@
gdk_threads_enter ();
- gtk_widget_realize (GTK_WIDGET (ptr));
-
g_signal_connect (G_OBJECT (ptr), "event",
G_CALLBACK (pre_event_handler), *gref);
@@ -284,6 +264,9 @@
g_signal_connect (G_OBJECT (ptr), "property-notify-event",
G_CALLBACK (window_property_changed_cb), *gref);
+ g_signal_connect_after (G_OBJECT (ptr), "realize",
+ G_CALLBACK (connect_awt_hook_cb), *gref);
+
gdk_threads_leave ();
}
@@ -356,6 +339,7 @@
height = (height < 1) ? 1 : height;
gdk_threads_enter ();
+
gtk_window_move (GTK_WINDOW(ptr), x, y);
/* The call to gdk_window_move is needed in addition to the call to
gtk_window_move. If gdk_window_move isn't called, then the
@@ -369,7 +353,8 @@
Instead of being at the position set by setLocation, the window
is reshown at the position to which it was moved manually. */
- gdk_window_move (GTK_WIDGET (ptr)->window, x, y);
+ if (GTK_WIDGET (ptr)->window != NULL)
+ gdk_window_move (GTK_WIDGET (ptr)->window, x, y);
/* Need to change the widget's request size. */
gtk_widget_set_size_request (GTK_WIDGET(ptr), width, height);
Index: jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvs/gcc/gcc/libjava/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.12.8.10
diff -u -r1.12.8.10 gtkpeer.h
--- jni/gtk-peer/gtkpeer.h 4 Oct 2004 16:45:49 -0000 1.12.8.10
+++ jni/gtk-peer/gtkpeer.h 7 Oct 2004 22:08:18 -0000
@@ -450,6 +450,10 @@
extern jmethodID postTextEventID;
extern jmethodID postWindowEventID;
+extern jmethodID initComponentGraphicsID;
+extern jmethodID initComponentGraphics2DID;
+extern jmethodID setCursorID;
+
extern jmethodID syncAttrsID;
extern jclass gdkColor;
extern jmethodID gdkColorID;
@@ -466,6 +470,7 @@
jobject peer);
void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...);
+void connect_awt_hook_cb (GtkWidget *widget, jobject peer);
void set_visible (GtkWidget *widget, jboolean visible);
void set_parent (GtkWidget *widget, GtkContainer *parent);