diff options
author | Benjamin Otte <otte@redhat.com> | 2011-09-20 02:54:42 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-09-22 21:44:04 +0200 |
commit | 3af04c1dceb04f19c6988ff3b96e124887d23a80 (patch) | |
tree | 50e1a9eb5fa11087e744c5fc9f72a6efba9c19c2 /gtk/gtkfontchooserwidget.c | |
parent | fe8ed0a3f6f3012b3cc9e902b504b886bb61b0b6 (diff) | |
download | gtk+-3af04c1dceb04f19c6988ff3b96e124887d23a80.tar.gz |
fontchooser: Introduce gtk_font_chooser_find_font()
... which looks up the font in the list of fonts. This then can be used
to select an actual font upon changes.
Also fixes cases where the get_family() and get_face() functions would
return outdated data when set_font() had been called.
Diffstat (limited to 'gtk/gtkfontchooserwidget.c')
-rw-r--r-- | gtk/gtkfontchooserwidget.c | 130 |
1 files changed, 60 insertions, 70 deletions
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c index 012c85f139..21e5f9a396 100644 --- a/gtk/gtkfontchooserwidget.c +++ b/gtk/gtkfontchooserwidget.c @@ -874,6 +874,40 @@ gtk_font_chooser_widget_finalize (GObject *object) G_OBJECT_CLASS (gtk_font_chooser_widget_parent_class)->finalize (object); } +static gboolean +gtk_font_chooser_widget_find_font (GtkFontChooserWidget *fontchooser, + const PangoFontDescription *font_desc, + /* out arguments */ + GtkTreeIter *iter, + PangoFontFamily **family, + PangoFontFace **face) +{ + GtkFontChooserWidgetPrivate *priv = fontchooser->priv; + PangoFontDescription *desc; + gboolean valid; + + for (valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->model), iter); + valid; + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->model), iter)) + { + gtk_tree_model_get (GTK_TREE_MODEL (priv->model), iter, + FACE_COLUMN, face, + FAMILY_COLUMN, family, + FONT_DESC_COLUMN, &desc, + -1); + + pango_font_description_merge_static (desc, font_desc, FALSE); + if (pango_font_description_equal (desc, font_desc)) + break; + + g_object_unref (face); + g_object_unref (family); + pango_font_description_free (desc); + } + + return valid; +} + static void gtk_font_chooser_widget_screen_changed (GtkWidget *widget, GdkScreen *previous_screen) @@ -988,89 +1022,45 @@ static void gtk_font_chooser_widget_select_font (GtkFontChooserWidget *fontchooser) { GtkFontChooserWidgetPrivate *priv = fontchooser->priv; - const PangoFontDescription *desc; - const gchar *family_name; - gint font_size; - gboolean font_size_is_absolute; GtkTreeIter iter; - gboolean valid; - gboolean found = FALSE; - - desc = priv->font_desc; - g_assert (desc != NULL); - - font_size = pango_font_description_get_size (desc); - font_size_is_absolute = pango_font_description_get_size_is_absolute (desc); - family_name = pango_font_description_get_family (desc); - /* We make sure the filter is clear */ - gtk_entry_set_text (GTK_ENTRY (priv->search_entry), ""); - - if (!family_name) - goto deselect; + if (priv->family) + g_object_unref (priv->family); + if (priv->face) + g_object_unref (priv->face); - /* We find the matching family/face */ - for (valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->filter_model), &iter); - valid; - valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->filter_model), &iter)) + if (gtk_font_chooser_widget_find_font (fontchooser, + priv->font_desc, + &iter, + &priv->family, + &priv->face)) { - PangoFontFace *face; - PangoFontDescription *tmp_desc; - - gtk_tree_model_get (GTK_TREE_MODEL (priv->filter_model), &iter, - FACE_COLUMN, &face, - -1); - - tmp_desc = pango_font_face_describe (face); - if (font_size_is_absolute) - pango_font_description_set_absolute_size (tmp_desc, font_size); - else - pango_font_description_set_size (tmp_desc, font_size); + GtkTreeIter filter_iter; - if (pango_font_description_equal (desc, tmp_desc)) + if (gtk_tree_model_filter_convert_child_iter_to_iter (GTK_TREE_MODEL_FILTER (priv->filter_model), + &filter_iter, + &iter)) { - GtkTreePath *path; - - if (font_size) - { - if (font_size_is_absolute) - font_size *= PANGO_SCALE; - gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->size_spin), - font_size / PANGO_SCALE); - } - - path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->filter_model), &iter); - - if (path) - { - gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->family_face_list), + GtkTreePath *path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->filter_model), &filter_iter); + gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->family_face_list), + path, + NULL, + FALSE); + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->family_face_list), path, NULL, - FALSE); - gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (priv->family_face_list), - path, - NULL, - FALSE, - 0.5, - 0.5); - gtk_tree_path_free (path); - } - - found = TRUE; + FALSE, + 0.5, + 0.5); + gtk_tree_path_free (path); } - - g_object_unref (face); - pango_font_description_free (tmp_desc); - - if (found) - break; } - -deselect: - if (!found) + else { gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->family_face_list))); + priv->face = NULL; + priv->family = NULL; } } |