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