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 */