summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/gnu/java/awt/peer
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu/java/awt/peer')
-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
14 files changed, 464 insertions, 159 deletions
diff --git a/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java b/libjava/classpath/gnu/java/awt/peer/GnomeDesktopPeer.java
index be216318140..cc41f749dc0 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 30dd89ba7b2..8bc3e65b24e 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 28fb84119e4..826cfbecead 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 e41754641bb..e248b6daf10 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 c80c85c28f0..dde5b919537 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 7f984353316..379839196b2 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 0a96a613b4e..4372c965ffe 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 7424dc671ed..a355c68b383 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 95129666a05..0339a424dac 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 85f72a4eff4..becb92a7d72 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 eff5902d22e..ca37f3adbbd 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 7d4636b95da..fa94d00c131 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 c1724aad55d..af12574a150 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 f9184ed1cde..930247da5c2 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;
+ }
}
OpenPOWER on IntegriCloud