diff options
Diffstat (limited to 'libjava/gnu/java/awt/peer/gtk')
34 files changed, 1448 insertions, 939 deletions
diff --git a/libjava/gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java b/libjava/gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java deleted file mode 100644 index 2f019e4dbc4..00000000000 --- a/libjava/gnu/java/awt/peer/gtk/GdkClasspathFontPeerMetrics.java +++ /dev/null @@ -1,116 +0,0 @@ -/* GdkClasspathFontPeerMetrics.java - Copyright (C) 1999, 2002 Free Software Foundation, Inc. - - This file is part of GNU Classpath. - - GNU Classpath is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU Classpath is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU Classpath; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. - - Linking this library statically or dynamically with other modules is - making a combined work based on this library. Thus, the terms and - conditions of the GNU General Public License cover the whole - combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent - modules, and to copy and distribute the resulting executable under - terms of your choice, provided that you also meet, for each linked - independent module, the terms and conditions of the license of that - module. An independent module is a module which is not derived from - or based on this library. If you modify this library, you may extend - this exception to your version of the library, but you are not - obligated to do so. If you do not wish to do so, delete this - exception statement from your version. */ - - -package gnu.java.awt.peer.gtk; - -import java.awt.*; -import java.awt.font.*; -import java.awt.geom.*; - -public class GdkClasspathFontPeerMetrics extends FontMetrics -{ - private final int native_state = GtkGenericPeer.getUniqueInteger(); - - private static final int ASCENT = 0, MAX_ASCENT = 1, - DESCENT = 2, MAX_DESCENT = 3, - MAX_ADVANCE = 4; - - private int[] metrics; - private native int[] initState (Object font); - - public GdkClasspathFontPeerMetrics (Font font) - { - super (font); - metrics = initState (font.getPeer()); - } - - public int stringWidth (String str) - { - GlyphVector gv = font.createGlyphVector - (new FontRenderContext - (new AffineTransform (), false, false), str); - Rectangle2D r = gv.getVisualBounds (); - return (int) r.getWidth (); - } - - public int charWidth (char ch) - { - return stringWidth (new String (new char[] { ch })); - } - - public int charsWidth (char data[], int off, int len) - { - return stringWidth (new String (data, off, len)); - } - - /* - Sun's Motif implementation always returns 0 or 1 here (???), but - going by the X11 man pages, it seems as though we should return - font.ascent + font.descent. - */ - public int getLeading () - { - return 1; -// return metrics[ASCENT] + metrics[DESCENT]; - } - - public int getAscent () - { - return metrics[ASCENT]; - } - - public int getMaxAscent () - { - return metrics[MAX_ASCENT]; - } - - public int getDescent () - { - return metrics[DESCENT]; - } - - public int getMaxDescent () - { - return metrics[MAX_DESCENT]; - } - - public int getMaxAdvance () - { - return metrics[MAX_ADVANCE]; - } -} diff --git a/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java b/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java index c7a73a3f362..3cd2f9a1cd2 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkFontMetrics.java @@ -1,5 +1,5 @@ /* GdkFontMetrics.java - Copyright (C) 1999, 2002 Free Software Foundation, Inc. + Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,33 +38,63 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import gnu.java.awt.ClasspathToolkit; + import java.awt.Font; import java.awt.FontMetrics; +import java.awt.Toolkit; public class GdkFontMetrics extends FontMetrics { - private final int native_state = GtkGenericPeer.getUniqueInteger(); - - private static final int ASCENT = 0, MAX_ASCENT = 1, - DESCENT = 2, MAX_DESCENT = 3, - MAX_ADVANCE = 4; - - private int[] metrics; - private native int[] initState (String fname, int style, int size); + + private int[] font_metrics; + GdkFontPeer peer; + + static final int FONT_METRICS_ASCENT = 0; + static final int FONT_METRICS_MAX_ASCENT = 1; + static final int FONT_METRICS_DESCENT = 2; + static final int FONT_METRICS_MAX_DESCENT = 3; + static final int FONT_METRICS_MAX_ADVANCE = 4; + + static final int TEXT_METRICS_X_BEARING = 0; + static final int TEXT_METRICS_Y_BEARING = 1; + static final int TEXT_METRICS_WIDTH = 2; + static final int TEXT_METRICS_HEIGHT = 3; + static final int TEXT_METRICS_X_ADVANCE = 4; + static final int TEXT_METRICS_Y_ADVANCE = 5; + + static native void getPeerFontMetrics(GdkFontPeer peer, double [] metrics); + static native void getPeerTextMetrics(GdkFontPeer peer, String str, double [] metrics); public GdkFontMetrics (Font font) - { - super (font); - metrics = initState (font.getName (), font.getStyle (), font.getSize ()); + { + super (font.getPeer() instanceof GdkFontPeer + ? font + : ((ClasspathToolkit)(Toolkit.getDefaultToolkit ())) + .getFont (font.getName(), font.getAttributes ())); + + peer = (GdkFontPeer) this.font.getPeer(); + + font_metrics = new int[5]; + double [] hires = new double[5]; + + if (GtkToolkit.useGraphics2D ()) + GdkGraphics2D.getPeerFontMetrics(peer, hires); + else + getPeerFontMetrics (peer, hires); + + for (int i = 0; i < 5; ++i) + font_metrics[i] = (int) hires[i]; } - - native public int stringWidth (String fname, int style, int size, - String str); - + public int stringWidth (String str) { - return stringWidth (font.getName (), font.getStyle (), font.getSize (), - str); + double [] hires = new double[6]; + if (GtkToolkit.useGraphics2D()) + GdkGraphics2D.getPeerTextMetrics(peer, str, hires); + else + getPeerTextMetrics(peer, str, hires); + return (int) hires [TEXT_METRICS_WIDTH]; } public int charWidth (char ch) @@ -77,34 +107,39 @@ public class GdkFontMetrics extends FontMetrics return stringWidth (new String (data, off, len)); } - // Sun's Motif implementation always returns 0 or 1 here (???). + /* + Sun's Motif implementation always returns 0 or 1 here (???), but + going by the X11 man pages, it seems as though we should return + font.ascent + font.descent. + */ public int getLeading () { - return 0; + return 1; +// return metrics[ASCENT] + metrics[DESCENT]; } public int getAscent () { - return metrics[ASCENT]; + return font_metrics[FONT_METRICS_ASCENT]; } public int getMaxAscent () { - return metrics[MAX_ASCENT]; + return font_metrics[FONT_METRICS_MAX_ASCENT]; } public int getDescent () { - return metrics[DESCENT]; + return font_metrics[FONT_METRICS_DESCENT]; } public int getMaxDescent () { - return metrics[MAX_DESCENT]; + return font_metrics[FONT_METRICS_MAX_DESCENT]; } public int getMaxAdvance () { - return metrics[MAX_ADVANCE]; + return font_metrics[FONT_METRICS_MAX_ADVANCE]; } } diff --git a/libjava/gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java b/libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java index 1cf24a98d61..ee051451026 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkClasspathFontPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkFontPeer.java @@ -1,68 +1,62 @@ -/* GdkClasspathFontPeer.java -- backend implementation for Font object - Copyright (C) 2003 Free Software Foundation, Inc. - - This file is part of GNU Classpath. - - GNU Classpath is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU Classpath is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU Classpath; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. - - Linking this library statically or dynamically with other modules is - making a combined work based on this library. Thus, the terms and - conditions of the GNU General Public License cover the whole - combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent - modules, and to copy and distribute the resulting executable under - terms of your choice, provided that you also meet, for each linked - independent module, the terms and conditions of the license of that - module. An independent module is a module which is not derived from - or based on this library. If you modify this library, you may extend - this exception to your version of the library, but you are not - obligated to do so. If you do not wish to do so, delete this - exception statement from your version. */ +/* GdkFontPeer.java -- Implements FontPeer with GTK+ + Copyright (C) 1999, 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ package gnu.java.awt.peer.gtk; - +import java.awt.peer.FontPeer; import java.awt.*; -import java.awt.font.*; import java.awt.geom.*; -import java.io.InputStream; -import java.io.IOException; -import java.io.Serializable; +import java.awt.font.*; import java.util.Locale; import java.util.Map; -import java.util.StringTokenizer; +import java.util.ResourceBundle; +import java.util.MissingResourceException; import java.text.CharacterIterator; import java.text.AttributedCharacterIterator; import java.text.StringCharacterIterator; -import java.awt.font.TextAttribute; import gnu.classpath.Configuration; import gnu.java.awt.peer.ClasspathFontPeer; -/** - * This class represents a windowing system font using the Pango - * unicode/glyph/font library and the Cairo rendering library. - * - * @author Graydon Hoare (graydon@redhat.com) - */ - -public class GdkClasspathFontPeer extends ClasspathFontPeer +public class GdkFontPeer extends ClasspathFontPeer { + + native static void initStaticState (); + private final int native_state = GtkGenericPeer.getUniqueInteger (); + private static ResourceBundle bundle; static { @@ -71,26 +65,26 @@ public class GdkClasspathFontPeer extends ClasspathFontPeer System.loadLibrary("gtkpeer"); } - if (GtkToolkit.useGraphics2D ()) - initStaticState (); - } - native static void initStaticState (); - private final int native_state = GtkGenericPeer.getUniqueInteger (); - + initStaticState (); - /* Instance Variables */ + try + { + bundle = ResourceBundle.getBundle ("gnu.java.awt.peer.gtk.font"); + } + catch (Throwable ignored) + { + bundle = null; + } + } private native void initState (); private native void dispose (); - private native void setFont (String family, int style, int size); - - protected void sync () - { - this.setFont (this.familyName, this.style, (int)this.size); - } + private native void setFont (String family, int style, int size, boolean useGraphics2D); protected void finalize () { + if (GtkToolkit.useGraphics2D ()) + GdkGraphics2D.releasePeerGraphicsResource(this); dispose (); } @@ -101,49 +95,57 @@ public class GdkClasspathFontPeer extends ClasspathFontPeer * triplicate. */ - private String buildString(CharacterIterator i) { - String s = new String (); - for(char c = i.first(); c != CharacterIterator.DONE; c = i.next()) - s += c; - return s; + private String buildString(CharacterIterator iter) + { + StringBuffer sb = new StringBuffer(); + for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) + sb.append(c); + return sb.toString(); } - private String buildString(CharacterIterator iter, int begin, int limit) { - String s = new String (); + private String buildString(CharacterIterator iter, int begin, int limit) + { + StringBuffer sb = new StringBuffer(); int i = 0; for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next(), i++) { if (begin <= i) - s += c; + sb.append(c); if (limit <= i) break; } - return s; + return sb.toString(); } - private String buildString(char[] chars, int begin, int limit) { - String s = new String (); - for(int i = begin; i <= limit; i++) - s += chars[i]; - return s; + private String buildString(char[] chars, int begin, int limit) + { + return new String(chars, begin, limit - begin); } /* Public API */ - public GdkClasspathFontPeer (String name, int style, int size) + public GdkFontPeer (String name, int style) + { + // All fonts get a default size of 12 if size is not specified. + this(name, style, 12); + } + + public GdkFontPeer (String name, int style, int size) { super(name, style, size); initState (); - setFont (this.familyName, this.style, (int)this.size); + setFont (this.familyName, this.style, (int)this.size, + GtkToolkit.useGraphics2D()); } - public GdkClasspathFontPeer (String name, Map attributes) + public GdkFontPeer (String name, Map attributes) { super(name, attributes); initState (); - setFont (this.familyName, this.style, (int)this.size); + setFont (this.familyName, this.style, (int)this.size, + GtkToolkit.useGraphics2D()); } - + public String getSubFamilyName(Font font, Locale locale) { return null; @@ -228,7 +230,6 @@ public class GdkClasspathFontPeer extends ClasspathFontPeer } - public LineMetrics getLineMetrics (Font font, CharacterIterator ci, int begin, int limit, FontRenderContext rc) { @@ -288,8 +289,7 @@ public class GdkClasspathFontPeer extends ClasspathFontPeer public FontMetrics getFontMetrics (Font font) { - return new GdkClasspathFontPeerMetrics (font); + return new GdkFontMetrics (font); } } - diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java b/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java index ff6b4cd291a..c37de5274ac 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGlyphVector.java @@ -1,57 +1,57 @@ /* GdkGlyphVector.java -- Glyph vector object - Copyright (C) 2003 Free Software Foundation, Inc. - - This file is part of GNU Classpath. - - GNU Classpath is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU Classpath is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU Classpath; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. - - Linking this library statically or dynamically with other modules is - making a combined work based on this library. Thus, the terms and - conditions of the GNU General Public License cover the whole - combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent - modules, and to copy and distribute the resulting executable under - terms of your choice, provided that you also meet, for each linked - independent module, the terms and conditions of the license of that - module. An independent module is a module which is not derived from - or based on this library. If you modify this library, you may extend - this exception to your version of the library, but you are not - obligated to do so. If you do not wish to do so, delete this - exception statement from your version. */ + Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.*; -import java.awt.font.*; -import java.awt.geom.*; -import java.io.InputStream; -import java.io.IOException; -import java.io.Serializable; -import java.util.Locale; -import java.util.Map; -import java.util.StringTokenizer; -import java.text.CharacterIterator; -import java.text.AttributedCharacterIterator; import gnu.classpath.Configuration; -public class GdkGlyphVector extends GlyphVector +import java.awt.Font; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphMetrics; +import java.awt.font.GlyphVector; +import java.awt.font.GlyphJustificationInfo; +import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; + +public class GdkGlyphVector extends GlyphVector { static @@ -70,7 +70,7 @@ public class GdkGlyphVector extends GlyphVector private Font font; private FontRenderContext ctx; - private native void initState (GdkClasspathFontPeer peer, FontRenderContext ctx); + private native void initState (GdkFontPeer peer, FontRenderContext ctx); private native void setChars (String s); private native void setGlyphCodes (int codes[]); private native void dispose (); @@ -109,7 +109,7 @@ public class GdkGlyphVector extends GlyphVector */ - public GdkGlyphVector (Font f, GdkClasspathFontPeer peer, FontRenderContext c, String s) + public GdkGlyphVector (Font f, GdkFontPeer peer, FontRenderContext c, String s) { font = f; ctx = c; @@ -117,7 +117,7 @@ public class GdkGlyphVector extends GlyphVector setChars (s); } - public GdkGlyphVector (Font f, GdkClasspathFontPeer peer, FontRenderContext c, int codes[]) + public GdkGlyphVector (Font f, GdkFontPeer peer, FontRenderContext c, int codes[]) { font = f; ctx = c; diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java index c374ba21826..5aacf5296c6 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java @@ -90,17 +90,31 @@ public class GdkGraphics extends Graphics GdkGraphics (GtkComponentPeer component) { this.component = component; + font = component.awtComponent.getFont (); + + if (component.isRealized ()) + initComponentGraphics (); + else + connectSignals (component); + } + + void initComponentGraphics () + { initState (component); color = component.awtComponent.getForeground (); - font = component.awtComponent.getFont (); Dimension d = component.awtComponent.getSize (); clip = new Rectangle (0, 0, d.width, d.height); } + native void connectSignals (GtkComponentPeer component); + public native void clearRect (int x, int y, int width, int height); public void clipRect (int x, int y, int width, int height) { + if (component != null && ! component.isRealized ()) + return; + clip = clip.intersection (new Rectangle (x, y, width, height)); setClipRectangle (clip.x, clip.y, clip.width, clip.height); } @@ -113,16 +127,6 @@ public class GdkGraphics extends Graphics return new GdkGraphics (this); } -// public Graphics create (int x, int y, int width, int height) -// { -// GdkGraphics g = new GdkGraphics (this); -// System.out.println ("translating by: " + x +" " + y); -// g.translate (x, y); -// g.clipRect (0, 0, width, height); - -// return g; -// } - native public void dispose (); native void copyPixmap (Graphics g, int x, int y, int width, int height); @@ -134,24 +138,45 @@ public class GdkGraphics extends Graphics public boolean drawImage (Image img, int x, int y, Color bgcolor, ImageObserver observer) { + if (component != null && ! component.isRealized ()) + return false; + if (img instanceof GtkOffScreenImage) { + int width = img.getWidth (null); + int height = img.getHeight (null); copyPixmap (img.getGraphics (), - x, y, img.getWidth (null), img.getHeight (null)); + x, y, width, height); + // FIXME: need to differentiate between SOMEBITS and FRAMEBITS. + if (observer != null) + observer.imageUpdate (img, + ImageObserver.FRAMEBITS, + x, y, width, height); return true; } GtkImage image = (GtkImage) img; - new GtkImagePainter (image, this, x, y, -1, -1, bgcolor); + new GtkImagePainter (image, this, x, y, -1, -1, bgcolor, observer); return image.isLoaded (); } public boolean drawImage (Image img, int x, int y, ImageObserver observer) { + if (component != null && ! component.isRealized ()) + return false; + if (img instanceof GtkOffScreenImage) { + int width = img.getWidth (null); + int height = img.getHeight (null); copyPixmap (img.getGraphics (), - x, y, img.getWidth (null), img.getHeight (null)); + x, y, width, height); + + // FIXME: need to differentiate between SOMEBITS and FRAMEBITS. + if (observer != null) + observer.imageUpdate (img, + ImageObserver.FRAMEBITS, + x, y, width, height); return true; } @@ -164,22 +189,33 @@ public class GdkGraphics extends Graphics public boolean drawImage (Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) { + if (component != null && ! component.isRealized ()) + return false; + if (img instanceof GtkOffScreenImage) { copyAndScalePixmap (img.getGraphics (), false, false, 0, 0, img.getWidth (null), img.getHeight (null), x, y, width, height); + // FIXME: need to differentiate between SOMEBITS and FRAMEBITS. + if (observer != null) + observer.imageUpdate (img, + ImageObserver.FRAMEBITS, + x, y, width, height); return true; } GtkImage image = (GtkImage) img; - new GtkImagePainter (image, this, x, y, width, height, bgcolor); + new GtkImagePainter (image, this, x, y, width, height, bgcolor, observer); return image.isLoaded (); } public boolean drawImage (Image img, int x, int y, int width, int height, ImageObserver observer) { + if (component != null && ! component.isRealized ()) + return false; + if (component != null) return drawImage (img, x, y, width, height, component.getBackground (), observer); @@ -192,6 +228,9 @@ public class GdkGraphics extends Graphics int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) { + if (component != null && ! component.isRealized ()) + return false; + if (img instanceof GtkOffScreenImage) { int dx_start, dy_start, d_width, d_height; @@ -247,12 +286,18 @@ public class GdkGraphics extends Graphics copyAndScalePixmap (img.getGraphics (), x_flip, y_flip, sx_start, sy_start, s_width, s_height, dx_start, dy_start, d_width, d_height); + + // FIXME: need to differentiate between SOMEBITS and FRAMEBITS. + if (observer != null) + observer.imageUpdate (img, + ImageObserver.FRAMEBITS, + dx_start, dy_start, d_width, d_height); return true; } GtkImage image = (GtkImage) img; new GtkImagePainter (image, this, dx1, dy1, dx2, dy2, - sx1, sy1, sx2, sy2, bgcolor); + sx1, sy1, sx2, sy2, bgcolor, observer); return image.isLoaded (); } @@ -260,6 +305,9 @@ public class GdkGraphics extends Graphics int sx1, int sy1, int sx2, int sy2, ImageObserver observer) { + if (component != null && ! component.isRealized ()) + return false; + if (component != null) return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, component.getBackground (), observer); @@ -285,11 +333,17 @@ public class GdkGraphics extends Graphics native public void drawRect(int x, int y, int width, int height); native public void fillRect (int x, int y, int width, int height); - native void drawString (String str, int x, int y, String fname, int style, int size); + GdkFontPeer getFontPeer() + { + return (GdkFontPeer) getFont().getPeer(); + } + + native void drawString (GdkFontPeer f, String str, int x, int y); public void drawString (String str, int x, int y) { - drawString (str, x, y, font.getName(), font.getStyle(), font.getSize()); + drawString(getFontPeer(), str, x, y); } + public void drawString (AttributedCharacterIterator ci, int x, int y) { @@ -350,7 +404,6 @@ public class GdkGraphics extends Graphics public Rectangle getClipBounds () { -// System.out.println ("returning CLIP: " + clip); return new Rectangle (clip.x, clip.y, clip.width, clip.height); } @@ -373,6 +426,9 @@ public class GdkGraphics extends Graphics public void setClip (int x, int y, int width, int height) { + if (component != null && ! component.isRealized ()) + return; + clip.x = x; clip.y = y; clip.width = width; @@ -396,7 +452,7 @@ public class GdkGraphics extends Graphics public void setColor (Color c) { if (c == null) - color = new Color (0, 0, 0); + color = Color.BLACK; else color = c; @@ -407,7 +463,7 @@ public class GdkGraphics extends Graphics color.getGreen () ^ xorColor.getGreen (), color.getBlue () ^ xorColor.getBlue ()); } - + public void setFont (Font font) { this.font = font; @@ -437,6 +493,9 @@ public class GdkGraphics extends Graphics public void translate (int x, int y) { + if (component != null && ! component.isRealized ()) + return; + clip.x -= x; clip.y -= y; diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java index 0986960b8b3..82de03d5aec 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphics2D.java @@ -1,5 +1,5 @@ /* GdkGraphics2D.java - Copyright (C) 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,21 +38,60 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.*; -import java.awt.geom.*; -import java.awt.font.*; -import java.awt.color.*; -import java.awt.image.*; -import java.awt.image.renderable.*; -import java.util.HashMap; -import java.util.Map; +import gnu.classpath.Configuration; +import gnu.java.awt.ClasspathToolkit; +import gnu.java.awt.peer.ClasspathFontPeer; +import java.awt.AlphaComposite; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.Image; +import java.awt.Paint; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Shape; +import java.awt.Stroke; +import java.awt.TexturePaint; +import java.awt.Toolkit; +import java.awt.color.ColorSpace; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.awt.font.GlyphJustificationInfo; +import java.awt.geom.Arc2D; +import java.awt.geom.GeneralPath; +import java.awt.geom.NoninvertibleTransformException; +import java.awt.geom.PathIterator; +import java.awt.geom.Point2D; +import java.awt.geom.Rectangle2D; +import java.awt.geom.AffineTransform; +import java.awt.image.AffineTransformOp; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; +import java.awt.image.ColorModel; +import java.awt.image.CropImageFilter; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferInt; +import java.awt.image.FilteredImageSource; +import java.awt.image.ImageConsumer; +import java.awt.image.ImageObserver; +import java.awt.image.ImagingOpException; +import java.awt.image.SampleModel; +import java.awt.image.Raster; +import java.awt.image.RenderedImage; +import java.awt.image.WritableRaster; +import java.awt.image.renderable.RenderableImage; +import java.awt.image.renderable.RenderContext; import java.text.AttributedCharacterIterator; +import java.util.HashMap; +import java.util.Map; import java.util.Stack; -import java.lang.Integer; -import gnu.java.awt.ClasspathToolkit; -import gnu.java.awt.peer.ClasspathFontPeer; -import gnu.classpath.Configuration; public class GdkGraphics2D extends Graphics2D { @@ -85,6 +124,8 @@ public class GdkGraphics2D extends Graphics2D private RenderingHints hints; private BufferedImage bimage; + private Composite comp; + private Stack stateStack; native private void initState (GtkComponentPeer component); @@ -93,6 +134,7 @@ public class GdkGraphics2D extends Graphics2D native public void dispose (); native private int[] getImagePixels(); native private void cairoSurfaceSetFilter(int filter); + native void connectSignals (GtkComponentPeer component); public void finalize () { @@ -113,7 +155,7 @@ public class GdkGraphics2D extends Graphics2D { paint = g.paint; stroke = g.stroke; - hints = g.hints; + setRenderingHints (g.hints); if (g.fg.getAlpha() != -1) fg = new Color (g.fg.getRed (), g.fg.getGreen (), @@ -145,8 +187,8 @@ public class GdkGraphics2D extends Graphics2D setBackground (bg); setPaint (paint); setStroke (stroke); - setClip (clip); setTransform (transform); + setClip (clip); stateStack = new Stack(); } @@ -168,12 +210,22 @@ public class GdkGraphics2D extends Graphics2D GdkGraphics2D (GtkComponentPeer component) { this.component = component; + + setFont (new Font("SansSerif", Font.PLAIN, 12)); + + if (component.isRealized ()) + initComponentGraphics2D (); + else + connectSignals (component); + } + + void initComponentGraphics2D () + { initState (component); setColor (component.awtComponent.getForeground ()); setBackground (component.awtComponent.getBackground ()); setPaint (getColor()); - setFont (new Font("SansSerif", Font.PLAIN, 12)); setTransform (new AffineTransform ()); setStroke (new BasicStroke ()); setRenderingHints (getDefaultHints()); @@ -224,9 +276,6 @@ public class GdkGraphics2D extends Graphics2D private native void cairoSave (); private native void cairoRestore (); private native void cairoSetMatrix (double m[]); - private native void cairoSetFont (GdkClasspathFontPeer peer); - private native void cairoShowGlyphs (int codes[], - float positions[]); private native void cairoSetOperator (int cairoOperator); private native void cairoSetRGBColor (double red, double green, double blue); private native void cairoSetAlpha (double alpha); @@ -268,6 +317,7 @@ public class GdkGraphics2D extends Graphics2D private Shape clip; private AffineTransform transform; private Font font; + private Composite comp; DrawState (GdkGraphics2D g) { this.paint = g.paint; @@ -278,6 +328,7 @@ public class GdkGraphics2D extends Graphics2D if (g.transform != null) this.transform = (AffineTransform) g.transform.clone(); this.font = g.font; + this.comp = g.comp; } public void restore(GdkGraphics2D g) { @@ -288,6 +339,7 @@ public class GdkGraphics2D extends Graphics2D g.clip = this.clip; g.transform = this.transform; g.font = this.font; + g.comp = this.comp; } } @@ -303,17 +355,23 @@ public class GdkGraphics2D extends Graphics2D cairoRestore (); } + // Some operations (drawing rather than filling) require that their + // coords be shifted to land on 0.5-pixel boundaries, in order to land on + // "middle of pixel" coordinates and light up complete pixels. - double x; - double y; - private void setPos (double nx, double ny) + private boolean shiftDrawCalls = false; + private final double shifted(double coord, boolean doShift) { - x = nx; - y = ny; + if (doShift) + return Math.floor(coord) + 0.5; + else + return coord; } - private void walkPath(PathIterator p) + private final void walkPath(PathIterator p, boolean doShift) { + double x = 0; + double y = 0; double coords[] = new double[6]; cairoSetFillRule (p.getWindingRule ()); @@ -324,13 +382,15 @@ public class GdkGraphics2D extends Graphics2D { case PathIterator.SEG_MOVETO: - setPos(coords[0], coords[1]); - cairoMoveTo (coords[0], coords[1]); + x = shifted(coords[0], doShift); + y = shifted(coords[1], doShift); + cairoMoveTo (x, y); break; case PathIterator.SEG_LINETO: - setPos(coords[0], coords[1]); - cairoLineTo (coords[0], coords[1]); + x = shifted(coords[0], doShift); + y = shifted(coords[1], doShift); + cairoLineTo (x, y); break; case PathIterator.SEG_QUADTO: @@ -338,23 +398,25 @@ public class GdkGraphics2D extends Graphics2D // splitting a quadratic bezier into a cubic: // see: http://pfaedit.sourceforge.net/bezier.html - double x1 = x + (2.0/3.0) * (coords[0] - x); - double y1 = y + (2.0/3.0) * (coords[1] - y); + double x1 = x + (2.0/3.0) * (shifted(coords[0], doShift) - x); + double y1 = y + (2.0/3.0) * (shifted(coords[1], doShift) - y); - double x2 = x1 + (1.0/3.0) * (coords[2] - x); - double y2 = y1 + (1.0/3.0) * (coords[3] - y); + double x2 = x1 + (1.0/3.0) * (shifted(coords[2], doShift) - x); + double y2 = y1 + (1.0/3.0) * (shifted(coords[3], doShift) - y); - setPos(coords[2], coords[3]); + x = shifted(coords[2], doShift); + y = shifted(coords[3], doShift); cairoCurveTo (x1, y1, x2, y2, - coords[2], coords[3]); + x, y); break; case PathIterator.SEG_CUBICTO: - setPos(coords[4], coords[5]); - cairoCurveTo (coords[0], coords[1], - coords[2], coords[3], - coords[4], coords[5]); + x = shifted(coords[4], doShift); + y = shifted(coords[5], doShift); + cairoCurveTo (shifted(coords[0], doShift), shifted(coords[1], doShift), + shifted(coords[2], doShift), shifted(coords[3], doShift), + x, y); break; case PathIterator.SEG_CLOSE: @@ -365,7 +427,7 @@ public class GdkGraphics2D extends Graphics2D } - private Map getDefaultHints() + private final Map getDefaultHints() { HashMap defaultHints = new HashMap (); @@ -388,23 +450,19 @@ public class GdkGraphics2D extends Graphics2D } - private void updateBufferedImage() + private final void updateBufferedImage() { int[] pixels = getImagePixels(); updateImagePixels(pixels); } - private boolean isBufferedImageGraphics () + private final boolean isBufferedImageGraphics () { - - if (bimage != null) - return true; - else - return false; + return bimage != null; } - private void updateImagePixels (int[] pixels) + private final void updateImagePixels (int[] pixels) { // This function can only be used if @@ -439,11 +497,15 @@ public class GdkGraphics2D extends Graphics2D } - private boolean drawImage(Image img, - AffineTransform xform, - Color bgcolor, - ImageObserver obs) + private final boolean drawImage(Image img, + AffineTransform xform, + Color bgcolor, + ImageObserver obs) { + + if (img == null) + return false; + if (img instanceof GtkOffScreenImage && img.getGraphics () instanceof GdkGraphics2D && (xform == null @@ -461,8 +523,8 @@ public class GdkGraphics2D extends Graphics2D return true; } else - { - + { + // In this case, xform is an AffineTransform that transforms bounding // box of the specified image from image space to user space. However // when we pass this transform to cairo, cairo will use this transform @@ -475,23 +537,22 @@ public class GdkGraphics2D extends Graphics2D try { - invertedXform = xform.createInverse(); + invertedXform = xform.createInverse(); if (img instanceof BufferedImage) { // draw an image which has actually been loaded // into memory fully - BufferedImage b = (BufferedImage) img; - return drawRaster (b.getColorModel (), - b.getData (), - invertedXform, - bgcolor); + BufferedImage b = (BufferedImage) img; + return drawRaster (b.getColorModel (), + b.getData (), + invertedXform, + bgcolor); } else { - // begin progressive loading in a separate thread - new PainterThread (this, img, invertedXform, bgcolor); - return false; + return this.drawImage(GdkPixbufDecoder.createBufferedImage(img.getSource()), + xform, bgcolor,obs); } } catch (NoninvertibleTransformException e) @@ -517,38 +578,25 @@ public class GdkGraphics2D extends Graphics2D return; } - stateSave (); cairoNewPath (); - - boolean normalize; - normalize = hints.containsValue (RenderingHints.VALUE_STROKE_NORMALIZE) - || hints.containsValue (RenderingHints.VALUE_STROKE_DEFAULT); - - if (normalize) - translate (0.5,0.5); if (s instanceof Rectangle2D) { Rectangle2D r = (Rectangle2D)s; - cairoRectangle (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); + cairoRectangle (shifted(r.getX (), shiftDrawCalls), + shifted(r.getY (), shiftDrawCalls), + r.getWidth (), r.getHeight ()); } else - walkPath (s.getPathIterator (null)); + walkPath (s.getPathIterator (null), shiftDrawCalls); cairoStroke (); - if (normalize) - translate (-0.5,-0.5); - - stateRestore (); - if (isBufferedImageGraphics ()) updateBufferedImage(); - } public void fill (Shape s) { - stateSave(); cairoNewPath (); if (s instanceof Rectangle2D) { @@ -556,9 +604,8 @@ public class GdkGraphics2D extends Graphics2D cairoRectangle (r.getX (), r.getY (), r.getWidth (), r.getHeight ()); } else - walkPath (s.getPathIterator (null)); + walkPath (s.getPathIterator (null), false); cairoFill (); - stateRestore (); if (isBufferedImageGraphics ()) updateBufferedImage(); @@ -592,8 +639,8 @@ public class GdkGraphics2D extends Graphics2D r.getWidth (), r.getHeight ()); } else - walkPath (clip.getPathIterator (null)); - cairoClosePath (); + walkPath (clip.getPathIterator (null), false); + // cairoClosePath (); cairoClip (); } } @@ -739,7 +786,7 @@ public class GdkGraphics2D extends Graphics2D { BasicStroke bs = (BasicStroke) stroke; cairoSetLineCap (bs.getEndCap()); - cairoSetLineWidth (bs.getLineWidth() / 2.0); + cairoSetLineWidth (bs.getLineWidth()); cairoSetLineJoin (bs.getLineJoin()); cairoSetMiterLimit (bs.getMiterLimit()); float dashes[] = bs.getDashArray(); @@ -771,6 +818,9 @@ public class GdkGraphics2D extends Graphics2D public void setColor (Color c) { + if (c == null) + c = Color.BLACK; + fg = c; paint = c; cairoSetRGBColor (fg.getRed() / 255.0, @@ -802,23 +852,23 @@ public class GdkGraphics2D extends Graphics2D return clip.getBounds (); } - protected Rectangle2D getClipInDevSpace () - { - Rectangle2D uclip = clip.getBounds2D (); - if (transform == null) - return uclip; - else - { - Point2D pos = transform.transform (new Point2D.Double(uclip.getX (), - uclip.getY ()), - (Point2D)null); - Point2D extent = transform.deltaTransform (new Point2D.Double(uclip.getWidth (), - uclip.getHeight ()), - (Point2D)null); - return new Rectangle2D.Double (pos.getX (), pos.getY (), - extent.getX (), extent.getY ()); - } - } + protected Rectangle2D getClipInDevSpace () + { + Rectangle2D uclip = clip.getBounds2D (); + if (transform == null) + return uclip; + else + { + Point2D pos = transform.transform (new Point2D.Double(uclip.getX (), + uclip.getY ()), + (Point2D)null); + Point2D extent = transform.deltaTransform (new Point2D.Double(uclip.getWidth (), + uclip.getHeight ()), + (Point2D)null); + return new Rectangle2D.Double (pos.getX (), pos.getY (), + extent.getX (), extent.getY ()); + } + } public void setClip (int x, int y, int width, int height) { @@ -839,96 +889,34 @@ public class GdkGraphics2D extends Graphics2D r.getWidth (), r.getHeight ()); } else - walkPath (s.getPathIterator (null)); - cairoClosePath (); + walkPath (s.getPathIterator (null), false); + // cairoClosePath (); cairoClip (); } } + private static BasicStroke draw3DRectStroke = new BasicStroke(); + public void draw3DRect(int x, int y, int width, int height, boolean raised) { - Color std = fg; - Color light = std.brighter(); - Color dark = std.darker(); - - if (!raised) - { - Color t = light; - light = dark; - dark = t; - } - - double x1 = (double) x; - double x2 = (double) x + width; - - double y1 = (double) y; - double y2 = (double) y + height; - - stateSave (); - - cairoNewPath (); - - boolean normalize; - normalize = hints.containsValue (RenderingHints.VALUE_STROKE_NORMALIZE) - || hints.containsValue (RenderingHints.VALUE_STROKE_DEFAULT); - - if (normalize) - { - x1 += 0.5; - y1 += 0.5; - x2 += 0.5; - y2 += 0.5; - } - - setColor (light); - cairoMoveTo (x1, y1); - cairoLineTo (x2, y1); - cairoLineTo (x2, y2); - cairoStroke (); - - cairoNewPath (); - setColor (dark); - cairoMoveTo (x1, y1); - cairoLineTo (x1, y2); - cairoLineTo (x2, y2); - cairoStroke (); - - stateRestore (); - + Stroke tmp = stroke; + setStroke(draw3DRectStroke); + super.draw3DRect(x, y, width, height, raised); + setStroke(tmp); if (isBufferedImageGraphics ()) updateBufferedImage(); - } public void fill3DRect(int x, int y, int width, int height, boolean raised) { - double step = 1.0; - if (stroke != null && stroke instanceof BasicStroke) - { - BasicStroke bs = (BasicStroke) stroke; - step = bs.getLineWidth(); - } - - Color bright = fg.brighter (); - Color dark = fg.darker (); - - draw3DRect (x, y, width, height, raised); - - stateSave (); - translate (step/2.0, step/2.0); - cairoNewPath (); - cairoRectangle ((double) x, (double) y, - ((double) width) - step, - ((double) height) - step ); - cairoClosePath (); - cairoFill (); - stateRestore (); - + Stroke tmp = stroke; + setStroke(draw3DRectStroke); + super.fill3DRect(x, y, width, height, raised); + setStroke(tmp); if (isBufferedImageGraphics ()) updateBufferedImage(); - } @@ -939,21 +927,21 @@ public class GdkGraphics2D extends Graphics2D public void fillRect (int x, int y, int width, int height) { - fill(new Rectangle (x, y, width, height)); + cairoNewPath (); + cairoRectangle (x, y, width, height); + cairoFill (); } public void clearRect (int x, int y, int width, int height) { - stateSave (); cairoSetRGBColor (bg.getRed() / 255.0, bg.getGreen() / 255.0, bg.getBlue() / 255.0); cairoSetAlpha (1.0); cairoNewPath (); cairoRectangle (x, y, width, height); - cairoClosePath (); cairoFill (); - stateRestore (); + setColor (fg); if (isBufferedImageGraphics ()) updateBufferedImage(); @@ -970,8 +958,8 @@ public class GdkGraphics2D extends Graphics2D return bg; } - private void doPolygon(int[] xPoints, int[] yPoints, int nPoints, - boolean close, boolean fill) + private final void doPolygon(int[] xPoints, int[] yPoints, int nPoints, + boolean close, boolean fill) { if (nPoints < 1) return; @@ -1026,9 +1014,9 @@ public class GdkGraphics2D extends Graphics2D doPolygon (xPoints, yPoints, nPoints, false, false); } - private boolean drawRaster (ColorModel cm, Raster r, - AffineTransform imageToUser, - Color bgcolor) + private final boolean drawRaster (ColorModel cm, Raster r, + AffineTransform imageToUser, + Color bgcolor) { if (r == null) return false; @@ -1087,10 +1075,7 @@ public class GdkGraphics2D extends Graphics2D } } - stateSave (); - translate (x, y); drawPixels (pixels, r.getWidth (), r.getHeight (), r.getWidth (), i2u); - stateRestore (); if (isBufferedImageGraphics ()) updateBufferedImage(); @@ -1133,113 +1118,6 @@ public class GdkGraphics2D extends Graphics2D } - //////////////////////////////////////// - ////// Supporting Private Classes ////// - //////////////////////////////////////// - - private class PainterThread implements Runnable, ImageConsumer - { - - // this is a helper which is spun off when someone tries to do - // Graphics2D.drawImage on an image we cannot determine to be either - // one of our own offscreen images or a BufferedImage; that is, when - // someone wants to draw an image which is possibly still loading over - // a network or something. you run it in a separate thread and it - // writes through to the underlying Graphics2D as pixels becomg - // available. - - GdkGraphics2D gr; - Image image; - ColorModel defaultModel; - AffineTransform xform; - Color bgcolor; - - public PainterThread (GdkGraphics2D g, Image im, - AffineTransform xf, Color bg) - { - image = im; - xform = xf; - bgcolor = bg; - this.gr = (GdkGraphics2D) g.create (); - new Thread (this).start (); - } - - public void imageComplete (int status) - { - } - - public void setColorModel (ColorModel model) - { - defaultModel = model; - } - - public void setDimensions (int width, int height) - { - } - - public void setHints (int hintflags) - { - } - - public void setPixels (int x, int y, int w, int h, ColorModel model, - byte[] pixels, int off, int scansize) - { - } - - public void setPixels (int x, int y, int w, int h, ColorModel model, - int[] pixels, int off, int scansize) - { - gr.stateSave (); - gr.translate (x, y); - - if (model == null) - model = defaultModel; - - int pixels2[]; - if (model != null) - { - pixels2 = new int[pixels.length]; - for (int yy = 0; yy < h; yy++) - for (int xx = 0; xx < w; xx++) - { - int i = yy * scansize + xx; - pixels2[i] = model.getRGB (pixels[i]); - } - } - else - pixels2 = pixels; - - // change all transparent pixels in the image to the - // specified bgcolor - - if (bgcolor != null) - { - for (int i = 0; i < pixels2.length; i++) - { - if (model.getAlpha (pixels2[i]) == 0) - pixels2[i] = bgcolor.getRGB (); - } - } - - double[] xf = new double[6]; - xform.getMatrix(xf); - gr.drawPixels (pixels2, w, h, scansize, xf); - gr.stateRestore (); - } - - public void setProperties (java.util.Hashtable props) - { - } - - public void run () - { - image.getSource ().startProduction (this); - gr.dispose (); - } - } - - - /////////////////////////////////////////////// ////// Unimplemented Stubs and Overloads ////// /////////////////////////////////////////////// @@ -1259,6 +1137,8 @@ public class GdkGraphics2D extends Graphics2D public void setComposite(Composite comp) { + this.comp = comp; + if (comp instanceof AlphaComposite) { AlphaComposite a = (AlphaComposite) comp; @@ -1297,8 +1177,11 @@ public class GdkGraphics2D extends Graphics2D else if (hintValue.equals(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) cairoSurfaceSetFilter(4); - } + } + shiftDrawCalls = hints.containsValue (RenderingHints.VALUE_STROKE_NORMALIZE) + || hints.containsValue (RenderingHints.VALUE_STROKE_DEFAULT); + } public Object getRenderingHint(RenderingHints.Key hintKey) @@ -1331,6 +1214,9 @@ public class GdkGraphics2D extends Graphics2D else if(hints.containsValue(RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)) cairoSurfaceSetFilter(4); } + + shiftDrawCalls = hints.containsValue (RenderingHints.VALUE_STROKE_NORMALIZE) + || hints.containsValue (RenderingHints.VALUE_STROKE_DEFAULT); } public void addRenderingHints(Map hints) @@ -1345,7 +1231,10 @@ public class GdkGraphics2D extends Graphics2D public Composite getComposite() { - throw new java.lang.UnsupportedOperationException (); + if (comp == null) + return AlphaComposite.SrcOver; + else + return comp; } public FontRenderContext getFontRenderContext () @@ -1353,23 +1242,6 @@ public class GdkGraphics2D extends Graphics2D return new FontRenderContext (transform, true, true); } - public void drawGlyphVector (GlyphVector g, float x, float y) - { - stateSave (); - setFont (g.getFont ()); - translate ((double)x, (double)y); - cairoMoveTo (0, 0); - int nglyphs = g.getNumGlyphs (); - int codes[] = g.getGlyphCodes (0, nglyphs, (int []) null); - float posns[] = g.getGlyphPositions (0, nglyphs, (float []) null); - cairoShowGlyphs (codes, posns); - - if (isBufferedImageGraphics ()) - updateBufferedImage(); - - stateRestore (); - } - public void copyArea (int x, int y, int width, int height, int dx, int dy) { throw new java.lang.UnsupportedOperationException (); @@ -1418,6 +1290,9 @@ public class GdkGraphics2D extends Graphics2D Color bgcolor, ImageObserver observer) { + if (img == null) + return false; + Image subImage; int sourceWidth = sx2 - sx1; @@ -1501,15 +1376,40 @@ public class GdkGraphics2D extends Graphics2D drawLine (x1, y + height, x2, y + height); } - public void drawString (String str, int x, int y) + // these are the most accelerated painting paths + native void cairoDrawGdkGlyphVector (GdkFontPeer f, GdkGlyphVector gv, float x, float y); + native void cairoDrawGdkTextLayout (GdkFontPeer f, GdkTextLayout gl, float x, float y); + native void cairoDrawString (GdkFontPeer f, String str, float x, float y); + + GdkFontPeer getFontPeer() { - drawString (str, (float)x, (float)y); + return (GdkFontPeer) getFont().getPeer(); + } + + public void drawGdkGlyphVector(GdkGlyphVector gv, float x, float y) + { + cairoDrawGdkGlyphVector(getFontPeer(), gv, x, y); + if (isBufferedImageGraphics ()) + updateBufferedImage(); + } + + public void drawGdkTextLayout(GdkTextLayout gl, float x, float y) + { + cairoDrawGdkTextLayout(getFontPeer(), gl, x, y); + if (isBufferedImageGraphics ()) + updateBufferedImage(); } public void drawString (String str, float x, float y) { - GlyphVector gv = font.createGlyphVector (getFontRenderContext(), str); - drawGlyphVector (gv, x, y); + cairoDrawString(getFontPeer(), str, x, y); + if (isBufferedImageGraphics ()) + updateBufferedImage(); + } + + public void drawString (String str, int x, int y) + { + drawString (str, (float)x, (float)y); } public void drawString (AttributedCharacterIterator ci, int x, int y) @@ -1517,6 +1417,14 @@ public class GdkGraphics2D extends Graphics2D drawString (ci, (float)x, (float)y); } + public void drawGlyphVector (GlyphVector gv, float x, float y) + { + if (gv instanceof GdkGlyphVector) + drawGdkGlyphVector((GdkGlyphVector)gv, x, y); + else + throw new java.lang.UnsupportedOperationException (); + } + public void drawString (AttributedCharacterIterator ci, float x, float y) { GlyphVector gv = font.createGlyphVector (getFontRenderContext(), ci); @@ -1562,30 +1470,38 @@ public class GdkGraphics2D extends Graphics2D return font; } + // Until such time as pango is happy to talk directly to cairo, we + // actually need to redirect some calls from the GtkFontPeer and + // GtkFontMetrics into the drawing kit and ask cairo ourselves. + + static native void releasePeerGraphicsResource(GdkFontPeer f); + static native void getPeerTextMetrics (GdkFontPeer f, String str, double [] metrics); + static native void getPeerFontMetrics (GdkFontPeer f, double [] metrics); + public FontMetrics getFontMetrics () { + // the reason we go via the toolkit here is to try to get + // a cached object. the toolkit keeps such a cache. return Toolkit.getDefaultToolkit ().getFontMetrics (font); } public FontMetrics getFontMetrics (Font f) { + // the reason we go via the toolkit here is to try to get + // a cached object. the toolkit keeps such a cache. return Toolkit.getDefaultToolkit ().getFontMetrics (f); } public void setFont (Font f) { - if (f.getPeer() instanceof GdkClasspathFontPeer) + if (f.getPeer() instanceof GdkFontPeer) font = f; else font = ((ClasspathToolkit)(Toolkit.getDefaultToolkit ())) - .getFont (f.getName(), f.getAttributes ()); - - if (f != null && - f.getPeer() instanceof GdkClasspathFontPeer) - cairoSetFont ((GdkClasspathFontPeer) f.getPeer()); + .getFont (f.getName(), f.getAttributes ()); } - + public String toString() { return getClass ().getName () + diff --git a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java index dbcd2d1c437..45e0c21c0f2 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkGraphicsEnvironment.java @@ -38,18 +38,20 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.*; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; +import java.awt.Rectangle; +import java.awt.Shape; import java.awt.image.BufferedImage; import java.util.Locale; - public class GdkGraphicsEnvironment extends GraphicsEnvironment { - public GdkGraphicsEnvironment () { - super(); + super(); } public GraphicsDevice[] getScreenDevices () @@ -66,22 +68,28 @@ public class GdkGraphicsEnvironment extends GraphicsEnvironment { return new GdkGraphics2D (image); } + native private int nativeGetNumFontFamilies (); + native private void nativeGetFontFamilies (String[] family_names); public Font[] getAllFonts () { throw new java.lang.UnsupportedOperationException (); } - public String[] getAvailableFontFamilyNames () - { - throw new java.lang.UnsupportedOperationException (); - } + public String[] getAvailableFontFamilyNames () + { + String[] family_names; + int array_size; + + array_size = nativeGetNumFontFamilies(); + family_names = new String[array_size]; + + nativeGetFontFamilies(family_names); + return family_names; + } public String[] getAvailableFontFamilyNames (Locale l) { throw new java.lang.UnsupportedOperationException (); } - - -} // class GdkGraphicsEnvironment - +} diff --git a/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java b/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java index 5c7fd96003b..a7b93e5b9ad 100644 --- a/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java +++ b/libjava/gnu/java/awt/peer/gtk/GdkPixbufDecoder.java @@ -1,52 +1,57 @@ /* GdkPixbufDecoder.java -- Image data decoding object - Copyright (C) 2003 Free Software Foundation, Inc. - - This file is part of GNU Classpath. - - GNU Classpath is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - GNU Classpath is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNU Classpath; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. - - Linking this library statically or dynamically with other modules is - making a combined work based on this library. Thus, the terms and - conditions of the GNU General Public License cover the whole - combination. - - As a special exception, the copyright holders of this library give you - permission to link this library with independent modules to produce an - executable, regardless of the license terms of these independent - modules, and to copy and distribute the resulting executable under - terms of your choice, provided that you also meet, for each linked - independent module, the terms and conditions of the license of that - module. An independent module is a module which is not derived from - or based on this library. If you modify this library, you may extend - this exception to your version of the library, but you are not - obligated to do so. If you do not wish to do so, delete this - exception statement from your version. */ + Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ package gnu.java.awt.peer.gtk; -import java.awt.image.*; +import gnu.classpath.Configuration; + +import java.awt.image.BufferedImage; +import java.awt.image.ColorModel; +import java.awt.image.DirectColorModel; +import java.awt.image.ImageConsumer; +import java.awt.image.ImageProducer; import java.io.FileDescriptor; import java.io.FileInputStream; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.net.URL; -import java.util.Vector; import java.util.Hashtable; -import gnu.classpath.Configuration; +import java.util.Vector; public class GdkPixbufDecoder extends gnu.java.awt.image.ImageDecoder { diff --git a/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java b/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java new file mode 100644 index 00000000000..26cfc16f0da --- /dev/null +++ b/libjava/gnu/java/awt/peer/gtk/GdkTextLayout.java @@ -0,0 +1,435 @@ +/* GdkTextLayout.java + Copyright (C) 2003 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package gnu.java.awt.peer.gtk; + +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Shape; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphMetrics; +import java.awt.font.GlyphVector; +import java.awt.font.TextHitInfo; +import java.awt.font.TextLayout; +import java.awt.geom.AffineTransform; +import java.awt.geom.GeneralPath; +import java.awt.geom.Rectangle2D; +import java.text.CharacterIterator; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; +import java.util.Map; +import java.awt.font.TextAttribute; + +import gnu.classpath.Configuration; +import gnu.java.awt.peer.ClasspathTextLayoutPeer; + +/** + * This is an implementation of the text layout peer interface which + * delegates all the hard work to pango. + * + * @author Graydon Hoare + */ + +public class GdkTextLayout + implements ClasspathTextLayoutPeer +{ + // native side, plumbing, etc. + static + { + if (Configuration.INIT_LOAD_LIBRARY) + { + System.loadLibrary("gtkpeer"); + } + initStaticState (); + } + private native void setText(String str); + private native void getExtents(double[] inkExtents, + double[] logExtents); + private native void indexToPos(int idx, double[] pos); + private native void initState (); + private native void dispose (); + native static void initStaticState (); + private final int native_state = GtkGenericPeer.getUniqueInteger (); + protected void finalize () + { + dispose (); + } + + // we hold on to these to make sure we can render when presented + // with non-GdkGraphics2D paint targets + private AttributedString attributedString; + private FontRenderContext fontRenderContext; + + public GdkTextLayout(AttributedString str, FontRenderContext frc) + { + initState(); + attributedString = str; + fontRenderContext = frc; + } + + protected class CharacterIteratorProxy + implements CharacterIterator + { + public CharacterIterator target; + public int begin; + public int limit; + public int index; + + public CharacterIteratorProxy (CharacterIterator ci) + { + target = ci; + } + + public int getBeginIndex () + { + return begin; + } + + public int getEndIndex () + { + return limit; + } + + public int getIndex () + { + return index; + } + + public char setIndex (int idx) + throws IllegalArgumentException + { + if (idx < begin || idx >= limit) + throw new IllegalArgumentException (); + char ch = target.setIndex (idx); + index = idx; + return ch; + } + + public char first () + { + int save = target.getIndex (); + char ch = target.setIndex (begin); + target.setIndex (save); + return ch; + } + + public char last () + { + if (begin == limit) + return this.first (); + + int save = target.getIndex (); + char ch = target.setIndex (limit - 1); + target.setIndex (save); + return ch; + } + + public char current () + { + return target.current(); + } + + public char next () + { + if (index >= limit - 1) + return CharacterIterator.DONE; + else + { + index++; + return target.next(); + } + } + + public char previous () + { + if (index <= begin) + return CharacterIterator.DONE; + else + { + index--; + return target.previous (); + } + } + + public Object clone () + { + CharacterIteratorProxy cip = new CharacterIteratorProxy (this.target); + cip.begin = this.begin; + cip.limit = this.limit; + cip.index = this.index; + return cip; + } + + } + + + // public side + + public void draw (Graphics2D g2, float x, float y) + { + if (g2 instanceof GdkGraphics2D) + { + // we share pango structures directly with GdkGraphics2D + // when legal + GdkGraphics2D gg2 = (GdkGraphics2D) g2; + gg2.drawGdkTextLayout(this, x, y); + } + else + { + // falling back to a rather tedious layout algorithm when + // not legal + AttributedCharacterIterator ci = attributedString.getIterator (); + CharacterIteratorProxy proxy = new CharacterIteratorProxy (ci); + Font defFont = g2.getFont (); + + /* Note: this implementation currently only interprets FONT text + * attributes. There is a reasonable argument to be made for some + * attributes being interpreted out here, where we have control of the + * Graphics2D and can construct or derive new fonts, and some + * attributes being interpreted by the GlyphVector itself. So far, for + * all attributes except FONT we do neither. + */ + + for (char c = ci.first (); + c != CharacterIterator.DONE; + c = ci.next ()) + { + proxy.begin = ci.getIndex (); + proxy.limit = ci.getRunLimit(TextAttribute.FONT); + if (proxy.limit <= proxy.begin) + continue; + + proxy.index = proxy.begin; + + Object fnt = ci.getAttribute(TextAttribute.FONT); + GlyphVector gv; + if (fnt instanceof Font) + gv = ((Font)fnt).createGlyphVector (fontRenderContext, proxy); + else + gv = defFont.createGlyphVector (fontRenderContext, proxy); + + g2.drawGlyphVector (gv, x, y); + + int n = gv.getNumGlyphs (); + for (int i = 0; i < n; ++i) + { + GlyphMetrics gm = gv.getGlyphMetrics (i); + if (gm.getAdvanceX() == gm.getAdvance ()) + x += gm.getAdvanceX (); + else + y += gm.getAdvanceY (); + } + } + } + } + + public TextHitInfo getStrongCaret (TextHitInfo hit1, + TextHitInfo hit2) + { + throw new Error("not implemented"); + } + + public byte getBaseline () + { + throw new Error("not implemented"); + } + + public boolean isLeftToRight () + { + throw new Error("not implemented"); + } + + public boolean isVertical () + { + throw new Error("not implemented"); + } + + public float getAdvance () + { + throw new Error("not implemented"); + } + + public float getAscent () + { + throw new Error("not implemented"); + } + + public float getDescent () + { + throw new Error("not implemented"); + } + + public float getLeading () + { + throw new Error("not implemented"); + } + + public int getCharacterCount () + { + throw new Error("not implemented"); + } + + public byte getCharacterLevel (int index) + { + throw new Error("not implemented"); + } + + public float[] getBaselineOffsets () + { + throw new Error("not implemented"); + } + + public Shape getBlackBoxBounds (int firstEndpoint, int secondEndpoint) + { + throw new Error("not implemented"); + } + + public Rectangle2D getBounds () + { + double[] inkExtents = new double[4]; + double[] logExtents = new double[4]; + getExtents(inkExtents, logExtents); + return new Rectangle2D.Double(logExtents[0], logExtents[1], + logExtents[2], logExtents[3]); + } + + public float[] getCaretInfo (TextHitInfo hit, Rectangle2D bounds) + { + throw new Error("not implemented"); + } + + public Shape getCaretShape (TextHitInfo hit, Rectangle2D bounds) + { + throw new Error("not implemented"); + } + + public Shape[] getCaretShapes (int offset, Rectangle2D bounds, + TextLayout.CaretPolicy policy) + { + throw new Error("not implemented"); + } + + public Shape getLogicalHighlightShape (int firstEndpoint, int secondEndpoint, + Rectangle2D bounds) + { + AffineTransform at = new AffineTransform(); + GeneralPath gp = new GeneralPath(); + double [] rect = new double[4]; + Rectangle2D tmp = new Rectangle2D.Double(); + for (int i = firstEndpoint; i <= secondEndpoint; ++i) + { + indexToPos(i, rect); + tmp.setRect(rect[0], rect[1], rect[2], rect[3]); + Rectangle2D.intersect(tmp, bounds, tmp); + gp.append(tmp.getPathIterator(at), false); + } + return gp; + } + + public int[] getLogicalRangesForVisualSelection (TextHitInfo firstEndpoint, + TextHitInfo secondEndpoint) + { + throw new Error("not implemented"); + } + + public TextHitInfo getNextLeftHit (int offset, TextLayout.CaretPolicy policy) + { + throw new Error("not implemented"); + } + public TextHitInfo getNextRightHit (int offset, TextLayout.CaretPolicy policy) + { + throw new Error("not implemented"); + } + public TextHitInfo hitTestChar (float x, float y, Rectangle2D bounds) + { + throw new Error("not implemented"); + } + public TextHitInfo getVisualOtherHit (TextHitInfo hit) + { + throw new Error("not implemented"); + } + + public float getVisibleAdvance () + { + throw new Error("not implemented"); + } + + public Shape getOutline (AffineTransform tx) + { + throw new Error("not implemented"); + } + + public Shape getVisualHighlightShape (TextHitInfo firstEndpoint, + TextHitInfo secondEndpoint, + Rectangle2D bounds) + { + throw new Error("not implemented"); + } + + + public TextLayout getJustifiedLayout (float justificationWidth) + { + throw new Error("not implemented"); + } + + public void handleJustify (float justificationWidth) + { + throw new Error("not implemented"); + } + + public Object clone () + { + throw new Error("not implemented"); + } + + public int hashCode () + { + throw new Error("not implemented"); + } + + public boolean equals (ClasspathTextLayoutPeer tl) + { + throw new Error("not implemented"); + } + + public String toString () + { + throw new Error("not implemented"); + } + +} diff --git a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java index db8aed6087b..9fba828b74b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkButtonPeer.java @@ -1,5 +1,5 @@ /* GtkButtonPeer.java -- Implements ButtonPeer with GTK - Copyright (C) 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -43,8 +43,8 @@ import java.awt.Button; import java.awt.Component; import java.awt.Font; import java.awt.Point; -import java.awt.event.MouseEvent; import java.awt.event.KeyEvent; +import java.awt.event.MouseEvent; import java.awt.peer.ButtonPeer; public class GtkButtonPeer extends GtkComponentPeer @@ -52,13 +52,15 @@ public class GtkButtonPeer extends GtkComponentPeer { native void create (String label); - public native void connectJObject (); public native void connectSignals (); - native void gtkSetFont (String name, int style, int size); + native void gtkWidgetModifyFont (String name, int style, int size); native void gtkSetLabel (String label); native void gtkWidgetSetForeground (int red, int green, int blue); + native void gtkWidgetSetBackground (int red, int green, int blue); native void gtkActivate (); + native void gtkWidgetRequestFocus (); + native void setNativeBounds (int x, int y, int width, int height); public GtkButtonPeer (Button b) { @@ -86,8 +88,8 @@ public class GtkButtonPeer extends GtkComponentPeer if (!me.isConsumed () && (me.getModifiersEx () & MouseEvent.BUTTON1_DOWN_MASK) != 0 && awtComponent.getBounds().contains(p)) - postActionEvent (((Button)awtComponent).getActionCommand (), - me.getModifiersEx ()); + postActionEvent (((Button) awtComponent).getActionCommand (), + me.getModifiersEx ()); } if (e.getID () == KeyEvent.KEY_PRESSED) diff --git a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java index 361136f08e9..a6fd1bac183 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java @@ -55,7 +55,7 @@ public class GtkCheckboxPeer extends GtkComponentPeer public native void create (GtkCheckboxGroupPeer group); public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group); public native void connectSignals (); - native void gtkSetFont (String name, int style, int size); + native void gtkWidgetModifyFont (String name, int style, int size); native void gtkButtonSetLabel (String label); native void gtkToggleButtonSetActive (boolean is_active); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java index 2ecea5cb9ba..05464143dcf 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkChoicePeer.java @@ -59,6 +59,10 @@ public class GtkChoicePeer extends GtkComponentPeer append (items); } + + int selected = c.getSelectedIndex(); + if (selected >= 0) + select(selected); } native void create (); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkClipboard.java b/libjava/gnu/java/awt/peer/gtk/GtkClipboard.java index 86678f8ab1c..ecc4c5cf7a1 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkClipboard.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkClipboard.java @@ -43,9 +43,9 @@ import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.IOException; public class GtkClipboard extends Clipboard { @@ -60,15 +60,13 @@ public class GtkClipboard extends Clipboard static boolean hasSelection = false; - protected - GtkClipboard () + protected GtkClipboard() { - super ("System Clipboard"); - initNativeState (); + super("System Clipboard"); + initNativeState(); } - public Transferable - getContents (Object requestor) + public Transferable getContents(Object requestor) { synchronized (this) { @@ -77,72 +75,76 @@ public class GtkClipboard extends Clipboard } /* Java doesn't own the selection, so we need to ask X11 */ + // XXX: Does this hold with Swing too ? synchronized (selectionLock) { - requestStringConversion (); + requestStringConversion(); + try { - selectionLock.wait (SELECTION_RECEIVED_TIMEOUT); + selectionLock.wait(SELECTION_RECEIVED_TIMEOUT); } catch (InterruptedException e) { return null; } - return (selection == null) ? null : new StringSelection (selection); + return selection == null ? null : new StringSelection(selection); } } - void - stringSelectionReceived (String newSelection) + void stringSelectionReceived(String newSelection) { synchronized (selectionLock) { selection = newSelection; - selectionLock.notify (); + selectionLock.notify(); } } /* convert Java clipboard data into a String suitable for sending to another application */ - synchronized String - stringSelectionHandler () throws IOException + synchronized String stringSelectionHandler() throws IOException { String selection = null; - try { - if (contents.isDataFlavorSupported (DataFlavor.stringFlavor)) - selection = (String)contents.getTransferData (DataFlavor.stringFlavor); - else if (contents.isDataFlavorSupported (DataFlavor.plainTextFlavor)) - { - StringBuffer sbuf = new StringBuffer (); - InputStreamReader reader; - char readBuf[] = new char[512]; - int numChars; + try + { + if (contents.isDataFlavorSupported(DataFlavor.stringFlavor)) + selection = (String)contents.getTransferData(DataFlavor.stringFlavor); + else if (contents.isDataFlavorSupported(DataFlavor.plainTextFlavor)) + { + StringBuffer sbuf = new StringBuffer(); + InputStreamReader reader; + char readBuf[] = new char[512]; + int numChars; - reader = new InputStreamReader - ((InputStream) - contents.getTransferData (DataFlavor.plainTextFlavor), "UNICODE"); + reader = new InputStreamReader + ((InputStream) + contents.getTransferData(DataFlavor.plainTextFlavor), "UNICODE"); - while (true) - { - numChars = reader.read (readBuf); - if (numChars == -1) - break; - sbuf.append (readBuf, 0, numChars); - } + while (true) + { + numChars = reader.read(readBuf); + if (numChars == -1) + break; + sbuf.append(readBuf, 0, numChars); + } - selection = new String (sbuf); - } - } catch (Exception e) { } + selection = new String(sbuf); + } + } + catch (Exception e) + { + } return selection; } - public synchronized void - setContents (Transferable contents, ClipboardOwner owner) + public synchronized void setContents(Transferable contents, + ClipboardOwner owner) { - selectionGet (); + selectionGet(); this.contents = contents; this.owner = owner; @@ -150,20 +152,19 @@ public class GtkClipboard extends Clipboard hasSelection = true; } - synchronized - void selectionClear () + synchronized void selectionClear() { hasSelection = false; if (owner != null) { - owner.lostOwnership (this, contents); + owner.lostOwnership(this, contents); owner = null; contents = null; } } - native void initNativeState (); - native static void requestStringConversion (); - native static void selectionGet (); + native void initNativeState(); + native static void requestStringConversion(); + native static void selectionGet(); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java index eae5a948bc4..31d59ce19b0 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkComponentPeer.java @@ -77,6 +77,8 @@ public class GtkComponentPeer extends GtkGenericPeer Insets insets; + boolean isInRepaint; + /* this isEnabled differs from Component.isEnabled, in that it knows if a parent is disabled. In that case Component.isEnabled may return true, but our isEnabled will always return false */ @@ -85,7 +87,6 @@ public class GtkComponentPeer extends GtkGenericPeer native int[] gtkWidgetGetForeground (); native int[] gtkWidgetGetBackground (); - native void gtkWidgetSetVisible (boolean b); native void gtkWidgetGetDimensions (int[] dim); native void gtkWidgetGetPreferredDimensions (int[] dim); native void gtkWidgetGetLocationOnScreen (int[] point); @@ -97,17 +98,14 @@ public class GtkComponentPeer extends GtkGenericPeer native void gtkWidgetRequestFocus (); native void gtkWidgetDispatchKeyEvent (int id, long when, int mods, int keyCode, int keyLocation); - native void gtkSetFont (String name, int style, int size); - native void gtkWidgetQueueDrawArea(int x, int y, int width, int height); - native void addExposeFilter(); - native void removeExposeFilter(); + + native boolean isRealized (); void create () { throw new RuntimeException (); } - native void connectJObject (); native void connectSignals (); protected GtkComponentPeer (Component awtComponent) @@ -118,9 +116,6 @@ public class GtkComponentPeer extends GtkGenericPeer create (); - setParent (); - - connectJObject (); connectSignals (); if (awtComponent.getForeground () != null) @@ -130,12 +125,22 @@ public class GtkComponentPeer extends GtkGenericPeer if (awtComponent.getFont() != null) setFont(awtComponent.getFont()); - setCursor (awtComponent.getCursor ()); + Component parent = awtComponent.getParent (); + + // Only set our parent on the GTK side if our parent on the AWT + // side is not showing. Otherwise the gtk peer will be shown + // before we've had a chance to position and size it properly. + if (awtComponent instanceof Window + || (parent != null && ! parent.isShowing ())) + setParentAndBounds (); + } + + void setParentAndBounds () + { + setParent (); setComponentBounds (); - Rectangle bounds = awtComponent.getBounds (); - setBounds (bounds.x, bounds.y, bounds.width, bounds.height); setVisibleAndEnabled (); } @@ -154,15 +159,32 @@ public class GtkComponentPeer extends GtkGenericPeer gtkWidgetSetParent (p); } + void beginNativeRepaint () + { + isInRepaint = true; + } + + void endNativeRepaint () + { + isInRepaint = false; + } + /* * Set the bounds of this peer's AWT Component based on dimensions * returned by the native windowing system. Most Components impose - * their dimensions on the peers so the default implementation does - * nothing. However some peers, like GtkFileDialogPeer, need to - * pass their size back to the AWT Component. + * their dimensions on the peers which is what the default + * implementation does. However some peers, like GtkFileDialogPeer, + * need to pass their size back to the AWT Component. */ void setComponentBounds () { + Rectangle bounds = awtComponent.getBounds (); + + if (bounds.x == 0 && bounds.y == 0 + && bounds.width == 0 && bounds.height == 0) + return; + + setBounds (bounds.x, bounds.y, bounds.width, bounds.height); } void setVisibleAndEnabled () @@ -180,7 +202,9 @@ public class GtkComponentPeer extends GtkGenericPeer public Image createImage (ImageProducer producer) { - return new GtkImage (producer, null); + GtkImage image = new GtkImage (producer, null); + producer.startProduction (image); + return image; } public Image createImage (int width, int height) @@ -195,6 +219,9 @@ public class GtkComponentPeer extends GtkGenericPeer else g = new GdkGraphics (width, height); + g.setColor(getBackground()); + g.fillRect(0, 0, width, height); + return new GtkOffScreenImage (null, g, width, height); } @@ -215,7 +242,7 @@ public class GtkComponentPeer extends GtkGenericPeer public FontMetrics getFontMetrics (Font font) { - return new GdkFontMetrics (font); + return getToolkit().getFontMetrics(font); } public Graphics getGraphics () @@ -265,8 +292,8 @@ public class GtkComponentPeer extends GtkGenericPeer // Some peers like GtkFileDialogPeer are repainted by Gtk itself if (g == null) break; - - g.setClip (((PaintEvent)event).getUpdateRect()); + + g.setClip (((PaintEvent) event).getUpdateRect()); if (id == PaintEvent.PAINT) awtComponent.paint (g); @@ -310,21 +337,6 @@ public class GtkComponentPeer extends GtkGenericPeer public void paint (Graphics g) { - Component parent = awtComponent.getParent(); - GtkComponentPeer parentPeer = null; - if ((parent instanceof Container) && !parent.isLightweight()) - parentPeer = (GtkComponentPeer) parent.getPeer(); - - addExposeFilter(); - if (parentPeer != null) - parentPeer.addExposeFilter(); - - Rectangle clip = g.getClipBounds(); - gtkWidgetQueueDrawArea(clip.x, clip.y, clip.width, clip.height); - - removeExposeFilter(); - if (parentPeer != null) - parentPeer.removeExposeFilter(); } public Dimension preferredSize () @@ -371,8 +383,11 @@ public class GtkComponentPeer extends GtkGenericPeer public void repaint (long tm, int x, int y, int width, int height) { + if (x == 0 && y == 0 && width == 0 && height == 0) + return; + q.postEvent (new PaintEvent (awtComponent, PaintEvent.UPDATE, - new Rectangle (x, y, width, height))); + new Rectangle (x, y, width, height))); } public void requestFocus () @@ -391,7 +406,7 @@ public class GtkComponentPeer extends GtkGenericPeer gtkWidgetSetBackground (c.getRed(), c.getGreen(), c.getBlue()); } - native public void setNativeBounds (int x, int y, int width, int height); + native void setNativeBounds (int x, int y, int width, int height); public void setBounds (int x, int y, int width, int height) { @@ -426,13 +441,24 @@ public class GtkComponentPeer extends GtkGenericPeer if (parent instanceof Window && !lightweightChild) { Insets insets = ((Window) parent).getInsets (); - // Convert from Java coordinates to GTK coordinates. - setNativeBounds (x - insets.left, y - insets.top, width, height); + GtkWindowPeer peer = (GtkWindowPeer) parent.getPeer (); + int menuBarHeight = 0; + if (peer instanceof GtkFramePeer) + menuBarHeight = ((GtkFramePeer) peer).getMenuBarHeight (); + + // Convert from Java coordinates to GTK coordinates. + setNativeBounds (x - insets.left, y - insets.top + menuBarHeight, + width, height); } else setNativeBounds (x, y, width, height); } + void setCursor () + { + setCursor (awtComponent.getCursor ()); + } + public void setCursor (Cursor cursor) { gtkWidgetSetCursor (cursor.getType ()); @@ -448,7 +474,7 @@ public class GtkComponentPeer extends GtkGenericPeer // FIXME: This should really affect the widget tree below me. // Currently this is only handled if the call is made directly on // a text widget, which implements setFont() itself. - gtkSetFont(f.getName(), f.getStyle(), f.getSize()); + gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize()); } public void setForeground (Color c) @@ -488,8 +514,9 @@ public class GtkComponentPeer extends GtkGenericPeer protected void postExposeEvent (int x, int y, int width, int height) { - q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, - new Rectangle (x, y, width, height))); + if (!isInRepaint) + q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + new Rectangle (x, y, width, height))); } protected void postKeyEvent (int id, long when, int mods, diff --git a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java index 040499724fd..7fddd56619f 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkContainerPeer.java @@ -45,13 +45,16 @@ import java.awt.Container; import java.awt.Font; import java.awt.Graphics; import java.awt.Insets; +import java.awt.Window; import java.awt.event.PaintEvent; +import java.awt.peer.ComponentPeer; import java.awt.peer.ContainerPeer; public class GtkContainerPeer extends GtkComponentPeer implements ContainerPeer { Container c; + boolean isValidating; public GtkContainerPeer(Container c) { @@ -59,22 +62,38 @@ public class GtkContainerPeer extends GtkComponentPeer this.c = c; } - public void beginValidate() + public void beginValidate () { + isValidating = true; } - public void endValidate() + public void endValidate () { -// q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, -// new Rectangle (x, y, width, height))); -// Graphics gc = getGraphics (); -// if (gc != null) -// { -// awtComponent.update (gc); -// gc.dispose (); -// } -// System.out.println ("got here"); -// awtComponent.repaint (); + Component parent = awtComponent.getParent (); + + // Only set our parent on the GTK side if our parent on the AWT + // side is not showing. Otherwise the gtk peer will be shown + // before we've had a chance to position and size it properly. + if (parent != null && parent.isShowing ()) + { + Component[] components = ((Container) awtComponent).getComponents (); + int ncomponents = components.length; + + for (int i = 0; i < ncomponents; i++) + { + ComponentPeer peer = components[i].getPeer (); + + // Skip lightweight peers. + if (peer instanceof GtkComponentPeer) + ((GtkComponentPeer) peer).setParentAndBounds (); + } + + // GTK windows don't have parents. + if (!(awtComponent instanceof Window)) + setParentAndBounds (); + } + + isValidating = false; } public Insets getInsets() diff --git a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java index 1d6ce8b8bf0..af22a2723ef 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkDialogPeer.java @@ -42,9 +42,9 @@ import java.awt.AWTEvent; import java.awt.Component; import java.awt.Dialog; import java.awt.Graphics; -import java.awt.peer.DialogPeer; import java.awt.Rectangle; import java.awt.event.PaintEvent; +import java.awt.peer.DialogPeer; public class GtkDialogPeer extends GtkWindowPeer implements DialogPeer @@ -75,11 +75,12 @@ public class GtkDialogPeer extends GtkWindowPeer protected void postExposeEvent (int x, int y, int width, int height) { - q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, - new Rectangle (x + insets.left, - y + insets.top, - width, height))); - } + if (!isInRepaint) + q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + new Rectangle (x + insets.left, + y + insets.top, + width, height))); + } void create () { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java index d31e0c5be02..19925568e87 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java @@ -45,8 +45,8 @@ import java.awt.Graphics; import java.awt.Window; import java.awt.event.WindowEvent; import java.awt.peer.FileDialogPeer; -import java.io.FilenameFilter; import java.io.File; +import java.io.FilenameFilter; public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer { @@ -57,7 +57,6 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer private FilenameFilter filter; native void create (GtkContainerPeer parent); - native void connectJObject (); native void connectSignals (); native void nativeSetFile (String file); native public String nativeGetDirectory(); @@ -94,6 +93,7 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer awtComponent.getY (), dims[0], dims[1]); } + super.setComponentBounds (); } public void setFile (String fileName) diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java index 5de3301270d..605d738a199 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFontPeer.java @@ -1,5 +1,5 @@ /* GtkFontPeer.java -- Implements FontPeer with GTK+ - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -37,20 +37,25 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; + +import gnu.java.awt.peer.ClasspathFontPeer; + +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.awt.font.LineMetrics; +import java.awt.geom.Rectangle2D; import java.awt.peer.FontPeer; -import java.awt.*; -import java.awt.geom.*; -import java.awt.font.*; +import java.text.CharacterIterator; import java.util.Locale; -import java.util.ResourceBundle; import java.util.MissingResourceException; -import java.text.*; -import gnu.java.awt.peer.ClasspathFontPeer; +import java.util.ResourceBundle; public class GtkFontPeer extends ClasspathFontPeer { private static ResourceBundle bundle; - + static { try diff --git a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java index e1a877eedcb..c0c1437b656 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkFramePeer.java @@ -39,6 +39,7 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; import java.awt.Component; +import java.awt.Container; import java.awt.Frame; import java.awt.Graphics; import java.awt.Graphics2D; @@ -57,51 +58,72 @@ public class GtkFramePeer extends GtkWindowPeer private int menuBarHeight; private MenuBarPeer menuBar; native int getMenuBarHeight (MenuBarPeer bar); - + native void setMenuBarWidth (MenuBarPeer bar, int width); native void setMenuBarPeer (MenuBarPeer bar); native void removeMenuBarPeer (); - native void moveLayout (int offset); - native void gtkLayoutSetVisible (boolean vis); + native void gtkFixedSetVisible (boolean visible); + + int getMenuBarHeight () + { + return menuBar == null ? 0 : getMenuBarHeight (menuBar); + } public void setMenuBar (MenuBar bar) { - if (bar == null) - { - if (menuBar != null) + if (bar == null && menuBar != null) { - gtkLayoutSetVisible(false); - removeMenuBarPeer(); + // We're removing the menubar. + gtkFixedSetVisible (false); menuBar = null; - moveLayout(menuBarHeight); + removeMenuBarPeer (); insets.top -= menuBarHeight; - menuBarHeight = 0; - awtComponent.doLayout(); - gtkLayoutSetVisible(true); + menuBarHeight = 0; + awtComponent.validate (); + gtkFixedSetVisible (true); } - } - else - { - gtkLayoutSetVisible(false); - int oldHeight = 0; - if (menuBar != null) + else if (bar != null && menuBar == null) + { + // We're adding a menubar where there was no menubar before. + gtkFixedSetVisible (false); + menuBar = (MenuBarPeer) ((MenuBar) bar).getPeer(); + setMenuBarPeer (menuBar); + int menuBarWidth = + awtComponent.getWidth () - insets.left - insets.right; + if (menuBarWidth > 0) + setMenuBarWidth (menuBar, menuBarWidth); + menuBarHeight = getMenuBarHeight (); + insets.top += menuBarHeight; + awtComponent.validate (); + gtkFixedSetVisible (true); + } + else if (bar != null && menuBar != null) { + // We're swapping the menubar. + gtkFixedSetVisible (false); removeMenuBarPeer(); - oldHeight = menuBarHeight; - insets.top -= menuBarHeight; + int oldHeight = menuBarHeight; + int menuBarWidth = + awtComponent.getWidth () - insets.left - insets.right; + menuBar = (MenuBarPeer) ((MenuBar) bar).getPeer (); + setMenuBarPeer (menuBar); + if (menuBarWidth > 0) + setMenuBarWidth (menuBar, menuBarWidth); + menuBarHeight = getMenuBarHeight (); + if (oldHeight != menuBarHeight) + { + insets.top += (menuBarHeight - oldHeight); + awtComponent.validate (); + } + gtkFixedSetVisible (true); } - menuBar = (MenuBarPeer) ((MenuBar) bar).getPeer(); - setMenuBarPeer(menuBar); - menuBarHeight = getMenuBarHeight (menuBar); - if (oldHeight != menuBarHeight) - moveLayout(oldHeight - menuBarHeight); - insets.top += menuBarHeight; - awtComponent.doLayout(); - gtkLayoutSetVisible(true); - } } public void setBounds (int x, int y, int width, int height) { + int menuBarWidth = width - insets.left - insets.right; + if (menuBar != null && menuBarWidth > 0) + setMenuBarWidth (menuBar, menuBarWidth); + nativeSetBounds (x, y, width - insets.left - insets.right, height - insets.top - insets.bottom @@ -151,7 +173,7 @@ public class GtkFramePeer extends GtkWindowPeer native void nativeSetIconImageFromData (int[] pixels, int width, int height); public void setIconImage (Image image) { - if (image != null) + if (image != null && image instanceof GtkImage) { GtkImage img = (GtkImage) image; // FIXME: Image should be loaded, but if not, do image loading here. @@ -206,15 +228,20 @@ public class GtkFramePeer extends GtkWindowPeer || frame_width != awtComponent.getWidth() || frame_height != awtComponent.getHeight()) { + if (frame_width != awtComponent.getWidth() && menuBar != null + && width > 0) + setMenuBarWidth (menuBar, width); + setBoundsCallback ((Window) awtComponent, frame_x, frame_y, frame_width, frame_height); } + awtComponent.validate(); } - + protected void postMouseEvent(int id, long when, int mods, int x, int y, int clickCount, boolean popupTrigger) { @@ -225,10 +252,11 @@ public class GtkFramePeer extends GtkWindowPeer protected void postExposeEvent (int x, int y, int width, int height) { - q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, - new Rectangle (x + insets.left, - y + insets.top, - width, height))); + if (!isInRepaint) + q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT, + new Rectangle (x + insets.left, + y + insets.top, + width, height))); } public int getState () diff --git a/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java index f7a7b2270ac..657e830bf2e 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkGenericPeer.java @@ -82,4 +82,6 @@ public class GtkGenericPeer // Let's assume this will never wrap. return next_native_state++; } + + native void gtkWidgetModifyFont (String name, int style, int size); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkImage.java b/libjava/gnu/java/awt/peer/gtk/GtkImage.java index 9234d248aba..510646c5a6a 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkImage.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkImage.java @@ -230,7 +230,7 @@ public class GtkImage extends Image implements ImageConsumer int offset, int scansize) { setPixels (x, y, width, height, cm, convertPixels (pixels), offset, - scansize); + scansize); if (observer != null) observer.imageUpdate (this, @@ -255,7 +255,8 @@ public class GtkImage extends Image implements ImageConsumer if (scansize == width && height == 1) { - System.arraycopy (pixels, offset, + // Copy contents of pixels array into pixel cache. + System.arraycopy (pixels, offset, pixelCache, y * this.width + x, pixels.length - offset); } @@ -274,7 +275,7 @@ public class GtkImage extends Image implements ImageConsumer if (status == ImageConsumer.STATICIMAGEDONE && isCacheable) isLoaded = true; - if (status == ImageConsumer.SINGLEFRAMEDONE) + if (status == ImageConsumer.SINGLEFRAME) isCacheable = false; if (observer != null) @@ -289,7 +290,7 @@ public class GtkImage extends Image implements ImageConsumer -1, -1, -1, -1); } - if (source != null) + if (source != null && status != ImageConsumer.SINGLEFRAME) source.removeConsumer (this); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkImagePainter.java b/libjava/gnu/java/awt/peer/gtk/GtkImagePainter.java index d15cb4a4acf..1e5eb4f6ab3 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkImagePainter.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkImagePainter.java @@ -42,6 +42,7 @@ import java.awt.Color; import java.awt.Rectangle; import java.awt.image.ColorModel; import java.awt.image.ImageConsumer; +import java.awt.image.ImageObserver; import java.util.Hashtable; public class GtkImagePainter implements Runnable, ImageConsumer @@ -57,10 +58,11 @@ public class GtkImagePainter implements Runnable, ImageConsumer boolean flipX, flipY; Rectangle clip; int s_width, s_height; + ImageObserver observer; public GtkImagePainter (GtkImage image, GdkGraphics gc, int x, int y, - int width, int height, Color bgcolor) + int width, int height, Color bgcolor, ImageObserver o) { this.image = image; this.gc = (GdkGraphics) gc.create (); @@ -74,15 +76,16 @@ public class GtkImagePainter implements Runnable, ImageConsumer flipX = flipY = false; s_width = s_height = 0; clip = null; + observer = o; - new Thread (this).start (); + run (); } public GtkImagePainter (GtkImage image, GdkGraphics gc, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, - Color bgcolor) + Color bgcolor, ImageObserver o) { this.image = image; this.gc = (GdkGraphics) gc.create (); @@ -91,6 +94,7 @@ public class GtkImagePainter implements Runnable, ImageConsumer redBG = bgcolor.getRed (); greenBG = bgcolor.getGreen (); blueBG = bgcolor.getBlue (); + observer = o; this.width = Math.abs (dx2 - dx1); this.height = Math.abs (dy2 - dy1); @@ -105,7 +109,7 @@ public class GtkImagePainter implements Runnable, ImageConsumer s_height = Math.abs (sy2 - sy1); clip = new Rectangle (sx1, sy1, s_width, s_height); - new Thread (this).start (); + run (); } public void @@ -126,7 +130,7 @@ public class GtkImagePainter implements Runnable, ImageConsumer if (model.equals (ColorModel.getRGBdefault ())) return pixels; - + int ret[] = new int[pixels.length]; for (int i = 0; i < pixels.length; i++) @@ -180,6 +184,11 @@ public class GtkImagePainter implements Runnable, ImageConsumer startX + x, startY + y, width, height, convertPixels (pixels, model), offset, scansize, affine); + + if (observer != null) + observer.imageUpdate (image, + ImageObserver.SOMEBITS, + x, y, width, height); } public void @@ -247,5 +256,17 @@ public class GtkImagePainter implements Runnable, ImageConsumer imageComplete (int status) { image.imageComplete(status); + + if (observer != null) + { + if (status == ImageConsumer.IMAGEERROR) + observer.imageUpdate (null, + ImageObserver.ERROR, + -1, -1, -1, -1); + else + observer.imageUpdate (null, + ImageObserver.ALLBITS, + -1, -1, -1, -1); + } } } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java index c28b7f597cc..25473d78ea2 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkLabelPeer.java @@ -47,10 +47,11 @@ public class GtkLabelPeer extends GtkComponentPeer implements LabelPeer { native void create (String text, float alignment); - native void gtkSetFont (String name, int style, int size); + native void gtkWidgetModifyFont (String name, int style, int size); native void nativeSetAlignment (float alignment); native public void setText (String text); + native void setNativeBounds (int x, int y, int width, int height); void create () { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java index a85aba952fd..13055d33c27 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkListPeer.java @@ -41,8 +41,8 @@ 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.event.MouseEvent; import java.awt.peer.ListPeer; public class GtkListPeer extends GtkComponentPeer @@ -58,9 +58,8 @@ public class GtkListPeer extends GtkComponentPeer } native void create (int rows); - native void connectJObject (); native void connectSignals (); - native void gtkSetFont (String name, int style, int size); + native void gtkWidgetModifyFont (String name, int style, int size); native void gtkWidgetRequestFocus (); native void getSize (int rows, int visibleRows, int dims[]); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java index b9cca1a5c38..90ad0c01b59 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java @@ -38,8 +38,10 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.Font; import java.awt.Menu; import java.awt.MenuBar; +import java.awt.MenuComponent; import java.awt.peer.MenuBarPeer; import java.awt.peer.MenuPeer; @@ -53,15 +55,25 @@ public class GtkMenuBarPeer extends GtkMenuComponentPeer public GtkMenuBarPeer (MenuBar target) { super (target); - create (); } - native void nativeSetHelpMenu(MenuPeer menuPeer); + void setFont () + { + MenuComponent mc = (MenuComponent) awtWidget; + Font f = mc.getFont (); + + if (f == null) + mc.setFont (new Font ("Dialog", Font.PLAIN, 12)); + } + // FIXME: remove this method or replace it with one that does + // something useful. /* In Gnome, help menus are no longer right flushed. */ + native void nativeSetHelpMenu(MenuPeer menuPeer); + public void addHelpMenu (Menu menu) { - nativeSetHelpMenu((MenuPeer) menu.getPeer()); + // nativeSetHelpMenu((MenuPeer) menu.getPeer()); } native public void delMenu (int index); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java index 92f02230621..dd061ed37b8 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java @@ -38,15 +38,28 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.Font; +import java.awt.MenuComponent; import java.awt.peer.MenuComponentPeer; public class GtkMenuComponentPeer extends GtkGenericPeer implements MenuComponentPeer { + void create () + { + throw new RuntimeException (); + } + + void setFont () + { + } + public GtkMenuComponentPeer (Object awtWidget) { super (awtWidget); + create (); + setFont (); } - + public native void dispose(); } diff --git a/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java index c32839ec6ba..81da90df012 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java @@ -38,24 +38,31 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import java.awt.Font; import java.awt.Menu; +import java.awt.MenuComponent; import java.awt.MenuBar; import java.awt.MenuItem; -import java.awt.peer.MenuItemPeer; -import java.awt.peer.MenuComponentPeer; import java.awt.peer.MenuBarPeer; +import java.awt.peer.MenuComponentPeer; +import java.awt.peer.MenuItemPeer; import java.awt.peer.MenuPeer; public class GtkMenuItemPeer extends GtkMenuComponentPeer implements MenuItemPeer { native void create (String label); - public native void connectSignals (); + native void connectSignals (); + native void gtkWidgetModifyFont (String name, int style, int size); + + void create () + { + create (((MenuItem) awtWidget).getLabel()); + } public GtkMenuItemPeer (MenuItem item) { super (item); - create (item.getLabel ()); setEnabled (item.isEnabled ()); setParent (item); @@ -63,6 +70,21 @@ public class GtkMenuItemPeer extends GtkMenuComponentPeer connectSignals(); } + void setFont () + { + MenuComponent mc = ((MenuComponent) awtWidget); + Font f = mc.getFont (); + + if (f == null) + { + MenuComponent parent = (MenuComponent) mc.getParent (); + Font pf = parent.getFont (); + gtkWidgetModifyFont (pf.getName (), pf.getStyle (), pf.getSize ()); + } + else + gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize()); + } + void setParent (MenuItem item) { // add ourself differently, based on what type of parent we have diff --git a/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java index 0b5d0af4342..fbdfcf472ca 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkPanelPeer.java @@ -47,7 +47,6 @@ public class GtkPanelPeer extends GtkContainerPeer implements PanelPeer { native void create (); - native void connectJObject (); public GtkPanelPeer (Panel p) { diff --git a/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java b/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java index d0cbde034e2..233bed75a9b 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java @@ -54,7 +54,7 @@ public class GtkScrollPanePeer extends GtkContainerPeer create (awtComponent.getWidth (), awtComponent.getHeight ()); } - native void gtkScrolledWindowSetScrollPosition(int x, int y); + // native void gtkScrolledWindowSetScrollPosition(int x, int y); native void gtkScrolledWindowSetHScrollIncrement (int u); native void gtkScrolledWindowSetVScrollIncrement (int u); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java index 0e1b65137d7..ef4289633c4 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java @@ -60,7 +60,6 @@ public class GtkScrollbarPeer extends GtkComponentPeer int min, int max, int stepIncr, int pageIncr, int visibleAmount); - native void connectJObject (); native void connectSignals (); public GtkScrollbarPeer (Scrollbar s) diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java index b08728b2bff..94874deb617 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java @@ -52,7 +52,7 @@ public class GtkTextAreaPeer extends GtkTextComponentPeer native void create (int width, int height, int scrollbarVisibility); - native void gtkSetFont (String name, int style, int size); + native void gtkWidgetModifyFont (String name, int style, int size); native void gtkWidgetRequestFocus (); void create () @@ -68,11 +68,7 @@ public class GtkTextAreaPeer extends GtkTextComponentPeer awtComponent.setFont (f); } - FontMetrics fm; - if (GtkToolkit.useGraphics2D ()) - fm = new GdkClasspathFontPeerMetrics (f); - else - fm = new GdkFontMetrics (f); + FontMetrics fm = getFontMetrics (f); TextArea ta = ((TextArea) awtComponent); int sizeRows = ta.getRows (); @@ -130,11 +126,7 @@ public class GtkTextAreaPeer extends GtkTextComponentPeer if (f == null) return new Dimension (width, height); - FontMetrics fm; - if (GtkToolkit.useGraphics2D ()) - fm = new GdkClasspathFontPeerMetrics (f); - else - fm = new GdkFontMetrics (f); + FontMetrics fm = getFontMetrics (f); int sizeRows = rows == 0 ? DEFAULT_ROWS : rows; int sizeCols = cols == 0 ? DEFAULT_COLS : cols; @@ -163,11 +155,7 @@ public class GtkTextAreaPeer extends GtkTextComponentPeer if (f == null) return new Dimension (width, height); - FontMetrics fm; - if (GtkToolkit.useGraphics2D ()) - fm = new GdkClasspathFontPeerMetrics (f); - else - fm = new GdkFontMetrics (f); + FontMetrics fm = getFontMetrics (f); int sizeRows = rows == 0 ? DEFAULT_ROWS : rows; int sizeCols = cols == 0 ? DEFAULT_COLS : cols; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java index d4a702deb35..bd1ac812470 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java @@ -66,11 +66,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer awtComponent.setFont (f); } - FontMetrics fm; - if (GtkToolkit.useGraphics2D ()) - fm = new GdkClasspathFontPeerMetrics (f); - else - fm = new GdkFontMetrics (f); + FontMetrics fm = getFontMetrics (f); TextField tf = ((TextField) awtComponent); int cols = tf.getColumns (); @@ -84,7 +80,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer native int gtkEntryGetBorderWidth (); - native void gtkSetFont (String name, int style, int size); + native void gtkWidgetModifyFont (String name, int style, int size); public GtkTextFieldPeer (TextField tf) { @@ -117,11 +113,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer if (f == null) return new Dimension (2 * gtkEntryGetBorderWidth (), dim[1]); - FontMetrics fm; - if (GtkToolkit.useGraphics2D ()) - fm = new GdkClasspathFontPeerMetrics (f); - else - fm = new GdkFontMetrics (f); + FontMetrics fm = getFontMetrics (f); int text_width = cols * fm.getMaxAdvance (); @@ -140,11 +132,7 @@ public class GtkTextFieldPeer extends GtkTextComponentPeer if (f == null) return new Dimension (2 * gtkEntryGetBorderWidth (), dim[1]); - FontMetrics fm; - if (GtkToolkit.useGraphics2D ()) - fm = new GdkClasspathFontPeerMetrics (f); - else - fm = new GdkFontMetrics (f); + FontMetrics fm = getFontMetrics (f); int text_width = cols * fm.getMaxAdvance (); diff --git a/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java b/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java index 3f82159c3ab..def22e9874e 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkToolkit.java @@ -1,5 +1,5 @@ /* GtkToolkit.java -- Implements an AWT Toolkit using GTK for peers - Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -38,36 +38,40 @@ exception statement from your version. */ package gnu.java.awt.peer.gtk; +import gnu.classpath.Configuration; +import gnu.java.awt.EmbeddedWindow; +import gnu.java.awt.EmbeddedWindowSupport; +import gnu.java.awt.peer.ClasspathFontPeer; +import gnu.java.awt.peer.ClasspathTextLayoutPeer; +import gnu.java.awt.peer.EmbeddedWindowPeer; +import gnu.java.awt.peer.gtk.GdkPixbufDecoder; + import java.awt.*; import java.awt.datatransfer.Clipboard; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.peer.DragSourceContextPeer; +import java.awt.font.FontRenderContext; import java.awt.font.TextAttribute; import java.awt.im.InputMethodHighlight; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; -import java.awt.image.ImageObserver; import java.awt.image.ImageConsumer; +import java.awt.image.ImageObserver; import java.awt.image.ImageProducer; -import java.awt.GraphicsEnvironment; import java.awt.peer.*; import java.net.URL; +import java.text.AttributedString; +import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.MissingResourceException; import java.util.Properties; -import gnu.java.awt.EmbeddedWindow; -import gnu.java.awt.EmbeddedWindowSupport; -import gnu.java.awt.peer.EmbeddedWindowPeer; -import gnu.java.awt.peer.ClasspathFontPeer; -import gnu.classpath.Configuration; -import gnu.java.awt.peer.gtk.GdkPixbufDecoder; /* This class uses a deprecated method java.awt.peer.ComponentPeer.getPeer(). This merits comment. We are basically calling Sun's bluff on this one. - We think Sun has deprecated it simply to discourage its use as it is + We think Sun has deprecated it simply to discourage its use as it is bad programming style. However, we need to get at a component's peer in 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. */ @@ -79,7 +83,6 @@ import gnu.java.awt.peer.gtk.GdkPixbufDecoder; * drawing contexts. Any other value will cause the older GdkGraphics * object to be used. */ - public class GtkToolkit extends gnu.java.awt.ClasspathToolkit implements EmbeddedWindowSupport { @@ -87,7 +90,6 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit Hashtable containers = new Hashtable(); static EventQueue q = new EventQueue(); static Clipboard systemClipboard; - static boolean useGraphics2dSet; static boolean useGraphics2d; @@ -120,14 +122,21 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit public int checkImage (Image image, int width, int height, ImageObserver observer) { - int status = ((GtkImage) image).checkImage (); + int status = ImageObserver.ALLBITS + | ImageObserver.WIDTH + | ImageObserver.HEIGHT; + + if (image instanceof GtkImage) + { + status = ((GtkImage) image).checkImage (); + } if (observer != null) observer.imageUpdate (image, status, -1, -1, image.getWidth (observer), image.getHeight (observer)); - + return status; } @@ -304,22 +313,59 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit "SansSerif" }); } + private class LRUCache extends java.util.LinkedHashMap + { + int max_entries; + public LRUCache(int max) + { + super(max, 0.75f, true); + max_entries = max; + } + protected boolean removeEldestEntry(Map.Entry eldest) + { + return size() > max_entries; + } + } + + private LRUCache fontCache = new LRUCache(50); + private LRUCache metricsCache = new LRUCache(50); + private LRUCache imageCache = new LRUCache(50); + public FontMetrics getFontMetrics (Font font) { - if (useGraphics2D()) - return new GdkClasspathFontPeerMetrics (font); + if (metricsCache.containsKey(font)) + return (FontMetrics) metricsCache.get(font); else - return new GdkFontMetrics (font); + { + FontMetrics m; + m = new GdkFontMetrics (font); + metricsCache.put(font, m); + return m; + } } public Image getImage (String filename) { - return createImage (filename); + if (imageCache.containsKey(filename)) + return (Image) imageCache.get(filename); + else + { + Image im = createImage(filename); + imageCache.put(filename, im); + return im; + } } public Image getImage (URL url) { - return createImage (url); + if (imageCache.containsKey(url)) + return (Image) imageCache.get(url); + else + { + Image im = createImage(url); + imageCache.put(url, im); + return im; + } } public PrintJob getPrintJob (Frame frame, String jobtitle, Properties props) @@ -510,8 +556,10 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit */ private FontPeer getFontPeer (String name, int style, int size) { - GtkFontPeer fp = new GtkFontPeer (name, style, size); - return fp; + Map attrs = new HashMap (); + ClasspathFontPeer.copyStyleToAttrs (style, attrs); + ClasspathFontPeer.copySizeToAttrs (size, attrs); + return getClasspathFontPeer (name, attrs); } /** @@ -522,40 +570,28 @@ public class GtkToolkit extends gnu.java.awt.ClasspathToolkit public ClasspathFontPeer getClasspathFontPeer (String name, Map attrs) { - if (useGraphics2D()) - return new GdkClasspathFontPeer (name, attrs); + Map keyMap = new HashMap (attrs); + // We don't know what kind of "name" the user requested (logical, face, + // family), and we don't actually *need* to know here. The worst case + // involves failure to consolidate fonts with the same backend in our + // cache. This is harmless. + keyMap.put ("GtkToolkit.RequestedFontName", name); + if (fontCache.containsKey (keyMap)) + return (ClasspathFontPeer) fontCache.get (keyMap); else { - // Default values - int size = 12; - int style = Font.PLAIN; - if (name == null) - name = "Default"; - - 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; - } - - if (attrs.containsKey (TextAttribute.SIZE)) - { - Float fsize = (Float) attrs.get (TextAttribute.SIZE); - size = fsize.intValue(); - } - - return (ClasspathFontPeer) this.getFontPeer (name, style, size); + ClasspathFontPeer newPeer = new GdkFontPeer (name, attrs); + fontCache.put (keyMap, newPeer); + return newPeer; } } + public ClasspathTextLayoutPeer getClasspathTextLayoutPeer (AttributedString str, + FontRenderContext frc) + { + return new GdkTextLayout(str, frc); + } + protected EventQueue getSystemEventQueueImpl() { return q; diff --git a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java index a2357699b3c..c61eecd5aa5 100644 --- a/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java +++ b/libjava/gnu/java/awt/peer/gtk/GtkWindowPeer.java @@ -40,8 +40,8 @@ package gnu.java.awt.peer.gtk; import java.awt.Component; import java.awt.Dimension; -import java.awt.Window; import java.awt.Frame; +import java.awt.Window; import java.awt.event.WindowEvent; import java.awt.peer.WindowPeer; @@ -106,7 +106,6 @@ public class GtkWindowPeer extends GtkContainerPeer { } - native void connectJObject (); native void connectSignals (); public GtkWindowPeer (Window window) |