summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2007-06-25 11:25:50 +0000
committerRoman Kennke <roman@kennke.org>2007-06-25 11:25:50 +0000
commit6171a7dfb853b5b0d4da9cd0f2f9036ea15ef9e4 (patch)
tree1421f5d6acc836c71fe71755487fcc1253179c32
parent38d71ece08e54b4c738f17049a9bb4e84c616b77 (diff)
downloadclasspath-6171a7dfb853b5b0d4da9cd0f2f9036ea15ef9e4.tar.gz
2007-06-25 Roman Kennke <roman@kennke.org>
* gnu/java/awt/peer/ClasspathFontPeer.java (canDisplay): Take character as integer codepoint. * gnu/java/awt/peer/gtk/GdkFontPeer.java (canDisplay): Take character as integer codepoint. * gnu/java/awt/peer/gtk/GtkComponentPeer.java (postMouseEvent): Use MouseEvent constructor with absolute coordinates to avoid deadlock (over getLocationOnScreen()). * gnu/java/awt/peer/gtk/VolatileImageGraphics.java (getDeviceConfiguration): Fall back to the default configuration if the component is not set. * gnu/java/awt/peer/qt/QtFontMetrics.java (canDisplay): Take character as integer codepoint. * gnu/java/awt/peer/qt/QtFontPeer.java (canDisplay): Take character as integer codepoint. * gnu/java/awt/peer/x/XFontPeer2.java (canDisplay): Take character as integer codepoint. * include/gnu_java_awt_peer_qt_QtFontMetrics.h (canDisplay): Take character as integer codepoint. * java/awt/Font.java (DIALOG): New constant. (DIALOG_INPUT): New constant. (MONOSPACED): New constant. (SANS_SERIF): New constant. (SERIF): New constant. (Font(Font)): New constructor. (canDisplay(char)): Use new canDisplay(int) method. (canDisplay(int)): New method. (hasLayoutAttributes): New method. * java/awt/event/MouseEvent.java (absX,absY): New fields. (MouseEvent): New constructor with absolute coordinates. (getLocationOnScreen): New method. (getXOnScreen): New method. (getYOnScreen): New method. * native/jni/qt-peer/qtfontmetrics.cpp (canDisplay): Take character as integer codepoint.
-rw-r--r--ChangeLog41
-rw-r--r--gnu/java/awt/peer/ClasspathFontPeer.java2
-rw-r--r--gnu/java/awt/peer/gtk/GdkFontPeer.java2
-rw-r--r--gnu/java/awt/peer/gtk/GtkComponentPeer.java13
-rw-r--r--gnu/java/awt/peer/gtk/VolatileImageGraphics.java12
-rw-r--r--gnu/java/awt/peer/qt/QtFontMetrics.java2
-rw-r--r--gnu/java/awt/peer/qt/QtFontPeer.java2
-rw-r--r--gnu/java/awt/peer/x/XFontPeer2.java2
-rw-r--r--include/gnu_java_awt_peer_qt_QtFontMetrics.h2
-rw-r--r--java/awt/Font.java43
-rw-r--r--java/awt/event/MouseEvent.java95
-rw-r--r--native/jni/qt-peer/qtfontmetrics.cpp4
12 files changed, 206 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index d1a8ac206..138696ce6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,42 @@
+2007-06-25 Roman Kennke <roman@kennke.org>
+
+ * gnu/java/awt/peer/ClasspathFontPeer.java
+ (canDisplay): Take character as integer codepoint.
+ * gnu/java/awt/peer/gtk/GdkFontPeer.java
+ (canDisplay): Take character as integer codepoint.
+ * gnu/java/awt/peer/gtk/GtkComponentPeer.java
+ (postMouseEvent): Use MouseEvent constructor with absolute coordinates
+ to avoid deadlock (over getLocationOnScreen()).
+ * gnu/java/awt/peer/gtk/VolatileImageGraphics.java
+ (getDeviceConfiguration): Fall back to the default configuration
+ if the component is not set.
+ * gnu/java/awt/peer/qt/QtFontMetrics.java
+ (canDisplay): Take character as integer codepoint.
+ * gnu/java/awt/peer/qt/QtFontPeer.java
+ (canDisplay): Take character as integer codepoint.
+ * gnu/java/awt/peer/x/XFontPeer2.java
+ (canDisplay): Take character as integer codepoint.
+ * include/gnu_java_awt_peer_qt_QtFontMetrics.h
+ (canDisplay): Take character as integer codepoint.
+ * java/awt/Font.java
+ (DIALOG): New constant.
+ (DIALOG_INPUT): New constant.
+ (MONOSPACED): New constant.
+ (SANS_SERIF): New constant.
+ (SERIF): New constant.
+ (Font(Font)): New constructor.
+ (canDisplay(char)): Use new canDisplay(int) method.
+ (canDisplay(int)): New method.
+ (hasLayoutAttributes): New method.
+ * java/awt/event/MouseEvent.java
+ (absX,absY): New fields.
+ (MouseEvent): New constructor with absolute coordinates.
+ (getLocationOnScreen): New method.
+ (getXOnScreen): New method.
+ (getYOnScreen): New method.
+ * native/jni/qt-peer/qtfontmetrics.cpp
+ (canDisplay): Take character as integer codepoint.
+
2007-06-25 Mark Wielaard <mark@klomp.org>
* native/jni/native-lib/cpnet.c
@@ -74,7 +113,7 @@
* gnu/java/awt/peer/GLightweightPeer.java
* gnu/java/awt/peer/gtk/GdkRobotPeer.java
- * gnu/java/awt/peer/gtk/GtkComponentPeer.java
+ * gnu/java/awt/peer/gtk/GtkCompoonentPeer.java
* gnu/java/awt/peer/gtk/GtkFramePeer.java
* gnu/java/awt/peer/gtk/GtkWindowPeer.java
* gnu/java/awt/peer/qt/QtComponentPeer.java
diff --git a/gnu/java/awt/peer/ClasspathFontPeer.java b/gnu/java/awt/peer/ClasspathFontPeer.java
index 60fde2557..e43e5f284 100644
--- a/gnu/java/awt/peer/ClasspathFontPeer.java
+++ b/gnu/java/awt/peer/ClasspathFontPeer.java
@@ -644,7 +644,7 @@ public abstract class ClasspathFontPeer
* be ignored.
*/
- public abstract boolean canDisplay (Font font, char c);
+ public abstract boolean canDisplay (Font font, int c);
/**
* Implementation of {@link Font#canDisplay(String)},
diff --git a/gnu/java/awt/peer/gtk/GdkFontPeer.java b/gnu/java/awt/peer/gtk/GdkFontPeer.java
index 47a418052..95a806ac7 100644
--- a/gnu/java/awt/peer/gtk/GdkFontPeer.java
+++ b/gnu/java/awt/peer/gtk/GdkFontPeer.java
@@ -361,7 +361,7 @@ public class GdkFontPeer extends ClasspathFontPeer
return NameDecoder.getName(nameTable, name, locale);
}
- public boolean canDisplay (Font font, char c)
+ public boolean canDisplay (Font font, int c)
{
// FIXME: inquire with pango
return true;
diff --git a/gnu/java/awt/peer/gtk/GtkComponentPeer.java b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
index a270c6e3f..16c20ee25 100644
--- a/gnu/java/awt/peer/gtk/GtkComponentPeer.java
+++ b/gnu/java/awt/peer/gtk/GtkComponentPeer.java
@@ -616,11 +616,18 @@ public class GtkComponentPeer extends GtkGenericPeer
setVisible (true);
}
- protected void postMouseEvent(int id, long when, int mods, int x, int y,
+ protected void postMouseEvent(int id, long when, int mods, int x, int y,
int clickCount, boolean popupTrigger)
{
- q().postEvent(new MouseEvent(awtComponent, id, when, mods, x, y,
- clickCount, popupTrigger));
+ // It is important to do the getLocationOnScreen() here, instead
+ // of using the old MouseEvent constructors, because
+ // Component.getLocationOnScreen() locks on the AWT lock, which can
+ // trigger a deadlock. You don't want this.
+ Point locOnScreen = getLocationOnScreen();
+ q().postEvent(new MouseEvent(awtComponent, id, when, mods, x, y,
+ locOnScreen.x + x, locOnScreen.y + y,
+ clickCount, popupTrigger,
+ MouseEvent.NOBUTTON));
}
/**
diff --git a/gnu/java/awt/peer/gtk/VolatileImageGraphics.java b/gnu/java/awt/peer/gtk/VolatileImageGraphics.java
index 88438862b..ad5cd5ecd 100644
--- a/gnu/java/awt/peer/gtk/VolatileImageGraphics.java
+++ b/gnu/java/awt/peer/gtk/VolatileImageGraphics.java
@@ -86,7 +86,17 @@ public class VolatileImageGraphics extends ComponentGraphics
public GraphicsConfiguration getDeviceConfiguration()
{
- return owner.component.getGraphicsConfiguration();
+ GraphicsConfiguration conf;
+ if (owner.component != null)
+ {
+ conf = owner.component.getGraphicsConfiguration();
+ }
+ else
+ {
+ return java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment()
+ .getDefaultScreenDevice().getDefaultConfiguration();
+ }
+ return conf;
}
public Graphics create()
diff --git a/gnu/java/awt/peer/qt/QtFontMetrics.java b/gnu/java/awt/peer/qt/QtFontMetrics.java
index 2438fcc32..3b182b5ea 100644
--- a/gnu/java/awt/peer/qt/QtFontMetrics.java
+++ b/gnu/java/awt/peer/qt/QtFontMetrics.java
@@ -94,7 +94,7 @@ public class QtFontMetrics extends FontMetrics
// ****************** Package private ***************************
- native boolean canDisplay( char c );
+ native boolean canDisplay( int c );
// ****************** Public methods ****************************
diff --git a/gnu/java/awt/peer/qt/QtFontPeer.java b/gnu/java/awt/peer/qt/QtFontPeer.java
index 6ffe3f691..bd16daf28 100644
--- a/gnu/java/awt/peer/qt/QtFontPeer.java
+++ b/gnu/java/awt/peer/qt/QtFontPeer.java
@@ -98,7 +98,7 @@ public class QtFontPeer extends ClasspathFontPeer
// ****************** ClasspathFontPeer Methods.
- public boolean canDisplay (Font font, char c)
+ public boolean canDisplay (Font font, int c)
{
return metrics.canDisplay( c );
}
diff --git a/gnu/java/awt/peer/x/XFontPeer2.java b/gnu/java/awt/peer/x/XFontPeer2.java
index ce782a220..ab3861be1 100644
--- a/gnu/java/awt/peer/x/XFontPeer2.java
+++ b/gnu/java/awt/peer/x/XFontPeer2.java
@@ -270,7 +270,7 @@ public class XFontPeer2
}
}
- public boolean canDisplay(Font font, char c)
+ public boolean canDisplay(Font font, int c)
{
// FIXME: Implement this.
throw new UnsupportedOperationException("Not yet implemented");
diff --git a/include/gnu_java_awt_peer_qt_QtFontMetrics.h b/include/gnu_java_awt_peer_qt_QtFontMetrics.h
index 632167a76..ebc607ed3 100644
--- a/include/gnu_java_awt_peer_qt_QtFontMetrics.h
+++ b/include/gnu_java_awt_peer_qt_QtFontMetrics.h
@@ -14,7 +14,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_init (JNIEnv *env
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_initGraphics (JNIEnv *env, jobject, jobject, jobject);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_dispose (JNIEnv *env, jobject);
JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_getStringBounds (JNIEnv *env, jobject, jstring);
-JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_canDisplay (JNIEnv *env, jobject, jchar);
+JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_canDisplay (JNIEnv *env, jobject, jint);
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_getAscent (JNIEnv *env, jobject);
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_getDescent (JNIEnv *env, jobject);
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_getHeight (JNIEnv *env, jobject);
diff --git a/java/awt/Font.java b/java/awt/Font.java
index 29b87d6af..d6892a626 100644
--- a/java/awt/Font.java
+++ b/java/awt/Font.java
@@ -170,6 +170,31 @@ public class Font implements Serializable
public static final int LAYOUT_NO_LIMIT_CONTEXT = 4;
/**
+ * @since 1.6
+ */
+ public static final String DIALOG = "Dialog";
+
+ /**
+ * @since 1.6
+ */
+ public static final String DIALOG_INPUT = "DialogInput";
+
+ /**
+ * @since 1.6
+ */
+ public static final String MONOSPACED = "Monospaced";
+
+ /**
+ * @since 1.6
+ */
+ public static final String SANS_SERIF = "SansSerif";
+
+ /**
+ * @since 1.6
+ */
+ public static final String SERIF = "Serif";
+
+ /**
* The logical name of this font.
*
* @since 1.0
@@ -330,6 +355,11 @@ public class Font implements Serializable
return getFont(propname, (Font) null);
}
+ protected Font(Font font)
+ {
+ this(font.getName(), font.getAttributes());
+ }
+
/**
* Initializes a new instance of <code>Font</code> with the specified
* attributes.
@@ -491,7 +521,12 @@ public class Font implements Serializable
*/
public boolean canDisplay(char c)
{
- return peer.canDisplay(this, c);
+ return canDisplay((int) c);
+ }
+
+ public boolean canDisplay(int codePoint)
+ {
+ return peer.canDisplay(this, codePoint);
}
/**
@@ -1373,6 +1408,12 @@ public class Font implements Serializable
return getLineMetrics(str, 0, str.length() - 1, frc);
}
+ public boolean hasLayoutAttributes()
+ {
+ // TODO: Implement properly.
+ return false;
+ }
+
/**
* Reads the normal fields from the stream and then constructs the
* peer from the style and size through getPeerFromToolkit().
diff --git a/java/awt/event/MouseEvent.java b/java/awt/event/MouseEvent.java
index f2bcfbcc6..ad777e8f4 100644
--- a/java/awt/event/MouseEvent.java
+++ b/java/awt/event/MouseEvent.java
@@ -164,6 +164,16 @@ public class MouseEvent extends InputEvent
private int y;
/**
+ * The screen position of that mouse event, X coordinate.
+ */
+ private int absX;
+
+ /**
+ * The screen position of that mouse event, Y coordinate.
+ */
+ private int absY;
+
+ /**
* The number of clicks that took place. For MOUSE_CLICKED, MOUSE_PRESSED,
* and MOUSE_RELEASED, this will be at least 1; otherwise it is 0.
*
@@ -212,6 +222,7 @@ public class MouseEvent extends InputEvent
int button)
{
super(source, id, when, modifiers);
+
this.x = x;
this.y = y;
this.clickCount = clickCount;
@@ -234,6 +245,13 @@ public class MouseEvent extends InputEvent
this.modifiersEx &= ~(BUTTON1_DOWN_MASK
| BUTTON2_DOWN_MASK
| BUTTON3_DOWN_MASK);
+
+ if (source != null)
+ {
+ Point screenLoc = source.getLocationOnScreen();
+ absX = screenLoc.x + x;
+ absY = screenLoc.y + y;
+ }
}
/**
@@ -258,6 +276,59 @@ public class MouseEvent extends InputEvent
}
/**
+ * Creates a new MouseEvent. This is like the other constructors and adds
+ * specific absolute coordinates.
+ *
+ * @param source the source of the event
+ * @param id the event id
+ * @param when the timestamp of when the event occurred
+ * @param modifiers the modifier keys during the event, in old or new style
+ * @param x the X coordinate of the mouse point
+ * @param y the Y coordinate of the mouse point
+ * @param absX the absolute X screen coordinate of this event
+ * @param absY the absolute Y screen coordinate of this event
+ * @param clickCount the number of mouse clicks for this event
+ * @param popupTrigger true if this event triggers a popup menu
+ * @param button the most recent mouse button to change state
+ *
+ * @throws IllegalArgumentException if source is null or button is invalid
+ *
+ * @since 1.6
+ */
+ public MouseEvent(Component source, int id, long when, int modifiers,
+ int x, int y, int absX, int absY, int clickCount,
+ boolean popupTrigger, int button)
+ {
+ super(source, id, when, modifiers);
+
+ this.x = x;
+ this.y = y;
+ this.clickCount = clickCount;
+ this.popupTrigger = popupTrigger;
+ this.button = button;
+ if (button < NOBUTTON || button > BUTTON3)
+ throw new IllegalArgumentException();
+ if ((modifiers & EventModifier.OLD_MASK) != 0)
+ {
+ if ((modifiers & BUTTON1_MASK) != 0)
+ this.button = BUTTON1;
+ else if ((modifiers & BUTTON2_MASK) != 0)
+ this.button = BUTTON2;
+ else if ((modifiers & BUTTON3_MASK) != 0)
+ this.button = BUTTON3;
+ }
+ // clear the mouse button modifier masks if this is a button
+ // release event.
+ if (id == MOUSE_RELEASED)
+ this.modifiersEx &= ~(BUTTON1_DOWN_MASK
+ | BUTTON2_DOWN_MASK
+ | BUTTON3_DOWN_MASK);
+
+ this.absX = absX;
+ this.absY = absY;
+ }
+
+ /**
* This method returns the X coordinate of the mouse position. This is
* relative to the source component.
*
@@ -280,6 +351,30 @@ public class MouseEvent extends InputEvent
}
/**
+ * @since 1.6
+ */
+ public Point getLocationOnScreen()
+ {
+ return new Point(absX, absY);
+ }
+
+ /**
+ * @since 1.6
+ */
+ public int getXOnScreen()
+ {
+ return absX;
+ }
+
+ /**
+ * @since 1.6
+ */
+ public int getYOnScreen()
+ {
+ return absY;
+ }
+
+ /**
* This method returns a <code>Point</code> for the x,y position of
* the mouse pointer. This is relative to the source component.
*
diff --git a/native/jni/qt-peer/qtfontmetrics.cpp b/native/jni/qt-peer/qtfontmetrics.cpp
index fd56b2878..f2f61822d 100644
--- a/native/jni/qt-peer/qtfontmetrics.cpp
+++ b/native/jni/qt-peer/qtfontmetrics.cpp
@@ -127,11 +127,11 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_dispose
* Returns JNI_TRUE if a character is displayable.
*/
JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_qt_QtFontMetrics_canDisplay
-(JNIEnv *env, jobject obj, jchar c)
+(JNIEnv *env, jobject obj, jint c)
{
QFontMetrics *fm = getFontMetrics( env, obj );
assert( fm );
- bool result = fm->inFont( QChar( (unsigned short)c ) );
+ bool result = fm->inFont( QChar( (unsigned int) c ) );
return (result ? JNI_TRUE : JNI_FALSE);
}