aboutsummaryrefslogtreecommitdiff
path: root/libjava/classpath/gnu/java/awt
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu/java/awt')
-rw-r--r--libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java8
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Edge.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Segment.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/autofit/Width.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java3
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java4
-rw-r--r--libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java4
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java169
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java4
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java15
-rw-r--r--libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java1
-rw-r--r--libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java6
-rw-r--r--libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java21
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java13
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XEventPump.java346
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java4
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java3
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java28
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java9
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java27
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XImage.java71
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XToolkit.java50
-rw-r--r--libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java37
27 files changed, 648 insertions, 203 deletions
diff --git a/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java b/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
index 2d898a4..e812452 100644
--- a/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/font/OpenTypeFontPeer.java
@@ -37,6 +37,10 @@ exception statement from your version. */
package gnu.java.awt.font;
+
+import gnu.java.awt.peer.ClasspathFontPeer;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.font.FontRenderContext;
@@ -61,8 +65,6 @@ import java.util.Map;
import java.util.Properties;
import java.util.Set;
-import gnu.java.awt.peer.ClasspathFontPeer;
-
public class OpenTypeFontPeer
extends ClasspathFontPeer
{
@@ -422,7 +424,7 @@ public class OpenTypeFontPeer
*/
static String encodeFont(String name, int style)
{
- StringBuilder key = new StringBuilder();
+ CPStringBuilder key = new CPStringBuilder();
key.append(validName(name));
key.append('/');
switch (style)
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Edge.java b/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
index d973665..6420fa1 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Edge.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
class Edge
{
int fpos;
@@ -54,7 +56,7 @@ class Edge
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Edge] id");
s.append(hashCode());
s.append(", fpos: ");
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java b/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
index 694fb24..2cf68b7 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/LatinBlue.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
public class LatinBlue
{
static final int FLAG_BLUE_ACTIVE = 1 << 0;
@@ -48,7 +50,7 @@ public class LatinBlue
int flags;
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[BlueZone]");
s.append(" ref: ");
s.append(ref.org);
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Segment.java b/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
index 640e82c..9f9da67 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Segment.java
@@ -40,6 +40,8 @@ package gnu.java.awt.font.autofit;
import gnu.java.awt.font.opentype.truetype.Point;
+import gnu.java.lang.CPStringBuilder;
+
class Segment
{
@@ -65,7 +67,7 @@ class Segment
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Segment] id: ");
s.append(hashCode());
s.append(", len:");
diff --git a/libjava/classpath/gnu/java/awt/font/autofit/Width.java b/libjava/classpath/gnu/java/awt/font/autofit/Width.java
index c890cf3..079f7b3 100644
--- a/libjava/classpath/gnu/java/awt/font/autofit/Width.java
+++ b/libjava/classpath/gnu/java/awt/font/autofit/Width.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.autofit;
+import gnu.java.lang.CPStringBuilder;
+
public class Width
{
int org;
@@ -50,7 +52,7 @@ public class Width
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Width] org: ");
s.append(org);
s.append(", cur: ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java b/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
index ea4b8e2..c2b009d 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/GlyphNamer.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype;
+import gnu.java.lang.CPStringBuilder;
+
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.CharBuffer;
@@ -1077,7 +1079,7 @@ final class GlyphNamer
return name;
}
- StringBuffer buf = new StringBuffer(numChars * 8);
+ CPStringBuilder buf = new CPStringBuilder(numChars * 8);
for (int i = 0; i < numChars; i++)
{
if (i > 0)
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
index 287593e..87dfebd 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Fixed.java
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
/**
* A utility class for fixed-point arithmetics, where numbers are
@@ -164,7 +165,7 @@ public final class Fixed
public static String toString(int x, int y)
{
- StringBuffer sbuf = new StringBuffer(40);
+ CPStringBuilder sbuf = new CPStringBuilder(40);
sbuf.append('(');
sbuf.append(((float) x) / 64);
sbuf.append(", ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
index c9664d2..31c1203 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/Point.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
+
/**
* Encapsulates information regarding one point on a glyph outline.
*/
@@ -234,7 +236,7 @@ public class Point
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[Point] origX: ");
s.append(origX);
s.append(", origY: ");
diff --git a/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java b/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
index 7e50b66..c88d4c6 100644
--- a/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
+++ b/libjava/classpath/gnu/java/awt/font/opentype/truetype/VirtualMachine.java
@@ -37,6 +37,8 @@ exception statement from your version. */
package gnu.java.awt.font.opentype.truetype;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.FontFormatException;
import java.awt.geom.AffineTransform;
import java.nio.ByteBuffer;
@@ -514,7 +516,7 @@ class VirtualMachine
*/
private void dumpInstruction(ByteBuffer inst)
{
- StringBuffer sbuf = new StringBuffer(40);
+ CPStringBuilder sbuf = new CPStringBuilder(40);
int pc = inst.position();
int bcode = inst.get(pc) & 0xff;
int count;
diff --git a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
index 36ba0f4..8504659 100644
--- a/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
+++ b/libjava/classpath/gnu/java/awt/java2d/AbstractGraphics2D.java
@@ -46,6 +46,7 @@ import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Composite;
import java.awt.CompositeContext;
+import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
@@ -75,9 +76,12 @@ import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
+import java.awt.image.FilteredImageSource;
import java.awt.image.ImageObserver;
+import java.awt.image.ImageProducer;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
+import java.awt.image.ReplicateScaleFilter;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import java.awt.image.renderable.RenderableImage;
@@ -86,6 +90,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
+import java.util.WeakHashMap;
/**
* This is a 100% Java implementation of the Java2D rendering pipeline. It is
@@ -154,7 +159,14 @@ public abstract class AbstractGraphics2D
extends Graphics2D
implements Cloneable, Pixelizer
{
-
+ /**
+ * Caches scaled versions of an image.
+ *
+ * @see #drawImage(Image, int, int, int, int, ImageObserver)
+ */
+ protected static final WeakHashMap<Image, HashMap<Dimension,Image>> imageCache =
+ new WeakHashMap<Image, HashMap<Dimension, Image>>();
+
/**
* Wether we use anti aliasing for rendering text by default or not.
*/
@@ -210,14 +222,20 @@ public abstract class AbstractGraphics2D
/**
* The paint context during rendering.
*/
- private PaintContext paintContext;
+ private PaintContext paintContext = null;
/**
* The background.
*/
- private Color background;
+ private Color background = Color.WHITE;
/**
+ * Foreground color, as set by setColor.
+ */
+ private Color foreground = Color.BLACK;
+ private boolean isForegroundColorNull = true;
+
+ /**
* The current font.
*/
private Font font;
@@ -266,15 +284,19 @@ public abstract class AbstractGraphics2D
private static final BasicStroke STANDARD_STROKE = new BasicStroke();
- private static final HashMap STANDARD_HINTS;
- static {
- HashMap hints = new HashMap();
- hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
- hints.put(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_DEFAULT);
- STANDARD_HINTS = hints;
- }
+ private static final HashMap<Key, Object> STANDARD_HINTS;
+ static
+ {
+
+ HashMap<Key, Object> hints = new HashMap<Key, Object>();
+ hints.put(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
+ hints.put(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_DEFAULT);
+
+ STANDARD_HINTS = hints;
+ }
+
/**
* Creates a new AbstractGraphics2D instance.
*/
@@ -626,14 +648,29 @@ public abstract class AbstractGraphics2D
if (p != null)
{
paint = p;
-
+
if (! (paint instanceof Color))
- isOptimized = false;
+ {
+ isOptimized = false;
+ }
else
{
+ this.foreground = (Color) paint;
+ isForegroundColorNull = false;
updateOptimization();
}
}
+ else
+ {
+ this.foreground = Color.BLACK;
+ isForegroundColorNull = true;
+ }
+
+ // free resources if needed, then put the paint context to null
+ if (this.paintContext != null)
+ this.paintContext.dispose();
+
+ this.paintContext = null;
}
/**
@@ -1058,10 +1095,10 @@ public abstract class AbstractGraphics2D
*/
public Color getColor()
{
- Color c = null;
- if (paint instanceof Color)
- c = (Color) paint;
- return c;
+ if (isForegroundColorNull)
+ return null;
+
+ return this.foreground;
}
/**
@@ -1070,8 +1107,8 @@ public abstract class AbstractGraphics2D
* @param color the foreground to set
*/
public void setColor(Color color)
- {
- setPaint(color);
+ {
+ this.setPaint(color);
}
public void setPaintMode()
@@ -1468,11 +1505,19 @@ public abstract class AbstractGraphics2D
ImageObserver observer)
{
AffineTransform t = new AffineTransform();
- t.translate(x, y);
- double scaleX = (double) width / (double) image.getWidth(observer);
- double scaleY = (double) height / (double) image.getHeight(observer);
- t.scale(scaleX, scaleY);
- return drawImage(image, t, observer);
+ int imWidth = image.getWidth(observer);
+ int imHeight = image.getHeight(observer);
+ if (imWidth == width && imHeight == height)
+ {
+ // No need to scale, fall back to non-scaling loops.
+ return drawImage(image, x, y, observer);
+ }
+ else
+ {
+ Image scaled = prepareImage(image, width, height);
+ // Ideally, this should notify the observer about the scaling progress.
+ return drawImage(scaled, x, y, observer);
+ }
}
/**
@@ -1639,10 +1684,7 @@ public abstract class AbstractGraphics2D
*
* @return the bounds of the target
*/
- protected Rectangle getDeviceBounds()
- {
- return destinationRaster.getBounds();
- }
+ protected abstract Rectangle getDeviceBounds();
/**
* Draws a line in optimization mode. The implementation should respect the
@@ -1763,7 +1805,8 @@ public abstract class AbstractGraphics2D
*/
public void renderScanline(int y, ScanlineCoverage c)
{
- PaintContext pCtx = paintContext;
+ PaintContext pCtx = getPaintContext();
+
int x0 = c.getMinX();
int x1 = c.getMaxX();
Raster paintRaster = pCtx.getRaster(x0, y, x1 - x0, 1);
@@ -1797,9 +1840,11 @@ public abstract class AbstractGraphics2D
CompositeContext cCtx = composite.createContext(paintColorModel,
getColorModel(),
renderingHints);
- WritableRaster targetChild = destinationRaster.createWritableTranslatedChild(-x0,- y);
+ WritableRaster raster = getDestinationRaster();
+ WritableRaster targetChild = raster.createWritableTranslatedChild(-x0, -y);
+
cCtx.compose(paintRaster, targetChild, targetChild);
- updateRaster(destinationRaster, x0, y, x1 - x0, 1);
+ updateRaster(raster, x0, y, x1 - x0, 1);
cCtx.dispose();
}
@@ -1986,4 +2031,64 @@ public abstract class AbstractGraphics2D
}
}
+ private PaintContext getPaintContext()
+ {
+ if (this.paintContext == null)
+ {
+ this.paintContext =
+ this.foreground.createContext(getColorModel(),
+ getDeviceBounds(),
+ getClipBounds(),
+ getTransform(),
+ getRenderingHints());
+ }
+
+ return this.paintContext;
+ }
+
+ /**
+ * Scales an image to the specified width and height. This should also
+ * be used to implement
+ * {@link Toolkit#prepareImage(Image, int, int, ImageObserver)}.
+ * This uses {@link Toolkit#createImage(ImageProducer)} to create the actual
+ * image.
+ *
+ * @param image the image to prepare
+ * @param w the width
+ * @param h the height
+ *
+ * @return the scaled image
+ */
+ public static Image prepareImage(Image image, int w, int h)
+ {
+ // Try to find cached scaled image.
+ HashMap<Dimension,Image> scaledTable = imageCache.get(image);
+ Dimension size = new Dimension(w, h);
+ Image scaled = null;
+ if (scaledTable != null)
+ {
+ scaled = scaledTable.get(size);
+ }
+ if (scaled == null)
+ {
+ // No cached scaled image. Start scaling image now.
+ ImageProducer source = image.getSource();
+ ReplicateScaleFilter scaler = new ReplicateScaleFilter(w, h);
+ FilteredImageSource filteredSource =
+ new FilteredImageSource(source, scaler);
+ // Ideally, this should asynchronously scale the image.
+ Image scaledImage =
+ Toolkit.getDefaultToolkit().createImage(filteredSource);
+ scaled = scaledImage;
+ // Put scaled image in cache.
+ if (scaledTable == null)
+ {
+ scaledTable = new HashMap<Dimension,Image>();
+ imageCache.put(image, scaledTable);
+ }
+ scaledTable.put(size, scaledImage);
+ }
+ return scaled;
+ }
+
}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
index 4d1e777..efe1966 100644
--- a/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
+++ b/libjava/classpath/gnu/java/awt/java2d/ActiveEdges.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.java2d;
+import gnu.java.lang.CPStringBuilder;
+
/**
* A collection of active edges for scanline conversion.
*/
@@ -183,7 +185,7 @@ final class ActiveEdges
public String toString()
{
- StringBuilder s = new StringBuilder();
+ CPStringBuilder s = new CPStringBuilder();
s.append("[ActiveEdges] ");
for (int i = 0; i < numActiveEdges; i++)
{
diff --git a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
index 98d47b4..04eb55e 100644
--- a/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
+++ b/libjava/classpath/gnu/java/awt/java2d/RasterGraphics.java
@@ -39,6 +39,7 @@ exception statement from your version. */
package gnu.java.awt.java2d;
import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
@@ -71,6 +72,15 @@ public class RasterGraphics
init();
}
+ @Override
+ public void renderScanline(int y, ScanlineCoverage c)
+ {
+ if (y >= getDeviceBounds().width)
+ return;
+
+ super.renderScanline(y, c);
+ }
+
/**
* Returns the color model of this Graphics object.
*
@@ -100,4 +110,9 @@ public class RasterGraphics
return null;
}
+ @Override
+ protected Rectangle getDeviceBounds()
+ {
+ return this.raster.getBounds();
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
index cc4bbef..b00a15c 100644
--- a/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
+++ b/libjava/classpath/gnu/java/awt/java2d/ScanlineConverter.java
@@ -206,6 +206,7 @@ public final class ScanlineConverter
// Ok, now we can perform the actual scanlining.
int realY = Fixed.intValue(FIXED_DIGITS, y + resolution);
boolean push = lastRealY != realY;
+
doScanline(p, y, push, haveClip);
// Remove obsolete active edges.
diff --git a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
index be21631..cc41f74 100644
--- a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
@@ -37,6 +37,8 @@
package gnu.java.awt.peer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
@@ -124,7 +126,7 @@ public class GnomeDesktopPeer
protected String execQuery(String command) throws IOException
{
InputStream in = null;
- StringBuilder output = new StringBuilder();
+ CPStringBuilder output = new CPStringBuilder();
try
{
diff --git a/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
index 30dd89b..8bc3e65 100644
--- a/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/KDEDesktopPeer.java
@@ -37,6 +37,8 @@
package gnu.java.awt.peer;
+import gnu.java.lang.CPStringBuilder;
+
import java.io.IOException;
import java.io.InputStream;
@@ -104,7 +106,7 @@ public class KDEDesktopPeer
protected String execQuery(String command) throws IOException
{
InputStream in = null;
- StringBuilder output = new StringBuilder();
+ CPStringBuilder output = new CPStringBuilder();
try
{
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java b/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
index 28fb841..826cfbe 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GdkFontPeer.java
@@ -45,6 +45,8 @@ import gnu.java.awt.ClasspathToolkit;
import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.java.awt.font.opentype.NameDecoder;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Toolkit;
@@ -211,7 +213,7 @@ public class GdkFontPeer extends ClasspathFontPeer
private String buildString(CharacterIterator iter)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next())
sb.append(c);
return sb.toString();
@@ -219,7 +221,7 @@ public class GdkFontPeer extends ClasspathFontPeer
private String buildString(CharacterIterator iter, int begin, int limit)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
int i = 0;
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next(), i++)
{
diff --git a/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java b/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
index e417546..e248b6d 100644
--- a/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
+++ b/libjava/classpath/gnu/java/awt/peer/gtk/GtkClipboard.java
@@ -38,10 +38,25 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.Image;
-import java.awt.datatransfer.*;
-import java.io.*;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.Reader;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Iterator;
@@ -247,7 +262,7 @@ public class GtkClipboard extends Clipboard
Reader r = plainText.getReaderForText(contents);
if (r != null)
{
- StringBuffer sb = new StringBuffer();
+ CPStringBuilder sb = new CPStringBuilder();
char[] cs = new char[1024];
int l = r.read(cs);
while (l != -1)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java b/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
index c80c85c..dde5b91 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/GLGraphics.java
@@ -39,7 +39,9 @@ package gnu.java.awt.peer.x;
import java.awt.Color;
import java.awt.GraphicsConfiguration;
+import java.awt.Rectangle;
import java.awt.image.ColorModel;
+import java.util.Map;
import gnu.java.awt.java2d.AbstractGraphics2D;
import gnu.x11.extension.glx.GL;
@@ -70,7 +72,8 @@ public class GLGraphics extends AbstractGraphics2D
public void setBackground(Color b)
{
super.setBackground(b);
- gl.clear_color(b.getRed() / 255.F, b.getGreen() / 255.F,
+
+ gl.clearColor(b.getRed() / 255.F, b.getGreen() / 255.F,
b.getBlue() / 255.F, b.getAlpha() / 255.F);
}
@@ -120,4 +123,12 @@ public class GLGraphics extends AbstractGraphics2D
throw new UnsupportedOperationException("Not yet implemented");
}
+ @Override
+ protected Rectangle getDeviceBounds()
+ {
+ // FIXME: not sure it's correct
+ return new Rectangle(0, 0,
+ gl.display.default_screen.width,
+ gl.display.default_screen.height);
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java b/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
index 7f98435..37983919 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XEventPump.java
@@ -38,6 +38,9 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
+import java.awt.AWTEvent;
+import java.awt.Component;
+import java.awt.Container;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Rectangle;
@@ -47,18 +50,26 @@ import java.awt.event.ComponentEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.PaintEvent;
+import java.awt.event.WindowEvent;
import java.util.HashMap;
+import gnu.java.awt.ComponentReshapeEvent;
+import gnu.x11.Atom;
import gnu.x11.Display;
import gnu.x11.event.ButtonPress;
import gnu.x11.event.ButtonRelease;
+import gnu.x11.event.ClientMessage;
import gnu.x11.event.ConfigureNotify;
+import gnu.x11.event.DestroyNotify;
import gnu.x11.event.Event;
import gnu.x11.event.Expose;
import gnu.x11.event.Input;
import gnu.x11.event.KeyPress;
import gnu.x11.event.KeyRelease;
import gnu.x11.event.MotionNotify;
+import gnu.x11.event.PropertyNotify;
+import gnu.x11.event.ResizeRequest;
+import gnu.x11.event.UnmapNotify;
/**
* Fetches events from X, translates them to AWT events and pumps them up
@@ -148,122 +159,217 @@ public class XEventPump
windows.remove(new Integer(xWindow.id));
}
- private void handleEvent(Event xEvent)
+ private void handleButtonPress(ButtonPress event)
+ {
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
+
+ // Create and post the mouse event.
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+ drag = button;
+
+ Component target =
+ findMouseEventTarget(awtWindow, event.getEventX(), event.getEventY());
+ if(target == null)
+ {
+ target = awtWindow;
+ }
+
+ MouseEvent mp = new MouseEvent(target, MouseEvent.MOUSE_PRESSED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false, button);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
+ }
+
+ private void handleButtonRelease(ButtonRelease event)
{
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
- Integer key = null;
- Window awtWindow = null;
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+ drag = -1;
+
+ Component target =
+ findMouseEventTarget(awtWindow, event.getEventX(), event.getEventY());
+ if(target == null)
+ {
+ target = awtWindow;
+ }
+
+ MouseEvent mr = new MouseEvent(target, MouseEvent.MOUSE_RELEASED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false, button);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
+ }
+
+
+ private void handleMotionNotify(MotionNotify event)
+ {
+ Integer key = new Integer(event.getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
+
+ int button = event.detail();
+
+ // AWT cannot handle more than 3 buttons and expects 0 instead.
+ if (button >= gnu.x11.Input.BUTTON3)
+ button = 0;
+
+ MouseEvent mm = null;
+ if (drag == -1)
+ {
+ mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(button),
+ event.getEventX(), event.getEventY(),
+ 1, false);
+ }
+ else
+ {
+ mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
+ System.currentTimeMillis(),
+ KeyboardMapping.mapModifiers(event.getState())
+ | buttonToModifier(drag),
+ event.getEventX(), event.getEventY(),
+ 1, false);
+ }
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
+ }
+
+ // FIME: refactor and make faster, maybe caching the event and handle
+ // and/or check timing (timing is generated for PropertyChange)?
+ private void handleExpose(Expose event)
+ {
+ Integer key = new Integer(event.window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ if (XToolkit.DEBUG)
+ System.err.println("expose request for window id: " + key);
+
+ Rectangle r = new Rectangle(event.x(), event.y(), event.width(),
+ event.height());
+ // We need to clear the background of the exposed rectangle.
+ assert awtWindow != null : "awtWindow == null for window ID: " + key;
+
+ Graphics g = awtWindow.getGraphics();
+ g.clearRect(r.x, r.y, r.width, r.height);
+ g.dispose();
+
+ XWindowPeer xwindow = (XWindowPeer) awtWindow.getPeer();
+ Insets i = xwindow.insets();
+ if (event.width() != awtWindow.getWidth() - i.left - i.right
+ || event.height() != awtWindow.getHeight() - i.top - i.bottom)
+ {
+ int w = event.width();
+ int h = event.height();
+ int x = xwindow.xwindow.x;
+ int y = xwindow.xwindow.y;
+
+ if (XToolkit.DEBUG)
+ System.err.println("Setting size on AWT window: " + w
+ + ", " + h + ", " + awtWindow.getWidth()
+ + ", " + awtWindow.getHeight());
+
+ // new width and height
+ xwindow.xwindow.width = w;
+ xwindow.xwindow.height = h;
+
+ // reshape the window
+ ComponentReshapeEvent cre =
+ new ComponentReshapeEvent(awtWindow, x, y, w, h);
+ awtWindow.dispatchEvent(cre);
+ }
+
+ ComponentEvent ce =
+ new ComponentEvent(awtWindow, ComponentEvent.COMPONENT_RESIZED);
+ awtWindow.dispatchEvent(ce);
+
+ PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.UPDATE, r);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
+ }
+
+ private void handleDestroyNotify(DestroyNotify destroyNotify)
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("DestroyNotify event: " + destroyNotify);
+
+ Integer key = new Integer(destroyNotify.event_window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_CLOSED);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ }
+
+ private void handleClientMessage(ClientMessage clientMessage)
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("ClientMessage event: " + clientMessage);
+
+ if (clientMessage.delete_window())
+ {
+ if (XToolkit.DEBUG)
+ System.err.println("ClientMessage is a delete_window event");
+
+ Integer key = new Integer(clientMessage.window_id);
+ Window awtWindow = (Window) windows.get(key);
+
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_CLOSING);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ }
+ }
+
+ private void handleEvent(Event xEvent)
+ {
if (XToolkit.DEBUG)
System.err.println("fetched event: " + xEvent);
- switch (xEvent.code())
+
+ switch (xEvent.code() & 0x7f)
{
case ButtonPress.CODE:
- ButtonPress bp = (ButtonPress) xEvent;
- key= new Integer(bp.event_window_id);
- awtWindow = (Window) windows.get(key);
- // Create and post the mouse event.
- int button = bp.detail();
-
- // AWT cannot handle more than 3 buttons and expects 0 instead.
- if (button >= gnu.x11.Input.BUTTON3)
- button = 0;
- drag = button;
-
- MouseEvent mp = new MouseEvent(awtWindow, MouseEvent.MOUSE_PRESSED,
- System.currentTimeMillis(),
- KeyboardMapping.mapModifiers(bp.state()) | buttonToModifier(button),
- bp.event_x(), bp.event_y(),
- 1, false, button);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mp);
+ this.handleButtonPress((ButtonPress) xEvent);
break;
case ButtonRelease.CODE:
- ButtonRelease br = (ButtonRelease) xEvent;
- key= new Integer(br.event_window_id);
- awtWindow = (Window) windows.get(key);
-
- button = br.detail();
- // AWT cannot handle more than 3 buttons and expects 0 instead.
- if (button >= gnu.x11.Input.BUTTON3)
- button = 0;
- drag = -1;
- MouseEvent mr = new MouseEvent(awtWindow, MouseEvent.MOUSE_RELEASED,
- System.currentTimeMillis(),
- KeyboardMapping.mapModifiers(br.state()) | buttonToModifier(button),
- br.event_x(), br.event_y(),
- 1, false, button);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mr);
+ this.handleButtonRelease((ButtonRelease) xEvent);
break;
case MotionNotify.CODE:
- MotionNotify mn = (MotionNotify) xEvent;
- key= new Integer(mn.event_window_id);
- awtWindow = (Window) windows.get(key);
-
- MouseEvent mm;
- if (drag == -1)
- {
- mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_MOVED,
- System.currentTimeMillis(), 0,
- mn.event_x(), mn.event_y(),
- 1, false);
- }
- else
- {
- mm = new MouseEvent(awtWindow, MouseEvent.MOUSE_DRAGGED,
- System.currentTimeMillis(), 0,
- mn.event_x(), mn.event_y(),
- 1, false);
- }
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(mm);
- break;
- case ConfigureNotify.CODE:
- key= new Integer(((ConfigureNotify) xEvent).event_window_id);
- awtWindow = (Window) windows.get(key);
- ConfigureNotify c = (ConfigureNotify) xEvent;
- if (XToolkit.DEBUG)
- System.err.println("resize request for window id: " + key);
-
- // Detect and report size changes.
- XWindowPeer xwindow = (XWindowPeer) awtWindow.getPeer();
- Insets i = xwindow.insets();
- if (c.width() != awtWindow.getWidth() - i.left - i.right
- || c.height() != awtWindow.getHeight() - i.top - i.bottom)
- {
- if (XToolkit.DEBUG)
- System.err.println("Setting size on AWT window: " + c.width()
- + ", " + c.height() + ", " + awtWindow.getWidth()
- + ", " + awtWindow.getHeight());
- xwindow.callback = true;
- xwindow.xwindow.width = c.width();
- xwindow.xwindow.height = c.height();
- awtWindow.setSize(c.width() + i.left + i.right,
- c.height() + i.top + i.bottom);
- xwindow.callback = false;
- }
+ this.handleMotionNotify((MotionNotify) xEvent);
break;
case Expose.CODE:
- key= new Integer(((Expose) xEvent).window_id);
- awtWindow = (Window) windows.get(key);
- Expose exp = (Expose) xEvent;
- if (XToolkit.DEBUG)
- System.err.println("expose request for window id: " + key);
- Rectangle r = new Rectangle(exp.x(), exp.y(), exp.width(),
- exp.height());
- //System.err.println("expose paint: " + r);
- // We need to clear the background of the exposed rectangle.
- assert awtWindow != null : "awtWindow == null for window ID: " + key;
- Graphics g = awtWindow.getGraphics();
- g.clearRect(r.x, r.y, r.width, r.height);
- g.dispose();
- PaintEvent pev = new PaintEvent(awtWindow, PaintEvent.PAINT, r);
- Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(pev);
+ this.handleExpose((Expose) xEvent);
break;
case KeyPress.CODE:
case KeyRelease.CODE:
- key = new Integer(((Input) xEvent).event_window_id);
- awtWindow = (Window) windows.get(key);
+ Integer key = new Integer(((Input) xEvent).getEventWindowID());
+ Window awtWindow = (Window) windows.get(key);
handleKeyEvent(xEvent, awtWindow);
break;
+ case DestroyNotify.CODE:
+ this.handleDestroyNotify((DestroyNotify) xEvent);
+ break;
+ case ClientMessage.CODE:
+ this.handleClientMessage((ClientMessage) xEvent);
+ break;
+ case PropertyNotify.CODE:
+ key = new Integer (((PropertyNotify) xEvent).getWindowID());
+ awtWindow = (Window) windows.get(key);
+ AWTEvent event = new WindowEvent(awtWindow, WindowEvent.WINDOW_STATE_CHANGED);
+ Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
+ break;
default:
if (XToolkit.DEBUG)
System.err.println("Unhandled X event: " + xEvent);
@@ -280,7 +386,7 @@ public class XEventPump
{
Input keyEvent = (Input) xEvent;
int xKeyCode = keyEvent.detail();
- int xMods = keyEvent.state();
+ int xMods = keyEvent.getState();
int keyCode = KeyboardMapping.mapToKeyCode(xEvent.display.input, xKeyCode,
xMods);
char keyChar = KeyboardMapping.mapToKeyChar(xEvent.display.input, xKeyCode,
@@ -334,5 +440,47 @@ public class XEventPump
return 0;
}
+
+ /**
+ * Finds the heavyweight mouse event target.
+ *
+ * @param src the original source of the event
+ *
+ * @param pt the event coordinates
+ *
+ * @return the real mouse event target
+ */
+ private Component findMouseEventTarget(Component src, int x, int y)
+ {
+ Component found = null;
+ if (src instanceof Container)
+ {
+ Container cont = (Container) src;
+ int numChildren = cont.getComponentCount();
+ for (int i = 0; i < numChildren && found == null; i++)
+ {
+ Component child = cont.getComponent(i);
+ if (child != null && child.isVisible()
+ && child.contains(x - child.getX(), y - child.getY()))
+ {
+ if (child instanceof Container)
+ {
+ Component deeper = findMouseEventTarget(child,
+ x - child.getX(),
+ y - child.getY());
+ if (deeper != null)
+ found = deeper;
+ }
+ else if (! child.isLightweight())
+ found = child;
+ }
+ }
+ }
+
+ // Consider the source itself.
+ if (found == null && src.contains(x, y) && ! src.isLightweight())
+ found = src;
+ return found;
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java b/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
index 0a96a61..4372c965 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XFontPeer.java
@@ -38,6 +38,8 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
+import gnu.java.lang.CPStringBuilder;
+
import java.awt.AWTError;
import java.awt.Font;
import java.awt.FontMetrics;
@@ -675,7 +677,7 @@ public class XFontPeer
*/
static String encodeFont(String name, int style, int size)
{
- StringBuilder key = new StringBuilder();
+ CPStringBuilder key = new CPStringBuilder();
key.append(validName(name));
key.append('.');
switch (style)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java b/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
index 7424dc6..a355c68 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XFramePeer.java
@@ -93,8 +93,7 @@ public class XFramePeer
public int getState()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return 0;
}
public void setState(int state)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
index 9512966..0339a42 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphics2D.java
@@ -313,7 +313,7 @@ public class XGraphics2D
{
// TODO: Optimize for different standard bit-depths.
Color c = (Color) p;
- XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
+ /* XToolkit tk = (XToolkit) Toolkit.getDefaultToolkit();
HashMap colorMap = tk.colorMap;
gnu.x11.Color col = (gnu.x11.Color) colorMap.get(c);
if (col == null)
@@ -323,8 +323,10 @@ public class XGraphics2D
c.getGreen() * 256,
c.getBlue() * 256);
colorMap.put(c, col);
- }
- xgc.set_foreground(col);
+ }*/
+ //xgc.set_foreground(col);
+
+ xgc.set_foreground(c.getRGB());
foreground = c;
}
}
@@ -392,9 +394,23 @@ public class XGraphics2D
xdrawable.put_image(xgc, zpixmap, x, y);
imageCache.put(image, zpixmap);
} else {
- ZPixmap zpixmap = (ZPixmap) xdrawable.image(x, y, w, h,
- 0xffffffff,
- gnu.x11.image.Image.Format.ZPIXMAP);
+
+ // TODO optimize reusing the rectangles
+ Rectangle source =
+ new Rectangle(0, 0, xdrawable.width, xdrawable.height);
+ Rectangle target = new Rectangle(x, y, w, h);
+
+ Rectangle destination = source.intersection(target);
+
+ x = destination.x;
+ y = destination.y;
+ w = destination.width;
+ h = destination.height;
+
+ ZPixmap zpixmap =
+ (ZPixmap) xdrawable.image(x, y, w, h,
+ 0xffffffff,
+ gnu.x11.image.Image.Format.ZPIXMAP);
for (int yy = 0; yy < h; yy++)
{
for (int xx = 0; xx < w; xx++)
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
index 85f72a4..becb92a 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsConfiguration.java
@@ -146,8 +146,7 @@ public class XGraphicsConfiguration
public AffineTransform getDefaultTransform()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return new AffineTransform();
}
public AffineTransform getNormalizingTransform()
@@ -158,8 +157,10 @@ public class XGraphicsConfiguration
public Rectangle getBounds()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ Display d = device.getDisplay();
+ Screen screen = d.default_screen;
+
+ return new Rectangle(0, 0, screen.width, screen.height);
}
/**
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
index eff5902..ca37f3a 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XGraphicsDevice.java
@@ -39,6 +39,7 @@ package gnu.java.awt.peer.x;
import gnu.classpath.SystemProperties;
import gnu.x11.Display;
+import gnu.x11.EscherServerConnectionException;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
@@ -127,9 +128,16 @@ public class XGraphicsDevice
Socket socket = createLocalSocket();
if (socket != null)
{
- display = new Display(socket, "localhost",
- displayName.display_no,
- displayName.screen_no);
+ try
+ {
+ display = new Display(socket, "localhost",
+ displayName.display_no,
+ displayName.screen_no);
+ }
+ catch (EscherServerConnectionException e)
+ {
+ throw new RuntimeException(e.getCause());
+ }
}
}
@@ -137,8 +145,17 @@ public class XGraphicsDevice
// when the connection is probably remote or when we couldn't load
// the LocalSocket class stuff.
if (display == null)
- display = new Display(displayName);
-
+ {
+ try
+ {
+ display = new Display(displayName);
+ }
+ catch (EscherServerConnectionException e)
+ {
+ throw new RuntimeException(e.getCause());
+ }
+ }
+
eventPump = new XEventPump(display);
}
return display;
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XImage.java b/libjava/classpath/gnu/java/awt/peer/x/XImage.java
index 7d4636b..fa94d00 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XImage.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XImage.java
@@ -39,13 +39,19 @@ exception statement from your version. */
package gnu.java.awt.peer.x;
import gnu.x11.Pixmap;
+import gnu.x11.image.ZPixmap;
import java.awt.Graphics;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
+
+import java.awt.image.ColorModel;
+import java.awt.image.ImageConsumer;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
+
import java.util.Hashtable;
+import java.util.Vector;
public class XImage
extends Image
@@ -75,8 +81,7 @@ public class XImage
public ImageProducer getSource()
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ return new XImageProducer();
}
/**
@@ -108,4 +113,66 @@ public class XImage
{
pixmap.free();
}
+
+ protected class XImageProducer implements ImageProducer
+ {
+ private Vector<ImageConsumer> consumers = new Vector<ImageConsumer>();
+
+ public void addConsumer(ImageConsumer ic)
+ {
+ if (ic != null && !isConsumer(ic))
+ this.consumers.add(ic);
+ }
+
+ public boolean isConsumer(ImageConsumer ic)
+ {
+ return this.consumers.contains(ic);
+ }
+
+ public void removeConsumer(ImageConsumer ic)
+ {
+ if (ic != null)
+ this.consumers.remove(ic);
+ }
+
+ public void requestTopDownLeftRightResend(ImageConsumer ic)
+ {
+ /* just ignore the call */
+ }
+
+ public void startProduction(ImageConsumer ic)
+ {
+ this.addConsumer(ic);
+
+ for (ImageConsumer consumer : this.consumers)
+ {
+ int width = XImage.this.getWidth(null);
+ int height = XImage.this.getHeight(null);
+
+ XGraphics2D graphics = (XGraphics2D) getGraphics();
+ ColorModel model = graphics.getColorModel();
+ graphics.dispose();
+
+ ZPixmap zpixmap = (ZPixmap)
+ XImage.this.pixmap.image(0, 0, width, height,
+ 0xffffffff,
+ gnu.x11.image.Image.Format.ZPIXMAP);
+
+ int size = zpixmap.get_data_length();
+ System.out.println("size: " + size + ", w = " + width + ", h = " + height);
+
+ int [] pixel = new int[size];
+ for (int i = 0; i < size; i++)
+ pixel[i] = zpixmap.get_data_element(i);
+
+ consumer.setHints(ImageConsumer.SINGLEPASS);
+
+ consumer.setDimensions(width, height);
+ consumer.setPixels(0, 0, width, height, model, pixel, 0, width);
+ consumer.imageComplete(ImageConsumer.STATICIMAGEDONE);
+ }
+
+ System.out.println("done!");
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java b/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
index c1724aa..af12574 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XToolkit.java
@@ -54,6 +54,7 @@ import java.awt.Frame;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
import java.awt.Image;
import java.awt.Label;
import java.awt.List;
@@ -120,11 +121,16 @@ import gnu.java.awt.ClasspathToolkit;
import gnu.java.awt.EmbeddedWindow;
import gnu.java.awt.font.OpenTypeFontPeer;
import gnu.java.awt.image.ImageConverter;
+import gnu.java.awt.java2d.AbstractGraphics2D;
import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.java.awt.peer.EmbeddedWindowPeer;
+import gnu.java.awt.peer.swing.SwingButtonPeer;
import gnu.java.awt.peer.swing.SwingCanvasPeer;
+import gnu.java.awt.peer.swing.SwingCheckboxPeer;
import gnu.java.awt.peer.swing.SwingLabelPeer;
import gnu.java.awt.peer.swing.SwingPanelPeer;
+import gnu.java.awt.peer.swing.SwingTextAreaPeer;
+import gnu.java.awt.peer.swing.SwingTextFieldPeer;
public class XToolkit
extends ClasspathToolkit
@@ -232,18 +238,24 @@ public class XToolkit
protected ButtonPeer createButton(Button target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No ButtonPeer can be created in an headless" +
+ "graphics environment.");
+
+ return new SwingButtonPeer(target);
}
protected TextFieldPeer createTextField(TextField target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No TextFieldPeer can be created in an headless " +
+ "graphics environment.");
+
+ return new SwingTextFieldPeer(target);
}
protected LabelPeer createLabel(Label target)
{
+ checkHeadLess("No LabelPeer can be created in an headless graphics " +
+ "environment.");
return new SwingLabelPeer(target);
}
@@ -255,8 +267,10 @@ public class XToolkit
protected CheckboxPeer createCheckbox(Checkbox target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No CheckboxPeer can be created in an headless graphics " +
+ "environment.");
+
+ return new SwingCheckboxPeer(target);
}
protected ScrollbarPeer createScrollbar(Scrollbar target)
@@ -273,8 +287,10 @@ public class XToolkit
protected TextAreaPeer createTextArea(TextArea target)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ checkHeadLess("No TextAreaPeer can be created in an headless graphics " +
+ "environment.");
+
+ return new SwingTextAreaPeer(target);
}
protected ChoicePeer createChoice(Choice target)
@@ -514,14 +530,14 @@ public class XToolkit
public boolean prepareImage(Image image, int width, int height, ImageObserver observer)
{
- // Images are loaded synchronously, so we don't bother and return true.
- return true;
+ Image scaled = AbstractGraphics2D.prepareImage(image, width, height);
+ return checkImage(image, width, height, observer) == ImageObserver.ALLBITS;
}
public int checkImage(Image image, int width, int height, ImageObserver observer)
{
- // TODO: Implement this.
- throw new UnsupportedOperationException("Not yet implemented.");
+ // Images are loaded synchronously, so we don't bother and return true.
+ return ImageObserver.ALLBITS;
}
public Image createImage(ImageProducer producer)
@@ -638,4 +654,14 @@ public class XToolkit
return false;
}
+ private void checkHeadLess(String message) throws HeadlessException
+ {
+ if(GraphicsEnvironment.isHeadless())
+ {
+ if(message == null)
+ message = "This method cannot be called in headless mode.";
+
+ throw new HeadlessException(message);
+ }
+ }
}
diff --git a/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java b/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
index f9184ed..930247d 100644
--- a/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
+++ b/libjava/classpath/gnu/java/awt/peer/x/XWindowPeer.java
@@ -71,21 +71,16 @@ public class XWindowPeer
private static int standardSelect = Event.BUTTON_PRESS_MASK
| Event.BUTTON_RELEASE_MASK
| Event.POINTER_MOTION_MASK
- //| Event.RESIZE_REDIRECT_MASK
+ // | Event.RESIZE_REDIRECT_MASK //
| Event.EXPOSURE_MASK
- //| Event.PROPERTY_CHANGE_MASK
- | Event.STRUCTURE_NOTIFY_MASK
+ | Event.PROPERTY_CHANGE_MASK
+ //| Event.STRUCTURE_NOTIFY_MASK
+ //| Event.SUBSTRUCTURE_NOTIFY_MASK
| Event.KEY_PRESS_MASK
| Event.KEY_RELEASE_MASK
+ //| Event.VISIBILITY_CHANGE_MASK //
;
-
- /**
- * Indicates if we are in callback mode, that is when a property (like size)
- * is changed in reponse to a request from the X server and doesn't need
- * to be propagated back to the X server.
- */
- boolean callback = false;
-
+
/**
* The X window.
*/
@@ -110,8 +105,10 @@ public class XWindowPeer
int h = Math.max(window.getHeight(), 1);
xwindow = new Window(dev.getDisplay().default_root, x, y, w, h, 0, atts);
xwindow.select_input(standardSelect);
+
dev.getEventPump().registerWindow(xwindow, window);
-
+ xwindow.set_wm_delete_window();
+
boolean undecorated;
if (awtComponent instanceof Frame)
{
@@ -269,14 +266,9 @@ public class XWindowPeer
*/
public void reshape(int x, int y, int width, int height)
{
- // Need to substract insets because AWT size is including insets,
- // and X size is excluding insets.
- if (! callback)
- {
- Insets i = insets;
- xwindow.move_resize(x - i.left, y - i.right, width - i.left - i.right,
- height - i.top - i.bottom);
- }
+ Insets i = insets;
+ xwindow.move_resize(x - i.left, y - i.right, width - i.left - i.right,
+ height - i.top - i.bottom);
}
public Insets insets()
@@ -303,4 +295,9 @@ public class XWindowPeer
XGraphicsDevice dev = XToolkit.getDefaultDevice();
dev.getEventPump().unregisterWindow(xwindow);
}
+
+ public Window getXwindow()
+ {
+ return xwindow;
+ }
}