]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkfontsel.c
Use gtk_box_new() instead gtk_[v|h]box_new()
[~andy/gtk] / gtk / gtkfontsel.c
index ba635c6711cd683b3320cc328b55cae9df619162..7dfcfbdb2a96a57a675fab7fe1024e827af2d6b2 100644 (file)
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#include "config.h"
 #include <stdlib.h>
 #include <glib/gprintf.h>
 #include <string.h>
 
+#include <atk/atk.h>
+
 #include "gdk/gdk.h"
 #include "gdk/gdkkeysyms.h"
 
 #include "gtkvbox.h"
 #include "gtkscrolledwindow.h"
 #include "gtkintl.h"
+#include "gtkaccessible.h"
+#include "gtkbuildable.h"
+#include "gtkprivate.h"
+
+struct _GtkFontSelectionPrivate
+{
+  GtkWidget *font_entry;        /* Used _get_family_entry() for consistency, -mr */
+  GtkWidget *font_style_entry;  /* Used _get_face_entry() for consistency, -mr */
+
+  GtkWidget *size_entry;
+  GtkWidget *preview_entry;
+
+  GtkWidget *family_list;
+  GtkWidget *face_list;
+  GtkWidget *size_list;
+
+  PangoFontFamily *family;      /* Current family */
+  PangoFontFace *face;          /* Current face */
+
+  gint size;
+};
+
+
+struct _GtkFontSelectionDialogPrivate
+{
+  GtkWidget *fontsel;
+
+  GtkWidget *ok_button;
+  GtkWidget *apply_button;
+  GtkWidget *cancel_button;
+};
+
 
 /* We don't enable the font and style entries because they don't add
  * much in terms of visible effect and have a weird effect on keynav.
    can set it. Remember that some fonts only have capital letters. */
 #define PREVIEW_TEXT N_("abcdefghijk ABCDEFGHIJK")
 
+#define DEFAULT_FONT_NAME "Sans 10"
+
 /* This is the initial and maximum height of the preview entry (it expands
    when large font sizes are selected). Initial height is also the minimum. */
 #define INITIAL_PREVIEW_HEIGHT 44
 /* These are what we use as the standard font sizes, for the size list.
  */
 static const guint16 font_sizes[] = {
-  8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28,
+  6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28,
   32, 36, 40, 48, 56, 64, 72
 };
 
 enum {
    PROP_0,
    PROP_FONT_NAME,
-   PROP_FONT,
    PROP_PREVIEW_TEXT
 };
 
@@ -107,7 +143,6 @@ enum {
   SIZE_COLUMN
 };
 
-static void    gtk_font_selection_class_init        (GtkFontSelectionClass *klass);
 static void    gtk_font_selection_set_property       (GObject         *object,
                                                      guint            prop_id,
                                                      const GValue    *value,
@@ -116,10 +151,11 @@ static void    gtk_font_selection_get_property       (GObject         *object,
                                                      guint            prop_id,
                                                      GValue          *value,
                                                      GParamSpec      *pspec);
-static void    gtk_font_selection_init              (GtkFontSelection      *fontsel);
-static void    gtk_font_selection_finalize          (GObject               *object);
-static void    gtk_font_selection_screen_changed     (GtkWidget                    *widget,
-                                                     GdkScreen             *previous_screen);
+static void    gtk_font_selection_finalize          (GObject         *object);
+static void    gtk_font_selection_screen_changed     (GtkWidget              *widget,
+                                                     GdkScreen       *previous_screen);
+static void    gtk_font_selection_style_set          (GtkWidget      *widget,
+                                                     GtkStyle       *prev_style);
 
 /* These are the callbacks & related functions. */
 static void     gtk_font_selection_select_font           (GtkTreeSelection *selection,
@@ -148,84 +184,55 @@ static void     gtk_font_selection_scroll_on_map         (GtkWidget        *w,
 
 static void     gtk_font_selection_preview_changed       (GtkWidget        *entry,
                                                          GtkFontSelection *fontsel);
+static void     gtk_font_selection_scroll_to_selection   (GtkFontSelection *fontsel);
+
 
 /* Misc. utility functions. */
 static void    gtk_font_selection_load_font          (GtkFontSelection *fs);
 static void    gtk_font_selection_update_preview     (GtkFontSelection *fs);
 
-static GdkFont* gtk_font_selection_get_font_internal (GtkFontSelection *fontsel);
-
-/* FontSelectionDialog */
-static void    gtk_font_selection_dialog_class_init  (GtkFontSelectionDialogClass *klass);
-static void    gtk_font_selection_dialog_init       (GtkFontSelectionDialog *fontseldiag);
-
-static GtkVBoxClass *font_selection_parent_class = NULL;
-static GtkWindowClass *font_selection_dialog_parent_class = NULL;
+static PangoFontDescription *gtk_font_selection_get_font_description (GtkFontSelection *fontsel);
+static gboolean gtk_font_selection_select_font_desc  (GtkFontSelection      *fontsel,
+                                                     PangoFontDescription  *new_desc,
+                                                     PangoFontFamily      **pfamily,
+                                                     PangoFontFace        **pface);
+static void     gtk_font_selection_reload_fonts          (GtkFontSelection *fontsel);
+static void     gtk_font_selection_ref_family            (GtkFontSelection *fontsel,
+                                                         PangoFontFamily  *family);
+static void     gtk_font_selection_ref_face              (GtkFontSelection *fontsel,
+                                                         PangoFontFace    *face);
 
-
-GType
-gtk_font_selection_get_type (void)
-{
-  static GType font_selection_type = 0;
-  
-  if (!font_selection_type)
-    {
-      static const GTypeInfo fontsel_type_info =
-      {
-       sizeof (GtkFontSelectionClass),
-       NULL,           /* base_init */
-       NULL,           /* base_finalize */
-       (GClassInitFunc) gtk_font_selection_class_init,
-       NULL,           /* class_finalize */
-       NULL,           /* class_data */
-       sizeof (GtkFontSelection),
-       0,              /* n_preallocs */
-       (GInstanceInitFunc) gtk_font_selection_init,
-      };
-      
-      font_selection_type =
-       g_type_register_static (GTK_TYPE_VBOX, "GtkFontSelection",
-                               &fontsel_type_info, 0);
-    }
-  
-  return font_selection_type;
-}
+G_DEFINE_TYPE (GtkFontSelection, gtk_font_selection, GTK_TYPE_VBOX)
 
 static void
 gtk_font_selection_class_init (GtkFontSelectionClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-  
-  font_selection_parent_class = g_type_class_peek_parent (klass);
-  
+
+  gobject_class->finalize = gtk_font_selection_finalize;
   gobject_class->set_property = gtk_font_selection_set_property;
   gobject_class->get_property = gtk_font_selection_get_property;
 
   widget_class->screen_changed = gtk_font_selection_screen_changed;
+  widget_class->style_set = gtk_font_selection_style_set;
    
   g_object_class_install_property (gobject_class,
                                    PROP_FONT_NAME,
-                                   g_param_spec_string ("font_name",
+                                   g_param_spec_string ("font-name",
                                                         P_("Font name"),
-                                                        P_("The X string that represents this font"),
-                                                        NULL,
-                                                        G_PARAM_READWRITE));
-  g_object_class_install_property (gobject_class,
-                                  PROP_FONT,
-                                  g_param_spec_boxed ("font",
-                                                      P_("Font"),
-                                                      P_("The GdkFont that is currently selected"),
-                                                      GDK_TYPE_FONT,
-                                                      G_PARAM_READABLE));
+                                                        P_("The string that represents this font"),
+                                                        DEFAULT_FONT_NAME,
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                    PROP_PREVIEW_TEXT,
-                                   g_param_spec_string ("preview_text",
+                                   g_param_spec_string ("preview-text",
                                                         P_("Preview text"),
                                                         P_("The text to display in order to demonstrate the selected font"),
-                                                        PREVIEW_TEXT,
-                                                        G_PARAM_READWRITE));
-  gobject_class->finalize = gtk_font_selection_finalize;
+                                                        _(PREVIEW_TEXT),
+                                                        GTK_PARAM_READWRITE));
+
+  g_type_class_add_private (klass, sizeof (GtkFontSelectionPrivate));
 }
 
 static void 
@@ -264,10 +271,7 @@ static void gtk_font_selection_get_property (GObject         *object,
   switch (prop_id)
     {
     case PROP_FONT_NAME:
-      g_value_set_string (value, gtk_font_selection_get_font_name (fontsel));
-      break;
-    case PROP_FONT:
-      g_value_set_object (value, gtk_font_selection_get_font_internal (fontsel));
+      g_value_take_string (value, gtk_font_selection_get_font_name (fontsel));
       break;
     case PROP_PREVIEW_TEXT:
       g_value_set_string (value, gtk_font_selection_get_preview_text (fontsel));
@@ -278,54 +282,88 @@ static void gtk_font_selection_get_property (GObject         *object,
     }
 }
 
+/* Handles key press events on the lists, so that we can trap Enter to
+ * activate the default button on our own.
+ */
+static gboolean
+list_row_activated (GtkWidget *widget)
+{
+  GtkWidget *default_widget, *focus_widget;
+  GtkWindow *window;
+  
+  window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (widget)));
+  if (!gtk_widget_is_toplevel (GTK_WIDGET (window)))
+    window = NULL;
+
+  if (window)
+    {
+      default_widget = gtk_window_get_default_widget (window);
+      focus_widget = gtk_window_get_focus (window);
+
+      if (widget != default_widget &&
+          !(widget == focus_widget && (!default_widget || !gtk_widget_get_sensitive (default_widget))))
+        gtk_window_activate_default (window);
+    }
+
+  return TRUE;
+}
 
 static void
 gtk_font_selection_init (GtkFontSelection *fontsel)
 {
+  GtkFontSelectionPrivate *priv;
   GtkWidget *scrolled_win;
-  GtkWidget *text_frame;
   GtkWidget *text_box;
   GtkWidget *table, *label;
   GtkWidget *font_label, *style_label;
+  GtkWidget *vbox;
   GtkListStore *model;
   GtkTreeViewColumn *column;
   GList *focus_chain = NULL;
+  AtkObject *atk_obj;
+
+  fontsel->priv = G_TYPE_INSTANCE_GET_PRIVATE (fontsel,
+                                               GTK_TYPE_FONT_SELECTION,
+                                               GtkFontSelectionPrivate);
+  priv = fontsel->priv;
 
   gtk_widget_push_composite_child ();
 
-  fontsel->size = 12 * PANGO_SCALE;
+  gtk_box_set_spacing (GTK_BOX (fontsel), 12);
+  priv->size = 12 * PANGO_SCALE;
   
   /* Create the table of font, style & size. */
   table = gtk_table_new (3, 3, FALSE);
   gtk_widget_show (table);
-  gtk_table_set_col_spacings (GTK_TABLE (table), 8);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 12);
   gtk_box_pack_start (GTK_BOX (fontsel), table, TRUE, TRUE, 0);
 
 #ifdef INCLUDE_FONT_ENTRIES
-  fontsel->font_entry = gtk_entry_new ();
-  gtk_editable_set_editable (GTK_EDITABLE (fontsel->font_entry), FALSE);
-  gtk_widget_set_size_request (fontsel->font_entry, 20, -1);
-  gtk_widget_show (fontsel->font_entry);
-  gtk_table_attach (GTK_TABLE (table), fontsel->font_entry, 0, 1, 1, 2,
+  priv->font_entry = gtk_entry_new ();
+  gtk_editable_set_editable (GTK_EDITABLE (priv->font_entry), FALSE);
+  gtk_widget_set_size_request (priv->font_entry, 20, -1);
+  gtk_widget_show (priv->font_entry);
+  gtk_table_attach (GTK_TABLE (table), priv->font_entry, 0, 1, 1, 2,
                    GTK_FILL, 0, 0, 0);
   
-  fontsel->font_style_entry = gtk_entry_new ();
-  gtk_editable_set_editable (GTK_EDITABLE (fontsel->font_style_entry), FALSE);
-  gtk_widget_set_size_request (fontsel->font_style_entry, 20, -1);
-  gtk_widget_show (fontsel->font_style_entry);
-  gtk_table_attach (GTK_TABLE (table), fontsel->font_style_entry, 1, 2, 1, 2,
+  priv->font_style_entry = gtk_entry_new ();
+  gtk_editable_set_editable (GTK_EDITABLE (priv->font_style_entry), FALSE);
+  gtk_widget_set_size_request (priv->font_style_entry, 20, -1);
+  gtk_widget_show (priv->font_style_entry);
+  gtk_table_attach (GTK_TABLE (table), priv->font_style_entry, 1, 2, 1, 2,
                    GTK_FILL, 0, 0, 0);
 #endif /* INCLUDE_FONT_ENTRIES */
   
-  fontsel->size_entry = gtk_entry_new ();
-  gtk_widget_set_size_request (fontsel->size_entry, 20, -1);
-  gtk_widget_show (fontsel->size_entry);
-  gtk_table_attach (GTK_TABLE (table), fontsel->size_entry, 2, 3, 1, 2,
+  priv->size_entry = gtk_entry_new ();
+  gtk_widget_set_size_request (priv->size_entry, 20, -1);
+  gtk_widget_show (priv->size_entry);
+  gtk_table_attach (GTK_TABLE (table), priv->size_entry, 2, 3, 1, 2,
                    GTK_FILL, 0, 0, 0);
-  g_signal_connect (fontsel->size_entry, "activate",
+  g_signal_connect (priv->size_entry, "activate",
                    G_CALLBACK (gtk_font_selection_size_activate),
                    fontsel);
-  g_signal_connect_after (fontsel->size_entry, "focus_out_event",
+  g_signal_connect_after (priv->size_entry, "focus-out-event",
                          G_CALLBACK (gtk_font_selection_size_focus_out),
                          fontsel);
   
@@ -343,7 +381,7 @@ gtk_font_selection_init (GtkFontSelection *fontsel)
   
   label = gtk_label_new_with_mnemonic (_("Si_ze:"));
   gtk_label_set_mnemonic_widget (GTK_LABEL (label),
-                                 fontsel->size_entry);
+                                 priv->size_entry);
   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
   gtk_widget_show (label);
   gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
@@ -355,30 +393,33 @@ gtk_font_selection_init (GtkFontSelection *fontsel)
   model = gtk_list_store_new (2,
                              G_TYPE_OBJECT,  /* FAMILY_COLUMN */
                              G_TYPE_STRING); /* FAMILY_NAME_COLUMN */
-  fontsel->family_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+  priv->family_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
   g_object_unref (model);
 
+  g_signal_connect (priv->family_list, "row-activated",
+                   G_CALLBACK (list_row_activated), fontsel);
+
   column = gtk_tree_view_column_new_with_attributes ("Family",
                                                     gtk_cell_renderer_text_new (),
                                                     "text", FAMILY_NAME_COLUMN,
                                                     NULL);
   gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->family_list), column);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (priv->family_list), column);
 
-  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->family_list), FALSE);
-  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)),
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->family_list), FALSE);
+  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->family_list)),
                               GTK_SELECTION_BROWSE);
   
-  gtk_label_set_mnemonic_widget (GTK_LABEL (font_label), fontsel->family_list);
+  gtk_label_set_mnemonic_widget (GTK_LABEL (font_label), priv->family_list);
 
   scrolled_win = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
   gtk_widget_set_size_request (scrolled_win,
                               FONT_LIST_WIDTH, FONT_LIST_HEIGHT);
-  gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->family_list);
+  gtk_container_add (GTK_CONTAINER (scrolled_win), priv->family_list);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-  gtk_widget_show (fontsel->family_list);
+  gtk_widget_show (priv->family_list);
   gtk_widget_show (scrolled_win);
 
   gtk_table_attach (GTK_TABLE (table), scrolled_win, 0, 1, 1, 3,
@@ -389,60 +430,64 @@ gtk_font_selection_init (GtkFontSelection *fontsel)
   model = gtk_list_store_new (2,
                              G_TYPE_OBJECT,  /* FACE_COLUMN */
                              G_TYPE_STRING); /* FACE_NAME_COLUMN */
-  fontsel->face_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+  priv->face_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
   g_object_unref (model);
+  g_signal_connect (priv->face_list, "row-activated",
+                   G_CALLBACK (list_row_activated), fontsel);
 
-  gtk_label_set_mnemonic_widget (GTK_LABEL (style_label), fontsel->face_list);
+  gtk_label_set_mnemonic_widget (GTK_LABEL (style_label), priv->face_list);
 
   column = gtk_tree_view_column_new_with_attributes ("Face",
                                                     gtk_cell_renderer_text_new (),
                                                     "text", FACE_NAME_COLUMN,
                                                     NULL);
   gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->face_list), column);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (priv->face_list), column);
 
-  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->face_list), FALSE);
-  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)),
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->face_list), FALSE);
+  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->face_list)),
                               GTK_SELECTION_BROWSE);
   
   scrolled_win = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
   gtk_widget_set_size_request (scrolled_win,
                               FONT_STYLE_LIST_WIDTH, FONT_LIST_HEIGHT);
-  gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->face_list);
+  gtk_container_add (GTK_CONTAINER (scrolled_win), priv->face_list);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-  gtk_widget_show (fontsel->face_list);
+  gtk_widget_show (priv->face_list);
   gtk_widget_show (scrolled_win);
   gtk_table_attach (GTK_TABLE (table), scrolled_win, 1, 2, 1, 3,
                    GTK_EXPAND | GTK_FILL,
                    GTK_EXPAND | GTK_FILL, 0, 0);
   focus_chain = g_list_append (focus_chain, scrolled_win);
   
-  focus_chain = g_list_append (focus_chain, fontsel->size_entry);
+  focus_chain = g_list_append (focus_chain, priv->size_entry);
 
   model = gtk_list_store_new (1, G_TYPE_INT);
-  fontsel->size_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+  priv->size_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
   g_object_unref (model);
+  g_signal_connect (priv->size_list, "row-activated",
+                   G_CALLBACK (list_row_activated), fontsel);
 
   column = gtk_tree_view_column_new_with_attributes ("Size",
                                                     gtk_cell_renderer_text_new (),
                                                     "text", SIZE_COLUMN,
                                                     NULL);
   gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->size_list), column);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (priv->size_list), column);
 
-  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->size_list), FALSE);
-  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list)),
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->size_list), FALSE);
+  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->size_list)),
                               GTK_SELECTION_BROWSE);
   
   scrolled_win = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
-  gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->size_list);
+  gtk_container_add (GTK_CONTAINER (scrolled_win), priv->size_list);
   gtk_widget_set_size_request (scrolled_win, -1, FONT_LIST_HEIGHT);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
                                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
-  gtk_widget_show (fontsel->size_list);
+  gtk_widget_show (priv->size_list);
   gtk_widget_show (scrolled_win);
   gtk_table_attach (GTK_TABLE (table), scrolled_win, 2, 3, 2, 3,
                    GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
@@ -452,53 +497,97 @@ gtk_font_selection_init (GtkFontSelection *fontsel)
   g_list_free (focus_chain);
   
   /* Insert the fonts. */
-  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)), "changed",
+  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->family_list)), "changed",
                    G_CALLBACK (gtk_font_selection_select_font), fontsel);
 
-  g_signal_connect_after (fontsel->family_list, "map",
+  g_signal_connect_after (priv->family_list, "map",
                          G_CALLBACK (gtk_font_selection_scroll_on_map),
                          fontsel);
   
-  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)), "changed",
+  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->face_list)), "changed",
                    G_CALLBACK (gtk_font_selection_select_style), fontsel);
 
-  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list)), "changed",
+  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->size_list)), "changed",
                    G_CALLBACK (gtk_font_selection_select_size), fontsel);
+  atk_obj = gtk_widget_get_accessible (priv->size_list);
+  if (GTK_IS_ACCESSIBLE (atk_obj))
+    {
+      /* Accessibility support is enabled.
+       * Make the label ATK_RELATON_LABEL_FOR for the size list as well.
+       */
+      AtkObject *atk_label;
+      AtkRelationSet *relation_set;
+      AtkRelation *relation;
+      AtkObject *obj_array[1];
+
+      atk_label = gtk_widget_get_accessible (label);
+      relation_set = atk_object_ref_relation_set (atk_obj);
+      relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_LABELLED_BY);
+      if (relation)
+        {
+          atk_relation_add_target (relation, atk_label);
+        }
+      else 
+        {
+          obj_array[0] = atk_label;
+          relation = atk_relation_new (obj_array, 1, ATK_RELATION_LABELLED_BY);
+          atk_relation_set_add (relation_set, relation);
+        }
+      g_object_unref (relation_set);
+
+      relation_set = atk_object_ref_relation_set (atk_label);
+      relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_LABEL_FOR);
+      if (relation)
+        {
+          atk_relation_add_target (relation, atk_obj);
+        }
+      else 
+        {
+          obj_array[0] = atk_obj;
+          relation = atk_relation_new (obj_array, 1, ATK_RELATION_LABEL_FOR);
+          atk_relation_set_add (relation_set, relation);
+        }
+      g_object_unref (relation_set);
+    }    
+      
 
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 6);
+  gtk_widget_show (vbox);
+  gtk_box_pack_start (GTK_BOX (fontsel), vbox, FALSE, TRUE, 0);
+  
   /* create the text entry widget */
   label = gtk_label_new_with_mnemonic (_("_Preview:"));
+  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
   gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
   
-  text_frame = gtk_frame_new (NULL);
-  gtk_frame_set_label_widget (GTK_FRAME (text_frame), label);
-  
-  gtk_widget_show (text_frame);
-  gtk_frame_set_shadow_type (GTK_FRAME (text_frame), GTK_SHADOW_ETCHED_IN);
-  gtk_box_pack_start (GTK_BOX (fontsel), text_frame,
-                     FALSE, TRUE, 0);
-  
-  /* This is just used to get a 4-pixel space around the preview entry. */
-  text_box = gtk_hbox_new (FALSE, 0);
+  text_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
   gtk_widget_show (text_box);
-  gtk_container_add (GTK_CONTAINER (text_frame), text_box);
-  gtk_container_set_border_width (GTK_CONTAINER (text_box), 4);
+  gtk_box_pack_start (GTK_BOX (vbox), text_box, FALSE, TRUE, 0);
   
-  fontsel->preview_entry = gtk_entry_new ();
-  gtk_label_set_mnemonic_widget (GTK_LABEL (label), fontsel->preview_entry);
+  priv->preview_entry = gtk_entry_new ();
+  gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->preview_entry);
+  gtk_entry_set_text (GTK_ENTRY (priv->preview_entry), _(PREVIEW_TEXT));
   
-  gtk_widget_show (fontsel->preview_entry);
-  g_signal_connect (fontsel->preview_entry, "changed",
+  gtk_widget_show (priv->preview_entry);
+  g_signal_connect (priv->preview_entry, "changed",
                    G_CALLBACK (gtk_font_selection_preview_changed), fontsel);
-  gtk_widget_set_size_request (fontsel->preview_entry,
+  gtk_widget_set_size_request (priv->preview_entry,
                               -1, INITIAL_PREVIEW_HEIGHT);
-  gtk_box_pack_start (GTK_BOX (text_box), fontsel->preview_entry,
+  gtk_box_pack_start (GTK_BOX (text_box), priv->preview_entry,
                      TRUE, TRUE, 0);
-
   gtk_widget_pop_composite_child();
 }
 
+/**
+ * gtk_font_selection_new:
+ *
+ * Creates a new #GtkFontSelection.
+ *
+ * Return value: a n ew #GtkFontSelection
+ */
 GtkWidget *
-gtk_font_selection_new ()
+gtk_font_selection_new (void)
 {
   GtkFontSelection *fontsel;
   
@@ -510,38 +599,78 @@ gtk_font_selection_new ()
 static void
 gtk_font_selection_finalize (GObject *object)
 {
-  GtkFontSelection *fontsel;
-  
-  g_return_if_fail (GTK_IS_FONT_SELECTION (object));
-  
-  fontsel = GTK_FONT_SELECTION (object);
+  GtkFontSelection *fontsel = GTK_FONT_SELECTION (object);
 
-  if (fontsel->font)
-    gdk_font_unref (fontsel->font);
-  
-  if (G_OBJECT_CLASS (font_selection_parent_class)->finalize)
-    (* G_OBJECT_CLASS (font_selection_parent_class)->finalize) (object);
+  gtk_font_selection_ref_family (fontsel, NULL);
+  gtk_font_selection_ref_face (fontsel, NULL);
+
+  G_OBJECT_CLASS (gtk_font_selection_parent_class)->finalize (object);
 }
 
 static void
-gtk_font_selection_screen_changed (GtkWidget *widget,
-                                  GdkScreen *previous_screen)
+gtk_font_selection_ref_family (GtkFontSelection *fontsel,
+                              PangoFontFamily  *family)
+{
+  GtkFontSelectionPrivate *priv = fontsel->priv;
+
+  if (family)
+    family = g_object_ref (family);
+  if (priv->family)
+    g_object_unref (priv->family);
+  priv->family = family;
+}
+
+static void gtk_font_selection_ref_face (GtkFontSelection *fontsel,
+                                        PangoFontFace    *face)
 {
-  GtkFontSelection *fontsel = GTK_FONT_SELECTION (widget);
+  GtkFontSelectionPrivate *priv = fontsel->priv;
 
+  if (face)
+    face = g_object_ref (face);
+  if (priv->face)
+    g_object_unref (priv->face);
+  priv->face = face;
+}
+
+static void
+gtk_font_selection_reload_fonts (GtkFontSelection *fontsel)
+{
   if (gtk_widget_has_screen (GTK_WIDGET (fontsel)))
     {
+      PangoFontDescription *desc;
+      desc = gtk_font_selection_get_font_description (fontsel);
+
       gtk_font_selection_show_available_fonts (fontsel);
       gtk_font_selection_show_available_sizes (fontsel, TRUE);
       gtk_font_selection_show_available_styles (fontsel);
+
+      gtk_font_selection_select_font_desc (fontsel, desc, NULL, NULL);
+      gtk_font_selection_scroll_to_selection (fontsel);
+
+      pango_font_description_free (desc);
     }
 }
 
+static void
+gtk_font_selection_screen_changed (GtkWidget *widget,
+                                  GdkScreen *previous_screen)
+{
+  gtk_font_selection_reload_fonts (GTK_FONT_SELECTION (widget));
+}
+
+static void
+gtk_font_selection_style_set (GtkWidget *widget,
+                             GtkStyle  *prev_style)
+{
+  /* Maybe fonts where installed or removed... */
+  gtk_font_selection_reload_fonts (GTK_FONT_SELECTION (widget));
+}
+
 static void
 gtk_font_selection_preview_changed (GtkWidget        *entry,
                                    GtkFontSelection *fontsel)
 {
-  g_object_notify (G_OBJECT (fontsel), "preview_text");
+  g_object_notify (G_OBJECT (fontsel), "preview-text");
 }
 
 static void
@@ -566,32 +695,33 @@ set_cursor_to_iter (GtkTreeView *view,
   GtkTreeModel *model = gtk_tree_view_get_model (view);
   GtkTreePath *path = gtk_tree_model_get_path (model, iter);
   
-  gtk_tree_view_set_cursor (view, path, 0, FALSE);
+  gtk_tree_view_set_cursor (view, path, NULL, FALSE);
 
   gtk_tree_path_free (path);
 }
 
+static void
+gtk_font_selection_scroll_to_selection (GtkFontSelection *fontsel)
+{
+  GtkFontSelectionPrivate *priv = fontsel->priv;
+
+  /* Try to scroll the font family list to the selected item */
+  scroll_to_selection (GTK_TREE_VIEW (priv->family_list));
+
+  /* Try to scroll the font family list to the selected item */
+  scroll_to_selection (GTK_TREE_VIEW (priv->face_list));
+
+  /* Try to scroll the font family list to the selected item */
+  scroll_to_selection (GTK_TREE_VIEW (priv->size_list));
 /* This is called when the list is mapped. Here we scroll to the current
    font if necessary. */
+}
+
 static void
 gtk_font_selection_scroll_on_map (GtkWidget            *widget,
                                   gpointer              data)
 {
-  GtkFontSelection *fontsel;
-  
-#ifdef FONTSEL_DEBUG
-  g_message ("In expose_list\n");
-#endif
-  fontsel = GTK_FONT_SELECTION (data);
-  
-  /* Try to scroll the font family list to the selected item */
-  scroll_to_selection (GTK_TREE_VIEW (fontsel->family_list));
-      
-  /* Try to scroll the font family list to the selected item */
-  scroll_to_selection (GTK_TREE_VIEW (fontsel->face_list));
-      
-  /* Try to scroll the font family list to the selected item */
-  scroll_to_selection (GTK_TREE_VIEW (fontsel->size_list));
+  gtk_font_selection_scroll_to_selection (GTK_FONT_SELECTION (data));
 }
 
 /* This is called when a family is selected in the list. */
@@ -600,27 +730,30 @@ gtk_font_selection_select_font (GtkTreeSelection *selection,
                                gpointer          data)
 {
   GtkFontSelection *fontsel;
+  GtkFontSelectionPrivate *priv;
   GtkTreeModel *model;
   GtkTreeIter iter;
+#ifdef INCLUDE_FONT_ENTRIES
   const gchar *family_name;
-  
+#endif
+
   fontsel = GTK_FONT_SELECTION (data);
+  priv = fontsel->priv;
 
   if (gtk_tree_selection_get_selected (selection, &model, &iter))
     {
       PangoFontFamily *family;
-      
+
       gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
-      if (fontsel->family != family)
+      if (priv->family != family)
        {
-         fontsel->family = family;
-         
-         family_name = pango_font_family_get_name (fontsel->family);
-         
+         gtk_font_selection_ref_family (fontsel, family);
+
 #ifdef INCLUDE_FONT_ENTRIES
-         gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), family_name);
+         family_name = pango_font_family_get_name (priv->family);
+         gtk_entry_set_text (GTK_ENTRY (priv->font_entry), family_name);
 #endif
-         
+
          gtk_font_selection_show_available_styles (fontsel);
          gtk_font_selection_select_best_style (fontsel, TRUE);
        }
@@ -641,14 +774,15 @@ cmp_families (const void *a, const void *b)
 static void
 gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   GtkListStore *model;
   PangoFontFamily **families;
   PangoFontFamily *match_family = NULL;
   gint n_families, i;
   GtkTreeIter match_row;
-  
-  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list)));
-  
+
+  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->family_list)));
+
   pango_context_list_families (gtk_widget_get_pango_context (GTK_WIDGET (fontsel)),
                               &families, &n_families);
   qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);
@@ -673,12 +807,12 @@ gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
        }
     }
 
-  fontsel->family = match_family;
+  gtk_font_selection_ref_family (fontsel, match_family);
   if (match_family)
     {
-      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &match_row);
+      set_cursor_to_iter (GTK_TREE_VIEW (priv->family_list), &match_row);
 #ifdef INCLUDE_FONT_ENTRIES
-      gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), 
+      gtk_entry_set_text (GTK_ENTRY (priv->font_entry), 
                          pango_font_family_get_name (match_family));
 #endif /* INCLUDE_FONT_ENTRIES */
     }
@@ -737,21 +871,22 @@ font_description_style_equal (const PangoFontDescription *a,
 static void
 gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   gint n_faces, i;
   PangoFontFace **faces;
   PangoFontDescription *old_desc;
   GtkListStore *model;
   GtkTreeIter match_row;
   PangoFontFace *match_face = NULL;
-  
-  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list)));
-  
-  if (fontsel->face)
-    old_desc = pango_font_face_describe (fontsel->face);
+
+  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->face_list)));
+
+  if (priv->face)
+    old_desc = pango_font_face_describe (priv->face);
   else
     old_desc= NULL;
 
-  pango_font_family_list_faces (fontsel->family, &faces, &n_faces);
+  pango_font_family_list_faces (priv->family, &faces, &n_faces);
   qsort (faces, n_faces, sizeof (PangoFontFace *), faces_sort_func);
 
   gtk_list_store_clear (model);
@@ -789,15 +924,15 @@ gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
   if (old_desc)
     pango_font_description_free (old_desc);
 
-  fontsel->face = match_face;
+  gtk_font_selection_ref_face (fontsel, match_face);
   if (match_face)
     {
 #ifdef INCLUDE_FONT_ENTRIES
-      const gchar *str = pango_font_face_get_face_name (fontsel->face);
+      const gchar *str = pango_font_face_get_face_name (priv->face);
 
-      gtk_entry_set_text (GTK_ENTRY (fontsel->font_style_entry), str);
-#endif      
-      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_row);
+      gtk_entry_set_text (GTK_ENTRY (priv->font_style_entry), str);
+#endif
+      set_cursor_to_iter (GTK_TREE_VIEW (priv->face_list), &match_row);
     }
 
   g_free (faces);
@@ -812,15 +947,16 @@ static void
 gtk_font_selection_select_best_style (GtkFontSelection *fontsel,
                                      gboolean          use_first)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   GtkTreeIter iter;
   GtkTreeModel *model;
 
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list));
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->face_list));
 
   if (gtk_tree_model_get_iter_first (model, &iter))
     {
-      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &iter);
-      scroll_to_selection (GTK_TREE_VIEW (fontsel->face_list));
+      set_cursor_to_iter (GTK_TREE_VIEW (priv->face_list), &iter);
+      scroll_to_selection (GTK_TREE_VIEW (priv->face_list));
     }
 
   gtk_font_selection_show_available_sizes (fontsel, FALSE);
@@ -836,14 +972,13 @@ gtk_font_selection_select_style (GtkTreeSelection *selection,
   GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
   GtkTreeModel *model;
   GtkTreeIter iter;
-  
+
   if (gtk_tree_selection_get_selected (selection, &model, &iter))
     {
       PangoFontFace *face;
       
       gtk_tree_model_get (model, &iter, FACE_COLUMN, &face, -1);
-      fontsel->face = face;
-
+      gtk_font_selection_ref_face (fontsel, face);
       g_object_unref (face);
     }
 
@@ -855,14 +990,13 @@ static void
 gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
                                         gboolean          first_time)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   gint i;
   GtkListStore *model;
-  GtkTreeSelection *selection;
   gchar buffer[128];
   gchar *p;
-      
-  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->size_list)));
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list));
+
+  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->size_list)));
 
   /* Insert the standard font sizes */
   if (first_time)
@@ -872,25 +1006,25 @@ gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
       for (i = 0; i < G_N_ELEMENTS (font_sizes); i++)
        {
          GtkTreeIter iter;
-         
+
          gtk_list_store_append (model, &iter);
          gtk_list_store_set (model, &iter, SIZE_COLUMN, font_sizes[i], -1);
-         
-         if (font_sizes[i] * PANGO_SCALE == fontsel->size)
-           set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
+
+         if (font_sizes[i] * PANGO_SCALE == priv->size)
+           set_cursor_to_iter (GTK_TREE_VIEW (priv->size_list), &iter);
        }
     }
   else
     {
       GtkTreeIter iter;
       gboolean found = FALSE;
-      
+
       gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
       for (i = 0; i < G_N_ELEMENTS (font_sizes) && !found; i++)
        {
-         if (font_sizes[i] * PANGO_SCALE == fontsel->size)
+         if (font_sizes[i] * PANGO_SCALE == priv->size)
            {
-             set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
+             set_cursor_to_iter (GTK_TREE_VIEW (priv->size_list), &iter);
              found = TRUE;
            }
 
@@ -899,7 +1033,7 @@ gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
 
       if (!found)
        {
-         GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list));
+         GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->size_list));
          gtk_tree_selection_unselect_all (selection);
        }
     }
@@ -907,7 +1041,7 @@ gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
   /* Set the entry to the new size, rounding to 1 digit,
    * trimming of trailing 0's and a trailing period
    */
-  g_snprintf (buffer, sizeof (buffer), "%.1f", fontsel->size / (1.0 * PANGO_SCALE));
+  g_snprintf (buffer, sizeof (buffer), "%.1f", priv->size / (1.0 * PANGO_SCALE));
   if (strchr (buffer, '.'))
     {
       p = buffer + strlen (buffer) - 1;
@@ -919,8 +1053,8 @@ gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
     }
 
   /* Compare, to avoid moving the cursor unecessarily */
-  if (strcmp (gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry)), buffer) != 0)
-    gtk_entry_set_text (GTK_ENTRY (fontsel->size_entry), buffer);
+  if (strcmp (gtk_entry_get_text (GTK_ENTRY (priv->size_entry)), buffer) != 0)
+    gtk_entry_set_text (GTK_ENTRY (priv->size_entry), buffer);
 }
 
 static void
@@ -933,9 +1067,11 @@ static void
 gtk_font_selection_set_size (GtkFontSelection *fontsel,
                             gint              new_size)
 {
-  if (fontsel->size != new_size)
+  GtkFontSelectionPrivate *priv = fontsel->priv;
+
+  if (priv->size != new_size)
     {
-      fontsel->size = new_size;
+      priv->size = new_size;
 
       gtk_font_selection_show_available_sizes (fontsel, FALSE);      
       gtk_font_selection_load_font (fontsel);
@@ -948,16 +1084,18 @@ static void
 gtk_font_selection_size_activate (GtkWidget   *w,
                                   gpointer     data)
 {
-  GtkFontSelection *fontsel;
+  GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   gint new_size;
   const gchar *text;
-  
-  fontsel = GTK_FONT_SELECTION (data);
 
-  text = gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry));
+  text = gtk_entry_get_text (GTK_ENTRY (priv->size_entry));
   new_size = MAX (0.1, atof (text) * PANGO_SCALE + 0.5);
 
-  gtk_font_selection_set_size (fontsel, new_size);
+  if (priv->size != new_size)
+    gtk_font_selection_set_size (fontsel, new_size);
+  else 
+    list_row_activated (w);
 }
 
 static gboolean
@@ -965,8 +1103,16 @@ gtk_font_selection_size_focus_out (GtkWidget     *w,
                                   GdkEventFocus *event,
                                   gpointer       data)
 {
-  gtk_font_selection_size_activate (w, data);
-  
+  GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
+  GtkFontSelectionPrivate *priv = fontsel->priv;
+  gint new_size;
+  const gchar *text;
+
+  text = gtk_entry_get_text (GTK_ENTRY (priv->size_entry));
+  new_size = MAX (0.1, atof (text) * PANGO_SCALE + 0.5);
+
+  gtk_font_selection_set_size (fontsel, new_size);
+
   return TRUE;
 }
 
@@ -975,13 +1121,11 @@ static void
 gtk_font_selection_select_size (GtkTreeSelection *selection,
                                gpointer          data)
 {
-  GtkFontSelection *fontsel;
+  GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
   GtkTreeModel *model;
   GtkTreeIter iter;
   gint new_size;
-  
-  fontsel = GTK_FONT_SELECTION (data);
-  
+
   if (gtk_tree_selection_get_selected (selection, &model, &iter))
     {
       gtk_tree_model_get (model, &iter, SIZE_COLUMN, &new_size, -1);
@@ -992,25 +1136,22 @@ gtk_font_selection_select_size (GtkTreeSelection *selection,
 static void
 gtk_font_selection_load_font (GtkFontSelection *fontsel)
 {
-  if (fontsel->font)
-    gdk_font_unref (fontsel->font);
-  fontsel->font = NULL;
-
   gtk_font_selection_update_preview (fontsel);
 }
 
 static PangoFontDescription *
 gtk_font_selection_get_font_description (GtkFontSelection *fontsel)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   PangoFontDescription *font_desc;
 
-  if (fontsel->face)
+  if (priv->face)
     {
-      font_desc = pango_font_face_describe (fontsel->face);
-      pango_font_description_set_size (font_desc, fontsel->size);
+      font_desc = pango_font_face_describe (priv->face);
+      pango_font_description_set_size (font_desc, priv->size);
     }
   else
-    font_desc = pango_font_description_from_string ("Sans 10");
+    font_desc = pango_font_description_from_string (DEFAULT_FONT_NAME);
 
   return font_desc;
 }
@@ -1024,24 +1165,25 @@ gtk_font_selection_get_font_description (GtkFontSelection *fontsel)
 static void
 gtk_font_selection_update_preview (GtkFontSelection *fontsel)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   GtkRcStyle *rc_style;
   gint new_height;
-  GtkRequisition old_requisition;
-  GtkWidget *preview_entry = fontsel->preview_entry;
+  GtkRequisition old_requisition, new_requisition;
+  GtkWidget *preview_entry = priv->preview_entry;
   const gchar *text;
 
-  gtk_widget_get_child_requisition (preview_entry, &old_requisition);
-  
+  gtk_widget_get_preferred_size (preview_entry, &old_requisition, NULL);
+
   rc_style = gtk_rc_style_new ();
   rc_style->font_desc = gtk_font_selection_get_font_description (fontsel);
   
   gtk_widget_modify_style (preview_entry, rc_style);
-  gtk_rc_style_unref (rc_style);
+  g_object_unref (rc_style);
 
-  gtk_widget_size_request (preview_entry, NULL);
+  gtk_widget_get_preferred_size (preview_entry, &new_requisition, NULL);
   
   /* We don't ever want to be over MAX_PREVIEW_HEIGHT pixels high. */
-  new_height = CLAMP (preview_entry->requisition.height, INITIAL_PREVIEW_HEIGHT, MAX_PREVIEW_HEIGHT);
+  new_height = CLAMP (new_requisition.height, INITIAL_PREVIEW_HEIGHT, MAX_PREVIEW_HEIGHT);
 
   if (new_height > old_requisition.height || new_height < old_requisition.height - 30)
     gtk_widget_set_size_request (preview_entry, -1, new_height);
@@ -1053,30 +1195,181 @@ gtk_font_selection_update_preview (GtkFontSelection *fontsel)
   gtk_editable_set_position (GTK_EDITABLE (preview_entry), 0);
 }
 
-static GdkFont*
-gtk_font_selection_get_font_internal (GtkFontSelection *fontsel)
-{
-  if (!fontsel->font)
-    {
-      PangoFontDescription *font_desc = gtk_font_selection_get_font_description (fontsel);
-      fontsel->font = gdk_font_from_description_for_display (gtk_widget_get_display (GTK_WIDGET (fontsel)), font_desc);
-      pango_font_description_free (font_desc);
-    }
-  
-  return fontsel->font;
-}
-
 
 /*****************************************************************************
  * These functions are the main public interface for getting/setting the font.
  *****************************************************************************/
 
-GdkFont*
-gtk_font_selection_get_font (GtkFontSelection *fontsel)
+/**
+ * gtk_font_selection_get_family_list:
+ * @fontsel: a #GtkFontSelection
+ *
+ * This returns the #GtkTreeView that lists font families, for
+ * example, 'Sans', 'Serif', etc.
+ *
+ * Return value: (transfer none): A #GtkWidget that is part of @fontsel
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_get_family_list (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->family_list;
+}
+
+/**
+ * gtk_font_selection_get_face_list:
+ * @fontsel: a #GtkFontSelection
+ *
+ * This returns the #GtkTreeView which lists all styles available for
+ * the selected font. For example, 'Regular', 'Bold', etc.
+ * 
+ * Return value: (transfer none): A #GtkWidget that is part of @fontsel
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_get_face_list (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->face_list;
+}
+
+/**
+ * gtk_font_selection_get_size_entry:
+ * @fontsel: a #GtkFontSelection
+ *
+ * This returns the #GtkEntry used to allow the user to edit the font
+ * number manually instead of selecting it from the list of font sizes.
+ *
+ * Return value: (transfer none): A #GtkWidget that is part of @fontsel
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_get_size_entry (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->size_entry;
+}
+
+/**
+ * gtk_font_selection_get_size_list:
+ * @fontsel: a #GtkFontSelection
+ *
+ * This returns the #GtkTreeeView used to list font sizes.
+ *
+ * Return value: (transfer none): A #GtkWidget that is part of @fontsel
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_get_size_list (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->size_list;
+}
+
+/**
+ * gtk_font_selection_get_preview_entry:
+ * @fontsel: a #GtkFontSelection
+ *
+ * This returns the #GtkEntry used to display the font as a preview.
+ *
+ * Return value: (transfer none): A #GtkWidget that is part of @fontsel
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_get_preview_entry (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->preview_entry;
+}
+
+/**
+ * gtk_font_selection_get_family:
+ * @fontsel: a #GtkFontSelection
+ *
+ * Gets the #PangoFontFamily representing the selected font family.
+ *
+ * Return value: (transfer none): A #PangoFontFamily representing the
+ *     selected font family. Font families are a collection of font
+ *     faces. The returned object is owned by @fontsel and must not
+ *     be modified or freed.
+ *
+ * Since: 2.14
+ */
+PangoFontFamily *
+gtk_font_selection_get_family (GtkFontSelection *fontsel)
 {
-  return gtk_font_selection_get_font_internal (fontsel);
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->family;
 }
 
+/**
+ * gtk_font_selection_get_face:
+ * @fontsel: a #GtkFontSelection
+ *
+ * Gets the #PangoFontFace representing the selected font group
+ * details (i.e. family, slant, weight, width, etc).
+ *
+ * Return value: (transfer none): A #PangoFontFace representing the
+ *     selected font group details. The returned object is owned by
+ *     @fontsel and must not be modified or freed.
+ *
+ * Since: 2.14
+ */
+PangoFontFace *
+gtk_font_selection_get_face (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  return fontsel->priv->face;
+}
+
+/**
+ * gtk_font_selection_get_size:
+ * @fontsel: a #GtkFontSelection
+ *
+ * The selected font size.
+ *
+ * Return value: A n integer representing the selected font size,
+ *     or -1 if no font size is selected.
+ *
+ * Since: 2.14
+ **/
+gint
+gtk_font_selection_get_size (GtkFontSelection *fontsel)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), -1);
+
+  return fontsel->priv->size;
+}
+
+/**
+ * gtk_font_selection_get_font_name:
+ * @fontsel: a #GtkFontSelection
+ * 
+ * Gets the currently-selected font name. 
+ *
+ * Note that this can be a different string than what you set with 
+ * gtk_font_selection_set_font_name(), as the font selection widget may 
+ * normalize font names and thus return a string with a different structure. 
+ * For example, "Helvetica Italic Bold 12" could be normalized to 
+ * "Helvetica Bold Italic 12". Use pango_font_description_equal()
+ * if you want to compare two font descriptions.
+ * 
+ * Return value: A string with the name of the current font, or %NULL if 
+ *     no font is selected. You must free this string with g_free().
+ */
 gchar *
 gtk_font_selection_get_font_name (GtkFontSelection *fontsel)
 {
@@ -1089,32 +1382,35 @@ gtk_font_selection_get_font_name (GtkFontSelection *fontsel)
   return result;
 }
 
-
-/* This sets the current font, selecting the appropriate list rows.
+/* This selects the appropriate list rows.
    First we check the fontname is valid and try to find the font family
    - i.e. the name in the main list. If we can't find that, then just return.
    Next we try to set each of the properties according to the fontname.
    Finally we select the font family & style in the lists. */
-gboolean
-gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
-                                 const gchar      *fontname)
+static gboolean
+gtk_font_selection_select_font_desc (GtkFontSelection      *fontsel,
+                                    PangoFontDescription  *new_desc,
+                                    PangoFontFamily      **pfamily,
+                                    PangoFontFace        **pface)
 {
+  GtkFontSelectionPrivate *priv = fontsel->priv;
   PangoFontFamily *new_family = NULL;
   PangoFontFace *new_face = NULL;
   PangoFontFace *fallback_face = NULL;
-  PangoFontDescription *new_desc;
   GtkTreeModel *model;
   GtkTreeIter iter;
   GtkTreeIter match_iter;
   gboolean valid;
-  
-  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), FALSE);
-  
-  new_desc = pango_font_description_from_string (fontname);
+  const gchar *new_family_name;
 
-  /* Check to make sure that this is in the list of allowed fonts */
+  new_family_name = pango_font_description_get_family (new_desc);
 
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list));
+  if (!new_family_name)
+    return FALSE;
+
+  /* Check to make sure that this is in the list of allowed fonts 
+   */
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->family_list));
   for (valid = gtk_tree_model_get_iter_first (model, &iter);
        valid;
        valid = gtk_tree_model_iter_next (model, &iter))
@@ -1124,9 +1420,9 @@ gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
       gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
       
       if (g_ascii_strcasecmp (pango_font_family_get_name (family),
-                             pango_font_description_get_family (new_desc)) == 0)
-       new_family = family;
-      
+                             new_family_name) == 0)
+       new_family = g_object_ref (family);
+
       g_object_unref (family);
       
       if (new_family)
@@ -1136,11 +1432,14 @@ gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
   if (!new_family)
     return FALSE;
 
-  fontsel->family = new_family;
-  set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &iter);
+  if (pfamily)
+    *pfamily = new_family;
+  else
+    g_object_unref (new_family);
+  set_cursor_to_iter (GTK_TREE_VIEW (priv->family_list), &iter);
   gtk_font_selection_show_available_styles (fontsel);
 
-  model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list));
+  model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->face_list));
   for (valid = gtk_tree_model_get_iter_first (model, &iter);
        valid;
        valid = gtk_tree_model_iter_next (model, &iter))
@@ -1152,11 +1451,11 @@ gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
       tmp_desc = pango_font_face_describe (face);
       
       if (font_description_style_equal (tmp_desc, new_desc))
-       new_face = face;
+       new_face = g_object_ref (face);
       
       if (!fallback_face)
        {
-         fallback_face = face;
+         fallback_face = g_object_ref (face);
          match_iter = iter;
        }
       
@@ -1172,123 +1471,204 @@ gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
 
   if (!new_face)
     new_face = fallback_face;
+  else if (fallback_face)
+    g_object_unref (fallback_face);
 
-  fontsel->face = new_face;
-  set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_iter);  
+  if (pface)
+    *pface = new_face;
+  else if (new_face)
+    g_object_unref (new_face);
+  set_cursor_to_iter (GTK_TREE_VIEW (priv->face_list), &match_iter);  
 
   gtk_font_selection_set_size (fontsel, pango_font_description_get_size (new_desc));
+
+  return TRUE;
+}
+
+
+/* This sets the current font, then selecting the appropriate list rows. */
+
+/**
+ * gtk_font_selection_set_font_name:
+ * @fontsel: a #GtkFontSelection
+ * @fontname: a font name like "Helvetica 12" or "Times Bold 18"
+ * 
+ * Sets the currently-selected font. 
+ *
+ * Note that the @fontsel needs to know the screen in which it will appear 
+ * for this to work; this can be guaranteed by simply making sure that the 
+ * @fontsel is inserted in a toplevel window before you call this function.
+ * 
+ * Return value: %TRUE if the font could be set successfully; %FALSE if no 
+ *     such font exists or if the @fontsel doesn't belong to a particular 
+ *     screen yet.
+ */
+gboolean
+gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
+                                 const gchar      *fontname)
+{
+  PangoFontFamily *family = NULL;
+  PangoFontFace *face = NULL;
+  PangoFontDescription *new_desc;
   
-  g_object_freeze_notify (G_OBJECT (fontsel));
-  g_object_notify (G_OBJECT (fontsel), "font_name");
-  g_object_notify (G_OBJECT (fontsel), "font");
-  g_object_thaw_notify (G_OBJECT (fontsel));
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), FALSE);
+
+  if (!gtk_widget_has_screen (GTK_WIDGET (fontsel)))
+    return FALSE;
+
+  new_desc = pango_font_description_from_string (fontname);
+
+  if (gtk_font_selection_select_font_desc (fontsel, new_desc, &family, &face))
+    {
+      gtk_font_selection_ref_family (fontsel, family);
+      if (family)
+        g_object_unref (family);
+
+      gtk_font_selection_ref_face (fontsel, face);
+      if (face)
+        g_object_unref (face);
+    }
 
   pango_font_description_free (new_desc);
+  
+  g_object_notify (G_OBJECT (fontsel), "font-name");
 
   return TRUE;
 }
 
-
-/* This returns the text in the preview entry. You should copy the returned
-   text if you need it. */
+/**
+ * gtk_font_selection_get_preview_text:
+ * @fontsel: a #GtkFontSelection
+ *
+ * Gets the text displayed in the preview area.
+ * 
+ * Return value: the text displayed in the preview area. 
+ *     This string is owned by the widget and should not be 
+ *     modified or freed 
+ */
 G_CONST_RETURN gchar*
-gtk_font_selection_get_preview_text  (GtkFontSelection *fontsel)
+gtk_font_selection_get_preview_text (GtkFontSelection *fontsel)
 {
-  return gtk_entry_get_text (GTK_ENTRY (fontsel->preview_entry));
+  GtkFontSelectionPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
+
+  priv = fontsel->priv;
+
+  return gtk_entry_get_text (GTK_ENTRY (priv->preview_entry));
 }
 
 
-/* This sets the text in the preview entry. */
+/**
+ * gtk_font_selection_set_preview_text:
+ * @fontsel: a #GtkFontSelection
+ * @text: the text to display in the preview area 
+ *
+ * Sets the text displayed in the preview area.
+ * The @text is used to show how the selected font looks.
+ */
 void
 gtk_font_selection_set_preview_text  (GtkFontSelection *fontsel,
-                                     const gchar         *text)
+                                     const gchar      *text)
 {
-  gtk_entry_set_text (GTK_ENTRY (fontsel->preview_entry), text);
+  GtkFontSelectionPrivate *priv;
+
+  g_return_if_fail (GTK_IS_FONT_SELECTION (fontsel));
+  g_return_if_fail (text != NULL);
+
+  priv = fontsel->priv;
+
+  gtk_entry_set_text (GTK_ENTRY (priv->preview_entry), text);
 }
 
 /*****************************************************************************
  * GtkFontSelectionDialog
  *****************************************************************************/
 
-GType
-gtk_font_selection_dialog_get_type (void)
-{
-  static GType font_selection_dialog_type = 0;
-  
-  if (!font_selection_dialog_type)
-    {
-      static const GTypeInfo fontsel_diag_info =
-      {
-       sizeof (GtkFontSelectionDialogClass),
-       NULL,           /* base_init */
-       NULL,           /* base_finalize */
-       (GClassInitFunc) gtk_font_selection_dialog_class_init,
-       NULL,           /* class_finalize */
-       NULL,           /* class_data */
-       sizeof (GtkFontSelectionDialog),
-       0,              /* n_preallocs */
-       (GInstanceInitFunc) gtk_font_selection_dialog_init,
-      };
-      
-      font_selection_dialog_type =
-       g_type_register_static (GTK_TYPE_DIALOG, "GtkFontSelectionDialog",
-                               &fontsel_diag_info, 0);
-    }
-  
-  return font_selection_dialog_type;
-}
+static void gtk_font_selection_dialog_buildable_interface_init     (GtkBuildableIface *iface);
+static GObject * gtk_font_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
+                                                                         GtkBuilder   *builder,
+                                                                         const gchar  *childname);
+
+G_DEFINE_TYPE_WITH_CODE (GtkFontSelectionDialog, gtk_font_selection_dialog,
+                        GTK_TYPE_DIALOG,
+                        G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                                               gtk_font_selection_dialog_buildable_interface_init))
+
+static GtkBuildableIface *parent_buildable_iface;
 
 static void
 gtk_font_selection_dialog_class_init (GtkFontSelectionDialogClass *klass)
 {
-  font_selection_dialog_parent_class = g_type_class_peek_parent (klass);
+  g_type_class_add_private (klass, sizeof (GtkFontSelectionDialogPrivate));
 }
 
 static void
 gtk_font_selection_dialog_init (GtkFontSelectionDialog *fontseldiag)
 {
-  GtkDialog *dialog;
+  GtkFontSelectionDialogPrivate *priv;
+  GtkDialog *dialog = GTK_DIALOG (fontseldiag);
+  GtkWidget *action_area, *content_area;
+
+  fontseldiag->priv = G_TYPE_INSTANCE_GET_PRIVATE (fontseldiag,
+                                                   GTK_TYPE_FONT_SELECTION_DIALOG,
+                                                   GtkFontSelectionDialogPrivate);
+  priv = fontseldiag->priv;
+
+  content_area = gtk_dialog_get_content_area (dialog);
+  action_area = gtk_dialog_get_action_area (dialog);
+
+  gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+  gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */
+  gtk_container_set_border_width (GTK_CONTAINER (action_area), 5);
+  gtk_box_set_spacing (GTK_BOX (action_area), 6);
 
   gtk_widget_push_composite_child ();
 
-  dialog = GTK_DIALOG (fontseldiag);
-  
-  gtk_container_set_border_width (GTK_CONTAINER (fontseldiag), 4);
   gtk_window_set_resizable (GTK_WINDOW (fontseldiag), TRUE);
-  
-  fontseldiag->main_vbox = dialog->vbox;
-  
-  fontseldiag->fontsel = gtk_font_selection_new ();
-  gtk_container_set_border_width (GTK_CONTAINER (fontseldiag->fontsel), 4);
-  gtk_widget_show (fontseldiag->fontsel);
-  gtk_box_pack_start (GTK_BOX (fontseldiag->main_vbox),
-                     fontseldiag->fontsel, TRUE, TRUE, 0);
-  
-  /* Create the action area */
-  fontseldiag->action_area = dialog->action_area;
 
-  fontseldiag->cancel_button = gtk_dialog_add_button (dialog,
-                                                      GTK_STOCK_CANCEL,
-                                                      GTK_RESPONSE_CANCEL);
+  /* Create the content area */
+  priv->fontsel = gtk_font_selection_new ();
+  gtk_container_set_border_width (GTK_CONTAINER (priv->fontsel), 5);
+  gtk_widget_show (priv->fontsel);
+  gtk_box_pack_start (GTK_BOX (content_area),
+                     priv->fontsel, TRUE, TRUE, 0);
 
-  fontseldiag->apply_button = gtk_dialog_add_button (dialog,
-                                                     GTK_STOCK_APPLY,
-                                                     GTK_RESPONSE_APPLY);
-  gtk_widget_hide (fontseldiag->apply_button);
+  /* Create the action area */
+  priv->cancel_button = gtk_dialog_add_button (dialog,
+                                               GTK_STOCK_CANCEL,
+                                               GTK_RESPONSE_CANCEL);
+
+  priv->apply_button = gtk_dialog_add_button (dialog,
+                                              GTK_STOCK_APPLY,
+                                              GTK_RESPONSE_APPLY);
+  gtk_widget_hide (priv->apply_button);
+
+  priv->ok_button = gtk_dialog_add_button (dialog,
+                                           GTK_STOCK_OK,
+                                           GTK_RESPONSE_OK);
+  gtk_widget_grab_default (priv->ok_button);
+
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (fontseldiag),
+                                          GTK_RESPONSE_OK,
+                                          GTK_RESPONSE_APPLY,
+                                          GTK_RESPONSE_CANCEL,
+                                          -1);
 
-  fontseldiag->ok_button = gtk_dialog_add_button (dialog,
-                                                  GTK_STOCK_OK,
-                                                  GTK_RESPONSE_OK);
-  gtk_widget_grab_default (fontseldiag->ok_button);
-  
   gtk_window_set_title (GTK_WINDOW (fontseldiag),
                         _("Font Selection"));
 
-  gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
-  
   gtk_widget_pop_composite_child ();
 }
 
+/**
+ * gtk_font_selection_dialog_new:
+ * @title: the title of the dialog window 
+ *
+ * Creates a new #GtkFontSelectionDialog.
+ *
+ * Return value: a new #GtkFontSelectionDialog
+ */
 GtkWidget*
 gtk_font_selection_dialog_new (const gchar *title)
 {
@@ -1302,34 +1682,182 @@ gtk_font_selection_dialog_new (const gchar *title)
   return GTK_WIDGET (fontseldiag);
 }
 
-gchar*
-gtk_font_selection_dialog_get_font_name (GtkFontSelectionDialog *fsd)
+/**
+ * gtk_font_selection_dialog_get_font_selection:
+ * @fsd: a #GtkFontSelectionDialog
+ *
+ * Retrieves the #GtkFontSelection widget embedded in the dialog.
+ *
+ * Returns: (transfer none): the embedded #GtkFontSelection
+ *
+ * Since: 2.22
+ **/
+GtkWidget*
+gtk_font_selection_dialog_get_font_selection (GtkFontSelectionDialog *fsd)
 {
-  return gtk_font_selection_get_font_name (GTK_FONT_SELECTION (fsd->fontsel));
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
+
+  return fsd->priv->fontsel;
 }
 
-GdkFont*
-gtk_font_selection_dialog_get_font (GtkFontSelectionDialog *fsd)
+
+/**
+ * gtk_font_selection_dialog_get_ok_button:
+ * @fsd: a #GtkFontSelectionDialog
+ *
+ * Gets the 'OK' button.
+ *
+ * Return value: (transfer none): the #GtkWidget used in the dialog
+ *     for the 'OK' button.
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_dialog_get_ok_button (GtkFontSelectionDialog *fsd)
 {
-  return gtk_font_selection_get_font (GTK_FONT_SELECTION (fsd->fontsel));
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
+
+  return fsd->priv->ok_button;
+}
+
+/**
+ * gtk_font_selection_dialog_get_cancel_button:
+ * @fsd: a #GtkFontSelectionDialog
+ *
+ * Gets the 'Cancel' button.
+ *
+ * Return value: (transfer none): the #GtkWidget used in the dialog
+ *     for the 'Cancel' button.
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_font_selection_dialog_get_cancel_button (GtkFontSelectionDialog *fsd)
+{
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
+
+  return fsd->priv->cancel_button;
 }
 
+static void
+gtk_font_selection_dialog_buildable_interface_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+  iface->get_internal_child = gtk_font_selection_dialog_buildable_get_internal_child;
+}
+
+static GObject *
+gtk_font_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
+                                                       GtkBuilder   *builder,
+                                                       const gchar  *childname)
+{
+  GtkFontSelectionDialogPrivate *priv;
+
+  priv = GTK_FONT_SELECTION_DIALOG (buildable)->priv;
+
+  if (g_strcmp0 (childname, "ok_button") == 0)
+    return G_OBJECT (priv->ok_button);
+  else if (g_strcmp0 (childname, "cancel_button") == 0)
+    return G_OBJECT (priv->cancel_button);
+  else if (g_strcmp0 (childname, "apply_button") == 0)
+    return G_OBJECT (priv->apply_button);
+  else if (g_strcmp0 (childname, "font_selection") == 0)
+    return G_OBJECT (priv->fontsel);
+
+  return parent_buildable_iface->get_internal_child (buildable, builder, childname);
+}
+
+/**
+ * gtk_font_selection_dialog_get_font_name:
+ * @fsd: a #GtkFontSelectionDialog
+ * 
+ * Gets the currently-selected font name.
+ *
+ * Note that this can be a different string than what you set with 
+ * gtk_font_selection_dialog_set_font_name(), as the font selection widget
+ * may normalize font names and thus return a string with a different 
+ * structure. For example, "Helvetica Italic Bold 12" could be normalized 
+ * to "Helvetica Bold Italic 12".  Use pango_font_description_equal()
+ * if you want to compare two font descriptions.
+ * 
+ * Return value: A string with the name of the current font, or %NULL if no 
+ *     font is selected. You must free this string with g_free().
+ */
+gchar*
+gtk_font_selection_dialog_get_font_name (GtkFontSelectionDialog *fsd)
+{
+  GtkFontSelectionDialogPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
+
+  priv = fsd->priv;
+
+  return gtk_font_selection_get_font_name (GTK_FONT_SELECTION (priv->fontsel));
+}
+
+/**
+ * gtk_font_selection_dialog_set_font_name:
+ * @fsd: a #GtkFontSelectionDialog
+ * @fontname: a font name like "Helvetica 12" or "Times Bold 18"
+ *
+ * Sets the currently selected font. 
+ * 
+ * Return value: %TRUE if the font selected in @fsd is now the
+ *     @fontname specified, %FALSE otherwise. 
+ */
 gboolean
 gtk_font_selection_dialog_set_font_name (GtkFontSelectionDialog *fsd,
-                                        const gchar      *fontname)
+                                        const gchar            *fontname)
 {
-  return gtk_font_selection_set_font_name (GTK_FONT_SELECTION (fsd->fontsel), fontname);
+  GtkFontSelectionDialogPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), FALSE);
+  g_return_val_if_fail (fontname, FALSE);
+
+  priv = fsd->priv;
+
+  return gtk_font_selection_set_font_name (GTK_FONT_SELECTION (priv->fontsel), fontname);
 }
 
+/**
+ * gtk_font_selection_dialog_get_preview_text:
+ * @fsd: a #GtkFontSelectionDialog
+ *
+ * Gets the text displayed in the preview area.
+ * 
+ * Return value: the text displayed in the preview area. 
+ *     This string is owned by the widget and should not be 
+ *     modified or freed 
+ */
 G_CONST_RETURN gchar*
 gtk_font_selection_dialog_get_preview_text (GtkFontSelectionDialog *fsd)
 {
-  return gtk_font_selection_get_preview_text (GTK_FONT_SELECTION (fsd->fontsel));
+  GtkFontSelectionDialogPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
+
+  priv = fsd->priv;
+
+  return gtk_font_selection_get_preview_text (GTK_FONT_SELECTION (priv->fontsel));
 }
 
+/**
+ * gtk_font_selection_dialog_set_preview_text:
+ * @fsd: a #GtkFontSelectionDialog
+ * @text: the text to display in the preview area
+ *
+ * Sets the text displayed in the preview area. 
+ */
 void
 gtk_font_selection_dialog_set_preview_text (GtkFontSelectionDialog *fsd,
                                            const gchar            *text)
 {
-  gtk_font_selection_set_preview_text (GTK_FONT_SELECTION (fsd->fontsel), text);
+  GtkFontSelectionDialogPrivate *priv;
+
+  g_return_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd));
+  g_return_if_fail (text != NULL);
+
+  priv = fsd->priv;
+
+  gtk_font_selection_set_preview_text (GTK_FONT_SELECTION (priv->fontsel), text);
 }