summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/java/awt/peer/GLightweightPeer.java2
-rw-r--r--gnu/java/awt/peer/gtk/GtkButtonPeer.java2
-rw-r--r--gnu/java/awt/peer/gtk/GtkCanvasPeer.java3
-rw-r--r--gnu/java/awt/peer/gtk/GtkCheckboxPeer.java29
-rw-r--r--gnu/java/awt/peer/gtk/GtkChoicePeer.java6
-rw-r--r--gnu/java/awt/peer/gtk/GtkComponentPeer.java47
-rw-r--r--gnu/java/awt/peer/gtk/GtkContainerPeer.java8
-rw-r--r--gnu/java/awt/peer/gtk/GtkFileDialogPeer.java2
-rw-r--r--gnu/java/awt/peer/gtk/GtkFontPeer.java111
-rw-r--r--gnu/java/awt/peer/gtk/GtkFramePeer.java9
-rw-r--r--gnu/java/awt/peer/gtk/GtkListPeer.java43
-rw-r--r--gnu/java/awt/peer/gtk/GtkPanelPeer.java3
-rw-r--r--gnu/java/awt/peer/gtk/GtkScrollPanePeer.java31
-rw-r--r--gnu/java/awt/peer/gtk/GtkScrollbarPeer.java3
-rw-r--r--gnu/java/awt/peer/gtk/GtkTextComponentPeer.java2
-rw-r--r--gnu/java/awt/peer/gtk/GtkToolkit.java83
-rw-r--r--gnu/java/awt/peer/gtk/GtkWindowPeer.java3
17 files changed, 342 insertions, 45 deletions
diff --git a/gnu/java/awt/peer/GLightweightPeer.java b/gnu/java/awt/peer/GLightweightPeer.java
index 5c0ea498e..dfd9e1e26 100644
--- a/gnu/java/awt/peer/GLightweightPeer.java
+++ b/gnu/java/awt/peer/GLightweightPeer.java
@@ -239,7 +239,7 @@ public class GLightweightPeer
public void setBackground(Color color) {}
- public void setBounds(int x, int y, int width, int height) { }
+ public void setBounds(int x, int y, int width, int height) {}
public void setCursor(Cursor cursor) {}
diff --git a/gnu/java/awt/peer/gtk/GtkButtonPeer.java b/gnu/java/awt/peer/gtk/GtkButtonPeer.java
index 0801f9c6e..9a832265b 100644
--- a/gnu/java/awt/peer/gtk/GtkButtonPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkButtonPeer.java
@@ -50,6 +50,8 @@ public class GtkButtonPeer extends GtkComponentPeer
implements ButtonPeer
{
native void create ();
+ public native void connectJObject ();
+ public native void connectSignals ();
native void gtkSetFont(String name, int style, int size);
native void gtkWidgetSetForeground (int red, int green, int blue);
diff --git a/gnu/java/awt/peer/gtk/GtkCanvasPeer.java b/gnu/java/awt/peer/gtk/GtkCanvasPeer.java
index d5378dc77..1a0c4c968 100644
--- a/gnu/java/awt/peer/gtk/GtkCanvasPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkCanvasPeer.java
@@ -56,6 +56,9 @@ public class GtkCanvasPeer extends GtkComponentPeer implements CanvasPeer
public Graphics getGraphics ()
{
+ if (GtkToolkit.useGraphics2D ())
+ return new GdkGraphics2D (this);
+ else
return new GdkGraphics (this);
}
diff --git a/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java b/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
index 67469c931..fba8c8ff8 100644
--- a/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
@@ -1,5 +1,5 @@
/* GtkCheckboxPeer.java -- Implements CheckboxPeer with GTK
- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,10 +48,13 @@ public class GtkCheckboxPeer extends GtkComponentPeer
{
// Group from last time it was set.
public GtkCheckboxGroupPeer old_group;
+ // The current state of the GTK checkbox.
+ private boolean currentState;
- public native void nativeCreate (GtkCheckboxGroupPeer group);
+ public native void nativeCreate (GtkCheckboxGroupPeer group,
+ boolean state);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
- public native void connectHooks ();
+ public native void connectSignals ();
public GtkCheckboxPeer (Checkbox c)
{
@@ -66,12 +69,14 @@ public class GtkCheckboxPeer extends GtkComponentPeer
{
CheckboxGroup g = ((Checkbox) awtComponent).getCheckboxGroup ();
old_group = GtkCheckboxGroupPeer.getCheckboxGroupPeer (g);
- nativeCreate (old_group);
+ currentState = ((Checkbox)awtComponent).getState();
+ nativeCreate (old_group, currentState);
}
public void setState (boolean state)
{
- set ("active", state);
+ if (currentState != state)
+ set ("active", state);
}
public void setLabel (String label)
@@ -103,7 +108,19 @@ public class GtkCheckboxPeer extends GtkComponentPeer
// need information that we have.
public void postItemEvent (Object item, int stateChange)
{
- super.postItemEvent (awtComponent, stateChange);
+ Checkbox currentCheckBox = ((Checkbox)awtComponent);
+ // A firing of the event is only desired if the state has changed due to a
+ // button press. The currentCheckBox's state must be different from the
+ // one that the stateChange is changing to.
+ // stateChange = 1 if it goes from false -> true
+ // stateChange = 2 if it goes from true -> false
+ if (( !currentCheckBox.getState() && stateChange == 1)
+ || (currentCheckBox.getState() && stateChange == 2))
+ {
+ super.postItemEvent (awtComponent, stateChange);
+ currentState = !currentCheckBox.getState();
+ currentCheckBox.setState(currentState);
+ }
}
public void dispose ()
diff --git a/gnu/java/awt/peer/gtk/GtkChoicePeer.java b/gnu/java/awt/peer/gtk/GtkChoicePeer.java
index c4398e504..7e5579b3b 100644
--- a/gnu/java/awt/peer/gtk/GtkChoicePeer.java
+++ b/gnu/java/awt/peer/gtk/GtkChoicePeer.java
@@ -84,10 +84,10 @@ public class GtkChoicePeer extends GtkComponentPeer
}
*/
- protected void postItemEvent (Object item, int stateChange)
+ protected void choicePostItemEvent (String label, int stateChange)
{
if (stateChange == ItemEvent.SELECTED)
- ((Choice) awtComponent).select ((String) item);
- super.postItemEvent (item, stateChange);
+ ((Choice) awtComponent).select (label);
+ super.postItemEvent (label, stateChange);
}
}
diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
index 80feebdca..0a712a059 100644
--- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
@@ -48,6 +48,7 @@ import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
+import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
@@ -83,8 +84,9 @@ public class GtkComponentPeer extends GtkGenericPeer
native int[] gtkWidgetGetForeground ();
native int[] gtkWidgetGetBackground ();
native void gtkWidgetSetVisible (boolean b);
- native void gtkWidgetGetDimensions(int[] dim);
- native void gtkWidgetGetLocationOnScreen(int[] point);
+ native void gtkWidgetGetDimensions (int[] dim);
+ native void gtkWidgetGetPreferredDimensions (int[] dim);
+ native void gtkWidgetGetLocationOnScreen (int[] point);
native void gtkWidgetSetCursor (int type);
native void gtkWidgetSetBackground (int red, int green, int blue);
native void gtkWidgetSetForeground (int red, int green, int blue);
@@ -99,7 +101,8 @@ public class GtkComponentPeer extends GtkGenericPeer
insets = new Insets (0, 0, 0, 0);
}
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
protected GtkComponentPeer (Component awtComponent)
{
@@ -114,7 +117,8 @@ public class GtkComponentPeer extends GtkGenericPeer
getArgs (awtComponent, args);
args.setArgs (this);
- connectHooks ();
+ connectJObject ();
+ connectSignals ();
if (awtComponent.getForeground () != null)
setForeground (awtComponent.getForeground ());
@@ -146,7 +150,16 @@ public class GtkComponentPeer extends GtkGenericPeer
public Image createImage (int width, int height)
{
- GdkGraphics g = new GdkGraphics (width, height);
+ Graphics g;
+ if (GtkToolkit.useGraphics2D ())
+ {
+ Graphics2D g2 = new GdkGraphics2D (width, height);
+ g2.setBackground (getBackground ());
+ g = g2;
+ }
+ else
+ g = new GdkGraphics (width, height);
+
return new GtkOffScreenImage (null, g, width, height);
}
@@ -184,18 +197,12 @@ public class GtkComponentPeer extends GtkGenericPeer
public Dimension getMinimumSize ()
{
- int dim[]=new int[2];
- gtkWidgetGetDimensions (dim);
- Dimension d = new Dimension (dim[0],dim[1]);
- return (d);
+ return minimumSize ();
}
public Dimension getPreferredSize ()
{
- int dim[]=new int[2];
- gtkWidgetGetDimensions (dim);
- Dimension d = new Dimension (dim[0],dim[1]);
- return (d);
+ return preferredSize ();
}
public Toolkit getToolkit ()
@@ -214,7 +221,11 @@ public class GtkComponentPeer extends GtkGenericPeer
public Dimension minimumSize ()
{
- return getMinimumSize();
+ int dim[] = new int[2];
+
+ gtkWidgetGetPreferredDimensions (dim);
+
+ return new Dimension (dim[0], dim[1]);
}
public void paint (Graphics g)
@@ -222,9 +233,13 @@ public class GtkComponentPeer extends GtkGenericPeer
awtComponent.paint (g);
}
- public Dimension preferredSize()
+ public Dimension preferredSize ()
{
- return getPreferredSize();
+ int dim[] = new int[2];
+
+ gtkWidgetGetPreferredDimensions (dim);
+
+ return new Dimension (dim[0], dim[1]);
}
public boolean prepareImage (Image image, int width, int height,
diff --git a/gnu/java/awt/peer/gtk/GtkContainerPeer.java b/gnu/java/awt/peer/gtk/GtkContainerPeer.java
index 5225ccc5f..e51b7f098 100644
--- a/gnu/java/awt/peer/gtk/GtkContainerPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkContainerPeer.java
@@ -92,6 +92,9 @@ public class GtkContainerPeer extends GtkComponentPeer
public Graphics getGraphics ()
{
+ if (GtkToolkit.useGraphics2D ())
+ return new GdkGraphics2D (this);
+ else
return new GdkGraphics (this);
}
@@ -107,6 +110,11 @@ public class GtkContainerPeer extends GtkComponentPeer
try
{
Graphics g = getGraphics ();
+
+ // Some peers like GtkFileDialogPeer are repainted by Gtk itself
+ if (g == null)
+ break;
+
g.setClip (((PaintEvent)event).getUpdateRect());
if (id == PaintEvent.PAINT)
diff --git a/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java b/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
index 64e73c68a..07422ace7 100644
--- a/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
@@ -58,7 +58,7 @@ public class GtkFileDialogPeer extends GtkDialogPeer implements FileDialogPeer
}
public native void setFile (String file);
- public native void connectHooks ();
+ public native void connectJObject ();
public void setFilenameFilter (FilenameFilter filter)
{
diff --git a/gnu/java/awt/peer/gtk/GtkFontPeer.java b/gnu/java/awt/peer/gtk/GtkFontPeer.java
index d3130a905..8c1ec8fed 100644
--- a/gnu/java/awt/peer/gtk/GtkFontPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkFontPeer.java
@@ -38,10 +38,15 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
import java.awt.peer.FontPeer;
-import java.awt.Font;
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.font.*;
+import java.util.Locale;
import java.util.ResourceBundle;
+import java.text.*;
+import gnu.java.awt.peer.ClasspathFontPeer;
-public class GtkFontPeer implements FontPeer
+public class GtkFontPeer extends ClasspathFontPeer
{
private static ResourceBundle bundle;
@@ -61,6 +66,8 @@ public class GtkFontPeer implements FontPeer
public GtkFontPeer (String name, int style)
{
+ super(name, style, 12 /* kludge */);
+
if (bundle != null)
Xname = bundle.getString (name.toLowerCase () + "." + style);
else
@@ -91,4 +98,104 @@ public class GtkFontPeer implements FontPeer
{
return Xname;
}
+
+
+ /* remaining methods are for static compatibility with the newer
+ ClasspathFontPeer superclass; none of these methods ever existed or
+ worked on the older FontPeer interface, but we need to pretend to
+ support them anyways. */
+
+ public boolean canDisplay (Font font, char c)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int canDisplayUpTo (Font font, CharacterIterator i, int start, int limit)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getSubFamilyName (Font font, Locale locale)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getPostScriptName (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int getNumGlyphs (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public int getMissingGlyphCode (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public byte getBaselineFor (Font font, char c)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public String getGlyphName (Font font, int glyphIndex)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public GlyphVector createGlyphVector (Font font,
+ FontRenderContext frc,
+ CharacterIterator ci)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public GlyphVector createGlyphVector (Font font,
+ FontRenderContext ctx,
+ int[] glyphCodes)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public GlyphVector layoutGlyphVector (Font font,
+ FontRenderContext frc,
+ char[] chars, int start,
+ int limit, int flags)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public FontMetrics getFontMetrics (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public boolean hasUniformLineMetrics (Font font)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public LineMetrics getLineMetrics (Font font,
+ CharacterIterator ci,
+ int begin, int limit,
+ FontRenderContext rc)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Rectangle2D getMaxCharBounds (Font font,
+ FontRenderContext rc)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Rectangle2D getStringBounds (Font font,
+ CharacterIterator ci,
+ int begin, int limit,
+ FontRenderContext frc)
+ {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/gnu/java/awt/peer/gtk/GtkFramePeer.java b/gnu/java/awt/peer/gtk/GtkFramePeer.java
index ce5aa71e5..13d2fc77a 100644
--- a/gnu/java/awt/peer/gtk/GtkFramePeer.java
+++ b/gnu/java/awt/peer/gtk/GtkFramePeer.java
@@ -41,6 +41,7 @@ package gnu.java.awt.peer.gtk;
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
+import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.MenuBar;
@@ -109,8 +110,12 @@ public class GtkFramePeer extends GtkWindowPeer
public Graphics getGraphics ()
{
- GdkGraphics g = new GdkGraphics (this);
- g.translateNative (-insets.left, -insets.top);
+ Graphics g;
+ if (GtkToolkit.useGraphics2D ())
+ g = new GdkGraphics2D (this);
+ else
+ g = new GdkGraphics (this);
+ g.translate (-insets.left, -insets.top);
return g;
}
diff --git a/gnu/java/awt/peer/gtk/GtkListPeer.java b/gnu/java/awt/peer/gtk/GtkListPeer.java
index 2ba183b09..ac2c36149 100644
--- a/gnu/java/awt/peer/gtk/GtkListPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkListPeer.java
@@ -38,8 +38,11 @@ exception statement from your version. */
package gnu.java.awt.peer.gtk;
+import java.awt.AWTEvent;
import java.awt.Dimension;
import java.awt.List;
+import java.awt.event.MouseEvent;
+import java.awt.event.KeyEvent;
import java.awt.peer.ListPeer;
public class GtkListPeer extends GtkComponentPeer
@@ -48,7 +51,8 @@ public class GtkListPeer extends GtkComponentPeer
// native void create (ComponentPeer parent, String [] items, boolean mode);
native void create ();
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
native void getSize (int rows, int dims[]);
@@ -121,6 +125,43 @@ public class GtkListPeer extends GtkComponentPeer
setMultipleMode (b);
}
+ public void handleEvent (AWTEvent e)
+ {
+ if (e.getID () == MouseEvent.MOUSE_CLICKED && isEnabled ())
+ {
+ /* Only generate the ActionEvent on the second click of
+ a multiple click */
+ MouseEvent me = (MouseEvent) e;
+ if (!me.isConsumed ()
+ && (me.getModifiers () & MouseEvent.BUTTON1_MASK) != 0
+ && me.getClickCount() == 2)
+ {
+ String selectedItem = ((List)awtComponent).getSelectedItem ();
+
+ /* Double-click only generates an Action event
+ if something is selected */
+ if (selectedItem != null)
+ postActionEvent (((List)awtComponent).getSelectedItem (),
+ me.getModifiers ());
+ }
+ }
+
+ if (e.getID () == KeyEvent.KEY_PRESSED)
+ {
+ KeyEvent ke = (KeyEvent) e;
+ if (!ke.isConsumed () && ke.getKeyCode () == KeyEvent.VK_ENTER)
+ {
+ String selectedItem = ((List)awtComponent).getSelectedItem ();
+
+ /* Enter only generates an Action event if something is selected */
+ if (selectedItem != null)
+ postActionEvent (selectedItem, ke.getModifiers ());
+ }
+ }
+
+ super.handleEvent (e);
+ }
+
protected void postItemEvent (int item, int stateChange)
{
postItemEvent (new Integer (item), stateChange);
diff --git a/gnu/java/awt/peer/gtk/GtkPanelPeer.java b/gnu/java/awt/peer/gtk/GtkPanelPeer.java
index cf7a9e1ba..4f7799493 100644
--- a/gnu/java/awt/peer/gtk/GtkPanelPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkPanelPeer.java
@@ -45,7 +45,8 @@ public class GtkPanelPeer extends GtkContainerPeer
implements PanelPeer
{
native void create ();
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
public GtkPanelPeer (Panel p)
{
diff --git a/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java b/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java
index cd2c112c2..e4f5e8f31 100644
--- a/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java
+++ b/gnu/java/awt/peer/gtk/GtkScrollPanePeer.java
@@ -46,15 +46,17 @@ import java.awt.peer.ScrollPanePeer;
public class GtkScrollPanePeer extends GtkContainerPeer
implements ScrollPanePeer
{
- native void create ();
+ native void create (int width, int height);
+
+ void create ()
+ {
+ create (awtComponent.getWidth (), awtComponent.getHeight ());
+ }
- native void gtkScrolledWindowNew(ComponentPeer parent,
- int policy, int w, int h, int[] dims);
native void gtkScrolledWindowSetScrollPosition(int x, int y);
native void gtkScrolledWindowSetHScrollIncrement (int u);
native void gtkScrolledWindowSetVScrollIncrement (int u);
- native void gtkScrolledWindowSetSize(int w, int h);
-
+
public GtkScrollPanePeer (ScrollPane sp)
{
super (sp);
@@ -63,7 +65,24 @@ public class GtkScrollPanePeer extends GtkContainerPeer
}
native void setPolicy (int policy);
- native public void childResized (int width, int height);
+ public void childResized (int width, int height)
+ {
+ int dim[] = new int[2];
+
+ gtkWidgetGetDimensions (dim);
+
+ // If the child is in this range, GTK adds both scrollbars, but
+ // the AWT doesn't. So set the peer's scroll policy to
+ // GTK_POLICY_NEVER.
+ if ((width > dim[0] - getVScrollbarWidth ()
+ && width <= dim[0])
+ && (height > dim[1] - getHScrollbarHeight ()
+ && height <= dim[1]))
+ setPolicy (ScrollPane.SCROLLBARS_NEVER);
+ else
+ setPolicy (((ScrollPane) awtComponent).getScrollbarDisplayPolicy ());
+ }
+
native public int getHScrollbarHeight ();
native public int getVScrollbarWidth ();
native public void setScrollPosition (int x, int y);
diff --git a/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java b/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
index d13e34edf..0e1b65137 100644
--- a/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkScrollbarPeer.java
@@ -60,7 +60,8 @@ public class GtkScrollbarPeer extends GtkComponentPeer
int min, int max, int stepIncr, int pageIncr,
int visibleAmount);
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
public GtkScrollbarPeer (Scrollbar s)
{
diff --git a/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java b/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
index b3199d87c..8bc4bdf3e 100644
--- a/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkTextComponentPeer.java
@@ -56,7 +56,7 @@ public class GtkTextComponentPeer extends GtkComponentPeer
setText (tc.getText ());
}
- public native void connectHooks ();
+ public native void connectSignals ();
public native int getCaretPosition ();
public native void setCaretPosition (int pos);
diff --git a/gnu/java/awt/peer/gtk/GtkToolkit.java b/gnu/java/awt/peer/gtk/GtkToolkit.java
index ec934bd71..07445075c 100644
--- a/gnu/java/awt/peer/gtk/GtkToolkit.java
+++ b/gnu/java/awt/peer/gtk/GtkToolkit.java
@@ -42,6 +42,7 @@ import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.peer.DragSourceContextPeer;
+import java.awt.font.TextAttribute;
import java.awt.im.InputMethodHighlight;
import java.awt.image.ColorModel;
import java.awt.image.ImageObserver;
@@ -52,6 +53,8 @@ import java.util.Hashtable;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Properties;
+import gnu.java.awt.peer.ClasspathFontPeer;
+import gnu.java.awt.peer.ClasspathFontPeer;
import gnu.classpath.Configuration;
import gnu.java.awt.peer.gtk.GdkPixbufDecoder;
@@ -62,14 +65,35 @@ import gnu.java.awt.peer.gtk.GdkPixbufDecoder;
this class. If getPeer() ever goes away, we can implement a hash table
that will keep up with every window's peer, but for now this is faster. */
-public class GtkToolkit extends Toolkit
+/**
+ * This class accesses a system property called
+ * <tt>gnu.java.awt.peer.gtk.Graphics</tt>. If the property is defined and
+ * equal to "Graphics2D", the cairo-based GdkGraphics2D will be used in
+ * drawing contexts. Any other value will cause the older GdkGraphics
+ * object to be used.
+ */
+
+public class GtkToolkit extends gnu.java.awt.ClasspathToolkit
{
GtkMainThread main;
Hashtable containers = new Hashtable();
static EventQueue q = new EventQueue();
static Clipboard systemClipboard;
- static
+ static boolean useGraphics2dSet;
+ static boolean useGraphics2d;
+
+ public static boolean useGraphics2D()
+ {
+ if (useGraphics2dSet)
+ return useGraphics2d;
+ useGraphics2d = System.getProperty("gnu.java.awt.peer.gtk.Graphics",
+ "Graphics").equals("Graphics2D");
+ useGraphics2dSet = true;
+ return useGraphics2d;
+ }
+
+ static
{
if (Configuration.INIT_LOAD_LIBRARY)
System.loadLibrary("gtkpeer");
@@ -131,7 +155,10 @@ public class GtkToolkit extends Toolkit
public FontMetrics getFontMetrics (Font font)
{
- return new GdkFontMetrics (font);
+ if (useGraphics2D())
+ return new GdkClasspathFontPeerMetrics (font);
+ else
+ return new GdkFontMetrics (font);
}
public Image getImage (String filename)
@@ -313,6 +340,10 @@ public class GtkToolkit extends Toolkit
return new GtkWindowPeer (w);
}
+ /**
+ * @deprecated part of the older "logical font" system in earlier AWT
+ * implementations. Our newer Font class uses getClasspathFontPeer.
+ */
protected FontPeer getFontPeer (String name, int style)
{
try {
@@ -323,6 +354,38 @@ public class GtkToolkit extends Toolkit
}
}
+ /**
+ * Newer method to produce a peer for a Font object, even though Sun's
+ * design claims Font should now be peerless, we do not agree with this
+ * model, hence "ClasspathFontPeer".
+ */
+
+ public ClasspathFontPeer getClasspathFontPeer (String name, Map attrs)
+ {
+ if (useGraphics2D())
+ return new GdkClasspathFontPeer (name, attrs);
+ else
+ {
+ int style = Font.PLAIN;
+
+ if (attrs.containsKey (TextAttribute.WEIGHT))
+ {
+ Float weight = (Float) attrs.get (TextAttribute.WEIGHT);
+ if (weight.floatValue () >= TextAttribute.WEIGHT_BOLD.floatValue ())
+ style += Font.BOLD;
+ }
+
+ if (attrs.containsKey (TextAttribute.POSTURE))
+ {
+ Float posture = (Float) attrs.get (TextAttribute.POSTURE);
+ if (posture.floatValue () >= TextAttribute.POSTURE_OBLIQUE.floatValue ())
+ style += Font.ITALIC;
+ }
+
+ return (ClasspathFontPeer) this.getFontPeer (name, style);
+ }
+ }
+
protected EventQueue getSystemEventQueueImpl()
{
return q;
@@ -341,4 +404,18 @@ public class GtkToolkit extends Toolkit
{
throw new Error("not implemented");
}
+
+ // ClasspathToolkit methods
+
+ public GraphicsEnvironment getLocalGraphicsEnvironment()
+ {
+ throw new java.lang.UnsupportedOperationException ();
+ }
+
+ public Font createFont(int format, java.io.InputStream stream)
+ {
+ throw new java.lang.UnsupportedOperationException ();
+ }
+
+
} // class GtkToolkit
diff --git a/gnu/java/awt/peer/gtk/GtkWindowPeer.java b/gnu/java/awt/peer/gtk/GtkWindowPeer.java
index 821afa929..4a2d50805 100644
--- a/gnu/java/awt/peer/gtk/GtkWindowPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkWindowPeer.java
@@ -93,7 +93,8 @@ public class GtkWindowPeer extends GtkContainerPeer
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
- native void connectHooks ();
+ native void connectJObject ();
+ native void connectSignals ();
public GtkWindowPeer (Window window)
{