Index: gnu/java/awt/peer/GLightweightPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/GLightweightPeer.java,v
retrieving revision 1.1
diff -u -r1.1 GLightweightPeer.java
--- gnu/java/awt/peer/GLightweightPeer.java 22 Aug 2003 15:37:14 -0000 1.1
+++ gnu/java/awt/peer/GLightweightPeer.java 6 Jan 2004 00:36:56 -0000
@@ -239,7 +239,7 @@
public void setBackground(Color color) {}
- public void setBounds(int x, int y, int width, int height) { }
+ public void setBounds(int x, int y, int width, int height) {}
public void setCursor(Cursor cursor) {}
Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.24
diff -u -r1.24 GtkButtonPeer.java
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java 9 Oct 2003 00:34:16 -0000 1.24
+++ gnu/java/awt/peer/gtk/GtkButtonPeer.java 6 Jan 2004 00:36:56 -0000
@@ -50,6 +50,8 @@
implements ButtonPeer
{
native void create ();
+ public native void connectJObject ();
+ public native void connectSignals ();
native void gtkSetFont(String name, int style, int size);
native void gtkWidgetSetForeground (int red, int green, int blue);
Index: gnu/java/awt/peer/gtk/GtkCanvasPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkCanvasPeer.java,v
retrieving revision 1.13
diff -u -r1.13 GtkCanvasPeer.java
--- gnu/java/awt/peer/gtk/GtkCanvasPeer.java 9 Jul 2003 10:25:34 -0000 1.13
+++ gnu/java/awt/peer/gtk/GtkCanvasPeer.java 6 Jan 2004 00:36:56 -0000
@@ -56,6 +56,9 @@
public Graphics getGraphics ()
{
+ if (GtkToolkit.useGraphics2D ())
+ return new GdkGraphics2D (this);
+ else
return new GdkGraphics (this);
}
Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v
retrieving revision 1.14
diff -u -r1.14 GtkCheckboxPeer.java
--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 9 Jul 2003 10:25:34 -0000 1.14
+++ gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 6 Jan 2004 00:36:56 -0000
@@ -1,5 +1,5 @@
/* GtkCheckboxPeer.java -- Implements CheckboxPeer with GTK
- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,10 +48,13 @@
{
// Group from last time it was set.
public GtkCheckboxGroupPeer old_group;
+ // The current state of the GTK checkbox.
+ private boolean currentState;
- public native void nativeCreate (GtkCheckboxGroupPeer group);
+ public native void nativeCreate (GtkCheckboxGroupPeer group,
+ boolean state);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
- public native void connectHooks ();
+ public native void connectSignals ();
public GtkCheckboxPeer (Checkbox c)
{
@@ -66,12 +69,14 @@
{
CheckboxGroup g = ((Checkbox) awtComponent).getCheckboxGroup ();
old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g);
- nativeCreate (old_group);
+ currentState = ((Checkbox)awtComponent).getState();
+ nativeCreate (old_group, currentState);
}
public void setState (boolean state)
{
- set ("active", state);
+ if (currentState != state)
+ set ("active", state);
}
public void setLabel (String label)
@@ -103,7 +108,19 @@
// need information that we have.
public void postItemEvent (Object item, int stateChange)
{
- super.postItemEvent (awtComponent, stateChange);
+ Checkbox currentCheckBox = ((Checkbox)awtComponent);
+ // A firing of the event is only desired if the state has changed due to a
+ // button press. The currentCheckBox's state must be different from the
+ // one that the stateChange is changing to.
+ // stateChange = 1 if it goes from false -> true
+ // stateChange = 2 if it goes from true -> false
+ if (( !currentCheckBox.getState() && stateChange == 1)
+ || (currentCheckBox.getState() && stateChange == 2))
+ {
+ super.postItemEvent (awtComponent, stateChange);
+ currentState = !currentCheckBox.getState();
+ currentCheckBox.setState(currentState);
+ }
}
public void dispose ()
Index: gnu/java/awt/peer/gtk/GtkChoicePeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkChoicePeer.java,v
retrieving revision 1.14
diff -u -r1.14 GtkChoicePeer.java
--- gnu/java/awt/peer/gtk/GtkChoicePeer.java 9 Jul 2003 10:25:34 -0000 1.14
+++ gnu/java/awt/peer/gtk/GtkChoicePeer.java 6 Jan 2004 00:36:56 -0000
@@ -84,10 +84,10 @@
}
*/
- protected void postItemEvent (Object item, int stateChange)
+ protected void choicePostItemEvent (String label, int stateChange)
{
if (stateChange == ItemEvent.SELECTED)
- ((Choice) awtComponent).select ((String) item);
- super.postItemEvent (item, stateChange);
+ ((Choice) awtComponent).select (label);
+ super.postItemEvent (label, stateChange);
}
}
Index: gnu/java/awt/peer/gtk/GtkComponentPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkComponentPeer.java,v
retrieving revision 1.55
diff -u -r1.55 GtkComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkComponentPeer.java 2 Dec 2003 19:42:10 -0000 1.55
+++ gnu/java/awt/peer/gtk/GtkComponentPeer.java 6 Jan 2004 00:36:56 -0000
@@ -48,6 +48,7 @@
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
+import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
@@ -83,8 +84,9 @@
native int[] gtkWidgetGetForeground ();
native int[] gtkWidgetGetBackground ();
native void gtkWidgetSetVisible (boolean b);
- native void gtkWidgetGetDimensions(int[] dim);
- native void gtkWidgetGetLocationOnScreen(int[] point);
+ native void gtkWidgetGetDimensions (int[] dim);
+ native void gtkWidgetGetPreferredDimensions (int[] dim);
+ native void gtkWidgetGetLocationOnScreen (int[] point);
native void gtkWidgetSetCursor (int type);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
@@ -99,7 +101,8 @@
insets = new Insets (0, 0, 0, 0);
}
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
protected GtkComponentPeer (Component awtComponent)
{
@@ -114,7 +117,8 @@
getArgs (awtComponent, args);
args.setArgs (this);
- connectHooks ();
+ connectJObject ();
+ connectSignals ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());
@@ -146,7 +150,16 @@
public Image createImage (int width, int height)
{
- GdkGraphics g = new GdkGraphics (width, height);
+ Graphics g;
+ if (GtkToolkit.useGraphics2D ())
+ {
+ Graphics2D g2 = new GdkGraphics2D (width, height);
+ g2.setBackground (getBackground ());
+ g = g2;
+ }
+ else
+ g = new GdkGraphics (width, height);
+
return new GtkOffScreenImage (null, g, width, height);
}
@@ -184,18 +197,12 @@
public Dimension getMinimumSize ()
{
- int dim[]=new int[2];
- gtkWidgetGetDimensions (dim);
- Dimension d = new Dimension (dim[0],dim[1]);
- return (d);
+ return minimumSize ();
}
public Dimension getPreferredSize ()
{
- int dim[]=new int[2];
- gtkWidgetGetDimensions (dim);
- Dimension d = new Dimension (dim[0],dim[1]);
- return (d);
+ return preferredSize ();
}
public Toolkit getToolkit ()
@@ -214,7 +221,11 @@
public Dimension minimumSize ()
{
- return getMinimumSize();
+ int dim[] = new int[2];
+
+ gtkWidgetGetPreferredDimensions (dim);
+
+ return new Dimension (dim[0], dim[1]);
}
public void paint (Graphics g)
@@ -222,9 +233,13 @@
awtComponent.paint (g);
}
- public Dimension preferredSize()
+ public Dimension preferredSize ()
{
- return getPreferredSize();
+ int dim[] = new int[2];
+
+ gtkWidgetGetPreferredDimensions (dim);
+
+ return new Dimension (dim[0], dim[1]);
}
public boolean prepareImage (Image image, int width, int height,
Index: gnu/java/awt/peer/gtk/GtkContainerPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkContainerPeer.java,v
retrieving revision 1.19
diff -u -r1.19 GtkContainerPeer.java
--- gnu/java/awt/peer/gtk/GtkContainerPeer.java 2 Oct 2003 18:39:54 -0000 1.19
+++ gnu/java/awt/peer/gtk/GtkContainerPeer.java 6 Jan 2004 00:36:56 -0000
@@ -92,6 +92,9 @@
public Graphics getGraphics ()
{
+ if (GtkToolkit.useGraphics2D ())
+ return new GdkGraphics2D (this);
+ else
return new GdkGraphics (this);
}
@@ -107,6 +110,11 @@
try
{
Graphics g = getGraphics ();
+
+ // Some peers like GtkFileDialogPeer are repainted by Gtk itself
+ if (g == null)
+ break;
+
g.setClip (((PaintEvent)event).getUpdateRect());
if (id == PaintEvent.PAINT)
Index: gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java,v
retrieving revision 1.11
diff -u -r1.11 GtkFileDialogPeer.java
--- gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 9 Jul 2003 10:25:34 -0000 1.11
+++ gnu/java/awt/peer/gtk/GtkFileDialogPeer.java 6 Jan 2004 00:36:56 -0000
@@ -58,7 +58,7 @@
}
public native void setFile (String file);
- public native void connectHooks ();
+ public native void connectJObject ();
public void setFilenameFilter (FilenameFilter filter)
{
Index: gnu/java/awt/peer/gtk/GtkFontPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFontPeer.java,v
retrieving revision 1.6
diff -u -r1.6 GtkFontPeer.java
--- gnu/java/awt/peer/gtk/GtkFontPeer.java 19 Feb 2003 03:50:33 -0000 1.6
+++ gnu/java/awt/peer/gtk/GtkFontPeer.java 6 Jan 2004 00:36:56 -0000
@@ -38,10 +38,15 @@
package gnu.java.awt.peer.gtk;
import java.awt.peer.FontPeer;
-import java.awt.Font;
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.font.*;
+import java.util.Locale;
import java.util.ResourceBundle;
+import java.text.*;
+import gnu.java.awt.peer.ClasspathFontPeer;
-public class GtkFontPeer implements FontPeer
+public class GtkFontPeer extends ClasspathFontPeer
{
private static ResourceBundle bundle;
@@ -61,6 +66,8 @@
public GtkFontPeer (String name, int style)
{
+ super(name, style, 12 /* kludge */);
+
if (bundle != null)
Xname = bundle.getString (name.toLowerCase () + "." + style);
else
@@ -90,5 +97,105 @@
public String getXLFD ()
{
return Xname;
+ }
+
+
+ /* remaining methods are for static compatibility with the newer
+ ClasspathFontPeer superclass; none of these methods ever existed or
+ worked on the older FontPeer interface, but we need to pretend to
+ support them anyways. */
+
+ public boolean canDisplay (Font font, char c)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int canDisplayUpTo (Font font, CharacterIterator i, int start, int limit)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getSubFamilyName (Font font, Locale locale)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getPostScriptName (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int getNumGlyphs (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int getMissingGlyphCode (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public byte getBaselineFor (Font font, char c)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getGlyphName (Font font, int glyphIndex)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public GlyphVector createGlyphVector (Font font,
+ FontRenderContext frc,
+ CharacterIterator ci)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public GlyphVector createGlyphVector (Font font,
+ FontRenderContext ctx,
+ int[] glyphCodes)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public GlyphVector layoutGlyphVector (Font font,
+ FontRenderContext frc,
+ char[] chars, int start,
+ int limit, int flags)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public FontMetrics getFontMetrics (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean hasUniformLineMetrics (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public LineMetrics getLineMetrics (Font font,
+ CharacterIterator ci,
+ int begin, int limit,
+ FontRenderContext rc)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Rectangle2D getMaxCharBounds (Font font,
+ FontRenderContext rc)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Rectangle2D getStringBounds (Font font,
+ CharacterIterator ci,
+ int begin, int limit,
+ FontRenderContext frc)
+ {
+ throw new UnsupportedOperationException();
}
}
Index: gnu/java/awt/peer/gtk/GtkFramePeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkFramePeer.java,v
retrieving revision 1.16
diff -u -r1.16 GtkFramePeer.java
--- gnu/java/awt/peer/gtk/GtkFramePeer.java 9 Oct 2003 00:34:16 -0000 1.16
+++ gnu/java/awt/peer/gtk/GtkFramePeer.java 6 Jan 2004 00:36:56 -0000
@@ -41,6 +41,7 @@
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
+import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.MenuBar;
@@ -109,8 +110,12 @@
public Graphics getGraphics ()
{
- GdkGraphics g = new GdkGraphics (this);
- g.translateNative (-insets.left, -insets.top);
+ Graphics g;
+ if (GtkToolkit.useGraphics2D ())
+ g = new GdkGraphics2D (this);
+ else
+ g = new GdkGraphics (this);
+ g.translate (-insets.left, -insets.top);
return g;
}
Index: gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.13
diff -u -r1.13 GtkListPeer.java
--- gnu/java/awt/peer/gtk/GtkListPeer.java 9 Jul 2003 10:25:34 -0000 1.13
+++ gnu/java/awt/peer/gtk/GtkListPeer.java 6 Jan 2004 00:36:56 -0000
@@ -38,8 +38,11 @@
package gnu.java.awt.peer.gtk;
+import java.awt.AWTEvent;
import java.awt.Dimension;
import java.awt.List;
+import java.awt.event.MouseEvent;
+import java.awt.event.KeyEvent;
import java.awt.peer.ListPeer;
public class GtkListPeer extends GtkComponentPeer
@@ -48,7 +51,8 @@
// native void create (ComponentPeer parent, String [] items, boolean mode);
native void create ();
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
native void getSize (int rows, int dims[]);
@@ -119,6 +123,43 @@
public void setMultipleSelections (boolean b)
{
setMultipleMode (b);
+ }
+
+ public void handleEvent (AWTEvent e)
+ {
+ if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled ())
+ {
+ /* Only generate the ActionEvent on the second click of
+ a multiple click */
+ MouseEvent me = (MouseEvent) e;
+ if (!me.isConsumed ()
+ && (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0
+ && me.getClickCount() == 2)
+ {
+ String selectedItem = ((List)awtComponent).getSelectedItem ();
+
+ /* Double-click only generates an Action event
+ if something is selected */
+ if (selectedItem != null)
+ postActionEvent (((List)awtComponent).getSelectedItem (),
+ me.getModifiers ());
+ }
+ }
+
+ if (e.getID () == KeyEvent.KEY_PRESSED)
+ {
+ KeyEvent ke = (KeyEvent) e;
+ if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_ENTER)
+ {
+ String selectedItem = ((List)awtComponent).getSelectedItem ();
+
+ /* Enter only generates an Action event if something is selected */
+ if (selectedItem != null)
+ postActionEvent (selectedItem, ke.getModifiers ());
+ }
+ }
+
+ super.handleEvent (e);
}
protected void postItemEvent (int item, int stateChange)
Index: gnu/java/awt/peer/gtk/GtkPanelPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkPanelPeer.java,v
retrieving revision 1.13
diff -u -r1.13 GtkPanelPeer.java
--- gnu/java/awt/peer/gtk/GtkPanelPeer.java 9 Jul 2003 10:25:34 -0000 1.13
+++ gnu/java/awt/peer/gtk/GtkPanelPeer.java 6 Jan 2004 00:36:56 -0000
@@ -45,7 +45,8 @@
implements PanelPeer
{
native void create ();
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
public GtkPanelPeer (Panel p)
{
Index: gnu/java/awt/peer/gtk/GtkScrollPanePeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java,v
retrieving revision 1.13
diff -u -r1.13 GtkScrollPanePeer.java
--- gnu/java/awt/peer/gtk/GtkScrollPanePeer.java 9 Jul 2003 10:25:34 -0000 1.13
+++ gnu/java/awt/peer/gtk/GtkScrollPanePeer.java 6 Jan 2004 00:36:56 -0000
@@ -46,15 +46,17 @@
public class GtkScrollPanePeer extends GtkContainerPeer
implements ScrollPanePeer
{
- native void create ();
+ native void create (int width, int height);
+
+ void create ()
+ {
+ create (awtComponent.getWidth (), awtComponent.getHeight ());
+ }
- native void gtkScrolledWindowNew(ComponentPeer parent,
- int policy, int w, int h, int[] dims);
native void gtkScrolledWindowSetScrollPosition(int x, int y);
native void gtkScrolledWindowSetHScrollIncrement (int u);
native void gtkScrolledWindowSetVScrollIncrement (int u);
- native void gtkScrolledWindowSetSize(int w, int h);
-
+
public GtkScrollPanePeer (ScrollPane sp)
{
super (sp);
@@ -63,7 +65,24 @@
}
native void setPolicy (int policy);
- native public void childResized (int width, int height);
+ public void childResized (int width, int height)
+ {
+ int dim[] = new int[2];
+
+ gtkWidgetGetDimensions (dim);
+
+ // If the child is in this range, GTK adds both scrollbars, but
+ // the AWT doesn't. So set the peer's scroll policy to
+ // GTK_POLICY_NEVER.
+ if ((width > dim[0] - getVScrollbarWidth ()
+ && width <= dim[0])
+ && (height > dim[1] - getHScrollbarHeight ()
+ && height <= dim[1]))
+ setPolicy (ScrollPane.SCROLLBARS_NEVER);
+ else
+ setPolicy (((ScrollPane) awtComponent).getScrollbarDisplayPolicy ());
+ }
+
native public int getHScrollbarHeight ();
native public int getVScrollbarWidth ();
native public void setScrollPosition (int x, int y);
Index: gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java,v
retrieving revision 1.14
diff -u -r1.14 GtkScrollbarPeer.java
--- gnu/java/awt/peer/gtk/GtkScrollbarPeer.java 9 Jul 2003 10:25:34 -0000 1.14
+++ gnu/java/awt/peer/gtk/GtkScrollbarPeer.java 6 Jan 2004 00:36:56 -0000
@@ -60,7 +60,8 @@
int min, int max, int stepIncr, int pageIncr,
int visibleAmount);
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
public GtkScrollbarPeer (Scrollbar s)
{
Index: gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java,v
retrieving revision 1.12
diff -u -r1.12 GtkTextComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 6 Aug 2003 15:05:29 -0000 1.12
+++ gnu/java/awt/peer/gtk/GtkTextComponentPeer.java 6 Jan 2004 00:36:56 -0000
@@ -56,7 +56,7 @@
setText (tc.getText ());
}
- public native void connectHooks ();
+ public native void connectSignals ();
public native int getCaretPosition ();
public native void setCaretPosition (int pos);
Index: gnu/java/awt/peer/gtk/GtkToolkit.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkToolkit.java,v
retrieving revision 1.44
diff -u -r1.44 GtkToolkit.java
--- gnu/java/awt/peer/gtk/GtkToolkit.java 2 Dec 2003 19:42:10 -0000 1.44
+++ gnu/java/awt/peer/gtk/GtkToolkit.java 6 Jan 2004 00:36:56 -0000
@@ -42,6 +42,7 @@
import java.awt.datatransfer.Clipboard;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.peer.DragSourceContextPeer;
+import java.awt.font.TextAttribute;
import java.awt.im.InputMethodHighlight;
import java.awt.image.ColorModel;
import java.awt.image.ImageObserver;
@@ -52,6 +53,8 @@
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
+import gnu.java.awt.peer.ClasspathFontPeer;
+import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.classpath.Configuration;
import gnu.java.awt.peer.gtk.GdkPixbufDecoder;
@@ -62,14 +65,35 @@
this class. If getPeer() ever goes away, we can implement a hash table
that will keep up with every window's peer, but for now this is faster. */
-public class GtkToolkit extends Toolkit
+/**
+ * This class accesses a system property called
+ * gnu.java.awt.peer.gtk.Graphics. If the property is defined and
+ * equal to "Graphics2D", the cairo-based GdkGraphics2D will be used in
+ * drawing contexts. Any other value will cause the older GdkGraphics
+ * object to be used.
+ */
+
+public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
{
GtkMainThread main;
Hashtable containers = new Hashtable();
static EventQueue q = new EventQueue();
static Clipboard systemClipboard;
- static
+ static boolean useGraphics2dSet;
+ static boolean useGraphics2d;
+
+ public static boolean useGraphics2D()
+ {
+ if (useGraphics2dSet)
+ return useGraphics2d;
+ useGraphics2d = System.getProperty("gnu.java.awt.peer.gtk.Graphics",
+ "Graphics").equals("Graphics2D");
+ useGraphics2dSet = true;
+ return useGraphics2d;
+ }
+
+ static
{
if (Configuration.INIT_LOAD_LIBRARY)
System.loadLibrary("gtkpeer");
@@ -131,7 +155,10 @@
public FontMetrics getFontMetrics (Font font)
{
- return new GdkFontMetrics (font);
+ if (useGraphics2D())
+ return new GdkClasspathFontPeerMetrics (font);
+ else
+ return new GdkFontMetrics (font);
}
public Image getImage (String filename)
@@ -313,6 +340,10 @@
return new GtkWindowPeer (w);
}
+ /**
+ * @deprecated part of the older "logical font" system in earlier AWT
+ * implementations. Our newer Font class uses getClasspathFontPeer.
+ */
protected FontPeer getFontPeer (String name, int style)
{
try {
@@ -323,6 +354,38 @@
}
}
+ /**
+ * Newer method to produce a peer for a Font object, even though Sun's
+ * design claims Font should now be peerless, we do not agree with this
+ * model, hence "ClasspathFontPeer".
+ */
+
+ public ClasspathFontPeer getClasspathFontPeer (String name, Map attrs)
+ {
+ if (useGraphics2D())
+ return new GdkClasspathFontPeer (name, attrs);
+ else
+ {
+ int style = Font.PLAIN;
+
+ if (attrs.containsKey (TextAttribute.WEIGHT))
+ {
+ Float weight = (Float) attrs.get (TextAttribute.WEIGHT);
+ if (weight.floatValue () >= TextAttribute.WEIGHT_BOLD.floatValue ())
+ style += Font.BOLD;
+ }
+
+ if (attrs.containsKey (TextAttribute.POSTURE))
+ {
+ Float posture = (Float) attrs.get (TextAttribute.POSTURE);
+ if (posture.floatValue () >= TextAttribute.POSTURE_OBLIQUE.floatValue ())
+ style += Font.ITALIC;
+ }
+
+ return (ClasspathFontPeer) this.getFontPeer (name, style);
+ }
+ }
+
protected EventQueue getSystemEventQueueImpl()
{
return q;
@@ -341,4 +404,18 @@
{
throw new Error("not implemented");
}
+
+ // ClasspathToolkit methods
+
+ public GraphicsEnvironment getLocalGraphicsEnvironment()
+ {
+ throw new java.lang.UnsupportedOperationException ();
+ }
+
+ public Font createFont(int format, java.io.InputStream stream)
+ {
+ throw new java.lang.UnsupportedOperationException ();
+ }
+
+
} // class GtkToolkit
Index: gnu/java/awt/peer/gtk/GtkWindowPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkWindowPeer.java,v
retrieving revision 1.24
diff -u -r1.24 GtkWindowPeer.java
--- gnu/java/awt/peer/gtk/GtkWindowPeer.java 24 Oct 2003 19:54:22 -0000 1.24
+++ gnu/java/awt/peer/gtk/GtkWindowPeer.java 6 Jan 2004 00:36:56 -0000
@@ -93,7 +93,8 @@
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
public GtkWindowPeer (Window window)
{
Index: include/gnu_java_awt_peer_gtk_GtkButtonPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkButtonPeer.h,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkButtonPeer.h
--- include/gnu_java_awt_peer_gtk_GtkButtonPeer.h 8 Oct 2003 23:40:49 -0000 1.4
+++ include/gnu_java_awt_peer_gtk_GtkButtonPeer.h 6 Jan 2004 00:36:56 -0000
@@ -11,6 +11,8 @@
#endif
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectJObject (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkSetFont (JNIEnv *env, jobject, jstring, jint, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_gtkWidgetSetForeground (JNIEnv *env, jobject, jint, jint, jint);
Index: include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_GtkCheckboxPeer.h
--- include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h 30 Jul 2003 16:47:19 -0000 1.3
+++ include/gnu_java_awt_peer_gtk_GtkCheckboxPeer.h 6 Jan 2004 00:36:56 -0000
@@ -10,9 +10,9 @@
{
#endif
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate (JNIEnv *env, jobject, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate (JNIEnv *env, jobject, jobject, jboolean);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeSetCheckboxGroup (JNIEnv *env, jobject, jobject);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals (JNIEnv *env, jobject);
#ifdef __cplusplus
}
Index: include/gnu_java_awt_peer_gtk_GtkComponentPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkComponentPeer.h,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkComponentPeer.h
--- include/gnu_java_awt_peer_gtk_GtkComponentPeer.h 25 Dec 2003 17:07:08 -0000 1.6
+++ include/gnu_java_awt_peer_gtk_GtkComponentPeer.h 6 Jan 2004 00:36:56 -0000
@@ -16,11 +16,13 @@
extern JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetBackground (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetVisible (JNIEnv *env, jobject, jboolean);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions (JNIEnv *env, jobject, jintArray);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions (JNIEnv *env, jobject, jintArray);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen (JNIEnv *env, jobject, jintArray);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetCursor (JNIEnv *env, jobject, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetBackground (JNIEnv *env, jobject, jint, jint, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground (JNIEnv *env, jobject, jint, jint, jint);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_requestFocus__ (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds (JNIEnv *env, jobject, jint, jint, jint, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_String_2 (JNIEnv *env, jobject, jstring, jstring);
Index: include/gnu_java_awt_peer_gtk_GtkFileDialogPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkFileDialogPeer.h,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_GtkFileDialogPeer.h
--- include/gnu_java_awt_peer_gtk_GtkFileDialogPeer.h 30 Jul 2003 16:47:19 -0000 1.3
+++ include/gnu_java_awt_peer_gtk_GtkFileDialogPeer.h 6 Jan 2004 00:36:56 -0000
@@ -12,7 +12,7 @@
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_create (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_setFile (JNIEnv *env, jobject, jstring);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject (JNIEnv *env, jobject);
#ifdef __cplusplus
}
Index: include/gnu_java_awt_peer_gtk_GtkListPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkListPeer.h,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GtkListPeer.h
--- include/gnu_java_awt_peer_gtk_GtkListPeer.h 30 Jul 2003 16:47:19 -0000 1.2
+++ include/gnu_java_awt_peer_gtk_GtkListPeer.h 6 Jan 2004 00:36:56 -0000
@@ -11,7 +11,8 @@
#endif
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_create (JNIEnv *env, jobject);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_getSize (JNIEnv *env, jobject, jint, jintArray);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_append (JNIEnv *env, jobject, jobjectArray);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkListPeer_add (JNIEnv *env, jobject, jstring, jint);
Index: include/gnu_java_awt_peer_gtk_GtkPanelPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkPanelPeer.h,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GtkPanelPeer.h
--- include/gnu_java_awt_peer_gtk_GtkPanelPeer.h 30 Jul 2003 16:47:19 -0000 1.2
+++ include/gnu_java_awt_peer_gtk_GtkPanelPeer.h 6 Jan 2004 00:36:56 -0000
@@ -11,7 +11,8 @@
#endif
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_create (JNIEnv *env, jobject);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals (JNIEnv *env, jobject);
#ifdef __cplusplus
}
Index: include/gnu_java_awt_peer_gtk_GtkScrollPanePeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkScrollPanePeer.h,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GtkScrollPanePeer.h
--- include/gnu_java_awt_peer_gtk_GtkScrollPanePeer.h 30 Jul 2003 16:47:19 -0000 1.2
+++ include/gnu_java_awt_peer_gtk_GtkScrollPanePeer.h 6 Jan 2004 00:36:56 -0000
@@ -10,14 +10,11 @@
{
#endif
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create (JNIEnv *env, jobject);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowNew (JNIEnv *env, jobject, jobject, jint, jint, jint, jintArray);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create__II (JNIEnv *env, jobject, jint, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetScrollPosition (JNIEnv *env, jobject, jint, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetHScrollIncrement (JNIEnv *env, jobject, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetVScrollIncrement (JNIEnv *env, jobject, jint);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetSize (JNIEnv *env, jobject, jint, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_setPolicy (JNIEnv *env, jobject, jint);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_childResized (JNIEnv *env, jobject, jint, jint);
extern JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getHScrollbarHeight (JNIEnv *env, jobject);
extern JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getVScrollbarWidth (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_setScrollPosition (JNIEnv *env, jobject, jint, jint);
Index: include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GtkScrollbarPeer.h
--- include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h 30 Jul 2003 16:47:19 -0000 1.2
+++ include/gnu_java_awt_peer_gtk_GtkScrollbarPeer.h 6 Jan 2004 00:36:56 -0000
@@ -11,7 +11,8 @@
#endif
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_create__IIIIIII (JNIEnv *env, jobject, jint, jint, jint, jint, jint, jint, jint);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectJObject (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setLineIncrement (JNIEnv *env, jobject, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setPageIncrement (JNIEnv *env, jobject, jint);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_setValues (JNIEnv *env, jobject, jint, jint, jint, jint);
Index: include/gnu_java_awt_peer_gtk_GtkTextComponentPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkTextComponentPeer.h,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GtkTextComponentPeer.h
--- include/gnu_java_awt_peer_gtk_GtkTextComponentPeer.h 24 Jul 2003 22:04:49 -0000 1.2
+++ include/gnu_java_awt_peer_gtk_GtkTextComponentPeer.h 6 Jan 2004 00:36:56 -0000
@@ -10,7 +10,7 @@
{
#endif
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals (JNIEnv *env, jobject);
extern JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getCaretPosition (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_setCaretPosition (JNIEnv *env, jobject, jint);
extern JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_getSelectionStart (JNIEnv *env, jobject);
Index: include/gnu_java_awt_peer_gtk_GtkWindowPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkWindowPeer.h,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkWindowPeer.h
--- include/gnu_java_awt_peer_gtk_GtkWindowPeer.h 24 Oct 2003 19:54:23 -0000 1.6
+++ include/gnu_java_awt_peer_gtk_GtkWindowPeer.h 6 Jan 2004 00:36:56 -0000
@@ -11,7 +11,8 @@
#endif
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create__IZIILgnu_java_awt_peer_gtk_GtkWindowPeer_2 (JNIEnv *env, jobject, jint, jboolean, jint, jint, jobject);
-extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject (JNIEnv *env, jobject);
+extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectSignals (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toBack (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env, jobject);
extern JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds (JNIEnv *env, jobject, jint, jint, jint, jint);
Index: java/awt/Choice.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/Choice.java,v
retrieving revision 1.13
diff -u -r1.13 Choice.java
--- java/awt/Choice.java 31 Dec 2003 11:17:16 -0000 1.13
+++ java/awt/Choice.java 6 Jan 2004 00:36:56 -0000
@@ -169,17 +169,6 @@
ChoicePeer cp = (ChoicePeer) peer;
cp.add (item, i);
}
-
- if (i == 0)
- {
- selectedIndex = 0;
- // We must generate an ItemEvent here
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent (
- new ItemEvent ((ItemSelectable)this,
- ItemEvent.ITEM_STATE_CHANGED,
- getItem(0),
- ItemEvent.SELECTED));
- }
}
/*************************************************************************/
@@ -229,17 +218,6 @@
ChoicePeer cp = (ChoicePeer) peer;
cp.add (item, index);
}
-
- if (getItemCount () == 1 || selectedIndex >= index)
- {
- select (0);
- // We must generate an ItemEvent here
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent (
- new ItemEvent ((ItemSelectable)this,
- ItemEvent.ITEM_STATE_CHANGED,
- getItem(0),
- ItemEvent.SELECTED));
- }
}
/*************************************************************************/
@@ -273,6 +251,9 @@
public synchronized void
remove(int index)
{
+ if ((index < 0) || (index > getItemCount()))
+ throw new IllegalArgumentException("Bad index: " + index);
+
pItems.removeElementAt(index);
if (peer != null)
@@ -281,17 +262,7 @@
cp.remove (index);
}
- if ((index == selectedIndex) && (getItemCount() > 0))
- {
- select (0);
- // We must generate an ItemEvent here
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent (
- new ItemEvent ((ItemSelectable)this,
- ItemEvent.ITEM_STATE_CHANGED,
- getItem(0),
- ItemEvent.SELECTED));
- }
- else if (selectedIndex > index)
+ if (selectedIndex > index)
--selectedIndex;
}
@@ -303,26 +274,15 @@
public synchronized void
removeAll()
{
- int count = getItemCount();
-
- if (count <= 0)
+ if (getItemCount() <= 0)
return;
- ChoicePeer cp = (ChoicePeer) peer;
+ pItems.removeAllElements ();
- // Select the first item to prevent an spurious ItemEvent to be generated
- if (cp != null)
- {
- cp.select (0);
- selectedIndex = 0; // Just to keep consistent
- }
-
- for (int i = (count - 1); i >= 0; i--)
+ if (peer != null)
{
- // Always remove the last to avoid generation of ItemEvents.
- pItems.removeElementAt(i);
- if (cp != null)
- cp.remove (i);
+ ChoicePeer cp = (ChoicePeer) peer;
+ cp.removeAll ();
}
selectedIndex = -1;
Index: java/awt/ScrollPane.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/awt/ScrollPane.java,v
retrieving revision 1.17
diff -u -r1.17 ScrollPane.java
--- java/awt/ScrollPane.java 3 Jun 2003 16:49:45 -0000 1.17
+++ java/awt/ScrollPane.java 6 Jan 2004 00:36:56 -0000
@@ -218,12 +218,71 @@
{
Dimension viewsize = getSize ();
Insets insets = getInsets ();
- viewsize.width = (viewsize.width
- - (insets.left + insets.right)
- - getVScrollbarWidth ());
- viewsize.height = (viewsize.height
- - (insets.top + insets.bottom)
- - getHScrollbarHeight ());
+
+ viewsize.width -= (insets.left + insets.right);
+ viewsize.height -= (insets.top + insets.bottom);
+
+ Component[] list = getComponents();
+ if ((list == null) || (list.length <= 0))
+ return viewsize;
+
+ Dimension dim = list[0].getPreferredSize();
+
+ if (dim.width <= 0 && dim.height <= 0)
+ return viewsize;
+
+ int vScrollbarWidth = getVScrollbarWidth ();
+ int hScrollbarHeight = getHScrollbarHeight ();
+
+ if (scrollbarDisplayPolicy == SCROLLBARS_ALWAYS)
+ {
+ viewsize.width -= vScrollbarWidth;
+ viewsize.height -= hScrollbarHeight;
+ return viewsize;
+ }
+
+ if (scrollbarDisplayPolicy == SCROLLBARS_NEVER)
+ return viewsize;
+
+ // The scroll policy is SCROLLBARS_AS_NEEDED, so we need to see if
+ // either scrollbar is needed.
+
+ // Assume we don't need either scrollbar.
+ boolean mayNeedVertical = false;
+ boolean mayNeedHorizontal = false;
+
+ boolean needVertical = false;
+ boolean needHorizontal = false;
+
+ // Check if we need vertical scrollbars. If we do, then we need to
+ // subtract the width of the vertical scrollbar from the viewport's
+ // width.
+ if (dim.height > viewsize.height)
+ needVertical = true;
+ else if (dim.height > (viewsize.height - hScrollbarHeight))
+ // This is tricky. In this case the child is tall enough that its
+ // bottom edge would be covered by a horizontal scrollbar, if one
+ // were present. This means that if there's a horizontal
+ // scrollbar then we need a vertical scrollbar.
+ mayNeedVertical = true;
+
+ if (dim.width > viewsize.width)
+ needHorizontal = true;
+ else if (dim.width > (viewsize.width - vScrollbarWidth))
+ mayNeedHorizontal = true;
+
+ if (needVertical && mayNeedHorizontal)
+ needHorizontal = true;
+
+ if (needHorizontal && mayNeedVertical)
+ needVertical = true;
+
+ if (needHorizontal)
+ viewsize.height -= hScrollbarHeight;
+
+ if (needVertical)
+ viewsize.width -= vScrollbarWidth;
+
return viewsize;
}
@@ -391,7 +450,19 @@
if ((list != null) && (list.length > 0))
{
Dimension dim = list[0].getPreferredSize();
- list[0].resize(dim);
+ Dimension vp = getViewportSize ();
+
+ if (dim.width < vp.width)
+ dim.width = vp.width;
+
+ if (dim.height < vp.height)
+ dim.height = vp.height;
+
+ ScrollPanePeer peer = (ScrollPanePeer) getPeer ();
+ if (peer != null)
+ peer.childResized (dim.width, dim.height);
+
+ list[0].resize (dim);
Point p = getScrollPosition();
if (p.x > dim.width)
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c,v
retrieving revision 1.1
diff -u -r1.1 gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c 20 Nov 2003 22:27:37 -0000 1.1
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.c 6 Jan 2004 00:36:57 -0000
@@ -37,7 +37,6 @@
#include
-#include "gtkpeer.h"
#include "gdkfont.h"
#include "gnu_java_awt_peer_gtk_GdkClasspathFontPeerMetrics.h"
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c,v
retrieving revision 1.2
diff -u -r1.2 gnu_java_awt_peer_gtk_GdkGraphics2D.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 20 Nov 2003 22:27:37 -0000 1.2
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkGraphics2D.c 6 Jan 2004 00:36:57 -0000
@@ -35,7 +35,7 @@
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
-#include "gtkpeer.h"
+#include "gtkcairopeer.h"
#include "gdkfont.h"
#include "gnu_java_awt_peer_gtk_GdkGraphics2D.h"
#include
@@ -46,7 +46,6 @@
#include
#include
-#include
#include
#include
@@ -385,6 +384,7 @@
gdk_draw_drawable(dst->drawable, gc, src->drawable,
0, 0, x, y, width, height);
+ gdk_flush ();
g_object_unref (gc);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c,v
retrieving revision 1.1
diff -u -r1.1 gnu_java_awt_peer_gtk_GdkPixbufDecoder.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 17 Sep 2003 20:05:53 -0000 1.1
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GdkPixbufDecoder.c 6 Jan 2004 00:36:57 -0000
@@ -153,7 +153,7 @@
}
static void
-closed (GdkPixbufLoader *loader, jobject *decoder)
+closed (GdkPixbufLoader *loader __attribute__((unused)), jobject *decoder)
{
gdk_threads_leave ();
(*gdk_env)->DeleteGlobalRef (gdk_env, *decoder);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c,v
retrieving revision 1.9
diff -u -r1.9 gnu_java_awt_peer_gtk_GtkButtonPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 8 Oct 2003 23:40:49 -0000 1.9
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkButtonPeer.c 6 Jan 2004 00:36:57 -0000
@@ -37,18 +37,54 @@
#include "gtkpeer.h"
+#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkButtonPeer.h"
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_create
(JNIEnv *env, jobject obj)
{
GtkWidget *button;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
button = gtk_button_new();
gtk_widget_show (button);
+
gdk_threads_leave ();
+
NSA_SET_PTR (env, obj, button);
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_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_BUTTON(ptr)->event_window);
+
+ gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkButtonPeer_connectSignals
+ (JNIEnv *env, jobject obj)
+{
+ /* FIXME: Do we need to connect any signals here? Otherwise just do not
+ override parent method. */
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
JNIEXPORT void JNICALL
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkCanvasPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c 22 Aug 2003 20:41:58 -0000 1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCanvasPeer.c 6 Jan 2004 00:36:57 -0000
@@ -44,8 +44,13 @@
{
gpointer widget;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
widget = gtk_type_new (gtk_drawing_area_get_type ());
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c 22 Jan 2002 22:27:02 -0000 1.3
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxMenuItemPeer.c 6 Jan 2004 00:36:57 -0000
@@ -46,12 +46,17 @@
GtkWidget *widget;
const char *str;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
str = (*env)->GetStringUTFChars (env, label, NULL);
gdk_threads_enter ();
+
widget = gtk_check_menu_item_new_with_label (str);
gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (widget), 1);
gtk_widget_show (widget);
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, label, str);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkCheckboxPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 15 Nov 2002 03:05:11 -0000 1.6
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkCheckboxPeer.c 6 Jan 2004 00:36:57 -0000
@@ -1,5 +1,5 @@
/* gtkcheckboxpeer.c -- Native implementation of GtkCheckboxPeer
- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -78,10 +78,13 @@
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_nativeCreate
- (JNIEnv *env, jobject obj, jobject group)
+ (JNIEnv *env, jobject obj, jobject group, jboolean state)
{
GtkWidget *button;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
if (group == NULL)
@@ -97,6 +100,7 @@
NSA_SET_PTR (env, group, button);
}
}
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), state);
gdk_threads_leave ();
@@ -104,25 +108,22 @@
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectHooks
+Java_gnu_java_awt_peer_gtk_GtkCheckboxPeer_connectSignals
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
- jobject peer;
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
gdk_threads_enter ();
- peer = (*env)->NewGlobalRef (env, obj);
-
- /* FIXME: when the widget goes away, we should get rid of the global
- reference. */
- gtk_signal_connect (GTK_OBJECT (ptr), "toggled",
- GTK_SIGNAL_FUNC (item_toggled), peer);
+ g_signal_connect (G_OBJECT (ptr), "toggled",
+ GTK_SIGNAL_FUNC (item_toggled), *gref);
gdk_threads_leave ();
- /* Connect the superclass hooks. */
- Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
JNIEXPORT void JNICALL
@@ -166,6 +167,7 @@
static void
item_toggled (GtkToggleButton *item, jobject peer)
{
+ //g_print ("toggled\n");
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postItemEventID,
peer,
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkChoicePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 8 Oct 2003 16:00:57 -0000 1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkChoicePeer.c 6 Jan 2004 00:36:57 -0000
@@ -41,8 +41,9 @@
static void connect_choice_item_selectable_hook (JNIEnv *env,
jobject peer_obj,
- GtkItem *item,
- jobject item_obj);
+ GtkItem *menuitem,
+ const char *label);
+
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkChoicePeer_create
(JNIEnv *env, jobject obj)
@@ -51,7 +52,11 @@
GtkOptionMenu *option_menu;
GtkRequisition child_requisition;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
option_menu = GTK_OPTION_MENU (gtk_option_menu_new ());
menu = gtk_menu_new ();
gtk_widget_show (menu);
@@ -97,14 +102,13 @@
label = (*env)->GetStringUTFChars (env, item, NULL);
menuitem = gtk_menu_item_new_with_label (label);
-
- (*env)->ReleaseStringUTFChars (env, item, label);
-
gtk_menu_append (menu, menuitem);
gtk_widget_show (menuitem);
connect_choice_item_selectable_hook (env, obj,
- GTK_ITEM (menuitem), item);
+ GTK_ITEM (menuitem), label);
+
+ (*env)->ReleaseStringUTFChars (env, item, label);
}
if (need_set_history)
@@ -135,7 +139,8 @@
menuitem = gtk_menu_item_new_with_label (label);
gtk_menu_insert (GTK_MENU (menu), menuitem, index);
gtk_widget_show (menuitem);
- connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), item);
+
+ connect_choice_item_selectable_hook (env, obj, GTK_ITEM (menuitem), label);
if (need_set_history)
gtk_option_menu_set_history (GTK_OPTION_MENU (ptr), 0);
@@ -151,14 +156,19 @@
{
void *ptr;
GtkContainer *menu;
+ GtkWidget *menuitem;
GList *children;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+
menu = GTK_CONTAINER (gtk_option_menu_get_menu (GTK_OPTION_MENU (ptr)));
children = gtk_container_children (menu);
- gtk_container_remove (menu, GTK_WIDGET (g_list_nth (children, index)->data));
+ menuitem = GTK_WIDGET (g_list_nth (children, index)->data);
+ gtk_container_remove (menu, menuitem);
+ gtk_widget_destroy (menuitem);
+
gdk_threads_leave ();
}
@@ -175,31 +185,49 @@
gdk_threads_leave ();
}
-
static void
item_activate (GtkItem *item __attribute__((unused)),
struct item_event_hook_info *ie)
{
gdk_threads_leave ();
+
+ jstring label = (*gdk_env)->NewStringUTF (gdk_env, ie->label);
(*gdk_env)->CallVoidMethod (gdk_env, ie->peer_obj,
- postItemEventID,
- ie->item_obj,
+ choicePostItemEventID,
+ label,
(jint) AWT_ITEM_SELECTED);
gdk_threads_enter ();
}
static void
-connect_choice_item_selectable_hook (JNIEnv *env, jobject peer_obj,
- GtkItem *item, jobject item_obj)
+item_removed (gpointer data,
+ GClosure gc __attribute__((unused)))
+{
+ struct item_event_hook_info *ie = data;
+
+ free (ie->label);
+ free (ie);
+}
+
+static void
+connect_choice_item_selectable_hook (JNIEnv *env,
+ jobject peer_obj,
+ GtkItem *menuitem,
+ const char *label)
{
struct item_event_hook_info *ie;
+ jobject *peer_objGlobPtr;
ie = (struct item_event_hook_info *)
malloc (sizeof (struct item_event_hook_info));
- ie->peer_obj = (*env)->NewGlobalRef (env, peer_obj);
- ie->item_obj = (*env)->NewGlobalRef (env, item_obj);
+ peer_objGlobPtr = NSA_GET_GLOBAL_REF (env, peer_obj);
+ g_assert (peer_objGlobPtr);
+
+ ie->peer_obj = *peer_objGlobPtr;
+ ie->label = strdup (label);
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (item_activate), ie);
+ g_signal_connect_data (G_OBJECT (menuitem), "activate",
+ GTK_SIGNAL_FUNC (item_activate), ie,
+ (GClosureNotify) item_removed, 0);
}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkClipboard.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c 8 Oct 2003 16:00:57 -0000 1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkClipboard.c 6 Jan 2004 00:36:57 -0000
@@ -75,16 +75,16 @@
gdk_threads_enter ();
clipboard = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_signal_connect (GTK_OBJECT(clipboard), "selection_received",
+ g_signal_connect (G_OBJECT(clipboard), "selection_received",
GTK_SIGNAL_FUNC (selection_received), NULL);
- gtk_signal_connect (GTK_OBJECT(clipboard), "selection_clear_event",
+ g_signal_connect (G_OBJECT(clipboard), "selection_clear_event",
GTK_SIGNAL_FUNC (selection_clear), NULL);
gtk_selection_add_target (clipboard, GDK_SELECTION_PRIMARY,
GDK_TARGET_STRING, 0);
- gtk_signal_connect (GTK_OBJECT(clipboard), "selection_get",
+ g_signal_connect (G_OBJECT(clipboard), "selection_get",
GTK_SIGNAL_FUNC (selection_get), NULL);
gdk_threads_leave ();
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c,v
retrieving revision 1.15
diff -u -r1.15 gnu_java_awt_peer_gtk_GtkComponentPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 11 Nov 2003 17:13:36 -0000 1.15
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c 6 Jan 2004 00:36:57 -0000
@@ -48,12 +48,16 @@
{
void *ptr;
+ /* Remove entries from state tables */
+ NSA_DEL_GLOBAL_REF (env, obj);
ptr = NSA_DEL_PTR (env, obj);
+ gdk_threads_enter ();
+
/* For now the native state for any object must be a widget.
However, a subclass could override dispose() if required. */
- gdk_threads_enter ();
gtk_widget_destroy (GTK_WIDGET (ptr));
+
gdk_threads_leave ();
}
@@ -165,29 +169,69 @@
}
/*
- * Find the preferred size of a widget.
+ * Find this widget's current size.
*/
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions
- (JNIEnv *env, jobject obj, jintArray jdims)
+ (JNIEnv *env, jobject obj, jintArray jdims)
+{
+ void *ptr;
+ jint *dims;
+ GtkRequisition requisition;
+
+ ptr = NSA_GET_PTR (env, obj);
+
+ dims = (*env)->GetIntArrayElements (env, jdims, 0);
+ dims[0] = dims[1] = 0;
+
+ gdk_threads_enter ();
+
+ gtk_widget_size_request (GTK_WIDGET (ptr), &requisition);
+
+ dims[0] = requisition.width;
+ dims[1] = requisition.height;
+
+ gdk_threads_leave ();
+
+ (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
+}
+
+/*
+ * Find this widget's preferred size.
+ */
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions
+ (JNIEnv *env, jobject obj, jintArray jdims)
{
- void *ptr;
- jint *dims;
- GtkRequisition req;
+ void *ptr;
+ jint *dims;
+ GtkRequisition current_req;
+ GtkRequisition natural_req;
- ptr = NSA_GET_PTR (env, obj);
- dims = (*env)->GetIntArrayElements (env, jdims, 0);
+ ptr = NSA_GET_PTR (env, obj);
+
+ dims = (*env)->GetIntArrayElements (env, jdims, 0);
+ dims[0] = dims[1] = 0;
+
+ gdk_threads_enter ();
+
+ /* Save the widget's current size request. */
+ gtk_widget_size_request (GTK_WIDGET (ptr), ¤t_req);
- gdk_threads_enter ();
+ /* Get the widget's "natural" size request. */
+ gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1);
+ gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req);
- gtk_signal_emit_by_name (GTK_OBJECT (ptr), "size_request", &req);
+ /* Reset the widget's size request. */
+ gtk_widget_set_size_request (GTK_WIDGET (ptr),
+ current_req.width, current_req.height);
- dims[0] = req.width;
- dims[1] = req.height;
+ dims[0] = natural_req.width;
+ dims[1] = natural_req.height;
- gdk_threads_leave ();
+ gdk_threads_leave ();
- (*env)->ReleaseIntArrayElements(env, jdims, dims, 0);
+ (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);
}
JNIEXPORT void JNICALL
@@ -531,7 +575,7 @@
(*env)->ReleaseStringUTFChars (env, jname, name);
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@@ -539,12 +583,36 @@
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+
gtk_widget_realize (GTK_WIDGET (ptr));
- if(GTK_IS_BUTTON(ptr))
- connect_awt_hook (env, obj, 1, GTK_BUTTON(ptr)->event_window);
- else
- connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
+ connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
+
+ gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr = NSA_GET_PTR (env, obj);
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
+
+ gdk_threads_enter ();
+
+ gtk_widget_realize (GTK_WIDGET (ptr));
+
+ /* FIXME: We could check here if this is a scrolled window with a
+ single child that does not have an associated jobject. This
+ means that it is one of our wrapped widgets like List or TextArea
+ and thus we could connect the signal to the child without having
+ to specialize this method. */
+
+ /* Connect EVENT signal, which happens _before_ any specific signal. */
+
+ g_signal_connect (GTK_OBJECT (ptr), "event",
+ G_CALLBACK (pre_event_handler), *gref);
+
gdk_threads_leave ();
}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c,v
retrieving revision 1.17
diff -u -r1.17 gnu_java_awt_peer_gtk_GtkEvents.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 1 Dec 2003 23:44:12 -0000 1.17
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c 6 Jan 2004 00:36:57 -0000
@@ -813,19 +813,57 @@
void
awt_event_handler (GdkEvent *event)
{
- jobject *event_obj_ptr;
+ /* keep synthetic AWT events from being processed recursively */
+ if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING)
+ {
+ event->type ^= SYNTHETIC_EVENT_MASK;
+ }
+
+ gtk_main_do_event (event);
+}
+
+gboolean
+pre_event_handler (GtkWidget *widget, GdkEvent *event, jobject peer)
+{
+ GtkWidget *event_widget;
static guint32 button_click_time = 0;
static GdkWindow *button_window = NULL;
static guint button_number = -1;
static jint click_count = 1;
- /* keep synthetic AWT events from being processed recursively */
- if (event->type & SYNTHETIC_EVENT_MASK && event->type != GDK_NOTHING)
+ /* If it is not a focus change event, the widget must be realized already.
+ If not, ignore the event (Gtk+ will do the same). */
+ if (!(event->type == GDK_FOCUS_CHANGE || GTK_WIDGET_REALIZED(widget)))
+ return FALSE;
+
+ /* Do not handle propagated events. AWT has its own propagation rules */
+ gdk_window_get_user_data (event->any.window, (void **) &event_widget);
+ if (event_widget != widget)
+ return FALSE;
+
+ /* We only care about input events */
+ if (!(event->type == GDK_BUTTON_PRESS
+ || event->type == GDK_BUTTON_RELEASE
+ || event->type == GDK_ENTER_NOTIFY
+ || event->type == GDK_LEAVE_NOTIFY
+ || event->type == GDK_CONFIGURE
+ || event->type == GDK_EXPOSE
+ || event->type == GDK_KEY_PRESS
+ || event->type == GDK_KEY_RELEASE
+ || event->type == GDK_FOCUS_CHANGE
+ || event->type == GDK_MOTION_NOTIFY))
{
- event->type ^= SYNTHETIC_EVENT_MASK;
- gtk_main_do_event (event);
- return;
+ return FALSE;
}
+ /* g_print("event %u widget %s peer %p\n",
+ event->type, gtk_widget_get_name (widget), peer); */
+
+ /* If it has no jobject associated we can send no AWT event */
+ if (!peer)
+ return FALSE;
+
+ /* for all input events, which have a window with a jobject attached,
+ send the AWT input event corresponding to the Gtk event off to Java */
/* keep track of clickCount ourselves, since the AWT allows more
than a triple click to occur */
@@ -843,341 +881,266 @@
button_number = event->button.button;
}
- /* for all input events, which have a window with a jobject attached,
- send the input event off to Java before GTK has a chance to process
- the event */
- if ((event->type == GDK_BUTTON_PRESS
- || event->type == GDK_BUTTON_RELEASE
- || event->type == GDK_ENTER_NOTIFY
- || event->type == GDK_LEAVE_NOTIFY
- || event->type == GDK_CONFIGURE
- || event->type == GDK_EXPOSE
- || event->type == GDK_KEY_PRESS
- || event->type == GDK_KEY_RELEASE
- || event->type == GDK_FOCUS_CHANGE
- || event->type == GDK_MOTION_NOTIFY)
- && gdk_property_get (event->any.window,
- gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
- gdk_atom_intern ("CARDINAL", FALSE),
- 0,
- sizeof (jobject),
- FALSE,
- NULL,
- NULL,
- NULL,
- (guchar **)&event_obj_ptr))
+ switch (event->type)
{
- GtkWidget *event_widget;
- GtkWidget *grab_widget;
- jobject *grab_obj_ptr = NULL;
- void *ptr;
-
- /* Implement modality using GTK grabs. */
- g_assert (global_gtk_window_group);
- if (global_gtk_window_group->grabs)
- {
- grab_widget = global_gtk_window_group->grabs->data;
- g_assert (grab_widget);
-
- gdk_property_get (grab_widget->window,
- gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
- gdk_atom_intern ("CARDINAL", FALSE),
- 0,
- sizeof (jobject),
- FALSE,
- NULL,
- NULL,
- NULL,
- (guchar **)&grab_obj_ptr);
-
- ptr = NSA_GET_PTR (gdk_env, *event_obj_ptr);
- event_widget = GTK_WIDGET(ptr);
-
- if (GTK_WIDGET_IS_SENSITIVE (event_widget) &&
- gtk_widget_is_ancestor (event_widget, grab_widget))
- {
- g_free (grab_obj_ptr);
-
- grab_obj_ptr = event_obj_ptr;
- }
- }
- else
- grab_obj_ptr = event_obj_ptr;
-
- switch (event->type)
- {
- case GDK_BUTTON_PRESS:
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID,
- AWT_MOUSE_PRESSED,
- (jlong)event->button.time,
+ case GDK_BUTTON_PRESS:
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postMouseEventID,
+ AWT_MOUSE_PRESSED,
+ (jlong)event->button.time,
+ state_to_awt_mods (event->button.state) |
+ button_to_awt_mods (event->button.button),
+ (jint)event->button.x,
+ (jint)event->button.y,
+ click_count,
+ (event->button.button == 3) ? JNI_TRUE :
+ JNI_FALSE);
+ break;
+ case GDK_BUTTON_RELEASE:
+ {
+ int width, height;
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postMouseEventID,
+ AWT_MOUSE_RELEASED,
+ (jlong)event->button.time,
state_to_awt_mods (event->button.state) |
button_to_awt_mods (event->button.button),
- (jint)event->button.x,
- (jint)event->button.y,
- click_count,
- (event->button.button == 3) ? JNI_TRUE :
- JNI_FALSE);
-
- /* grab_counter++;
- gdk_pointer_grab (event->any.window,
- FALSE,
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_ENTER_NOTIFY_MASK |
- GDK_LEAVE_NOTIFY_MASK,
- NULL,
- NULL,
- event->button.time);*/
- break;
- case GDK_BUTTON_RELEASE:
- {
- int width, height;
+ (jint)event->button.x,
+ (jint)event->button.y,
+ click_count,
+ JNI_FALSE);
+
+ /* check to see if the release occured in the window it was pressed
+ in, and if so, generate an AWT click event */
+ gdk_window_get_size (event->any.window, &width, &height);
+ if (event->button.x >= 0
+ && event->button.y >= 0
+ && event->button.x <= width
+ && event->button.y <= height)
+ {
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postMouseEventID,
+ AWT_MOUSE_CLICKED,
+ (jlong)event->button.time,
+ state_to_awt_mods (event->button.state) |
+ button_to_awt_mods (event->button.button),
+ (jint)event->button.x,
+ (jint)event->button.y,
+ click_count,
+ JNI_FALSE);
+ }
+ }
+ break;
+ case GDK_MOTION_NOTIFY:
+ (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
+ AWT_MOUSE_MOVED,
+ (jlong)event->motion.time,
+ state_to_awt_mods (event->motion.state),
+ (jint)event->motion.x,
+ (jint)event->motion.y,
+ 0,
+ JNI_FALSE);
- /* only ungrab if no other buttons are pressed down */
- /* if (--grab_counter == 0)
- gdk_pointer_ungrab (event->button.time);
- */
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postMouseEventID,
- AWT_MOUSE_RELEASED,
- (jlong)event->button.time,
- state_to_awt_mods (event->button.state) |
- button_to_awt_mods (event->button.button),
- (jint)event->button.x,
- (jint)event->button.y,
- click_count, JNI_FALSE);
-
- /* check to see if the release occured in the window it was pressed
- in, and if so, generate an AWT click event */
- gdk_window_get_size (event->any.window, &width, &height);
- if (event->button.x >= 0
- && event->button.y >= 0
- && event->button.x <= width
- && event->button.y <= height)
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postMouseEventID,
- AWT_MOUSE_CLICKED,
- (jlong)event->button.time,
- state_to_awt_mods (event->button.state) |
- button_to_awt_mods (event->button.button),
- (jint)event->button.x,
- (jint)event->button.y,
- click_count, JNI_FALSE);
-
- }
- break;
- case GDK_MOTION_NOTIFY:
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID,
- AWT_MOUSE_MOVED,
+ if (event->motion.state & (GDK_BUTTON1_MASK
+ | GDK_BUTTON2_MASK
+ | GDK_BUTTON3_MASK
+ | GDK_BUTTON4_MASK
+ | GDK_BUTTON5_MASK))
+ {
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postMouseEventID,
+ AWT_MOUSE_DRAGGED,
(jlong)event->motion.time,
state_to_awt_mods (event->motion.state),
(jint)event->motion.x,
(jint)event->motion.y,
- 0, JNI_FALSE);
-
- if (event->motion.state & (GDK_BUTTON1_MASK
- | GDK_BUTTON2_MASK
- | GDK_BUTTON3_MASK
- | GDK_BUTTON4_MASK
- | GDK_BUTTON5_MASK))
- {
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postMouseEventID,
- AWT_MOUSE_DRAGGED,
- (jlong)event->motion.time,
- state_to_awt_mods (event->motion.state),
- (jint)event->motion.x,
- (jint)event->motion.y,
- 0, JNI_FALSE);
- }
- break;
- case GDK_ENTER_NOTIFY:
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr, postMouseEventID,
- AWT_MOUSE_ENTERED,
- (jlong)event->crossing.time,
- state_to_awt_mods (event->crossing.state),
- (jint)event->crossing.x,
- (jint)event->crossing.y,
- 0, JNI_FALSE);
- break;
- case GDK_LEAVE_NOTIFY:
- if (event->crossing.mode == GDK_CROSSING_NORMAL)
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postMouseEventID,
- AWT_MOUSE_EXITED,
- (jlong)event->crossing.time,
+ 0,
+ JNI_FALSE);
+ }
+ break;
+ case GDK_ENTER_NOTIFY:
+ (*gdk_env)->CallVoidMethod (gdk_env, peer, postMouseEventID,
+ AWT_MOUSE_ENTERED,
+ (jlong)event->crossing.time,
+ state_to_awt_mods (event->crossing.state),
+ (jint)event->crossing.x,
+ (jint)event->crossing.y,
+ 0,
+ JNI_FALSE);
+ break;
+ case GDK_LEAVE_NOTIFY:
+ if (event->crossing.mode == GDK_CROSSING_NORMAL)
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postMouseEventID,
+ AWT_MOUSE_EXITED,
+ (jlong)event->crossing.time,
state_to_awt_mods (event->crossing.state),
- (jint)event->crossing.x,
- (jint)event->crossing.y,
- 0, JNI_FALSE);
- break;
- case GDK_CONFIGURE:
- {
- GtkWidget *widget;
+ (jint)event->crossing.x,
+ (jint)event->crossing.y,
+ 0,
+ JNI_FALSE);
+ break;
+ case GDK_CONFIGURE:
+ {
+ /* GtkWidget *widget;
- gdk_window_get_user_data (event->any.window, (void **) &widget);
+ gdk_window_get_user_data (event->any.window, (void **) &widget); */
- if (widget && GTK_WIDGET_TOPLEVEL (widget))
- {
- gint top, left, right, bottom;
+ if (widget && GTK_WIDGET_TOPLEVEL (widget))
+ {
+ gint top, left, right, bottom;
- /* Configure events are not posted to the AWT event
- queue, and as such, the gdk/gtk peer functions will
- be called back before postConfigureEvent
- returns. */
- gdk_threads_leave ();
+ /* Configure events are not posted to the AWT event
+ queue, and as such, the gdk/gtk peer functions will
+ be called back before postConfigureEvent
+ returns. */
+ gdk_threads_leave ();
- /* FIXME: hard-code these values for now. */
+ /* FIXME: hard-code these values for now. */
+ if (GTK_IS_PLUG (widget))
+ {
+ top = 0;
+ left = 0;
+ bottom = 0;
+ right = 0;
+ }
+ else
+ {
top = 20;
left = 6;
bottom = 6;
right = 6;
-
- (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
- postConfigureEventID,
- (jint) event->configure.x,
- (jint) event->configure.y,
- (jint) event->configure.width,
- (jint) event->configure.height,
- (jint) top,
- (jint) left,
- (jint) bottom,
- (jint) right);
- gdk_threads_enter ();
}
+
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postConfigureEventID,
+ (jint) event->configure.x,
+ (jint) event->configure.y,
+ (jint) event->configure.width,
+ (jint) event->configure.height,
+ (jint) top,
+ (jint) left,
+ (jint) bottom,
+ (jint) right);
+ gdk_threads_enter ();
}
- break;
- case GDK_EXPOSE:
+ }
+ break;
+ case GDK_EXPOSE:
+ {
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postExposeEventID,
+ (jint)event->expose.area.x,
+ (jint)event->expose.area.y,
+ (jint)event->expose.area.width,
+ (jint)event->expose.area.height);
+ }
+ break;
+ case GDK_FOCUS_CHANGE:
+ (*gdk_env)->CallVoidMethod (gdk_env, peer,
+ postFocusEventID,
+ (jint) (event->focus_change.in) ?
+ AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
+ JNI_FALSE);
+ break;
+ case GDK_KEY_PRESS:
+ case GDK_KEY_RELEASE:
+ {
+ GdkWindow *obj_window;
+ jobject *focus_obj_ptr = NULL;
+ int generates_key_typed = 0;
+
+ /* A widget with a grab will get key events */
+ if (!GTK_IS_WINDOW (widget))
+ focus_obj_ptr = &peer;
+ else
{
- (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
- postExposeEventID,
- (jint)event->expose.area.x,
- (jint)event->expose.area.y,
- (jint)event->expose.area.width,
- (jint)event->expose.area.height);
- }
- break;
+ GtkWindow *window;
- case GDK_KEY_PRESS:
- {
- GtkWidget *widget;
- GtkWindow *window;
- /* The window to which the Java peer is attached. */
- GdkWindow *obj_window;
-
- gdk_window_get_user_data (event->any.window, (void **) &widget);
-
- window = GTK_WINDOW (gtk_widget_get_ancestor (widget,
- GTK_TYPE_WINDOW));
- if (window
- && GTK_WIDGET_IS_SENSITIVE (window)
- && window->focus_widget
- && GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
- && window->focus_widget->window)
- {
- gtk_widget_activate (window->focus_widget);
+ /* Check if we have an enabled focused widget in this window.
+ If not don't handle the event. */
+ window = GTK_WINDOW (widget);
+ if (!window->focus_widget
+ || !GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
+ || !window->focus_widget->window)
+ return FALSE;
+
+ /* TextArea peers are attached to the scrolled window
+ that contains the GtkTextView, not to the text view
+ itself. Same for List. */
+ if (GTK_IS_TEXT_VIEW (window->focus_widget)
+ || GTK_IS_CLIST (window->focus_widget))
+ {
+ obj_window = gtk_widget_get_parent (window->focus_widget)->window;
+ }
+ else if (GTK_IS_BUTTON (window->focus_widget))
+ /* GtkButton events go to the "event_window" and this is what
+ we registered when the button was created. */
+ obj_window = GTK_BUTTON (window->focus_widget)->event_window;
+ else
+ obj_window = window->focus_widget->window;
+
+ gdk_property_get (obj_window,
+ gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
+ gdk_atom_intern ("CARDINAL", FALSE),
+ 0,
+ sizeof (jobject),
+ FALSE,
+ NULL,
+ NULL,
+ NULL,
+ (guchar **)&focus_obj_ptr);
+
+ /* If the window has no jobject attached we can't send anything */
+ if (!focus_obj_ptr)
+ return FALSE;
+
+ /* Should we generate an AWT_KEY_TYPED event? */
+ generates_key_typed = generates_key_typed_event (event, window->focus_widget);
+ }
- /* TextArea peers are attached to the scrolled window
- that contains the GtkTextView, not to the text view
- itself. */
- if (GTK_IS_TEXT_VIEW (window->focus_widget))
- obj_window = gtk_widget_get_parent (window->focus_widget)->window;
- else
- obj_window = window->focus_widget->window;
-
- gdk_property_get (obj_window,
- gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
- gdk_atom_intern ("CARDINAL", FALSE),
- 0,
- sizeof (jobject),
- FALSE,
- NULL,
- NULL,
- NULL,
- (guchar **)&grab_obj_ptr);
-
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postKeyEventID,
- (jint) AWT_KEY_PRESSED,
- (jlong) event->key.time,
- keyevent_state_to_awt_mods (event),
- keysym_to_awt_keycode (event),
- keyevent_to_awt_keychar (event),
- keysym_to_awt_keylocation (event));
-
- if (generates_key_typed_event (event, window->focus_widget))
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postKeyEventID,
- (jint) AWT_KEY_TYPED,
- (jlong) event->key.time,
- state_to_awt_mods (event->key.state),
- VK_UNDEFINED,
- keyevent_to_awt_keychar (event),
- AWT_KEY_LOCATION_UNKNOWN);
- }
- }
- break;
- case GDK_KEY_RELEASE:
+ if (event->type == GDK_KEY_PRESS)
{
- GtkWidget *widget;
- GtkWindow *window;
- GdkWindow *obj_window;
-
- gdk_window_get_user_data (event->any.window, (void **) &widget);
-
- window = GTK_WINDOW (gtk_widget_get_ancestor (widget,
- GTK_TYPE_WINDOW));
- if (window
- && GTK_WIDGET_IS_SENSITIVE (window)
- && window->focus_widget
- && GTK_WIDGET_IS_SENSITIVE (window->focus_widget)
- && window->focus_widget->window)
- {
- gtk_widget_activate (window->focus_widget);
-
- if (GTK_IS_TEXT_VIEW (window->focus_widget))
- obj_window = gtk_widget_get_parent (window->focus_widget)->window;
- else
- obj_window = window->focus_widget->window;
-
- gdk_property_get (obj_window,
- gdk_atom_intern ("_GNU_GTKAWT_ADDR", FALSE),
- gdk_atom_intern ("CARDINAL", FALSE),
- 0,
- sizeof (jobject),
- FALSE,
- NULL,
- NULL,
- NULL,
- (guchar **)&grab_obj_ptr);
-
- (*gdk_env)->CallVoidMethod (gdk_env, *grab_obj_ptr,
- postKeyEventID,
- (jint) AWT_KEY_RELEASED,
- (jlong) event->key.time,
- keyevent_state_to_awt_mods (event),
- keysym_to_awt_keycode (event),
- keyevent_to_awt_keychar (event),
- keysym_to_awt_keylocation (event));
+ (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
+ postKeyEventID,
+ (jint) AWT_KEY_PRESSED,
+ (jlong) event->key.time,
+ keyevent_state_to_awt_mods (event),
+ keysym_to_awt_keycode (event),
+ keyevent_to_awt_keychar (event),
+ keysym_to_awt_keylocation (event));
+
+ if (generates_key_typed)
+ {
+ (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
+ postKeyEventID,
+ (jint) AWT_KEY_TYPED,
+ (jlong) event->key.time,
+ state_to_awt_mods (event->key.state),
+ VK_UNDEFINED,
+ keyevent_to_awt_keychar (event),
+ AWT_KEY_LOCATION_UNKNOWN);
}
}
- break;
- case GDK_FOCUS_CHANGE:
- (*gdk_env)->CallVoidMethod (gdk_env, *event_obj_ptr,
- postFocusEventID,
- (jint) (event->focus_change.in) ?
- AWT_FOCUS_GAINED : AWT_FOCUS_LOST,
- JNI_FALSE);
- break;
- default:
- break;
- }
- g_free (event_obj_ptr);
+ else /* GDK_KEY_RELEASE */
+ {
+ (*gdk_env)->CallVoidMethod (gdk_env, *focus_obj_ptr,
+ postKeyEventID,
+ (jint) AWT_KEY_RELEASED,
+ (jlong) event->key.time,
+ keyevent_state_to_awt_mods (event),
+ keysym_to_awt_keycode (event),
+ keyevent_to_awt_keychar (event),
+ keysym_to_awt_keylocation (event));
+ }
+ }
+ break;
+ default:
+ break;
}
-
- gtk_main_do_event (event);
+
+ return FALSE;
}
static void
@@ -1215,10 +1178,11 @@
{
va_list ap;
jobject *obj;
+ //void *ptr = NSA_GET_PTR (env, peer_obj);
- obj = (jobject *) malloc (sizeof (jobject));
- *obj = (*env)->NewGlobalRef (env, peer_obj);
- //g_print("Connection obj %p\n", peer_obj);
+ obj = NSA_GET_GLOBAL_REF (env, peer_obj);
+ //g_print("Connection obj %s\n", gtk_widget_get_name (GTK_WIDGET (ptr)));
+ g_assert (obj);
va_start (ap, nwindows);
{
@@ -1226,9 +1190,9 @@
for (i = 0; i < nwindows; i++)
{
GdkWindow* attach = (va_arg (ap, GdkWindow *));
- //g_print("attach peer obj %p and %p\n", peer_obj, attach);
attach_jobject(attach, obj);
}
}
va_end (ap);
}
+
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkFileDialogPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 24 Mar 2002 23:12:54 -0000 1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c 6 Jan 2004 00:36:57 -0000
@@ -49,23 +49,28 @@
{
gpointer widget;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
widget = gtk_type_new (gtk_file_selection_get_type ());
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectHooks
+Java_gnu_java_awt_peer_gtk_GtkFileDialogPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
- /* NOTE: we don't call the superclass connect method here. */
gtk_widget_realize (GTK_WIDGET (ptr));
+
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
gdk_threads_leave ();
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkLabelPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 11 Nov 2003 17:13:36 -0000 1.6
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkLabelPeer.c 6 Jan 2004 00:36:57 -0000
@@ -48,10 +48,13 @@
GtkContainer *ebox_container;
const char *str;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
str = (*env)->GetStringUTFChars (env, text, 0);
gdk_threads_enter ();
-
+
ebox = gtk_event_box_new ();
ebox_container = GTK_CONTAINER (ebox);
label = gtk_label_new (str);
@@ -90,7 +93,7 @@
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkLabelPeer_setAlignment
+Java_gnu_java_awt_peer_gtk_GtkLabelPeer_nativeSetAlignment
(JNIEnv *env, jobject obj, jfloat xalign)
{
void *ptr;
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c,v
retrieving revision 1.7
diff -u -r1.7 gnu_java_awt_peer_gtk_GtkListPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 30 Oct 2003 01:57:59 -0000 1.7
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkListPeer.c 6 Jan 2004 00:36:57 -0000
@@ -37,10 +37,18 @@
#include "gtkpeer.h"
+#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkListPeer.h"
-static void
-connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list);
+static void item_select (GtkCList *list __attribute__((unused)),
+ int row, int col __attribute__((unused)),
+ GdkEventButton *event __attribute__((unused)),
+ jobject peer_obj);
+static void item_unselect (GtkCList *list __attribute__((unused)),
+ int row,
+ int col __attribute__((unused)),
+ GdkEventButton *event __attribute__((unused)),
+ jobject peer_obj);
#define CLIST_FROM_SW(obj) (GTK_CLIST(GTK_SCROLLED_WINDOW (obj)->container.child))
@@ -50,7 +58,11 @@
{
GtkWidget *list, *sw;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
list = gtk_clist_new (1);
gtk_widget_show (list);
sw = gtk_scrolled_window_new (NULL, NULL);
@@ -58,13 +70,14 @@
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (sw), list);
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, sw);
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkListPeer_connectHooks
+Java_gnu_java_awt_peer_gtk_GtkListPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@@ -72,76 +85,61 @@
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
+
gtk_widget_realize (GTK_WIDGET (ptr));
- connect_selectable_hook (env, obj, CLIST_FROM_SW (ptr));
+
connect_awt_hook (env, obj, 1, GTK_WIDGET (ptr)->window);
+
gdk_threads_leave ();
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkListPeer_append
- (JNIEnv *env, jobject obj, jobjectArray items)
+Java_gnu_java_awt_peer_gtk_GtkListPeer_connectSignals
+ (JNIEnv *env, jobject obj)
{
- void *ptr;
GtkCList *list;
- jint count, i;
+ void *ptr = NSA_GET_PTR (env, obj);
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
- ptr = NSA_GET_PTR (env, obj);
+ gdk_threads_enter ();
- count = (*env)->GetArrayLength (env, items);
+ gtk_widget_realize (GTK_WIDGET (ptr));
- gdk_threads_enter ();
+ /* connect selectable hook */
+
list = CLIST_FROM_SW (ptr);
- for (i = 0; i < count; i++)
- {
- const char *text;
- jobject item;
- item = (*env)->GetObjectArrayElement (env, items, i);
+ g_signal_connect (G_OBJECT (list), "select_row",
+ GTK_SIGNAL_FUNC (item_select), *gref);
- text = (*env)->GetStringUTFChars (env, item, NULL);
- gtk_clist_append (list, (char **)&text);
- (*env)->ReleaseStringUTFChars (env, item, text);
- }
+ g_signal_connect (G_OBJECT (list), "unselect_row",
+ GTK_SIGNAL_FUNC (item_unselect), *gref);
+
+ /* Connect the superclass signals. */
+ /* FIXME: Cannot do that here or it will get the sw and not the list.
+ We must a generic way of doing this. */
+ /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, peer_obj); */
+ g_signal_connect (GTK_OBJECT (list), "event",
+ G_CALLBACK (pre_event_handler), *gref);
- gtk_clist_columns_autosize (list);
gdk_threads_leave ();
}
-
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkListPeer_old_create
- (JNIEnv *env, jobject obj, jobject parent_obj,
- jobjectArray items, jboolean mode)
+Java_gnu_java_awt_peer_gtk_GtkListPeer_append
+ (JNIEnv *env, jobject obj, jobjectArray items)
{
- GtkWidget *list, *sw, *parent;
- jsize count, i;
+ void *ptr;
+ GtkCList *list;
+ jint count, i;
- parent = NSA_GET_PTR (env, parent_obj);
+ ptr = NSA_GET_PTR (env, obj);
count = (*env)->GetArrayLength (env, items);
gdk_threads_enter ();
-
- list = gtk_clist_new (1);
- gtk_widget_show (list);
-
- sw = gtk_scrolled_window_new (NULL, NULL);
- set_parent (sw, GTK_CONTAINER (parent));
- gtk_widget_realize (sw);
-
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (GTK_CONTAINER (sw), list);
-
- connect_selectable_hook (env, obj, GTK_CLIST (list));
- connect_awt_hook (env, obj, 1, list->window);
-
- gtk_clist_set_selection_mode (GTK_CLIST (list),
- mode ? GTK_SELECTION_MULTIPLE :
- GTK_SELECTION_SINGLE);
-
+ list = CLIST_FROM_SW (ptr);
for (i = 0; i < count; i++)
{
const char *text;
@@ -150,14 +148,12 @@
item = (*env)->GetObjectArrayElement (env, items, i);
text = (*env)->GetStringUTFChars (env, item, NULL);
- gtk_clist_append (GTK_CLIST (list), (char **)&text);
+ gtk_clist_append (list, (char **)&text);
(*env)->ReleaseStringUTFChars (env, item, text);
}
- gtk_clist_columns_autosize (GTK_CLIST (list));
+ gtk_clist_columns_autosize (list);
gdk_threads_leave ();
-
- NSA_SET_PTR (env, obj, sw);
}
JNIEXPORT void JNICALL
@@ -192,12 +188,14 @@
list = CLIST_FROM_SW (ptr);
if (end == -1) /* special case for removing all rows */
- end = list->rows;
-
- gtk_clist_freeze (list);
- for (i = start; i < end; i++)
- gtk_clist_remove (list, i);
- gtk_clist_thaw (list);
+ gtk_clist_clear (list);
+ else
+ {
+ gtk_clist_freeze (list);
+ for (i = end; i >= start; i--)
+ gtk_clist_remove (list, i);
+ gtk_clist_thaw (list);
+ }
gdk_threads_leave ();
}
@@ -324,9 +322,10 @@
item_select (GtkCList *list __attribute__((unused)),
int row, int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
- jobject *peer_obj)
+ jobject peer_obj)
{
- (*gdk_env)->CallVoidMethod (gdk_env, *peer_obj,
+ //g_print ("select_row\n");
+ (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_SELECTED);
@@ -337,25 +336,12 @@
int row,
int col __attribute__((unused)),
GdkEventButton *event __attribute__((unused)),
- jobject *peer_obj)
+ jobject peer_obj)
{
- (*gdk_env)->CallVoidMethod (gdk_env, *peer_obj,
+ //g_print ("unselect_row\n");
+ (*gdk_env)->CallVoidMethod (gdk_env, peer_obj,
postListItemEventID,
row,
(jint) AWT_ITEM_DESELECTED);
}
-static void
-connect_selectable_hook (JNIEnv *env, jobject peer_obj, GtkCList *list)
-{
- jobject *obj;
-
- obj = (jobject *) malloc (sizeof (jobject));
- *obj = (*env)->NewGlobalRef (env, peer_obj);
-
- gtk_signal_connect (GTK_OBJECT (list), "select_row",
- GTK_SIGNAL_FUNC (item_select), obj);
-
- gtk_signal_connect (GTK_OBJECT (list), "unselect_row",
- GTK_SIGNAL_FUNC (item_unselect), obj);
-}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c,v
retrieving revision 1.13
diff -u -r1.13 gnu_java_awt_peer_gtk_GtkMainThread.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 24 Oct 2003 19:54:24 -0000 1.13
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c 6 Jan 2004 00:36:57 -0000
@@ -42,6 +42,7 @@
#ifdef JVM_SUN
struct state_table *native_state_table;
+ struct state_table *native_global_ref_table;
#endif
jmethodID setBoundsCallbackID;
@@ -55,6 +56,7 @@
jmethodID postFocusEventID;
jmethodID postAdjustmentEventID;
jmethodID postItemEventID;
+jmethodID choicePostItemEventID;
jmethodID postListItemEventID;
jmethodID postTextEventID;
jmethodID postWindowEventID;
@@ -79,7 +81,7 @@
char **argv;
char *homedir, *rcpath = NULL;
/* jclass gtkgenericpeer; */
- jclass gtkcomponentpeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
+ jclass gtkcomponentpeer, gtkchoicepeer, gtkwindowpeer, gtkscrollbarpeer, gtklistpeer,
gtkmenuitempeer, gtktextcomponentpeer, window;
NSA_INIT (env, clazz);
@@ -138,6 +140,8 @@
gtkcomponentpeer = (*env)->FindClass (env,
"gnu/java/awt/peer/gtk/GtkComponentPeer");
+ gtkchoicepeer = (*env)->FindClass (env,
+ "gnu/java/awt/peer/gtk/GtkChoicePeer");
gtkwindowpeer = (*env)->FindClass (env,
"gnu/java/awt/peer/gtk/GtkWindowPeer");
gtkscrollbarpeer = (*env)->FindClass (env,
@@ -180,6 +184,9 @@
postItemEventID = (*env)->GetMethodID (env, gtkcomponentpeer,
"postItemEvent",
"(Ljava/lang/Object;I)V");
+ choicePostItemEventID = (*env)->GetMethodID (env, gtkchoicepeer,
+ "choicePostItemEvent",
+ "(Ljava/lang/String;I)V");
postListItemEventID = (*env)->GetMethodID (env, gtklistpeer,
"postItemEvent",
"(II)V");
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c,v
retrieving revision 1.3
diff -u -r1.3 gnu_java_awt_peer_gtk_GtkMenuBarPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c 22 Jan 2002 22:27:02 -0000 1.3
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuBarPeer.c 6 Jan 2004 00:36:57 -0000
@@ -44,9 +44,14 @@
{
GtkWidget *widget;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
widget = gtk_menu_bar_new ();
gtk_widget_show (widget);
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkMenuItemPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 8 Oct 2003 16:00:57 -0000 1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuItemPeer.c 6 Jan 2004 00:36:57 -0000
@@ -40,26 +40,35 @@
#include "gnu_java_awt_peer_gtk_GtkMenuItemPeer.h"
#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
-static void
-connect_activate_hook (JNIEnv *, jobject, GtkMenuItem *);
+static void item_activate (GtkMenuItem *item __attribute__((unused)),
+ jobject *peer_obj);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkMenuItemPeer_create
(JNIEnv *env, jobject obj, jstring label)
{
GtkWidget *widget;
const char *str;
+ jobject *gref;
+
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+ gref = NSA_GET_GLOBAL_REF (env, obj);
str = (*env)->GetStringUTFChars (env, label, NULL);
gdk_threads_enter ();
-
+
if (strcmp (str, "-") == 0) /* "-" signals that we need a separator */
widget = gtk_menu_item_new ();
else
widget = gtk_menu_item_new_with_label (str);
- connect_activate_hook (env, obj, GTK_MENU_ITEM (widget));
+ /* Connect activate hook */
+ g_signal_connect (G_OBJECT (widget), "activate",
+ GTK_SIGNAL_FUNC (item_activate), *gref);
+
gtk_widget_show (widget);
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, label, str);
@@ -101,14 +110,3 @@
postMenuActionEventID);
}
-static void
-connect_activate_hook (JNIEnv *env, jobject peer_obj, GtkMenuItem *item)
-{
- jobject *obj;
-
- obj = (jobject *) malloc (sizeof (jobject));
- *obj = (*env)->NewGlobalRef (env, peer_obj);
-
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- GTK_SIGNAL_FUNC (item_activate), obj);
-}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c,v
retrieving revision 1.4
diff -u -r1.4 gnu_java_awt_peer_gtk_GtkMenuPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c 8 Oct 2003 16:00:57 -0000 1.4
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMenuPeer.c 6 Jan 2004 00:36:57 -0000
@@ -66,7 +66,7 @@
if (GTK_WIDGET_REALIZED (GTK_WIDGET (ptr1)))
accel_attach (GTK_MENU_ITEM (ptr1), NULL);
else
- gtk_signal_connect (GTK_OBJECT (ptr1),
+ g_signal_connect (G_OBJECT (ptr1),
"realize",
GTK_SIGNAL_FUNC (accel_attach),
NULL);
@@ -92,9 +92,13 @@
GtkWidget *menu_title, *menu;
const char *str;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
str = (*env)->GetStringUTFChars (env, label, NULL);
gdk_threads_enter ();
+
menu = gtk_menu_new ();
menu_title = gtk_menu_item_new_with_label (str);
@@ -104,6 +108,7 @@
gtk_widget_show (menu_title);
NSA_SET_PTR (env, obj, menu_title);
+
gdk_threads_leave ();
(*env)->ReleaseStringUTFChars (env, label, str);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c,v
retrieving revision 1.5
diff -u -r1.5 gnu_java_awt_peer_gtk_GtkPanelPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 8 Oct 2003 16:00:58 -0000 1.5
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkPanelPeer.c 6 Jan 2004 00:36:57 -0000
@@ -37,6 +37,7 @@
#include "gtkpeer.h"
+#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkPanelPeer.h"
JNIEXPORT void JNICALL
@@ -45,8 +46,13 @@
{
gpointer widget;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
widget = gtk_layout_new (NULL, NULL);
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
@@ -61,7 +67,7 @@
};
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectHooks
+Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@@ -72,11 +78,31 @@
gtk_widget_realize (GTK_WIDGET (ptr));
connect_awt_hook (env, obj, 1, GTK_LAYOUT (ptr)->bin_window);
-/* gtk_signal_connect (GTK_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */
+ gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkPanelPeer_connectSignals
+ (JNIEnv *env, jobject obj)
+{
+ void *ptr = NSA_GET_PTR (env, obj);
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
+
+ gdk_threads_enter ();
+ gtk_widget_realize (GTK_WIDGET (ptr));
+
+ /* FIXME: If we don't need this then remove this method. */
+/* g_signal_connect (G_OBJECT (ptr), "size_request", GTK_SIGNAL_FUNC (sr), */
/* NULL); */
gdk_threads_leave ();
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
+/* FIXME: The following doesn't seem to be used.
+ Is not declared as a native function in GtkPanelPeer.java */
/*
* Make a new panel.
*/
@@ -87,19 +113,26 @@
GtkWidget *layout;
void *parent;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
parent = NSA_GET_PTR (env, parent_obj);
gdk_threads_enter ();
+
layout = gtk_layout_new (NULL, NULL);
set_parent (layout, GTK_CONTAINER (parent));
gtk_widget_realize (layout);
+
connect_awt_hook (env, obj, 1, GTK_LAYOUT (layout)->bin_window);
+
set_visible (layout, 1);
- NSA_SET_PTR (env, obj, layout);
gdk_threads_leave ();
+
+ NSA_SET_PTR (env, obj, layout);
}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c,v
retrieving revision 1.6
diff -u -r1.6 gnu_java_awt_peer_gtk_GtkScrollBarPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 18 Jul 2003 19:56:34 -0000 1.6
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollBarPeer.c 6 Jan 2004 00:36:57 -0000
@@ -37,6 +37,7 @@
#include "gtkpeer.h"
+#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkScrollbarPeer.h"
struct range_scrollbar
@@ -107,46 +108,70 @@
GtkWidget *sb;
GtkObject *adj;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
adj = gtk_adjustment_new (value, min, max,
step_incr, page_incr,
visible_amount);
sb = (orientation) ? gtk_vscrollbar_new (GTK_ADJUSTMENT (adj)) :
gtk_hscrollbar_new (GTK_ADJUSTMENT (adj));
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, sb);
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectHooks
+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_SCROLLBAR (ptr)->range);
+
+ gdk_threads_leave ();
+}
+
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkScrollbarPeer_connectSignals
+ (JNIEnv *env, jobject obj)
+{
struct range_scrollbar *rs;
+ void *ptr = NSA_GET_PTR (env, obj);
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
rs = (struct range_scrollbar *) malloc (sizeof (struct range_scrollbar));
- ptr = NSA_GET_PTR (env, obj);
-
gdk_threads_enter ();
+
gtk_widget_realize (GTK_WIDGET (ptr));
rs->range = GTK_RANGE (ptr);
- rs->scrollbar = (jobject *) malloc (sizeof (jobject));
- *(rs->scrollbar) = (*env)->NewGlobalRef (env, obj);
- gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)),
+ rs->scrollbar = gref;
+
+ g_signal_connect (G_OBJECT (GTK_RANGE (ptr)),
"move-slider",
GTK_SIGNAL_FUNC (post_adjustment_event), rs);
- gtk_signal_connect (GTK_OBJECT (GTK_RANGE (ptr)),
+ g_signal_connect (G_OBJECT (GTK_RANGE (ptr)),
"value-changed",
GTK_SIGNAL_FUNC (post_change_event), rs);
-
- connect_awt_hook (env, obj, 1, GTK_SCROLLBAR (ptr)->range);
gdk_threads_leave ();
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c,v
retrieving revision 1.5
diff -u -r1.5 gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c 8 Oct 2003 16:00:58 -0000 1.5
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c 6 Jan 2004 00:36:57 -0000
@@ -41,15 +41,22 @@
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create
- (JNIEnv *env, jobject obj)
+ (JNIEnv *env, jobject obj, int width, int height)
{
- gpointer window;
+ GtkWidget *sw;
+
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
gdk_threads_enter ();
- window = gtk_scrolled_window_new (NULL, NULL);
+
+ sw = gtk_scrolled_window_new (NULL, NULL);
+
+ gtk_widget_set_size_request (sw, width, height);
+
gdk_threads_leave ();
- NSA_SET_PTR (env, obj, window);
+ NSA_SET_PTR (env, obj, sw);
}
JNIEXPORT void JNICALL
@@ -111,34 +118,25 @@
gdk_threads_leave ();
}
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_childResized
- (JNIEnv *env, jobject obj, jint width, jint height)
-{
- void *ptr;
-
- ptr = NSA_GET_PTR (env, obj);
-
- return;
-
- gdk_threads_enter ();
- gtk_widget_set_usize (GTK_BIN (ptr)->child, width, height);
- gdk_threads_leave ();
-}
-
JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getHScrollbarHeight
(JNIEnv *env, jobject obj)
{
void *ptr;
GtkScrolledWindow *sw;
- jint height;
+ GtkRequisition requisition;
+ jint height = 0;
+ jint spacing = 0;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
sw = GTK_SCROLLED_WINDOW (ptr);
- height = (sw->hscrollbar_visible) ? sw->hscrollbar->allocation.height : 0;
+
+ gtk_widget_size_request (sw->hscrollbar, &requisition);
+ gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
+ height = requisition.height + spacing;
+
gdk_threads_leave ();
return height;
@@ -150,13 +148,19 @@
{
void *ptr;
GtkScrolledWindow *sw;
- jint width;
+ GtkRequisition requisition;
+ jint width = 0;
+ jint spacing = 0;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
sw = GTK_SCROLLED_WINDOW (ptr);
- width = (sw->vscrollbar_visible) ? sw->vscrollbar->allocation.width : 0;
+
+ gtk_widget_size_request (sw->vscrollbar, &requisition);
+ gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
+ width = requisition.width + spacing;
+
gdk_threads_leave ();
return width;
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_awt_peer_gtk_GtkTextAreaPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 2 Dec 2003 01:07:59 -0000 1.11
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextAreaPeer.c 6 Jan 2004 00:36:57 -0000
@@ -46,8 +46,11 @@
{
GtkWidget *text, *sw;
- gdk_threads_enter ();
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+ gdk_threads_enter ();
+
text = gtk_text_view_new ();
gtk_widget_show (text);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c,v
retrieving revision 1.10
diff -u -r1.10 gnu_java_awt_peer_gtk_GtkTextComponentPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 1 Dec 2003 20:19:21 -0000 1.10
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextComponentPeer.c 6 Jan 2004 00:36:57 -0000
@@ -48,24 +48,29 @@
jobject peer);
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectHooks
+Java_gnu_java_awt_peer_gtk_GtkTextComponentPeer_connectSignals
(JNIEnv *env, jobject obj)
{
- void *ptr;
GtkTextView *text = NULL;
GtkTextBuffer *buf;
-
- ptr = NSA_GET_PTR (env, obj);
+ void *ptr = NSA_GET_PTR (env, obj);
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
gdk_threads_enter ();
if (GTK_IS_ENTRY(ptr))
{
g_signal_connect (GTK_ENTRY (ptr)->im_context, "commit",
- G_CALLBACK (textcomponent_commit_cb), obj);
+ G_CALLBACK (textcomponent_commit_cb), *gref);
g_signal_connect (GTK_EDITABLE (ptr), "changed",
- G_CALLBACK (textcomponent_changed_cb), obj);
+ G_CALLBACK (textcomponent_changed_cb), *gref);
+
+ gdk_threads_leave ();
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, *gref);
}
else
{
@@ -81,19 +86,24 @@
if (text)
{
g_signal_connect (text->im_context, "commit",
- G_CALLBACK (textcomponent_commit_cb), obj);
+ G_CALLBACK (textcomponent_commit_cb), *gref);
buf = gtk_text_view_get_buffer (text);
if (buf)
g_signal_connect (buf, "changed",
- G_CALLBACK (textcomponent_changed_cb), obj);
- }
- }
+ G_CALLBACK (textcomponent_changed_cb), *gref);
- gdk_threads_leave ();
+ /* Connect the superclass signals. */
+ /* FIXME: Cannot do that here or it will get the sw and not the list.
+ We must a generic way of doing this. */
+ /* Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env,
+ obj); */
+ g_signal_connect (GTK_OBJECT (text), "event",
+ G_CALLBACK (pre_event_handler), *gref);
- /* Connect the superclass hooks. */
- Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectHooks (env, obj);
+ gdk_threads_leave ();
+ }
+ }
}
JNIEXPORT jint JNICALL
@@ -101,7 +111,7 @@
(JNIEnv *env, jobject obj)
{
void *ptr;
- int pos;
+ int pos = 0;
GtkEditable *editable; // type of GtkEntry (TextField)
GtkWidget *text = NULL; // type of GtkTextView (TextArea)
GtkTextBuffer *buf;
@@ -187,7 +197,7 @@
(JNIEnv *env, jobject obj)
{
void *ptr;
- int pos;
+ int pos = 0;
GtkEditable *editable; // type of GtkEntry (TextField)
GtkWidget *text = NULL; // type of GtkTextView (TextArea)
GtkTextBuffer *buf;
@@ -244,7 +254,7 @@
(JNIEnv *env, jobject obj)
{
void *ptr;
- int pos;
+ int pos = 0;
GtkEditable *editable; // type of GtkEntry (TextField)
GtkWidget *text = NULL; // type of GtkTextView (TextArea)
GtkTextBuffer *buf;
@@ -384,7 +394,7 @@
(JNIEnv *env, jobject obj)
{
void *ptr;
- char *contents;
+ char *contents = NULL;
jstring jcontents;
GtkEditable *editable; // type of GtkEntry (TextField)
GtkWidget *text = NULL; // type of GtkTextView (TextArea)
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 8 Oct 2003 23:40:49 -0000 1.11
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 6 Jan 2004 00:36:57 -0000
@@ -45,8 +45,13 @@
{
GtkWidget *widget;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
widget = gtk_entry_new ();
+
gdk_threads_leave ();
NSA_SET_PTR (env, obj, widget);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c,v
retrieving revision 1.14
diff -u -r1.14 gnu_java_awt_peer_gtk_GtkWindowPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 24 Oct 2003 19:54:24 -0000 1.14
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c 6 Jan 2004 00:36:57 -0000
@@ -37,6 +37,7 @@
#include "gtkpeer.h"
+#include "gnu_java_awt_peer_gtk_GtkComponentPeer.h"
#include "gnu_java_awt_peer_gtk_GtkWindowPeer.h"
#include "gnu_java_awt_peer_gtk_GtkFramePeer.h"
#include
@@ -73,7 +74,11 @@
void *window_parent;
GtkWidget *vbox, *layout;
+ /* Create global reference and save it for future use */
+ NSA_SET_GLOBAL_REF (env, obj);
+
gdk_threads_enter ();
+
window_widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
window = GTK_WINDOW (window_widget);
@@ -116,7 +121,8 @@
NSA_SET_PTR (env, obj, window_widget);
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetVisible
(JNIEnv *env, jobject obj, jboolean visible)
{
void *ptr;
@@ -135,7 +141,8 @@
gdk_threads_leave ();
}
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectJObject
(JNIEnv *env, jobject obj)
{
void *ptr;
@@ -169,26 +176,44 @@
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)
+{
+ void *ptr = NSA_GET_PTR (env, obj);
+ jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
+ g_assert (gref);
+
+ gdk_threads_enter ();
+
+ gtk_widget_realize (ptr);
+
/* Connect signals for window event support. */
g_signal_connect (G_OBJECT (ptr), "delete-event",
- G_CALLBACK (window_delete_cb), obj);
+ G_CALLBACK (window_delete_cb), *gref);
g_signal_connect (G_OBJECT (ptr), "destroy-event",
- G_CALLBACK (window_destroy_cb), obj);
+ G_CALLBACK (window_destroy_cb), *gref);
g_signal_connect (G_OBJECT (ptr), "show",
- G_CALLBACK (window_show_cb), obj);
+ G_CALLBACK (window_show_cb), *gref);
g_signal_connect (G_OBJECT (ptr), "focus-in-event",
- G_CALLBACK (window_focus_in_cb), obj);
+ G_CALLBACK (window_focus_in_cb), *gref);
g_signal_connect (G_OBJECT (ptr), "focus-out-event",
- G_CALLBACK (window_focus_out_cb), obj);
+ G_CALLBACK (window_focus_out_cb), *gref);
g_signal_connect (G_OBJECT (ptr), "window-state-event",
- G_CALLBACK (window_window_state_cb), obj);
+ G_CALLBACK (window_window_state_cb), *gref);
gdk_threads_leave ();
+
+ /* Connect the superclass signals. */
+ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (env, obj);
}
/*
Index: native/jni/gtk-peer/gtkpeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gtkpeer.h,v
retrieving revision 1.12
diff -u -r1.12 gtkpeer.h
--- native/jni/gtk-peer/gtkpeer.h 24 Oct 2003 19:54:24 -0000 1.12
+++ native/jni/gtk-peer/gtkpeer.h 6 Jan 2004 00:36:57 -0000
@@ -61,9 +61,11 @@
#ifdef JVM_SUN
extern struct state_table *native_state_table;
+extern struct state_table *native_global_ref_table;
#define NSA_INIT(env, clazz) \
- native_state_table = init_state_table (env, clazz)
+ do {native_state_table = init_state_table (env, clazz); \
+ native_global_ref_table = init_state_table (env, clazz);} while (0)
#define NSA_GET_PTR(env, obj) \
get_state (env, obj, native_state_table)
@@ -74,6 +76,21 @@
#define NSA_DEL_PTR(env, obj) \
remove_state_slot (env, obj, native_state_table)
+#define NSA_GET_GLOBAL_REF(env, obj) \
+ get_state (env, obj, native_global_ref_table)
+
+#define NSA_SET_GLOBAL_REF(env, obj) \
+ do {jobject *globRefPtr; \
+ globRefPtr = (jobject *) malloc (sizeof (jobject)); \
+ *globRefPtr = (*env)->NewGlobalRef (env, obj); \
+ set_state (env, obj, native_global_ref_table, (void *)globRefPtr);} while (0)
+
+#define NSA_DEL_GLOBAL_REF(env, obj) \
+ do {jobject *globRefPtr = get_state (env, obj, native_global_ref_table); \
+ remove_state_slot (env, obj, native_global_ref_table); \
+ (*env)->DeleteGlobalRef (env, *globRefPtr); \
+ free (globRefPtr);} while (0)
+
#endif /* JVM_SUN */
struct graphics
@@ -378,6 +395,7 @@
extern jmethodID postKeyEventID;
extern jmethodID postFocusEventID;
extern jmethodID postAdjustmentEventID;
+extern jmethodID choicePostItemEventID;
extern jmethodID postItemEventID;
extern jmethodID postListItemEventID;
extern jmethodID postTextEventID;
@@ -392,6 +410,10 @@
void awt_event_handler (GdkEvent *event);
+gboolean pre_event_handler (GtkWidget *widget,
+ GdkEvent *event,
+ jobject peer);
+
void connect_awt_hook (JNIEnv *env, jobject peer_obj, int nwindows, ...);
void set_visible (GtkWidget *widget, jboolean visible);
@@ -403,7 +425,7 @@
struct item_event_hook_info
{
jobject peer_obj;
- jobject item_obj;
+ const char *label;
};
#endif /* __GTKPEER_H */