summaryrefslogtreecommitdiff
path: root/gtk/gtkfontchooser.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-08-14 23:46:14 -0400
committerMatthias Clasen <mclasen@redhat.com>2011-08-15 18:57:58 -0400
commit6877893ed5c5ace9e91c111a3c798d71ea34bc19 (patch)
tree364ab8a080d738f59e511f0e8a355619993e6c74 /gtk/gtkfontchooser.c
parent120775792466580b532d58eb1857a378123db7e3 (diff)
downloadgtk+-6877893ed5c5ace9e91c111a3c798d71ea34bc19.tar.gz
Make setting fontname work, independent of a screen
Diffstat (limited to 'gtk/gtkfontchooser.c')
-rw-r--r--gtk/gtkfontchooser.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/gtk/gtkfontchooser.c b/gtk/gtkfontchooser.c
index 7f3989a80a..733758fb7f 100644
--- a/gtk/gtkfontchooser.c
+++ b/gtk/gtkfontchooser.c
@@ -91,6 +91,7 @@ struct _GtkFontChooserPrivate
GtkWidget *size_spin;
GtkWidget *size_slider;
+ gchar *fontname;
gint size;
PangoFontFace *face;
PangoFontFamily *family;
@@ -157,6 +158,8 @@ static void gtk_font_chooser_style_updated (GtkWidget *widget);
static void gtk_font_chooser_bootstrap_fontlist (GtkFontChooser *fontchooser);
+static gboolean gtk_font_chooser_select_font_name (GtkFontChooser *fontchooser);
+
G_DEFINE_TYPE (GtkFontChooser, gtk_font_chooser, GTK_TYPE_BOX)
static void
@@ -693,13 +696,13 @@ populate_list (GtkFontChooser *fontchooser,
GtkListStore *model)
{
GtkFontChooserPrivate *priv = fontchooser->priv;
- GtkStyleContext *style_context;
+ GtkStyleContext *style_context;
PangoFontDescription *default_font;
PangoFontDescription *selected_font;
gint match;
- GtkTreeIter match_row;
- GtkTreePath *path;
+ GtkTreeIter match_row;
+ GtkTreePath *path;
gint n_families, i;
PangoFontFamily **families;
@@ -718,7 +721,6 @@ populate_list (GtkFontChooser *fontchooser,
qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);
- /* Get theme font */
style_context = gtk_widget_get_style_context (GTK_WIDGET (treeview));
default_font = (PangoFontDescription*) gtk_style_context_get_font (style_context,
GTK_STATE_NORMAL);
@@ -928,6 +930,9 @@ gtk_font_chooser_finalize (GObject *object)
GtkFontChooser *fontchooser = GTK_FONT_CHOOSER (object);
GtkFontChooserPrivate *priv = fontchooser->priv;
+ if (priv->fontname)
+ g_free (priv->fontname);
+
if (priv->family)
g_object_unref (priv->family);
@@ -945,10 +950,14 @@ gtk_font_chooser_screen_changed (GtkWidget *widget,
GdkScreen *previous_screen)
{
GtkFontChooser *fontchooser = GTK_FONT_CHOOSER (widget);
+ GtkFontChooserPrivate *priv = fontchooser->priv;
populate_list (fontchooser,
- GTK_TREE_VIEW (fontchooser->priv->family_face_list),
- fontchooser->priv->model);
+ GTK_TREE_VIEW (priv->family_face_list),
+ priv->model);
+
+ if (priv->fontname)
+ gtk_font_chooser_select_font_name (fontchooser);
}
static void
@@ -1071,11 +1080,6 @@ gtk_font_chooser_get_font_name (GtkFontChooser *fontchooser)
*
* Sets the currently-selected font.
*
- * Note that the @fontchooser needs to know the screen in which
- * it will appear for this to work; this can be guaranteed by simply
- * making sure that the @fontchooser 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 @fontchooser doesn't belong
* to a particular screen yet.
@@ -1087,21 +1091,39 @@ gtk_font_chooser_set_font_name (GtkFontChooser *fontchooser,
const gchar *fontname)
{
GtkFontChooserPrivate *priv = fontchooser->priv;
- GtkTreeIter iter;
- gboolean valid;
- gchar *family_name;
- PangoFontDescription *desc;
- gboolean found = FALSE;
+ gboolean found = FALSE;
g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), FALSE);
g_return_val_if_fail (fontname != NULL, FALSE);
- if (!gtk_widget_has_screen (GTK_WIDGET (fontchooser)))
- return FALSE;
+ if (priv->fontname)
+ g_free (priv->fontname);
+ priv->fontname = g_strdup (fontname);
+
+ if (gtk_widget_has_screen (GTK_WIDGET (fontchooser)))
+ found = gtk_font_chooser_select_font_name (fontchooser);
- desc = pango_font_description_from_string (fontname);
+ g_object_notify (G_OBJECT (fontchooser), "font-name");
+
+ return found;
+}
+
+static gboolean
+gtk_font_chooser_select_font_name (GtkFontChooser *fontchooser)
+{
+ GtkFontChooserPrivate *priv = fontchooser->priv;
+ GtkTreeIter iter;
+ gboolean valid;
+ gchar *family_name;
+ PangoFontDescription *desc;
+ gboolean found = FALSE;
+
+ desc = pango_font_description_from_string (priv->fontname);
family_name = (gchar*)pango_font_description_get_family (desc);
+ g_free (priv->fontname);
+ priv->fontname = NULL;
+
if (!family_name)
{
pango_font_description_free (desc);
@@ -1172,7 +1194,6 @@ gtk_font_chooser_set_font_name (GtkFontChooser *fontchooser,
}
pango_font_description_free (desc);
- g_object_notify (G_OBJECT (fontchooser), "font-name");
return found;
}