1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * Massively updated for Pango by Owen Taylor, May 2000
5 * GtkFontSelection widget for Gtk+, by Damon Chaplin, May 1998.
6 * Based on the GnomeFontSelector widget, by Elliot Lee, but major changes.
7 * The GnomeFontSelector was derived from app/text_tool.c in the GIMP.
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the
21 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22 * Boston, MA 02111-1307, USA.
26 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
27 * file for a list of people on the GTK+ Team. See the ChangeLog
28 * files for a list of changes. These files are distributed with
29 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
34 #include <glib/gprintf.h>
40 #include "gdk/gdkkeysyms.h"
42 #include "gtkfontsel.h"
44 #include "gtkbutton.h"
45 #include "gtkcellrenderertext.h"
51 #include "gtkliststore.h"
55 #include "gtktreeselection.h"
56 #include "gtktreeview.h"
58 #include "gtkscrolledwindow.h"
60 #include "gtkaccessible.h"
61 #include "gtkprivate.h"
62 #include "gtkbuildable.h"
65 /* We don't enable the font and style entries because they don't add
66 * much in terms of visible effect and have a weird effect on keynav.
67 * the Windows font selector has entries similarly positioned but they
68 * act in conjunction with the associated lists to form a single focus
71 #undef INCLUDE_FONT_ENTRIES
73 /* This is the default text shown in the preview entry, though the user
74 can set it. Remember that some fonts only have capital letters. */
75 #define PREVIEW_TEXT N_("abcdefghijk ABCDEFGHIJK")
77 #define DEFAULT_FONT_NAME "Sans 10"
79 /* This is the initial and maximum height of the preview entry (it expands
80 when large font sizes are selected). Initial height is also the minimum. */
81 #define INITIAL_PREVIEW_HEIGHT 44
82 #define MAX_PREVIEW_HEIGHT 300
84 /* These are the sizes of the font, style & size lists. */
85 #define FONT_LIST_HEIGHT 136
86 #define FONT_LIST_WIDTH 190
87 #define FONT_STYLE_LIST_WIDTH 170
88 #define FONT_SIZE_LIST_WIDTH 60
90 /* These are what we use as the standard font sizes, for the size list.
92 static const guint16 font_sizes[] = {
93 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28,
94 32, 36, 40, 48, 56, 64, 72
119 static void gtk_font_selection_set_property (GObject *object,
123 static void gtk_font_selection_get_property (GObject *object,
127 static void gtk_font_selection_finalize (GObject *object);
128 static void gtk_font_selection_screen_changed (GtkWidget *widget,
129 GdkScreen *previous_screen);
131 /* These are the callbacks & related functions. */
132 static void gtk_font_selection_select_font (GtkTreeSelection *selection,
134 static void gtk_font_selection_show_available_fonts (GtkFontSelection *fs);
136 static void gtk_font_selection_show_available_styles (GtkFontSelection *fs);
137 static void gtk_font_selection_select_best_style (GtkFontSelection *fs,
139 static void gtk_font_selection_select_style (GtkTreeSelection *selection,
142 static void gtk_font_selection_select_best_size (GtkFontSelection *fs);
143 static void gtk_font_selection_show_available_sizes (GtkFontSelection *fs,
144 gboolean first_time);
145 static void gtk_font_selection_size_activate (GtkWidget *w,
147 static gboolean gtk_font_selection_size_focus_out (GtkWidget *w,
148 GdkEventFocus *event,
150 static void gtk_font_selection_select_size (GtkTreeSelection *selection,
153 static void gtk_font_selection_scroll_on_map (GtkWidget *w,
156 static void gtk_font_selection_preview_changed (GtkWidget *entry,
157 GtkFontSelection *fontsel);
159 /* Misc. utility functions. */
160 static void gtk_font_selection_load_font (GtkFontSelection *fs);
161 static void gtk_font_selection_update_preview (GtkFontSelection *fs);
163 static GdkFont* gtk_font_selection_get_font_internal (GtkFontSelection *fontsel);
165 G_DEFINE_TYPE (GtkFontSelection, gtk_font_selection, GTK_TYPE_VBOX)
168 gtk_font_selection_class_init (GtkFontSelectionClass *klass)
170 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
171 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
173 gobject_class->set_property = gtk_font_selection_set_property;
174 gobject_class->get_property = gtk_font_selection_get_property;
176 widget_class->screen_changed = gtk_font_selection_screen_changed;
178 g_object_class_install_property (gobject_class,
180 g_param_spec_string ("font-name",
182 P_("The string that represents this font"),
184 GTK_PARAM_READWRITE));
185 g_object_class_install_property (gobject_class,
187 g_param_spec_boxed ("font",
189 P_("The GdkFont that is currently selected"),
191 GTK_PARAM_READABLE));
192 g_object_class_install_property (gobject_class,
194 g_param_spec_string ("preview-text",
196 P_("The text to display in order to demonstrate the selected font"),
198 GTK_PARAM_READWRITE));
199 gobject_class->finalize = gtk_font_selection_finalize;
203 gtk_font_selection_set_property (GObject *object,
208 GtkFontSelection *fontsel;
210 fontsel = GTK_FONT_SELECTION (object);
215 gtk_font_selection_set_font_name (fontsel, g_value_get_string (value));
217 case PROP_PREVIEW_TEXT:
218 gtk_font_selection_set_preview_text (fontsel, g_value_get_string (value));
221 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
226 static void gtk_font_selection_get_property (GObject *object,
231 GtkFontSelection *fontsel;
233 fontsel = GTK_FONT_SELECTION (object);
238 g_value_take_string (value, gtk_font_selection_get_font_name (fontsel));
241 g_value_set_boxed (value, gtk_font_selection_get_font_internal (fontsel));
243 case PROP_PREVIEW_TEXT:
244 g_value_set_string (value, gtk_font_selection_get_preview_text (fontsel));
247 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
252 /* Handles key press events on the lists, so that we can trap Enter to
253 * activate the default button on our own.
256 list_row_activated (GtkWidget *widget)
260 window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (widget)));
261 if (!GTK_WIDGET_TOPLEVEL (window))
265 && widget != window->default_widget
266 && !(widget == window->focus_widget &&
267 (!window->default_widget || !GTK_WIDGET_SENSITIVE (window->default_widget))))
269 gtk_window_activate_default (window);
276 gtk_font_selection_init (GtkFontSelection *fontsel)
278 GtkWidget *scrolled_win;
280 GtkWidget *table, *label;
281 GtkWidget *font_label, *style_label;
284 GtkTreeViewColumn *column;
285 GList *focus_chain = NULL;
288 gtk_widget_push_composite_child ();
290 gtk_box_set_spacing (GTK_BOX (fontsel), 12);
291 fontsel->size = 12 * PANGO_SCALE;
293 /* Create the table of font, style & size. */
294 table = gtk_table_new (3, 3, FALSE);
295 gtk_widget_show (table);
296 gtk_table_set_row_spacings (GTK_TABLE (table), 6);
297 gtk_table_set_col_spacings (GTK_TABLE (table), 12);
298 gtk_box_pack_start (GTK_BOX (fontsel), table, TRUE, TRUE, 0);
300 #ifdef INCLUDE_FONT_ENTRIES
301 fontsel->font_entry = gtk_entry_new ();
302 gtk_editable_set_editable (GTK_EDITABLE (fontsel->font_entry), FALSE);
303 gtk_widget_set_size_request (fontsel->font_entry, 20, -1);
304 gtk_widget_show (fontsel->font_entry);
305 gtk_table_attach (GTK_TABLE (table), fontsel->font_entry, 0, 1, 1, 2,
308 fontsel->font_style_entry = gtk_entry_new ();
309 gtk_editable_set_editable (GTK_EDITABLE (fontsel->font_style_entry), FALSE);
310 gtk_widget_set_size_request (fontsel->font_style_entry, 20, -1);
311 gtk_widget_show (fontsel->font_style_entry);
312 gtk_table_attach (GTK_TABLE (table), fontsel->font_style_entry, 1, 2, 1, 2,
314 #endif /* INCLUDE_FONT_ENTRIES */
316 fontsel->size_entry = gtk_entry_new ();
317 gtk_widget_set_size_request (fontsel->size_entry, 20, -1);
318 gtk_widget_show (fontsel->size_entry);
319 gtk_table_attach (GTK_TABLE (table), fontsel->size_entry, 2, 3, 1, 2,
321 g_signal_connect (fontsel->size_entry, "activate",
322 G_CALLBACK (gtk_font_selection_size_activate),
324 g_signal_connect_after (fontsel->size_entry, "focus-out-event",
325 G_CALLBACK (gtk_font_selection_size_focus_out),
328 font_label = gtk_label_new_with_mnemonic (_("_Family:"));
329 gtk_misc_set_alignment (GTK_MISC (font_label), 0.0, 0.5);
330 gtk_widget_show (font_label);
331 gtk_table_attach (GTK_TABLE (table), font_label, 0, 1, 0, 1,
334 style_label = gtk_label_new_with_mnemonic (_("_Style:"));
335 gtk_misc_set_alignment (GTK_MISC (style_label), 0.0, 0.5);
336 gtk_widget_show (style_label);
337 gtk_table_attach (GTK_TABLE (table), style_label, 1, 2, 0, 1,
340 label = gtk_label_new_with_mnemonic (_("Si_ze:"));
341 gtk_label_set_mnemonic_widget (GTK_LABEL (label),
342 fontsel->size_entry);
343 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
344 gtk_widget_show (label);
345 gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
349 /* Create the lists */
351 model = gtk_list_store_new (2,
352 G_TYPE_OBJECT, /* FAMILY_COLUMN */
353 G_TYPE_STRING); /* FAMILY_NAME_COLUMN */
354 fontsel->family_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
355 g_object_unref (model);
357 g_signal_connect (fontsel->family_list, "row-activated",
358 G_CALLBACK (list_row_activated), fontsel);
360 column = gtk_tree_view_column_new_with_attributes ("Family",
361 gtk_cell_renderer_text_new (),
362 "text", FAMILY_NAME_COLUMN,
364 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
365 gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->family_list), column);
367 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->family_list), FALSE);
368 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)),
369 GTK_SELECTION_BROWSE);
371 gtk_label_set_mnemonic_widget (GTK_LABEL (font_label), fontsel->family_list);
373 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
374 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
375 gtk_widget_set_size_request (scrolled_win,
376 FONT_LIST_WIDTH, FONT_LIST_HEIGHT);
377 gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->family_list);
378 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
379 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
380 gtk_widget_show (fontsel->family_list);
381 gtk_widget_show (scrolled_win);
383 gtk_table_attach (GTK_TABLE (table), scrolled_win, 0, 1, 1, 3,
384 GTK_EXPAND | GTK_FILL,
385 GTK_EXPAND | GTK_FILL, 0, 0);
386 focus_chain = g_list_append (focus_chain, scrolled_win);
388 model = gtk_list_store_new (2,
389 G_TYPE_OBJECT, /* FACE_COLUMN */
390 G_TYPE_STRING); /* FACE_NAME_COLUMN */
391 fontsel->face_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
392 g_object_unref (model);
393 g_signal_connect (fontsel->face_list, "row-activated",
394 G_CALLBACK (list_row_activated), fontsel);
396 gtk_label_set_mnemonic_widget (GTK_LABEL (style_label), fontsel->face_list);
398 column = gtk_tree_view_column_new_with_attributes ("Face",
399 gtk_cell_renderer_text_new (),
400 "text", FACE_NAME_COLUMN,
402 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
403 gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->face_list), column);
405 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->face_list), FALSE);
406 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)),
407 GTK_SELECTION_BROWSE);
409 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
410 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
411 gtk_widget_set_size_request (scrolled_win,
412 FONT_STYLE_LIST_WIDTH, FONT_LIST_HEIGHT);
413 gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->face_list);
414 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
415 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
416 gtk_widget_show (fontsel->face_list);
417 gtk_widget_show (scrolled_win);
418 gtk_table_attach (GTK_TABLE (table), scrolled_win, 1, 2, 1, 3,
419 GTK_EXPAND | GTK_FILL,
420 GTK_EXPAND | GTK_FILL, 0, 0);
421 focus_chain = g_list_append (focus_chain, scrolled_win);
423 focus_chain = g_list_append (focus_chain, fontsel->size_entry);
425 model = gtk_list_store_new (1, G_TYPE_INT);
426 fontsel->size_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
427 g_object_unref (model);
428 g_signal_connect (fontsel->size_list, "row-activated",
429 G_CALLBACK (list_row_activated), fontsel);
431 column = gtk_tree_view_column_new_with_attributes ("Size",
432 gtk_cell_renderer_text_new (),
435 gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
436 gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->size_list), column);
438 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->size_list), FALSE);
439 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list)),
440 GTK_SELECTION_BROWSE);
442 scrolled_win = gtk_scrolled_window_new (NULL, NULL);
443 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
444 gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->size_list);
445 gtk_widget_set_size_request (scrolled_win, -1, FONT_LIST_HEIGHT);
446 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
447 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
448 gtk_widget_show (fontsel->size_list);
449 gtk_widget_show (scrolled_win);
450 gtk_table_attach (GTK_TABLE (table), scrolled_win, 2, 3, 2, 3,
451 GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
452 focus_chain = g_list_append (focus_chain, scrolled_win);
454 gtk_container_set_focus_chain (GTK_CONTAINER (table), focus_chain);
455 g_list_free (focus_chain);
457 /* Insert the fonts. */
458 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)), "changed",
459 G_CALLBACK (gtk_font_selection_select_font), fontsel);
461 g_signal_connect_after (fontsel->family_list, "map",
462 G_CALLBACK (gtk_font_selection_scroll_on_map),
465 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)), "changed",
466 G_CALLBACK (gtk_font_selection_select_style), fontsel);
468 g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list)), "changed",
469 G_CALLBACK (gtk_font_selection_select_size), fontsel);
470 atk_obj = gtk_widget_get_accessible (fontsel->size_list);
471 if (GTK_IS_ACCESSIBLE (atk_obj))
473 /* Accessibility support is enabled.
474 * Make the label ATK_RELATON_LABEL_FOR for the size list as well.
476 AtkObject *atk_label;
477 AtkRelationSet *relation_set;
478 AtkRelation *relation;
479 AtkObject *obj_array[1];
481 atk_label = gtk_widget_get_accessible (label);
482 relation_set = atk_object_ref_relation_set (atk_obj);
483 relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_LABELLED_BY);
486 atk_relation_add_target (relation, atk_label);
490 obj_array[0] = atk_label;
491 relation = atk_relation_new (obj_array, 1, ATK_RELATION_LABELLED_BY);
492 atk_relation_set_add (relation_set, relation);
494 g_object_unref (relation_set);
496 relation_set = atk_object_ref_relation_set (atk_label);
497 relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_LABEL_FOR);
500 atk_relation_add_target (relation, atk_obj);
504 obj_array[0] = atk_obj;
505 relation = atk_relation_new (obj_array, 1, ATK_RELATION_LABEL_FOR);
506 atk_relation_set_add (relation_set, relation);
508 g_object_unref (relation_set);
512 vbox = gtk_vbox_new (FALSE, 6);
513 gtk_widget_show (vbox);
514 gtk_box_pack_start (GTK_BOX (fontsel), vbox, FALSE, TRUE, 0);
516 /* create the text entry widget */
517 label = gtk_label_new_with_mnemonic (_("_Preview:"));
518 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
519 gtk_widget_show (label);
520 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
522 text_box = gtk_hbox_new (FALSE, 0);
523 gtk_widget_show (text_box);
524 gtk_box_pack_start (GTK_BOX (vbox), text_box, FALSE, TRUE, 0);
526 fontsel->preview_entry = gtk_entry_new ();
527 gtk_label_set_mnemonic_widget (GTK_LABEL (label), fontsel->preview_entry);
528 gtk_entry_set_text (GTK_ENTRY (fontsel->preview_entry), _(PREVIEW_TEXT));
530 gtk_widget_show (fontsel->preview_entry);
531 g_signal_connect (fontsel->preview_entry, "changed",
532 G_CALLBACK (gtk_font_selection_preview_changed), fontsel);
533 gtk_widget_set_size_request (fontsel->preview_entry,
534 -1, INITIAL_PREVIEW_HEIGHT);
535 gtk_box_pack_start (GTK_BOX (text_box), fontsel->preview_entry,
538 gtk_widget_pop_composite_child();
542 * gtk_font_selection_new:
544 * Creates a new #GtkFontSelection.
546 * Return value: a n ew #GtkFontSelection
549 gtk_font_selection_new (void)
551 GtkFontSelection *fontsel;
553 fontsel = g_object_new (GTK_TYPE_FONT_SELECTION, NULL);
555 return GTK_WIDGET (fontsel);
559 gtk_font_selection_finalize (GObject *object)
561 GtkFontSelection *fontsel;
563 g_return_if_fail (GTK_IS_FONT_SELECTION (object));
565 fontsel = GTK_FONT_SELECTION (object);
568 gdk_font_unref (fontsel->font);
570 G_OBJECT_CLASS (gtk_font_selection_parent_class)->finalize (object);
574 gtk_font_selection_screen_changed (GtkWidget *widget,
575 GdkScreen *previous_screen)
577 GtkFontSelection *fontsel = GTK_FONT_SELECTION (widget);
579 if (gtk_widget_has_screen (GTK_WIDGET (fontsel)))
581 gtk_font_selection_show_available_fonts (fontsel);
582 gtk_font_selection_show_available_sizes (fontsel, TRUE);
583 gtk_font_selection_show_available_styles (fontsel);
588 gtk_font_selection_preview_changed (GtkWidget *entry,
589 GtkFontSelection *fontsel)
591 g_object_notify (G_OBJECT (fontsel), "preview-text");
595 scroll_to_selection (GtkTreeView *tree_view)
597 GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
601 if (gtk_tree_selection_get_selected (selection, &model, &iter))
603 GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
604 gtk_tree_view_scroll_to_cell (tree_view, path, NULL, TRUE, 0.5, 0.5);
605 gtk_tree_path_free (path);
610 set_cursor_to_iter (GtkTreeView *view,
613 GtkTreeModel *model = gtk_tree_view_get_model (view);
614 GtkTreePath *path = gtk_tree_model_get_path (model, iter);
616 gtk_tree_view_set_cursor (view, path, NULL, FALSE);
618 gtk_tree_path_free (path);
621 /* This is called when the list is mapped. Here we scroll to the current
622 font if necessary. */
624 gtk_font_selection_scroll_on_map (GtkWidget *widget,
627 GtkFontSelection *fontsel;
630 g_message ("In expose_list\n");
632 fontsel = GTK_FONT_SELECTION (data);
634 /* Try to scroll the font family list to the selected item */
635 scroll_to_selection (GTK_TREE_VIEW (fontsel->family_list));
637 /* Try to scroll the font family list to the selected item */
638 scroll_to_selection (GTK_TREE_VIEW (fontsel->face_list));
640 /* Try to scroll the font family list to the selected item */
641 scroll_to_selection (GTK_TREE_VIEW (fontsel->size_list));
644 /* This is called when a family is selected in the list. */
646 gtk_font_selection_select_font (GtkTreeSelection *selection,
649 GtkFontSelection *fontsel;
652 #ifdef INCLUDE_FONT_ENTRIES
653 const gchar *family_name;
656 fontsel = GTK_FONT_SELECTION (data);
658 if (gtk_tree_selection_get_selected (selection, &model, &iter))
660 PangoFontFamily *family;
662 gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
663 if (fontsel->family != family)
665 fontsel->family = family;
667 #ifdef INCLUDE_FONT_ENTRIES
668 family_name = pango_font_family_get_name (fontsel->family);
669 gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), family_name);
672 gtk_font_selection_show_available_styles (fontsel);
673 gtk_font_selection_select_best_style (fontsel, TRUE);
676 g_object_unref (family);
681 cmp_families (const void *a, const void *b)
683 const char *a_name = pango_font_family_get_name (*(PangoFontFamily **)a);
684 const char *b_name = pango_font_family_get_name (*(PangoFontFamily **)b);
686 return g_utf8_collate (a_name, b_name);
690 gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
693 PangoFontFamily **families;
694 PangoFontFamily *match_family = NULL;
696 GtkTreeIter match_row;
698 model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list)));
700 pango_context_list_families (gtk_widget_get_pango_context (GTK_WIDGET (fontsel)),
701 &families, &n_families);
702 qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);
704 gtk_list_store_clear (model);
706 for (i=0; i<n_families; i++)
708 const gchar *name = pango_font_family_get_name (families[i]);
711 gtk_list_store_append (model, &iter);
712 gtk_list_store_set (model, &iter,
713 FAMILY_COLUMN, families[i],
714 FAMILY_NAME_COLUMN, name,
717 if (i == 0 || !g_ascii_strcasecmp (name, "sans"))
719 match_family = families[i];
724 fontsel->family = match_family;
727 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &match_row);
728 #ifdef INCLUDE_FONT_ENTRIES
729 gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry),
730 pango_font_family_get_name (match_family));
731 #endif /* INCLUDE_FONT_ENTRIES */
738 compare_font_descriptions (const PangoFontDescription *a, const PangoFontDescription *b)
740 int val = strcmp (pango_font_description_get_family (a), pango_font_description_get_family (b));
744 if (pango_font_description_get_weight (a) != pango_font_description_get_weight (b))
745 return pango_font_description_get_weight (a) - pango_font_description_get_weight (b);
747 if (pango_font_description_get_style (a) != pango_font_description_get_style (b))
748 return pango_font_description_get_style (a) - pango_font_description_get_style (b);
750 if (pango_font_description_get_stretch (a) != pango_font_description_get_stretch (b))
751 return pango_font_description_get_stretch (a) - pango_font_description_get_stretch (b);
753 if (pango_font_description_get_variant (a) != pango_font_description_get_variant (b))
754 return pango_font_description_get_variant (a) - pango_font_description_get_variant (b);
760 faces_sort_func (const void *a, const void *b)
762 PangoFontDescription *desc_a = pango_font_face_describe (*(PangoFontFace **)a);
763 PangoFontDescription *desc_b = pango_font_face_describe (*(PangoFontFace **)b);
765 int ord = compare_font_descriptions (desc_a, desc_b);
767 pango_font_description_free (desc_a);
768 pango_font_description_free (desc_b);
774 font_description_style_equal (const PangoFontDescription *a,
775 const PangoFontDescription *b)
777 return (pango_font_description_get_weight (a) == pango_font_description_get_weight (b) &&
778 pango_font_description_get_style (a) == pango_font_description_get_style (b) &&
779 pango_font_description_get_stretch (a) == pango_font_description_get_stretch (b) &&
780 pango_font_description_get_variant (a) == pango_font_description_get_variant (b));
783 /* This fills the font style list with all the possible style combinations
784 for the current font family. */
786 gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
789 PangoFontFace **faces;
790 PangoFontDescription *old_desc;
792 GtkTreeIter match_row;
793 PangoFontFace *match_face = NULL;
795 model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list)));
798 old_desc = pango_font_face_describe (fontsel->face);
802 pango_font_family_list_faces (fontsel->family, &faces, &n_faces);
803 qsort (faces, n_faces, sizeof (PangoFontFace *), faces_sort_func);
805 gtk_list_store_clear (model);
807 for (i=0; i < n_faces; i++)
810 const gchar *str = pango_font_face_get_face_name (faces[i]);
812 gtk_list_store_append (model, &iter);
813 gtk_list_store_set (model, &iter,
814 FACE_COLUMN, faces[i],
815 FACE_NAME_COLUMN, str,
821 match_face = faces[i];
825 PangoFontDescription *tmp_desc = pango_font_face_describe (faces[i]);
827 if (font_description_style_equal (tmp_desc, old_desc))
830 match_face = faces[i];
833 pango_font_description_free (tmp_desc);
838 pango_font_description_free (old_desc);
840 fontsel->face = match_face;
843 #ifdef INCLUDE_FONT_ENTRIES
844 const gchar *str = pango_font_face_get_face_name (fontsel->face);
846 gtk_entry_set_text (GTK_ENTRY (fontsel->font_style_entry), str);
848 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_row);
854 /* This selects a style when the user selects a font. It just uses the first
855 available style at present. I was thinking of trying to maintain the
856 selected style, e.g. bold italic, when the user selects different fonts.
857 However, the interface is so easy to use now I'm not sure it's worth it.
858 Note: This will load a font. */
860 gtk_font_selection_select_best_style (GtkFontSelection *fontsel,
866 model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list));
868 if (gtk_tree_model_get_iter_first (model, &iter))
870 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &iter);
871 scroll_to_selection (GTK_TREE_VIEW (fontsel->face_list));
874 gtk_font_selection_show_available_sizes (fontsel, FALSE);
875 gtk_font_selection_select_best_size (fontsel);
879 /* This is called when a style is selected in the list. */
881 gtk_font_selection_select_style (GtkTreeSelection *selection,
884 GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
888 if (gtk_tree_selection_get_selected (selection, &model, &iter))
892 gtk_tree_model_get (model, &iter, FACE_COLUMN, &face, -1);
893 fontsel->face = face;
895 g_object_unref (face);
898 gtk_font_selection_show_available_sizes (fontsel, FALSE);
899 gtk_font_selection_select_best_size (fontsel);
903 gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
911 model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->size_list)));
913 /* Insert the standard font sizes */
916 gtk_list_store_clear (model);
918 for (i = 0; i < G_N_ELEMENTS (font_sizes); i++)
922 gtk_list_store_append (model, &iter);
923 gtk_list_store_set (model, &iter, SIZE_COLUMN, font_sizes[i], -1);
925 if (font_sizes[i] * PANGO_SCALE == fontsel->size)
926 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
932 gboolean found = FALSE;
934 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
935 for (i = 0; i < G_N_ELEMENTS (font_sizes) && !found; i++)
937 if (font_sizes[i] * PANGO_SCALE == fontsel->size)
939 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
943 gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter);
948 GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list));
949 gtk_tree_selection_unselect_all (selection);
953 /* Set the entry to the new size, rounding to 1 digit,
954 * trimming of trailing 0's and a trailing period
956 g_snprintf (buffer, sizeof (buffer), "%.1f", fontsel->size / (1.0 * PANGO_SCALE));
957 if (strchr (buffer, '.'))
959 p = buffer + strlen (buffer) - 1;
967 /* Compare, to avoid moving the cursor unecessarily */
968 if (strcmp (gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry)), buffer) != 0)
969 gtk_entry_set_text (GTK_ENTRY (fontsel->size_entry), buffer);
973 gtk_font_selection_select_best_size (GtkFontSelection *fontsel)
975 gtk_font_selection_load_font (fontsel);
979 gtk_font_selection_set_size (GtkFontSelection *fontsel,
982 if (fontsel->size != new_size)
984 fontsel->size = new_size;
986 gtk_font_selection_show_available_sizes (fontsel, FALSE);
987 gtk_font_selection_load_font (fontsel);
991 /* If the user hits return in the font size entry, we change to the new font
994 gtk_font_selection_size_activate (GtkWidget *w,
997 GtkFontSelection *fontsel;
1001 fontsel = GTK_FONT_SELECTION (data);
1003 text = gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry));
1004 new_size = MAX (0.1, atof (text) * PANGO_SCALE + 0.5);
1006 if (fontsel->size != new_size)
1007 gtk_font_selection_set_size (fontsel, new_size);
1009 list_row_activated (w);
1013 gtk_font_selection_size_focus_out (GtkWidget *w,
1014 GdkEventFocus *event,
1017 GtkFontSelection *fontsel;
1021 fontsel = GTK_FONT_SELECTION (data);
1023 text = gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry));
1024 new_size = MAX (0.1, atof (text) * PANGO_SCALE + 0.5);
1026 gtk_font_selection_set_size (fontsel, new_size);
1031 /* This is called when a size is selected in the list. */
1033 gtk_font_selection_select_size (GtkTreeSelection *selection,
1036 GtkFontSelection *fontsel;
1037 GtkTreeModel *model;
1041 fontsel = GTK_FONT_SELECTION (data);
1043 if (gtk_tree_selection_get_selected (selection, &model, &iter))
1045 gtk_tree_model_get (model, &iter, SIZE_COLUMN, &new_size, -1);
1046 gtk_font_selection_set_size (fontsel, new_size * PANGO_SCALE);
1051 gtk_font_selection_load_font (GtkFontSelection *fontsel)
1054 gdk_font_unref (fontsel->font);
1055 fontsel->font = NULL;
1057 gtk_font_selection_update_preview (fontsel);
1060 static PangoFontDescription *
1061 gtk_font_selection_get_font_description (GtkFontSelection *fontsel)
1063 PangoFontDescription *font_desc;
1067 font_desc = pango_font_face_describe (fontsel->face);
1068 pango_font_description_set_size (font_desc, fontsel->size);
1071 font_desc = pango_font_description_from_string (DEFAULT_FONT_NAME);
1076 /* This sets the font in the preview entry to the selected font, and tries to
1077 make sure that the preview entry is a reasonable size, i.e. so that the
1078 text can be seen with a bit of space to spare. But it tries to avoid
1079 resizing the entry every time the font changes.
1080 This also used to shrink the preview if the font size was decreased, but
1081 that made it awkward if the user wanted to resize the window themself. */
1083 gtk_font_selection_update_preview (GtkFontSelection *fontsel)
1085 GtkRcStyle *rc_style;
1087 GtkRequisition old_requisition;
1088 GtkWidget *preview_entry = fontsel->preview_entry;
1091 gtk_widget_get_child_requisition (preview_entry, &old_requisition);
1093 rc_style = gtk_rc_style_new ();
1094 rc_style->font_desc = gtk_font_selection_get_font_description (fontsel);
1096 gtk_widget_modify_style (preview_entry, rc_style);
1097 g_object_unref (rc_style);
1099 gtk_widget_size_request (preview_entry, NULL);
1101 /* We don't ever want to be over MAX_PREVIEW_HEIGHT pixels high. */
1102 new_height = CLAMP (preview_entry->requisition.height, INITIAL_PREVIEW_HEIGHT, MAX_PREVIEW_HEIGHT);
1104 if (new_height > old_requisition.height || new_height < old_requisition.height - 30)
1105 gtk_widget_set_size_request (preview_entry, -1, new_height);
1107 /* This sets the preview text, if it hasn't been set already. */
1108 text = gtk_entry_get_text (GTK_ENTRY (preview_entry));
1109 if (strlen (text) == 0)
1110 gtk_entry_set_text (GTK_ENTRY (preview_entry), _(PREVIEW_TEXT));
1111 gtk_editable_set_position (GTK_EDITABLE (preview_entry), 0);
1115 gtk_font_selection_get_font_internal (GtkFontSelection *fontsel)
1119 PangoFontDescription *font_desc = gtk_font_selection_get_font_description (fontsel);
1120 fontsel->font = gdk_font_from_description_for_display (gtk_widget_get_display (GTK_WIDGET (fontsel)), font_desc);
1121 pango_font_description_free (font_desc);
1124 return fontsel->font;
1128 /*****************************************************************************
1129 * These functions are the main public interface for getting/setting the font.
1130 *****************************************************************************/
1133 * gtk_font_selection_get_family_list:
1134 * @fontsel: a #GtkFontSelection
1136 * This returns the #GtkTreeView that lists font families, for
1137 * example, 'Sans', 'Serif', etc.
1139 * Return value: A #GtkWidget that is part of @fontsel
1144 gtk_font_selection_get_family_list (GtkFontSelection *fontsel)
1146 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1148 return fontsel->family_list;
1152 * gtk_font_selection_get_face_list:
1153 * @fontsel: a #GtkFontSelection
1155 * This returns the #GtkTreeView which lists all styles available for
1156 * the selected font. For example, 'Regular', 'Bold', etc.
1158 * Return value: A #GtkWidget that is part of @fontsel
1163 gtk_font_selection_get_face_list (GtkFontSelection *fontsel)
1165 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1167 return fontsel->face_list;
1171 * gtk_font_selection_get_size_entry:
1172 * @fontsel: a #GtkFontSelection
1174 * This returns the #GtkEntry used to allow the user to edit the font
1175 * number manually instead of selecting it from the list of font sizes.
1177 * Return value: A #GtkWidget that is part of @fontsel
1182 gtk_font_selection_get_size_entry (GtkFontSelection *fontsel)
1184 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1186 return fontsel->size_entry;
1190 * gtk_font_selection_get_size_list:
1191 * @fontsel: a #GtkFontSelection
1193 * This returns the #GtkTreeeView used to list font sizes.
1195 * Return value: A #GtkWidget that is part of @fontsel
1200 gtk_font_selection_get_size_list (GtkFontSelection *fontsel)
1202 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1204 return fontsel->size_list;
1208 * gtk_font_selection_get_preview_entry:
1209 * @fontsel: a #GtkFontSelection
1211 * This returns the #GtkEntry used to display the font as a preview.
1213 * Return value: A #GtkWidget that is part of @fontsel
1218 gtk_font_selection_get_preview_entry (GtkFontSelection *fontsel)
1220 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1222 return fontsel->preview_entry;
1226 * gtk_font_selection_get_family:
1227 * @fontsel: a #GtkFontSelection
1229 * Gets the #PangoFontFamily representing the selected font family.
1231 * Return value: A #PangoFontFamily representing the selected font
1232 * family. Font families are a collection of font faces. The
1233 * returned object is owned by @fontsel and must not be modified
1239 gtk_font_selection_get_family (GtkFontSelection *fontsel)
1241 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1243 return fontsel->family;
1247 * gtk_font_selection_get_face:
1248 * @fontsel: a #GtkFontSelection
1250 * Gets the #PangoFontFace representing the selected font group
1251 * details (i.e. family, slant, weight, width, etc).
1253 * Return value: A #PangoFontFace representing the selected font
1254 * group details. The returned object is owned by @fontsel and
1255 * must not be modified or freed.
1260 gtk_font_selection_get_face (GtkFontSelection *fontsel)
1262 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1264 return fontsel->face;
1268 * gtk_font_selection_get_size:
1269 * @fontsel: a #GtkFontSelection
1271 * The selected font size.
1273 * Return value: A n integer representing the selected font size,
1274 * or -1 if no font size is selected.
1279 gtk_font_selection_get_size (GtkFontSelection *fontsel)
1281 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), -1);
1283 return fontsel->size;
1287 * gtk_font_selection_get_font:
1288 * @fontsel: a #GtkFontSelection
1290 * Gets the currently-selected font.
1292 * Return value: A #GdkFont.
1294 * Deprecated: 2.0: Use gtk_font_selection_get_font_name() instead.
1297 gtk_font_selection_get_font (GtkFontSelection *fontsel)
1299 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1301 return gtk_font_selection_get_font_internal (fontsel);
1305 * gtk_font_selection_get_font_name:
1306 * @fontsel: a #GtkFontSelection
1308 * Gets the currently-selected font name.
1310 * Note that this can be a different string than what you set with
1311 * gtk_font_selection_set_font_name(), as the font selection widget may
1312 * normalize font names and thus return a string with a different structure.
1313 * For example, "Helvetica Italic Bold 12" could be normalized to
1314 * "Helvetica Bold Italic 12". Use pango_font_description_equal()
1315 * if you want to compare two font descriptions.
1317 * Return value: A string with the name of the current font, or %NULL if
1318 * no font is selected. You must free this string with g_free().
1321 gtk_font_selection_get_font_name (GtkFontSelection *fontsel)
1325 PangoFontDescription *font_desc = gtk_font_selection_get_font_description (fontsel);
1326 result = pango_font_description_to_string (font_desc);
1327 pango_font_description_free (font_desc);
1333 /* This sets the current font, selecting the appropriate list rows.
1334 First we check the fontname is valid and try to find the font family
1335 - i.e. the name in the main list. If we can't find that, then just return.
1336 Next we try to set each of the properties according to the fontname.
1337 Finally we select the font family & style in the lists. */
1340 * gtk_font_selection_set_font_name:
1341 * @fontsel: a #GtkFontSelection
1342 * @fontname: a font name like "Helvetica 12" or "Times Bold 18"
1344 * Sets the currently-selected font.
1346 * Note that the @fontsel needs to know the screen in which it will appear
1347 * for this to work; this can be guaranteed by simply making sure that the
1348 * @fontsel is inserted in a toplevel window before you call this function.
1350 * Return value: %TRUE if the font could be set successfully; %FALSE if no
1351 * such font exists or if the @fontsel doesn't belong to a particular
1355 gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
1356 const gchar *fontname)
1358 PangoFontFamily *new_family = NULL;
1359 PangoFontFace *new_face = NULL;
1360 PangoFontFace *fallback_face = NULL;
1361 PangoFontDescription *new_desc;
1362 GtkTreeModel *model;
1364 GtkTreeIter match_iter;
1366 const gchar *new_family_name;
1368 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), FALSE);
1370 if (!gtk_widget_has_screen (GTK_WIDGET (fontsel)))
1373 new_desc = pango_font_description_from_string (fontname);
1374 new_family_name = pango_font_description_get_family (new_desc);
1376 if (!new_family_name)
1379 /* Check to make sure that this is in the list of allowed fonts
1381 model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list));
1382 for (valid = gtk_tree_model_get_iter_first (model, &iter);
1384 valid = gtk_tree_model_iter_next (model, &iter))
1386 PangoFontFamily *family;
1388 gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
1390 if (g_ascii_strcasecmp (pango_font_family_get_name (family),
1391 new_family_name) == 0)
1392 new_family = family;
1394 g_object_unref (family);
1403 fontsel->family = new_family;
1404 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &iter);
1405 gtk_font_selection_show_available_styles (fontsel);
1407 model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list));
1408 for (valid = gtk_tree_model_get_iter_first (model, &iter);
1410 valid = gtk_tree_model_iter_next (model, &iter))
1412 PangoFontFace *face;
1413 PangoFontDescription *tmp_desc;
1415 gtk_tree_model_get (model, &iter, FACE_COLUMN, &face, -1);
1416 tmp_desc = pango_font_face_describe (face);
1418 if (font_description_style_equal (tmp_desc, new_desc))
1423 fallback_face = face;
1427 pango_font_description_free (tmp_desc);
1428 g_object_unref (face);
1438 new_face = fallback_face;
1440 fontsel->face = new_face;
1441 set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_iter);
1443 gtk_font_selection_set_size (fontsel, pango_font_description_get_size (new_desc));
1445 g_object_freeze_notify (G_OBJECT (fontsel));
1446 g_object_notify (G_OBJECT (fontsel), "font-name");
1447 g_object_notify (G_OBJECT (fontsel), "font");
1448 g_object_thaw_notify (G_OBJECT (fontsel));
1450 pango_font_description_free (new_desc);
1456 * gtk_font_selection_get_preview_text:
1457 * @fontsel: a #GtkFontSelection
1459 * Gets the text displayed in the preview area.
1461 * Return value: the text displayed in the preview area.
1462 * This string is owned by the widget and should not be
1465 G_CONST_RETURN gchar*
1466 gtk_font_selection_get_preview_text (GtkFontSelection *fontsel)
1468 g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
1470 return gtk_entry_get_text (GTK_ENTRY (fontsel->preview_entry));
1475 * gtk_font_selection_set_preview_text:
1476 * @fontsel: a #GtkFontSelection
1477 * @text: the text to display in the preview area
1479 * Sets the text displayed in the preview area.
1480 * The @text is used to show how the selected font looks.
1483 gtk_font_selection_set_preview_text (GtkFontSelection *fontsel,
1486 g_return_if_fail (GTK_IS_FONT_SELECTION (fontsel));
1487 g_return_if_fail (text != NULL);
1489 gtk_entry_set_text (GTK_ENTRY (fontsel->preview_entry), text);
1492 /*****************************************************************************
1493 * GtkFontSelectionDialog
1494 *****************************************************************************/
1496 static void gtk_font_selection_dialog_buildable_interface_init (GtkBuildableIface *iface);
1497 static GObject * gtk_font_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
1498 GtkBuilder *builder,
1499 const gchar *childname);
1501 G_DEFINE_TYPE_WITH_CODE (GtkFontSelectionDialog, gtk_font_selection_dialog,
1503 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
1504 gtk_font_selection_dialog_buildable_interface_init))
1506 static GtkBuildableIface *parent_buildable_iface;
1509 gtk_font_selection_dialog_class_init (GtkFontSelectionDialogClass *klass)
1514 gtk_font_selection_dialog_init (GtkFontSelectionDialog *fontseldiag)
1516 GtkDialog *dialog = GTK_DIALOG (fontseldiag);
1518 gtk_dialog_set_has_separator (dialog, FALSE);
1519 gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
1520 gtk_box_set_spacing (GTK_BOX (dialog->vbox), 2); /* 2 * 5 + 2 = 12 */
1521 gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 5);
1522 gtk_box_set_spacing (GTK_BOX (dialog->action_area), 6);
1524 gtk_widget_push_composite_child ();
1526 gtk_window_set_resizable (GTK_WINDOW (fontseldiag), TRUE);
1528 fontseldiag->main_vbox = dialog->vbox;
1530 fontseldiag->fontsel = gtk_font_selection_new ();
1531 gtk_container_set_border_width (GTK_CONTAINER (fontseldiag->fontsel), 5);
1532 gtk_widget_show (fontseldiag->fontsel);
1533 gtk_box_pack_start (GTK_BOX (fontseldiag->main_vbox),
1534 fontseldiag->fontsel, TRUE, TRUE, 0);
1536 /* Create the action area */
1537 fontseldiag->action_area = dialog->action_area;
1539 fontseldiag->cancel_button = gtk_dialog_add_button (dialog,
1541 GTK_RESPONSE_CANCEL);
1543 fontseldiag->apply_button = gtk_dialog_add_button (dialog,
1545 GTK_RESPONSE_APPLY);
1546 gtk_widget_hide (fontseldiag->apply_button);
1548 fontseldiag->ok_button = gtk_dialog_add_button (dialog,
1551 gtk_widget_grab_default (fontseldiag->ok_button);
1553 gtk_dialog_set_alternative_button_order (GTK_DIALOG (fontseldiag),
1556 GTK_RESPONSE_CANCEL,
1559 gtk_window_set_title (GTK_WINDOW (fontseldiag),
1560 _("Font Selection"));
1562 gtk_widget_pop_composite_child ();
1564 _gtk_dialog_set_ignore_separator (dialog, TRUE);
1568 * gtk_font_selection_dialog_new:
1569 * @title: the title of the dialog window
1571 * Creates a new #GtkFontSelectionDialog.
1573 * Return value: a new #GtkFontSelectionDialog
1576 gtk_font_selection_dialog_new (const gchar *title)
1578 GtkFontSelectionDialog *fontseldiag;
1580 fontseldiag = g_object_new (GTK_TYPE_FONT_SELECTION_DIALOG, NULL);
1583 gtk_window_set_title (GTK_WINDOW (fontseldiag), title);
1585 return GTK_WIDGET (fontseldiag);
1589 * gtk_font_selection_dialog_get_ok_button:
1590 * @fsd: a #GtkFontSelectionDialog
1592 * Gets the 'OK' button.
1594 * Return value: the #GtkWidget used in the dialog for the 'OK' button.
1599 gtk_font_selection_dialog_get_ok_button (GtkFontSelectionDialog *fsd)
1601 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
1603 return fsd->ok_button;
1607 * gtk_font_selection_dialog_get_apply_button:
1608 * @fsd: a #GtkFontSelectionDialog
1610 * Obtains a button. The button doesn't have any function.
1612 * Return value: a #GtkWidget
1616 * Deprecated: 2.16: Don't use this function.
1619 gtk_font_selection_dialog_get_apply_button (GtkFontSelectionDialog *fsd)
1621 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
1623 return fsd->apply_button;
1627 * gtk_font_selection_dialog_get_cancel_button:
1628 * @fsd: a #GtkFontSelectionDialog
1630 * Gets the 'Cancel' button.
1632 * Return value: the #GtkWidget used in the dialog for the 'Cancel' button.
1637 gtk_font_selection_dialog_get_cancel_button (GtkFontSelectionDialog *fsd)
1639 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
1641 return fsd->cancel_button;
1645 gtk_font_selection_dialog_buildable_interface_init (GtkBuildableIface *iface)
1647 parent_buildable_iface = g_type_interface_peek_parent (iface);
1648 iface->get_internal_child = gtk_font_selection_dialog_buildable_get_internal_child;
1652 gtk_font_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
1653 GtkBuilder *builder,
1654 const gchar *childname)
1656 if (strcmp(childname, "ok_button") == 0)
1657 return G_OBJECT (GTK_FONT_SELECTION_DIALOG(buildable)->ok_button);
1658 else if (strcmp(childname, "cancel_button") == 0)
1659 return G_OBJECT (GTK_FONT_SELECTION_DIALOG (buildable)->cancel_button);
1660 else if (strcmp(childname, "apply_button") == 0)
1661 return G_OBJECT (GTK_FONT_SELECTION_DIALOG(buildable)->apply_button);
1662 else if (strcmp(childname, "font_selection") == 0)
1663 return G_OBJECT (GTK_FONT_SELECTION_DIALOG(buildable)->fontsel);
1665 return parent_buildable_iface->get_internal_child (buildable, builder, childname);
1669 * gtk_font_selection_dialog_get_font_name:
1670 * @fsd: a #GtkFontSelectionDialog
1672 * Gets the currently-selected font name.
1674 * Note that this can be a different string than what you set with
1675 * gtk_font_selection_dialog_set_font_name(), as the font selection widget
1676 * may normalize font names and thus return a string with a different
1677 * structure. For example, "Helvetica Italic Bold 12" could be normalized
1678 * to "Helvetica Bold Italic 12". Use pango_font_description_equal()
1679 * if you want to compare two font descriptions.
1681 * Return value: A string with the name of the current font, or %NULL if no
1682 * font is selected. You must free this string with g_free().
1685 gtk_font_selection_dialog_get_font_name (GtkFontSelectionDialog *fsd)
1687 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
1689 return gtk_font_selection_get_font_name (GTK_FONT_SELECTION (fsd->fontsel));
1693 * gtk_font_selection_dialog_get_font:
1694 * @fsd: a #GtkFontSelectionDialog
1696 * Gets the currently-selected font.
1698 * Return value: the #GdkFont from the #GtkFontSelection for the
1699 * currently selected font in the dialog, or %NULL if no font is selected
1701 * Deprecated: 2.0: Use gtk_font_selection_dialog_get_font_name() instead.
1704 gtk_font_selection_dialog_get_font (GtkFontSelectionDialog *fsd)
1706 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
1708 return gtk_font_selection_get_font_internal (GTK_FONT_SELECTION (fsd->fontsel));
1712 * gtk_font_selection_dialog_set_font_name:
1713 * @fsd: a #GtkFontSelectionDialog
1714 * @fontname: a font name like "Helvetica 12" or "Times Bold 18"
1716 * Sets the currently selected font.
1718 * Return value: %TRUE if the font selected in @fsd is now the
1719 * @fontname specified, %FALSE otherwise.
1722 gtk_font_selection_dialog_set_font_name (GtkFontSelectionDialog *fsd,
1723 const gchar *fontname)
1725 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), FALSE);
1726 g_return_val_if_fail (fontname, FALSE);
1728 return gtk_font_selection_set_font_name (GTK_FONT_SELECTION (fsd->fontsel), fontname);
1732 * gtk_font_selection_dialog_get_preview_text:
1733 * @fsd: a #GtkFontSelectionDialog
1735 * Gets the text displayed in the preview area.
1737 * Return value: the text displayed in the preview area.
1738 * This string is owned by the widget and should not be
1741 G_CONST_RETURN gchar*
1742 gtk_font_selection_dialog_get_preview_text (GtkFontSelectionDialog *fsd)
1744 g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
1746 return gtk_font_selection_get_preview_text (GTK_FONT_SELECTION (fsd->fontsel));
1750 * gtk_font_selection_dialog_set_preview_text:
1751 * @fsd: a #GtkFontSelectionDialog
1752 * @text: the text to display in the preview area
1754 * Sets the text displayed in the preview area.
1757 gtk_font_selection_dialog_set_preview_text (GtkFontSelectionDialog *fsd,
1760 g_return_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd));
1761 g_return_if_fail (text != NULL);
1763 gtk_font_selection_set_preview_text (GTK_FONT_SELECTION (fsd->fontsel), text);
1766 #define __GTK_FONTSEL_C__
1767 #include "gtkaliasdef.c"