Hi, To better understand the gtk+ peers I documented GtkGenericPeer a little to make it more clear what should be overridden and why. I also cleaned up the setting of fonts of the Menu peers so they look better even when the user has set a custom (font) theme. While documenting this change I also noticed that the GtkTextFieldPeer was using a custom way to set the widget font which was similar to what was already done by GtkGenericPeer.
2006-02-13 Mark Wielaard <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/GtkGenericPeer.java (awtWidget): Made field final. (gtkWidgetModifyFont(Font)): New protected helper method. (gtkWidgetModifyFont(String,int,int)): Made protected and document. * gnu/java/awt/peer/gtk/GtkButtonPeer.java (gtkWidgetModifyFont): Made protected and document. * gnu/java/awt/peer/gtk/GtkCheckboxPeer.java (gtkWidgetModifyFont): Likewise. * gnu/java/awt/peer/gtk/GtkLabelPeer.java (gtkWidgetModifyFont): Likewise. * gnu/java/awt/peer/gtk/GtkListPeer.java (gtkWidgetModifyFont): Likewise. * gnu/java/awt/peer/gtk/GtkMenuBarPeer.java (create): Made protected. (setFont): Removed method. Done in GtkMenuComponent. * gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java (create): Made abstract and protected. (setFont): Made private, add implementation. (setFont(Font)): Implemented. * gnu/java/awt/peer/gtk/GtkMenuItemPeer.java (gtkWidgetModifyFont): Made protected and document. (create): Made protected. (setFont): Removed method. Done in GtkMenuComponent. * gnu/java/awt/peer/gtk/GtkTextAreaPeer.java (gtkWidgetModifyFont): Made protected and document. * gnu/java/awt/peer/gtk/GtkTextFieldPeer.java (gtkWidgetModifyFont): Removed, similar to GtkGenericPeer super class implementation. * include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h: Regenerated. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c (Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont): Removed. Comments? OK to commit? Tested against the vte and some local test programs on both menus and textfields to make sure fonts are handles correctly. Thanks, Mark
Index: include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h
===================================================================
RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h,v
retrieving revision 1.11
diff -u -r1.11 gnu_java_awt_peer_gtk_GtkTextFieldPeer.h
--- include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h 4 Jul 2005 23:56:36 -0000 1.11
+++ include/gnu_java_awt_peer_gtk_GtkTextFieldPeer.h 13 Feb 2006 15:18:59 -0000
@@ -23,7 +23,6 @@
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEditable (JNIEnv *env, jobject, jboolean);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setText (JNIEnv *env, jobject, jstring);
JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkEntryGetBorderWidth (JNIEnv *env, jobject);
-JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont (JNIEnv *env, jobject, jstring, jint, jint);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_setEchoChar (JNIEnv *env, jobject, jchar);
#ifdef __cplusplus
Index: gnu/java/awt/peer/gtk/GtkButtonPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkButtonPeer.java,v
retrieving revision 1.39
diff -u -r1.39 GtkButtonPeer.java
--- gnu/java/awt/peer/gtk/GtkButtonPeer.java 15 Aug 2005 04:14:29 -0000 1.39
+++ gnu/java/awt/peer/gtk/GtkButtonPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkButtonPeer.java -- Implements ButtonPeer with GTK
- Copyright (C) 1998, 1999, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2004, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -57,7 +57,10 @@
public native void connectSignals ();
- native void gtkWidgetModifyFont (String name, int style, int size);
+ /**
+ * Overridden to set Font of Label inside Button inside EventBox.
+ */
+ protected native void gtkWidgetModifyFont(String name, int style, int size);
native void gtkSetLabel (String label);
native void gtkWidgetSetForeground (int red, int green, int blue);
native void gtkWidgetSetBackground (int red, int green, int blue);
Index: gnu/java/awt/peer/gtk/GtkCheckboxPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkCheckboxPeer.java,v
retrieving revision 1.22
diff -u -r1.22 GtkCheckboxPeer.java
--- gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 18 Aug 2005 01:22:00 -0000 1.22
+++ gnu/java/awt/peer/gtk/GtkCheckboxPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkCheckboxPeer.java -- Implements CheckboxPeer with GTK
- Copyright (C) 1998, 1999, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2003, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -54,7 +54,11 @@
public native void create (GtkCheckboxGroupPeer group);
public native void nativeSetCheckboxGroup (GtkCheckboxGroupPeer group);
public native void connectSignals ();
- native void gtkWidgetModifyFont (String name, int style, int size);
+
+ /**
+ * Overridden to set Font of label inside button.
+ */
+ protected native void gtkWidgetModifyFont(String name, int style, int size);
native void gtkButtonSetLabel (String label);
native void gtkToggleButtonSetActive (boolean is_active);
Index: gnu/java/awt/peer/gtk/GtkGenericPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkGenericPeer.java,v
retrieving revision 1.18
diff -u -r1.18 GtkGenericPeer.java
--- gnu/java/awt/peer/gtk/GtkGenericPeer.java 12 Feb 2006 11:40:04 -0000 1.18
+++ gnu/java/awt/peer/gtk/GtkGenericPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkGenericPeer.java - Has a hashcode. Yuck.
- Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2002, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,20 +39,28 @@
package gnu.java.awt.peer.gtk;
import java.awt.EventQueue;
+import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
public class GtkGenericPeer
{
+ // Used by Native State Association (NSA) functions to map
+ // gtk_widget to peer object.
final int native_state = getUniqueInteger ();
// Next native state value we will assign.
private static int next_native_state = 0;
// The widget or other java-side object we wrap.
- protected Object awtWidget;
+ protected final Object awtWidget;
- // Dispose of our native state.
+ /**
+ * Dispose of our native state. Calls gtk_widget_destroy on the
+ * native widget and removes the awtWidget from the native state
+ * tables. Should be overridden by subclasses if this is not (all)
+ * that needs to be done.
+ */
public native void dispose ();
static EventQueue q ()
@@ -79,8 +87,20 @@
// Let's assume this will never wrap.
return next_native_state++;
}
+
+ /**
+ * Helper method to set Font for Gtk Widget.
+ */
+ protected void gtkWidgetModifyFont(Font f)
+ {
+ gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
+ }
- native void gtkWidgetModifyFont (String name, int style, int size);
+ /**
+ * Sets font for this Gtk Widget. Should be overridden by peers which
+ * are composed of different widgets or are contained in bins.
+ */
+ protected native void gtkWidgetModifyFont(String name, int style, int size);
static void printCurrentThread ()
{
Index: gnu/java/awt/peer/gtk/GtkLabelPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkLabelPeer.java,v
retrieving revision 1.24
diff -u -r1.24 GtkLabelPeer.java
--- gnu/java/awt/peer/gtk/GtkLabelPeer.java 12 Aug 2005 22:49:42 -0000 1.24
+++ gnu/java/awt/peer/gtk/GtkLabelPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkLabelPeer.java -- Implements LabelPeer with GTK
- Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -48,7 +48,12 @@
implements LabelPeer
{
native void create (String text, float alignment);
- native void gtkWidgetModifyFont (String name, int style, int size);
+
+ /**
+ * Overridden to set the Font of the label inside the gtk_event_box.
+ */
+ protected native void gtkWidgetModifyFont(String name, int style, int size);
+
native void nativeSetAlignment (float alignment);
public native void setText(String text);
Index: gnu/java/awt/peer/gtk/GtkListPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkListPeer.java,v
retrieving revision 1.21
diff -u -r1.21 GtkListPeer.java
--- gnu/java/awt/peer/gtk/GtkListPeer.java 2 Jul 2005 20:32:12 -0000 1.21
+++ gnu/java/awt/peer/gtk/GtkListPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkListPeer.java -- Implements ListPeer with GTK
- Copyright (C) 1998, 1999 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -59,7 +59,12 @@
native void create (int rows);
native void connectSignals ();
- native void gtkWidgetModifyFont (String name, int style, int size);
+
+ /**
+ * Overridden to set the Font of the text insode the gtk_scrolled_window.
+ */
+ protected native void gtkWidgetModifyFont (String name, int style, int size);
+
native void gtkWidgetRequestFocus ();
native void getSize (int rows, int visibleRows, int dims[]);
Index: gnu/java/awt/peer/gtk/GtkMenuBarPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkMenuBarPeer.java,v
retrieving revision 1.11
diff -u -r1.11 GtkMenuBarPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuBarPeer.java 13 Aug 2005 00:34:31 -0000 1.11
+++ gnu/java/awt/peer/gtk/GtkMenuBarPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkMenuBarPeer.java -- Implements MenuBarPeer with GTK+
- Copyright (C) 1999, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -49,7 +49,7 @@
implements MenuBarPeer
{
- native void create ();
+ protected native void create ();
native void addMenu (MenuPeer menu);
public GtkMenuBarPeer (MenuBar target)
@@ -57,15 +57,6 @@
super (target);
}
- void setFont ()
- {
- MenuComponent mc = (MenuComponent) awtWidget;
- Font f = mc.getFont ();
-
- if (f == null)
- mc.setFont (new Font ("Dialog", Font.PLAIN, 12));
- }
-
// FIXME: remove this method or replace it with one that does
// something useful.
/* In Gnome, help menus are no longer right flushed. */
Index: gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java,v
retrieving revision 1.11
diff -u -r1.11 GtkMenuComponentPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java 19 Aug 2005 01:29:26 -0000 1.11
+++ gnu/java/awt/peer/gtk/GtkMenuComponentPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkMenuComponentPeer.java -- Implements MenuComponentPeer with GTK+
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,18 +39,35 @@
package gnu.java.awt.peer.gtk;
import java.awt.Font;
+import java.awt.MenuComponent;
+import java.awt.MenuContainer;
import java.awt.peer.MenuComponentPeer;
-public class GtkMenuComponentPeer extends GtkGenericPeer
+public abstract class GtkMenuComponentPeer extends GtkGenericPeer
implements MenuComponentPeer
{
- void create ()
- {
- throw new RuntimeException ();
- }
+ protected abstract void create ();
- void setFont ()
+ /**
+ * Sets font based on MenuComponent font, or containing menu(bar)
+ * parent font.
+ */
+ private void setFont()
{
+ MenuComponent mc = ((MenuComponent) awtWidget);
+ Font f = mc.getFont ();
+
+ if (f == null)
+ {
+ MenuContainer parent = mc.getParent ();
+ // Submenus inherit the font of their containing Menu(Bar).
+ if (parent instanceof MenuComponent)
+ f = parent.getFont ();
+ }
+ if (f != null)
+ {
+ gtkWidgetModifyFont(f);
+ }
}
public GtkMenuComponentPeer (Object awtWidget)
@@ -60,10 +77,15 @@
setFont ();
}
+ /**
+ * Removes the awtWidget components from the native state tables.
+ * Subclasses should call <code>super.dispose()</code> if they don't
+ * remove these themselves.
+ */
public native void dispose();
public void setFont(Font font)
{
- // FIXME: implement
+ gtkWidgetModifyFont(font);
}
}
Index: gnu/java/awt/peer/gtk/GtkMenuItemPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkMenuItemPeer.java,v
retrieving revision 1.16
diff -u -r1.16 GtkMenuItemPeer.java
--- gnu/java/awt/peer/gtk/GtkMenuItemPeer.java 2 Jul 2005 20:32:12 -0000 1.16
+++ gnu/java/awt/peer/gtk/GtkMenuItemPeer.java 13 Feb 2006 15:18:59 -0000
@@ -1,5 +1,5 @@
/* GtkMenuItemPeer.java -- Implements MenuItemPeer with GTK+
- Copyright (C) 1999, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2005, 2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -51,9 +51,13 @@
{
native void create (String label);
native void connectSignals ();
- native void gtkWidgetModifyFont (String name, int style, int size);
- void create ()
+ /**
+ * Overridden to set font on menu item label.
+ */
+ protected native void gtkWidgetModifyFont(String name, int style, int size);
+
+ protected void create()
{
create (((MenuItem) awtWidget).getLabel());
}
@@ -68,21 +72,6 @@
connectSignals();
}
- void setFont ()
- {
- MenuComponent mc = ((MenuComponent) awtWidget);
- Font f = mc.getFont ();
-
- if (f == null)
- {
- MenuComponent parent = (MenuComponent) mc.getParent ();
- Font pf = parent.getFont ();
- gtkWidgetModifyFont (pf.getName (), pf.getStyle (), pf.getSize ());
- }
- else
- gtkWidgetModifyFont(f.getName(), f.getStyle(), f.getSize());
- }
-
void setParent (MenuItem item)
{
// add ourself differently, based on what type of parent we have
Index: gnu/java/awt/peer/gtk/GtkTextAreaPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkTextAreaPeer.java,v
retrieving revision 1.26
diff -u -r1.26 GtkTextAreaPeer.java
--- gnu/java/awt/peer/gtk/GtkTextAreaPeer.java 19 Aug 2005 01:29:26 -0000 1.26
+++ gnu/java/awt/peer/gtk/GtkTextAreaPeer.java 13 Feb 2006 15:18:59 -0000
@@ -55,7 +55,11 @@
native void create (int width, int height, int scrollbarVisibility);
- native void gtkWidgetModifyFont (String name, int style, int size);
+ /**
+ * Overridden to set Font for text widget inside scrolled window.
+ */
+ protected native void gtkWidgetModifyFont(String name, int style, int size);
+
native void gtkWidgetRequestFocus ();
public native void connectSignals ();
Index: gnu/java/awt/peer/gtk/GtkTextFieldPeer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/GtkTextFieldPeer.java,v
retrieving revision 1.31
diff -u -r1.31 GtkTextFieldPeer.java
--- gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 19 Aug 2005 01:29:26 -0000 1.31
+++ gnu/java/awt/peer/gtk/GtkTextFieldPeer.java 13 Feb 2006 15:18:59 -0000
@@ -112,8 +112,6 @@
native int gtkEntryGetBorderWidth ();
- native void gtkWidgetModifyFont (String name, int style, int size);
-
public GtkTextFieldPeer (TextField tf)
{
super (tf);
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
===================================================================
RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c,v
retrieving revision 1.23
diff -u -r1.23 gnu_java_awt_peer_gtk_GtkTextFieldPeer.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 18 Aug 2005 01:22:00 -0000 1.23
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_GtkTextFieldPeer.c 13 Feb 2006 15:18:59 -0000
@@ -224,39 +224,6 @@
gdk_threads_leave ();
}
-JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_gtkWidgetModifyFont
- (JNIEnv *env, jobject obj, jstring name, jint style, jint size)
-{
- const char *font_name;
- void *ptr;
- PangoFontDescription *font_desc;
-
- gdk_threads_enter();
-
- ptr = NSA_GET_PTR (env, obj);
-
- font_name = (*env)->GetStringUTFChars (env, name, NULL);
-
- font_desc = pango_font_description_from_string (font_name);
- pango_font_description_set_size (font_desc,
- size * cp_gtk_dpi_conversion_factor);
-
- if (style & AWT_STYLE_BOLD)
- pango_font_description_set_weight (font_desc, PANGO_WEIGHT_BOLD);
-
- if (style & AWT_STYLE_ITALIC)
- pango_font_description_set_style (font_desc, PANGO_STYLE_OBLIQUE);
-
- gtk_widget_modify_font (GTK_WIDGET (ptr), font_desc);
-
- pango_font_description_free (font_desc);
-
- (*env)->ReleaseStringUTFChars (env, name, font_name);
-
- gdk_threads_leave();
-}
-
JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GtkTextFieldPeer_getCaretPosition
(JNIEnv *env, jobject obj)
signature.asc
Description: This is a digitally signed message part
