Blame gtk/gtkfontsel.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Massively updated for Pango by Owen Taylor, May 2000
Packit Service fb6fa5
 * GtkFontSelection widget for Gtk+, by Damon Chaplin, May 1998.
Packit Service fb6fa5
 * Based on the GnomeFontSelector widget, by Elliot Lee, but major changes.
Packit Service fb6fa5
 * The GnomeFontSelector was derived from app/text_tool.c in the GIMP.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit Service fb6fa5
 * files for a list of changes.  These files are distributed with
Packit Service fb6fa5
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <glib/gprintf.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <atk/atk.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdk/gdk.h"
Packit Service fb6fa5
#include "gdk/gdkkeysyms.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkfontsel.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkbutton.h"
Packit Service fb6fa5
#include "gtkcellrenderertext.h"
Packit Service fb6fa5
#include "gtkentry.h"
Packit Service fb6fa5
#include "gtkframe.h"
Packit Service fb6fa5
#include "gtkhbbox.h"
Packit Service fb6fa5
#include "gtkhbox.h"
Packit Service fb6fa5
#include "gtklabel.h"
Packit Service fb6fa5
#include "gtkliststore.h"
Packit Service fb6fa5
#include "gtkrc.h"
Packit Service fb6fa5
#include "gtkstock.h"
Packit Service fb6fa5
#include "gtktable.h"
Packit Service fb6fa5
#include "gtktreeselection.h"
Packit Service fb6fa5
#include "gtktreeview.h"
Packit Service fb6fa5
#include "gtkvbox.h"
Packit Service fb6fa5
#include "gtkscrolledwindow.h"
Packit Service fb6fa5
#include "gtkintl.h"
Packit Service fb6fa5
#include "gtkaccessible.h"
Packit Service fb6fa5
#include "gtkprivate.h"
Packit Service fb6fa5
#include "gtkbuildable.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
/* We don't enable the font and style entries because they don't add
Packit Service fb6fa5
 * much in terms of visible effect and have a weird effect on keynav.
Packit Service fb6fa5
 * the Windows font selector has entries similarly positioned but they
Packit Service fb6fa5
 * act in conjunction with the associated lists to form a single focus
Packit Service fb6fa5
 * location.
Packit Service fb6fa5
 */
Packit Service fb6fa5
#undef INCLUDE_FONT_ENTRIES
Packit Service fb6fa5
Packit Service fb6fa5
/* This is the default text shown in the preview entry, though the user
Packit Service fb6fa5
   can set it. Remember that some fonts only have capital letters. */
Packit Service fb6fa5
#define PREVIEW_TEXT N_("abcdefghijk ABCDEFGHIJK")
Packit Service fb6fa5
Packit Service fb6fa5
#define DEFAULT_FONT_NAME "Sans 10"
Packit Service fb6fa5
Packit Service fb6fa5
/* This is the initial and maximum height of the preview entry (it expands
Packit Service fb6fa5
   when large font sizes are selected). Initial height is also the minimum. */
Packit Service fb6fa5
#define INITIAL_PREVIEW_HEIGHT 44
Packit Service fb6fa5
#define MAX_PREVIEW_HEIGHT 300
Packit Service fb6fa5
Packit Service fb6fa5
/* These are the sizes of the font, style & size lists. */
Packit Service fb6fa5
#define FONT_LIST_HEIGHT	136
Packit Service fb6fa5
#define FONT_LIST_WIDTH		190
Packit Service fb6fa5
#define FONT_STYLE_LIST_WIDTH	170
Packit Service fb6fa5
#define FONT_SIZE_LIST_WIDTH	60
Packit Service fb6fa5
Packit Service fb6fa5
/* These are what we use as the standard font sizes, for the size list.
Packit Service fb6fa5
 */
Packit Service fb6fa5
static const guint16 font_sizes[] = {
Packit Service fb6fa5
  6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28,
Packit Service fb6fa5
  32, 36, 40, 48, 56, 64, 72
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
   PROP_0,
Packit Service fb6fa5
   PROP_FONT_NAME,
Packit Service fb6fa5
   PROP_FONT,
Packit Service fb6fa5
   PROP_PREVIEW_TEXT
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  FAMILY_COLUMN,
Packit Service fb6fa5
  FAMILY_NAME_COLUMN
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  FACE_COLUMN,
Packit Service fb6fa5
  FACE_NAME_COLUMN
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  SIZE_COLUMN
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static void    gtk_font_selection_set_property       (GObject         *object,
Packit Service fb6fa5
						      guint            prop_id,
Packit Service fb6fa5
						      const GValue    *value,
Packit Service fb6fa5
						      GParamSpec      *pspec);
Packit Service fb6fa5
static void    gtk_font_selection_get_property       (GObject         *object,
Packit Service fb6fa5
						      guint            prop_id,
Packit Service fb6fa5
						      GValue          *value,
Packit Service fb6fa5
						      GParamSpec      *pspec);
Packit Service fb6fa5
static void    gtk_font_selection_finalize	     (GObject         *object);
Packit Service fb6fa5
static void    gtk_font_selection_screen_changed     (GtkWidget	      *widget,
Packit Service fb6fa5
						      GdkScreen       *previous_screen);
Packit Service fb6fa5
static void    gtk_font_selection_style_set          (GtkWidget      *widget,
Packit Service fb6fa5
						      GtkStyle       *prev_style);
Packit Service fb6fa5
Packit Service fb6fa5
/* These are the callbacks & related functions. */
Packit Service fb6fa5
static void     gtk_font_selection_select_font           (GtkTreeSelection *selection,
Packit Service fb6fa5
							  gpointer          data);
Packit Service fb6fa5
static void     gtk_font_selection_show_available_fonts  (GtkFontSelection *fs);
Packit Service fb6fa5
Packit Service fb6fa5
static void     gtk_font_selection_show_available_styles (GtkFontSelection *fs);
Packit Service fb6fa5
static void     gtk_font_selection_select_best_style     (GtkFontSelection *fs,
Packit Service fb6fa5
							  gboolean          use_first);
Packit Service fb6fa5
static void     gtk_font_selection_select_style          (GtkTreeSelection *selection,
Packit Service fb6fa5
							  gpointer          data);
Packit Service fb6fa5
Packit Service fb6fa5
static void     gtk_font_selection_select_best_size      (GtkFontSelection *fs);
Packit Service fb6fa5
static void     gtk_font_selection_show_available_sizes  (GtkFontSelection *fs,
Packit Service fb6fa5
							  gboolean          first_time);
Packit Service fb6fa5
static void     gtk_font_selection_size_activate         (GtkWidget        *w,
Packit Service fb6fa5
							  gpointer          data);
Packit Service fb6fa5
static gboolean gtk_font_selection_size_focus_out        (GtkWidget        *w,
Packit Service fb6fa5
							  GdkEventFocus    *event,
Packit Service fb6fa5
							  gpointer          data);
Packit Service fb6fa5
static void     gtk_font_selection_select_size           (GtkTreeSelection *selection,
Packit Service fb6fa5
							  gpointer          data);
Packit Service fb6fa5
Packit Service fb6fa5
static void     gtk_font_selection_scroll_on_map         (GtkWidget        *w,
Packit Service fb6fa5
							  gpointer          data);
Packit Service fb6fa5
Packit Service fb6fa5
static void     gtk_font_selection_preview_changed       (GtkWidget        *entry,
Packit Service fb6fa5
							  GtkFontSelection *fontsel);
Packit Service fb6fa5
static void     gtk_font_selection_scroll_to_selection   (GtkFontSelection *fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* Misc. utility functions. */
Packit Service fb6fa5
static void    gtk_font_selection_load_font          (GtkFontSelection *fs);
Packit Service fb6fa5
static void    gtk_font_selection_update_preview     (GtkFontSelection *fs);
Packit Service fb6fa5
Packit Service fb6fa5
static GdkFont* gtk_font_selection_get_font_internal (GtkFontSelection *fontsel);
Packit Service fb6fa5
static PangoFontDescription *gtk_font_selection_get_font_description (GtkFontSelection *fontsel);
Packit Service fb6fa5
static gboolean gtk_font_selection_select_font_desc  (GtkFontSelection      *fontsel,
Packit Service fb6fa5
						      PangoFontDescription  *new_desc,
Packit Service fb6fa5
						      PangoFontFamily      **pfamily,
Packit Service fb6fa5
						      PangoFontFace        **pface);
Packit Service fb6fa5
static void     gtk_font_selection_reload_fonts          (GtkFontSelection *fontsel);
Packit Service fb6fa5
static void     gtk_font_selection_ref_family            (GtkFontSelection *fontsel,
Packit Service fb6fa5
							  PangoFontFamily  *family);
Packit Service fb6fa5
static void     gtk_font_selection_ref_face              (GtkFontSelection *fontsel,
Packit Service fb6fa5
							  PangoFontFace    *face);
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE (GtkFontSelection, gtk_font_selection, GTK_TYPE_VBOX)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_class_init (GtkFontSelectionClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit Service fb6fa5
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gobject_class->set_property = gtk_font_selection_set_property;
Packit Service fb6fa5
  gobject_class->get_property = gtk_font_selection_get_property;
Packit Service fb6fa5
Packit Service fb6fa5
  widget_class->screen_changed = gtk_font_selection_screen_changed;
Packit Service fb6fa5
  widget_class->style_set = gtk_font_selection_style_set;
Packit Service fb6fa5
   
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_FONT_NAME,
Packit Service fb6fa5
                                   g_param_spec_string ("font-name",
Packit Service fb6fa5
                                                        P_("Font name"),
Packit Service fb6fa5
                                                        P_("The string that represents this font"),
Packit Service fb6fa5
                                                        DEFAULT_FONT_NAME,
Packit Service fb6fa5
                                                        GTK_PARAM_READWRITE));
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_FONT,
Packit Service fb6fa5
				   g_param_spec_boxed ("font",
Packit Service fb6fa5
						       P_("Font"),
Packit Service fb6fa5
						       P_("The GdkFont that is currently selected"),
Packit Service fb6fa5
						       GDK_TYPE_FONT,
Packit Service fb6fa5
						       GTK_PARAM_READABLE));
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
                                   PROP_PREVIEW_TEXT,
Packit Service fb6fa5
                                   g_param_spec_string ("preview-text",
Packit Service fb6fa5
                                                        P_("Preview text"),
Packit Service fb6fa5
                                                        P_("The text to display in order to demonstrate the selected font"),
Packit Service fb6fa5
                                                        _(PREVIEW_TEXT),
Packit Service fb6fa5
                                                        GTK_PARAM_READWRITE));
Packit Service fb6fa5
  gobject_class->finalize = gtk_font_selection_finalize;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
gtk_font_selection_set_property (GObject         *object,
Packit Service fb6fa5
				 guint            prop_id,
Packit Service fb6fa5
				 const GValue    *value,
Packit Service fb6fa5
				 GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (object);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_FONT_NAME:
Packit Service fb6fa5
      gtk_font_selection_set_font_name (fontsel, g_value_get_string (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_PREVIEW_TEXT:
Packit Service fb6fa5
      gtk_font_selection_set_preview_text (fontsel, g_value_get_string (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void gtk_font_selection_get_property (GObject         *object,
Packit Service fb6fa5
					     guint            prop_id,
Packit Service fb6fa5
					     GValue          *value,
Packit Service fb6fa5
					     GParamSpec      *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (object);
Packit Service fb6fa5
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_FONT_NAME:
Packit Service fb6fa5
      g_value_take_string (value, gtk_font_selection_get_font_name (fontsel));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_FONT:
Packit Service fb6fa5
      g_value_set_boxed (value, gtk_font_selection_get_font_internal (fontsel));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_PREVIEW_TEXT:
Packit Service fb6fa5
      g_value_set_string (value, gtk_font_selection_get_preview_text (fontsel));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Handles key press events on the lists, so that we can trap Enter to
Packit Service fb6fa5
 * activate the default button on our own.
Packit Service fb6fa5
 */
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
list_row_activated (GtkWidget *widget)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWindow *window;
Packit Service fb6fa5
  
Packit Service fb6fa5
  window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (widget)));
Packit Service fb6fa5
  if (!gtk_widget_is_toplevel (GTK_WIDGET (window)))
Packit Service fb6fa5
    window = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (window
Packit Service fb6fa5
      && widget != window->default_widget
Packit Service fb6fa5
      && !(widget == window->focus_widget &&
Packit Service fb6fa5
	   (!window->default_widget || !gtk_widget_get_sensitive (window->default_widget))))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_window_activate_default (window);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_init (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *scrolled_win;
Packit Service fb6fa5
  GtkWidget *text_box;
Packit Service fb6fa5
  GtkWidget *table, *label;
Packit Service fb6fa5
  GtkWidget *font_label, *style_label;
Packit Service fb6fa5
  GtkWidget *vbox;
Packit Service fb6fa5
  GtkListStore *model;
Packit Service fb6fa5
  GtkTreeViewColumn *column;
Packit Service fb6fa5
  GList *focus_chain = NULL;
Packit Service fb6fa5
  AtkObject *atk_obj;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_push_composite_child ();
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_box_set_spacing (GTK_BOX (fontsel), 12);
Packit Service fb6fa5
  fontsel->size = 12 * PANGO_SCALE;
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Create the table of font, style & size. */
Packit Service fb6fa5
  table = gtk_table_new (3, 3, FALSE);
Packit Service fb6fa5
  gtk_widget_show (table);
Packit Service fb6fa5
  gtk_table_set_row_spacings (GTK_TABLE (table), 6);
Packit Service fb6fa5
  gtk_table_set_col_spacings (GTK_TABLE (table), 12);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (fontsel), table, TRUE, TRUE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef INCLUDE_FONT_ENTRIES
Packit Service fb6fa5
  fontsel->font_entry = gtk_entry_new ();
Packit Service fb6fa5
  gtk_editable_set_editable (GTK_EDITABLE (fontsel->font_entry), FALSE);
Packit Service fb6fa5
  gtk_widget_set_size_request (fontsel->font_entry, 20, -1);
Packit Service fb6fa5
  gtk_widget_show (fontsel->font_entry);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), fontsel->font_entry, 0, 1, 1, 2,
Packit Service fb6fa5
		    GTK_FILL, 0, 0, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel->font_style_entry = gtk_entry_new ();
Packit Service fb6fa5
  gtk_editable_set_editable (GTK_EDITABLE (fontsel->font_style_entry), FALSE);
Packit Service fb6fa5
  gtk_widget_set_size_request (fontsel->font_style_entry, 20, -1);
Packit Service fb6fa5
  gtk_widget_show (fontsel->font_style_entry);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), fontsel->font_style_entry, 1, 2, 1, 2,
Packit Service fb6fa5
		    GTK_FILL, 0, 0, 0);
Packit Service fb6fa5
#endif /* INCLUDE_FONT_ENTRIES */
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel->size_entry = gtk_entry_new ();
Packit Service fb6fa5
  gtk_widget_set_size_request (fontsel->size_entry, 20, -1);
Packit Service fb6fa5
  gtk_widget_show (fontsel->size_entry);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), fontsel->size_entry, 2, 3, 1, 2,
Packit Service fb6fa5
		    GTK_FILL, 0, 0, 0);
Packit Service fb6fa5
  g_signal_connect (fontsel->size_entry, "activate",
Packit Service fb6fa5
		    G_CALLBACK (gtk_font_selection_size_activate),
Packit Service fb6fa5
		    fontsel);
Packit Service fb6fa5
  g_signal_connect_after (fontsel->size_entry, "focus-out-event",
Packit Service fb6fa5
			  G_CALLBACK (gtk_font_selection_size_focus_out),
Packit Service fb6fa5
			  fontsel);
Packit Service fb6fa5
  
Packit Service fb6fa5
  font_label = gtk_label_new_with_mnemonic (_("_Family:"));
Packit Service fb6fa5
  gtk_misc_set_alignment (GTK_MISC (font_label), 0.0, 0.5);
Packit Service fb6fa5
  gtk_widget_show (font_label);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), font_label, 0, 1, 0, 1,
Packit Service fb6fa5
		    GTK_FILL, 0, 0, 0);  
Packit Service fb6fa5
Packit Service fb6fa5
  style_label = gtk_label_new_with_mnemonic (_("_Style:"));
Packit Service fb6fa5
  gtk_misc_set_alignment (GTK_MISC (style_label), 0.0, 0.5);
Packit Service fb6fa5
  gtk_widget_show (style_label);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), style_label, 1, 2, 0, 1,
Packit Service fb6fa5
		    GTK_FILL, 0, 0, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  label = gtk_label_new_with_mnemonic (_("Si_ze:"));
Packit Service fb6fa5
  gtk_label_set_mnemonic_widget (GTK_LABEL (label),
Packit Service fb6fa5
                                 fontsel->size_entry);
Packit Service fb6fa5
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
Packit Service fb6fa5
  gtk_widget_show (label);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
Packit Service fb6fa5
		    GTK_FILL, 0, 0, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Create the lists  */
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_list_store_new (2,
Packit Service fb6fa5
			      G_TYPE_OBJECT,  /* FAMILY_COLUMN */
Packit Service fb6fa5
			      G_TYPE_STRING); /* FAMILY_NAME_COLUMN */
Packit Service fb6fa5
  fontsel->family_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
Packit Service fb6fa5
  g_object_unref (model);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_connect (fontsel->family_list, "row-activated",
Packit Service fb6fa5
		    G_CALLBACK (list_row_activated), fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
  column = gtk_tree_view_column_new_with_attributes ("Family",
Packit Service fb6fa5
						     gtk_cell_renderer_text_new (),
Packit Service fb6fa5
						     "text", FAMILY_NAME_COLUMN,
Packit Service fb6fa5
						     NULL);
Packit Service fb6fa5
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
Packit Service fb6fa5
  gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->family_list), column);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->family_list), FALSE);
Packit Service fb6fa5
  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)),
Packit Service fb6fa5
			       GTK_SELECTION_BROWSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_label_set_mnemonic_widget (GTK_LABEL (font_label), fontsel->family_list);
Packit Service fb6fa5
Packit Service fb6fa5
  scrolled_win = gtk_scrolled_window_new (NULL, NULL);
Packit Service fb6fa5
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
Packit Service fb6fa5
  gtk_widget_set_size_request (scrolled_win,
Packit Service fb6fa5
			       FONT_LIST_WIDTH, FONT_LIST_HEIGHT);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->family_list);
Packit Service fb6fa5
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
Packit Service fb6fa5
				  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
Packit Service fb6fa5
  gtk_widget_show (fontsel->family_list);
Packit Service fb6fa5
  gtk_widget_show (scrolled_win);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), scrolled_win, 0, 1, 1, 3,
Packit Service fb6fa5
		    GTK_EXPAND | GTK_FILL,
Packit Service fb6fa5
		    GTK_EXPAND | GTK_FILL, 0, 0);
Packit Service fb6fa5
  focus_chain = g_list_append (focus_chain, scrolled_win);
Packit Service fb6fa5
  
Packit Service fb6fa5
  model = gtk_list_store_new (2,
Packit Service fb6fa5
			      G_TYPE_OBJECT,  /* FACE_COLUMN */
Packit Service fb6fa5
			      G_TYPE_STRING); /* FACE_NAME_COLUMN */
Packit Service fb6fa5
  fontsel->face_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
Packit Service fb6fa5
  g_object_unref (model);
Packit Service fb6fa5
  g_signal_connect (fontsel->face_list, "row-activated",
Packit Service fb6fa5
		    G_CALLBACK (list_row_activated), fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_label_set_mnemonic_widget (GTK_LABEL (style_label), fontsel->face_list);
Packit Service fb6fa5
Packit Service fb6fa5
  column = gtk_tree_view_column_new_with_attributes ("Face",
Packit Service fb6fa5
						     gtk_cell_renderer_text_new (),
Packit Service fb6fa5
						     "text", FACE_NAME_COLUMN,
Packit Service fb6fa5
						     NULL);
Packit Service fb6fa5
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
Packit Service fb6fa5
  gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->face_list), column);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->face_list), FALSE);
Packit Service fb6fa5
  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)),
Packit Service fb6fa5
			       GTK_SELECTION_BROWSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  scrolled_win = gtk_scrolled_window_new (NULL, NULL);
Packit Service fb6fa5
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
Packit Service fb6fa5
  gtk_widget_set_size_request (scrolled_win,
Packit Service fb6fa5
			       FONT_STYLE_LIST_WIDTH, FONT_LIST_HEIGHT);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->face_list);
Packit Service fb6fa5
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
Packit Service fb6fa5
				  GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
Packit Service fb6fa5
  gtk_widget_show (fontsel->face_list);
Packit Service fb6fa5
  gtk_widget_show (scrolled_win);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), scrolled_win, 1, 2, 1, 3,
Packit Service fb6fa5
		    GTK_EXPAND | GTK_FILL,
Packit Service fb6fa5
		    GTK_EXPAND | GTK_FILL, 0, 0);
Packit Service fb6fa5
  focus_chain = g_list_append (focus_chain, scrolled_win);
Packit Service fb6fa5
  
Packit Service fb6fa5
  focus_chain = g_list_append (focus_chain, fontsel->size_entry);
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_list_store_new (1, G_TYPE_INT);
Packit Service fb6fa5
  fontsel->size_list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
Packit Service fb6fa5
  g_object_unref (model);
Packit Service fb6fa5
  g_signal_connect (fontsel->size_list, "row-activated",
Packit Service fb6fa5
		    G_CALLBACK (list_row_activated), fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
  column = gtk_tree_view_column_new_with_attributes ("Size",
Packit Service fb6fa5
						     gtk_cell_renderer_text_new (),
Packit Service fb6fa5
						     "text", SIZE_COLUMN,
Packit Service fb6fa5
						     NULL);
Packit Service fb6fa5
  gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
Packit Service fb6fa5
  gtk_tree_view_append_column (GTK_TREE_VIEW (fontsel->size_list), column);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (fontsel->size_list), FALSE);
Packit Service fb6fa5
  gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list)),
Packit Service fb6fa5
			       GTK_SELECTION_BROWSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  scrolled_win = gtk_scrolled_window_new (NULL, NULL);
Packit Service fb6fa5
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_win), GTK_SHADOW_IN);
Packit Service fb6fa5
  gtk_container_add (GTK_CONTAINER (scrolled_win), fontsel->size_list);
Packit Service fb6fa5
  gtk_widget_set_size_request (scrolled_win, -1, FONT_LIST_HEIGHT);
Packit Service fb6fa5
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win),
Packit Service fb6fa5
				  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
Packit Service fb6fa5
  gtk_widget_show (fontsel->size_list);
Packit Service fb6fa5
  gtk_widget_show (scrolled_win);
Packit Service fb6fa5
  gtk_table_attach (GTK_TABLE (table), scrolled_win, 2, 3, 2, 3,
Packit Service fb6fa5
		    GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
Packit Service fb6fa5
  focus_chain = g_list_append (focus_chain, scrolled_win);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_container_set_focus_chain (GTK_CONTAINER (table), focus_chain);
Packit Service fb6fa5
  g_list_free (focus_chain);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Insert the fonts. */
Packit Service fb6fa5
  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list)), "changed",
Packit Service fb6fa5
		    G_CALLBACK (gtk_font_selection_select_font), fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_connect_after (fontsel->family_list, "map",
Packit Service fb6fa5
			  G_CALLBACK (gtk_font_selection_scroll_on_map),
Packit Service fb6fa5
			  fontsel);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list)), "changed",
Packit Service fb6fa5
		    G_CALLBACK (gtk_font_selection_select_style), fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list)), "changed",
Packit Service fb6fa5
		    G_CALLBACK (gtk_font_selection_select_size), fontsel);
Packit Service fb6fa5
  atk_obj = gtk_widget_get_accessible (fontsel->size_list);
Packit Service fb6fa5
  if (GTK_IS_ACCESSIBLE (atk_obj))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Accessibility support is enabled.
Packit Service fb6fa5
       * Make the label ATK_RELATON_LABEL_FOR for the size list as well.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      AtkObject *atk_label;
Packit Service fb6fa5
      AtkRelationSet *relation_set;
Packit Service fb6fa5
      AtkRelation *relation;
Packit Service fb6fa5
      AtkObject *obj_array[1];
Packit Service fb6fa5
Packit Service fb6fa5
      atk_label = gtk_widget_get_accessible (label);
Packit Service fb6fa5
      relation_set = atk_object_ref_relation_set (atk_obj);
Packit Service fb6fa5
      relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_LABELLED_BY);
Packit Service fb6fa5
      if (relation)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          atk_relation_add_target (relation, atk_label);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else 
Packit Service fb6fa5
        {
Packit Service fb6fa5
          obj_array[0] = atk_label;
Packit Service fb6fa5
          relation = atk_relation_new (obj_array, 1, ATK_RELATION_LABELLED_BY);
Packit Service fb6fa5
          atk_relation_set_add (relation_set, relation);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      g_object_unref (relation_set);
Packit Service fb6fa5
Packit Service fb6fa5
      relation_set = atk_object_ref_relation_set (atk_label);
Packit Service fb6fa5
      relation = atk_relation_set_get_relation_by_type (relation_set, ATK_RELATION_LABEL_FOR);
Packit Service fb6fa5
      if (relation)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          atk_relation_add_target (relation, atk_obj);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else 
Packit Service fb6fa5
        {
Packit Service fb6fa5
          obj_array[0] = atk_obj;
Packit Service fb6fa5
          relation = atk_relation_new (obj_array, 1, ATK_RELATION_LABEL_FOR);
Packit Service fb6fa5
          atk_relation_set_add (relation_set, relation);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      g_object_unref (relation_set);
Packit Service fb6fa5
    }    
Packit Service fb6fa5
      
Packit Service fb6fa5
Packit Service fb6fa5
  vbox = gtk_vbox_new (FALSE, 6);
Packit Service fb6fa5
  gtk_widget_show (vbox);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (fontsel), vbox, FALSE, TRUE, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* create the text entry widget */
Packit Service fb6fa5
  label = gtk_label_new_with_mnemonic (_("_Preview:"));
Packit Service fb6fa5
  gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
Packit Service fb6fa5
  gtk_widget_show (label);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, TRUE, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  text_box = gtk_hbox_new (FALSE, 0);
Packit Service fb6fa5
  gtk_widget_show (text_box);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (vbox), text_box, FALSE, TRUE, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel->preview_entry = gtk_entry_new ();
Packit Service fb6fa5
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), fontsel->preview_entry);
Packit Service fb6fa5
  gtk_entry_set_text (GTK_ENTRY (fontsel->preview_entry), _(PREVIEW_TEXT));
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_widget_show (fontsel->preview_entry);
Packit Service fb6fa5
  g_signal_connect (fontsel->preview_entry, "changed",
Packit Service fb6fa5
		    G_CALLBACK (gtk_font_selection_preview_changed), fontsel);
Packit Service fb6fa5
  gtk_widget_set_size_request (fontsel->preview_entry,
Packit Service fb6fa5
			       -1, INITIAL_PREVIEW_HEIGHT);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (text_box), fontsel->preview_entry,
Packit Service fb6fa5
		      TRUE, TRUE, 0);
Packit Service fb6fa5
  gtk_widget_pop_composite_child();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_new:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Creates a new #GtkFontSelection.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: a n ew #GtkFontSelection
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_new (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel = g_object_new (GTK_TYPE_FONT_SELECTION, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return GTK_WIDGET (fontsel);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_finalize (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_FONT_SELECTION (object));
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (object);
Packit Service fb6fa5
Packit Service fb6fa5
  if (fontsel->font)
Packit Service fb6fa5
    gdk_font_unref (fontsel->font);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_ref_family (fontsel, NULL);
Packit Service fb6fa5
  gtk_font_selection_ref_face (fontsel, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  G_OBJECT_CLASS (gtk_font_selection_parent_class)->finalize (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_ref_family (GtkFontSelection *fontsel,
Packit Service fb6fa5
			       PangoFontFamily  *family)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (family)
Packit Service fb6fa5
    family = g_object_ref (family);
Packit Service fb6fa5
  if (fontsel->family)
Packit Service fb6fa5
    g_object_unref (fontsel->family);
Packit Service fb6fa5
  fontsel->family = family;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void gtk_font_selection_ref_face (GtkFontSelection *fontsel,
Packit Service fb6fa5
					 PangoFontFace    *face)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (face)
Packit Service fb6fa5
    face = g_object_ref (face);
Packit Service fb6fa5
  if (fontsel->face)
Packit Service fb6fa5
    g_object_unref (fontsel->face);
Packit Service fb6fa5
  fontsel->face = face;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_reload_fonts (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (gtk_widget_has_screen (GTK_WIDGET (fontsel)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      PangoFontDescription *desc;
Packit Service fb6fa5
      desc = gtk_font_selection_get_font_description (fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_font_selection_show_available_fonts (fontsel);
Packit Service fb6fa5
      gtk_font_selection_show_available_sizes (fontsel, TRUE);
Packit Service fb6fa5
      gtk_font_selection_show_available_styles (fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_font_selection_select_font_desc (fontsel, desc, NULL, NULL);
Packit Service fb6fa5
      gtk_font_selection_scroll_to_selection (fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
      pango_font_description_free (desc);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_screen_changed (GtkWidget *widget,
Packit Service fb6fa5
				   GdkScreen *previous_screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_font_selection_reload_fonts (GTK_FONT_SELECTION (widget));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_style_set (GtkWidget *widget,
Packit Service fb6fa5
			      GtkStyle  *prev_style)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Maybe fonts where installed or removed... */
Packit Service fb6fa5
  gtk_font_selection_reload_fonts (GTK_FONT_SELECTION (widget));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_preview_changed (GtkWidget        *entry,
Packit Service fb6fa5
				    GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_object_notify (G_OBJECT (fontsel), "preview-text");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
scroll_to_selection (GtkTreeView *tree_view)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
Packit Service fb6fa5
      gtk_tree_view_scroll_to_cell (tree_view, path, NULL, TRUE, 0.5, 0.5);
Packit Service fb6fa5
      gtk_tree_path_free (path);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
set_cursor_to_iter (GtkTreeView *view,
Packit Service fb6fa5
		    GtkTreeIter *iter)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeModel *model = gtk_tree_view_get_model (view);
Packit Service fb6fa5
  GtkTreePath *path = gtk_tree_model_get_path (model, iter);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_tree_view_set_cursor (view, path, NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_tree_path_free (path);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_scroll_to_selection (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Try to scroll the font family list to the selected item */
Packit Service fb6fa5
  scroll_to_selection (GTK_TREE_VIEW (fontsel->family_list));
Packit Service fb6fa5
      
Packit Service fb6fa5
  /* Try to scroll the font family list to the selected item */
Packit Service fb6fa5
  scroll_to_selection (GTK_TREE_VIEW (fontsel->face_list));
Packit Service fb6fa5
      
Packit Service fb6fa5
  /* Try to scroll the font family list to the selected item */
Packit Service fb6fa5
  scroll_to_selection (GTK_TREE_VIEW (fontsel->size_list));
Packit Service fb6fa5
/* This is called when the list is mapped. Here we scroll to the current
Packit Service fb6fa5
   font if necessary. */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_scroll_on_map (GtkWidget		*widget,
Packit Service fb6fa5
                                  gpointer		 data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_font_selection_scroll_to_selection (GTK_FONT_SELECTION (data));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This is called when a family is selected in the list. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_select_font (GtkTreeSelection *selection,
Packit Service fb6fa5
				gpointer          data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
#ifdef INCLUDE_FONT_ENTRIES
Packit Service fb6fa5
  const gchar *family_name;
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (data);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      PangoFontFamily *family;
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
Packit Service fb6fa5
      if (fontsel->family != family)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gtk_font_selection_ref_family (fontsel, family);
Packit Service fb6fa5
	  
Packit Service fb6fa5
#ifdef INCLUDE_FONT_ENTRIES
Packit Service fb6fa5
	  family_name = pango_font_family_get_name (fontsel->family);
Packit Service fb6fa5
	  gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), family_name);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  gtk_font_selection_show_available_styles (fontsel);
Packit Service fb6fa5
	  gtk_font_selection_select_best_style (fontsel, TRUE);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_unref (family);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static int
Packit Service fb6fa5
cmp_families (const void *a, const void *b)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const char *a_name = pango_font_family_get_name (*(PangoFontFamily **)a);
Packit Service fb6fa5
  const char *b_name = pango_font_family_get_name (*(PangoFontFamily **)b);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return g_utf8_collate (a_name, b_name);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkListStore *model;
Packit Service fb6fa5
  PangoFontFamily **families;
Packit Service fb6fa5
  PangoFontFamily *match_family = NULL;
Packit Service fb6fa5
  gint n_families, i;
Packit Service fb6fa5
  GtkTreeIter match_row;
Packit Service fb6fa5
  
Packit Service fb6fa5
  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list)));
Packit Service fb6fa5
  
Packit Service fb6fa5
  pango_context_list_families (gtk_widget_get_pango_context (GTK_WIDGET (fontsel)),
Packit Service fb6fa5
			       &families, &n_families);
Packit Service fb6fa5
  qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_list_store_clear (model);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i=0; i
Packit Service fb6fa5
    {
Packit Service fb6fa5
      const gchar *name = pango_font_family_get_name (families[i]);
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_list_store_append (model, &iter);
Packit Service fb6fa5
      gtk_list_store_set (model, &iter,
Packit Service fb6fa5
			  FAMILY_COLUMN, families[i],
Packit Service fb6fa5
			  FAMILY_NAME_COLUMN, name,
Packit Service fb6fa5
			  -1);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (i == 0 || !g_ascii_strcasecmp (name, "sans"))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  match_family = families[i];
Packit Service fb6fa5
	  match_row = iter;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_ref_family (fontsel, match_family);
Packit Service fb6fa5
  if (match_family)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &match_row);
Packit Service fb6fa5
#ifdef INCLUDE_FONT_ENTRIES
Packit Service fb6fa5
      gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), 
Packit Service fb6fa5
			  pango_font_family_get_name (match_family));
Packit Service fb6fa5
#endif /* INCLUDE_FONT_ENTRIES */
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (families);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static int
Packit Service fb6fa5
compare_font_descriptions (const PangoFontDescription *a, const PangoFontDescription *b)
Packit Service fb6fa5
{
Packit Service fb6fa5
  int val = strcmp (pango_font_description_get_family (a), pango_font_description_get_family (b));
Packit Service fb6fa5
  if (val != 0)
Packit Service fb6fa5
    return val;
Packit Service fb6fa5
Packit Service fb6fa5
  if (pango_font_description_get_weight (a) != pango_font_description_get_weight (b))
Packit Service fb6fa5
    return pango_font_description_get_weight (a) - pango_font_description_get_weight (b);
Packit Service fb6fa5
Packit Service fb6fa5
  if (pango_font_description_get_style (a) != pango_font_description_get_style (b))
Packit Service fb6fa5
    return pango_font_description_get_style (a) - pango_font_description_get_style (b);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (pango_font_description_get_stretch (a) != pango_font_description_get_stretch (b))
Packit Service fb6fa5
    return pango_font_description_get_stretch (a) - pango_font_description_get_stretch (b);
Packit Service fb6fa5
Packit Service fb6fa5
  if (pango_font_description_get_variant (a) != pango_font_description_get_variant (b))
Packit Service fb6fa5
    return pango_font_description_get_variant (a) - pango_font_description_get_variant (b);
Packit Service fb6fa5
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static int
Packit Service fb6fa5
faces_sort_func (const void *a, const void *b)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PangoFontDescription *desc_a = pango_font_face_describe (*(PangoFontFace **)a);
Packit Service fb6fa5
  PangoFontDescription *desc_b = pango_font_face_describe (*(PangoFontFace **)b);
Packit Service fb6fa5
  
Packit Service fb6fa5
  int ord = compare_font_descriptions (desc_a, desc_b);
Packit Service fb6fa5
Packit Service fb6fa5
  pango_font_description_free (desc_a);
Packit Service fb6fa5
  pango_font_description_free (desc_b);
Packit Service fb6fa5
Packit Service fb6fa5
  return ord;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
font_description_style_equal (const PangoFontDescription *a,
Packit Service fb6fa5
			      const PangoFontDescription *b)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return (pango_font_description_get_weight (a) == pango_font_description_get_weight (b) &&
Packit Service fb6fa5
	  pango_font_description_get_style (a) == pango_font_description_get_style (b) &&
Packit Service fb6fa5
	  pango_font_description_get_stretch (a) == pango_font_description_get_stretch (b) &&
Packit Service fb6fa5
	  pango_font_description_get_variant (a) == pango_font_description_get_variant (b));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This fills the font style list with all the possible style combinations
Packit Service fb6fa5
   for the current font family. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint n_faces, i;
Packit Service fb6fa5
  PangoFontFace **faces;
Packit Service fb6fa5
  PangoFontDescription *old_desc;
Packit Service fb6fa5
  GtkListStore *model;
Packit Service fb6fa5
  GtkTreeIter match_row;
Packit Service fb6fa5
  PangoFontFace *match_face = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list)));
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (fontsel->face)
Packit Service fb6fa5
    old_desc = pango_font_face_describe (fontsel->face);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    old_desc= NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  pango_font_family_list_faces (fontsel->family, &faces, &n_faces);
Packit Service fb6fa5
  qsort (faces, n_faces, sizeof (PangoFontFace *), faces_sort_func);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_list_store_clear (model);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i=0; i < n_faces; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
      const gchar *str = pango_font_face_get_face_name (faces[i]);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_list_store_append (model, &iter);
Packit Service fb6fa5
      gtk_list_store_set (model, &iter,
Packit Service fb6fa5
			  FACE_COLUMN, faces[i],
Packit Service fb6fa5
			  FACE_NAME_COLUMN, str,
Packit Service fb6fa5
			  -1);
Packit Service fb6fa5
Packit Service fb6fa5
      if (i == 0)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  match_row = iter;
Packit Service fb6fa5
	  match_face = faces[i];
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else if (old_desc)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  PangoFontDescription *tmp_desc = pango_font_face_describe (faces[i]);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (font_description_style_equal (tmp_desc, old_desc))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      match_row = iter;
Packit Service fb6fa5
	      match_face = faces[i];
Packit Service fb6fa5
	    }
Packit Service fb6fa5
      
Packit Service fb6fa5
	  pango_font_description_free (tmp_desc);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (old_desc)
Packit Service fb6fa5
    pango_font_description_free (old_desc);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_ref_face (fontsel, match_face);
Packit Service fb6fa5
  if (match_face)
Packit Service fb6fa5
    {
Packit Service fb6fa5
#ifdef INCLUDE_FONT_ENTRIES
Packit Service fb6fa5
      const gchar *str = pango_font_face_get_face_name (fontsel->face);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_entry_set_text (GTK_ENTRY (fontsel->font_style_entry), str);
Packit Service fb6fa5
#endif      
Packit Service fb6fa5
      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_row);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (faces);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This selects a style when the user selects a font. It just uses the first
Packit Service fb6fa5
   available style at present. I was thinking of trying to maintain the
Packit Service fb6fa5
   selected style, e.g. bold italic, when the user selects different fonts.
Packit Service fb6fa5
   However, the interface is so easy to use now I'm not sure it's worth it.
Packit Service fb6fa5
   Note: This will load a font. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_select_best_style (GtkFontSelection *fontsel,
Packit Service fb6fa5
				      gboolean	        use_first)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list));
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_tree_model_get_iter_first (model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &iter);
Packit Service fb6fa5
      scroll_to_selection (GTK_TREE_VIEW (fontsel->face_list));
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_show_available_sizes (fontsel, FALSE);
Packit Service fb6fa5
  gtk_font_selection_select_best_size (fontsel);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* This is called when a style is selected in the list. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_select_style (GtkTreeSelection *selection,
Packit Service fb6fa5
				 gpointer          data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      PangoFontFace *face;
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_tree_model_get (model, &iter, FACE_COLUMN, &face, -1);
Packit Service fb6fa5
      gtk_font_selection_ref_face (fontsel, face);
Packit Service fb6fa5
      g_object_unref (face);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_show_available_sizes (fontsel, FALSE);
Packit Service fb6fa5
  gtk_font_selection_select_best_size (fontsel);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
Packit Service fb6fa5
					 gboolean          first_time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
  GtkListStore *model;
Packit Service fb6fa5
  gchar buffer[128];
Packit Service fb6fa5
  gchar *p;
Packit Service fb6fa5
      
Packit Service fb6fa5
  model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->size_list)));
Packit Service fb6fa5
Packit Service fb6fa5
  /* Insert the standard font sizes */
Packit Service fb6fa5
  if (first_time)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_list_store_clear (model);
Packit Service fb6fa5
Packit Service fb6fa5
      for (i = 0; i < G_N_ELEMENTS (font_sizes); i++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GtkTreeIter iter;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  gtk_list_store_append (model, &iter);
Packit Service fb6fa5
	  gtk_list_store_set (model, &iter, SIZE_COLUMN, font_sizes[i], -1);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (font_sizes[i] * PANGO_SCALE == fontsel->size)
Packit Service fb6fa5
	    set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkTreeIter iter;
Packit Service fb6fa5
      gboolean found = FALSE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
Packit Service fb6fa5
      for (i = 0; i < G_N_ELEMENTS (font_sizes) && !found; i++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if (font_sizes[i] * PANGO_SCALE == fontsel->size)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
Packit Service fb6fa5
	      found = TRUE;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (!found)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list));
Packit Service fb6fa5
	  gtk_tree_selection_unselect_all (selection);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Set the entry to the new size, rounding to 1 digit,
Packit Service fb6fa5
   * trimming of trailing 0's and a trailing period
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_snprintf (buffer, sizeof (buffer), "%.1f", fontsel->size / (1.0 * PANGO_SCALE));
Packit Service fb6fa5
  if (strchr (buffer, '.'))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      p = buffer + strlen (buffer) - 1;
Packit Service fb6fa5
      while (*p == '0')
Packit Service fb6fa5
	p--;
Packit Service fb6fa5
      if (*p == '.')
Packit Service fb6fa5
	p--;
Packit Service fb6fa5
      p[1] = '\0';
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Compare, to avoid moving the cursor unecessarily */
Packit Service fb6fa5
  if (strcmp (gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry)), buffer) != 0)
Packit Service fb6fa5
    gtk_entry_set_text (GTK_ENTRY (fontsel->size_entry), buffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_select_best_size (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_font_selection_load_font (fontsel);  
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_set_size (GtkFontSelection *fontsel,
Packit Service fb6fa5
			     gint              new_size)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (fontsel->size != new_size)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      fontsel->size = new_size;
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_font_selection_show_available_sizes (fontsel, FALSE);      
Packit Service fb6fa5
      gtk_font_selection_load_font (fontsel);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* If the user hits return in the font size entry, we change to the new font
Packit Service fb6fa5
   size. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_size_activate (GtkWidget   *w,
Packit Service fb6fa5
                                  gpointer     data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
  gint new_size;
Packit Service fb6fa5
  const gchar *text;
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (data);
Packit Service fb6fa5
Packit Service fb6fa5
  text = gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry));
Packit Service fb6fa5
  new_size = MAX (0.1, atof (text) * PANGO_SCALE + 0.5);
Packit Service fb6fa5
Packit Service fb6fa5
  if (fontsel->size != new_size)
Packit Service fb6fa5
    gtk_font_selection_set_size (fontsel, new_size);
Packit Service fb6fa5
  else 
Packit Service fb6fa5
    list_row_activated (w);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_font_selection_size_focus_out (GtkWidget     *w,
Packit Service fb6fa5
				   GdkEventFocus *event,
Packit Service fb6fa5
				   gpointer       data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
  gint new_size;
Packit Service fb6fa5
  const gchar *text;
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (data);
Packit Service fb6fa5
Packit Service fb6fa5
  text = gtk_entry_get_text (GTK_ENTRY (fontsel->size_entry));
Packit Service fb6fa5
  new_size = MAX (0.1, atof (text) * PANGO_SCALE + 0.5);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_set_size (fontsel, new_size);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This is called when a size is selected in the list. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_select_size (GtkTreeSelection *selection,
Packit Service fb6fa5
				gpointer          data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelection *fontsel;
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  gint new_size;
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontsel = GTK_FONT_SELECTION (data);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_tree_model_get (model, &iter, SIZE_COLUMN, &new_size, -1);
Packit Service fb6fa5
      gtk_font_selection_set_size (fontsel, new_size * PANGO_SCALE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_load_font (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (fontsel->font)
Packit Service fb6fa5
    gdk_font_unref (fontsel->font);
Packit Service fb6fa5
  fontsel->font = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_update_preview (fontsel);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static PangoFontDescription *
Packit Service fb6fa5
gtk_font_selection_get_font_description (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PangoFontDescription *font_desc;
Packit Service fb6fa5
Packit Service fb6fa5
  if (fontsel->face)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      font_desc = pango_font_face_describe (fontsel->face);
Packit Service fb6fa5
      pango_font_description_set_size (font_desc, fontsel->size);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    font_desc = pango_font_description_from_string (DEFAULT_FONT_NAME);
Packit Service fb6fa5
Packit Service fb6fa5
  return font_desc;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This sets the font in the preview entry to the selected font, and tries to
Packit Service fb6fa5
   make sure that the preview entry is a reasonable size, i.e. so that the
Packit Service fb6fa5
   text can be seen with a bit of space to spare. But it tries to avoid
Packit Service fb6fa5
   resizing the entry every time the font changes.
Packit Service fb6fa5
   This also used to shrink the preview if the font size was decreased, but
Packit Service fb6fa5
   that made it awkward if the user wanted to resize the window themself. */
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_update_preview (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkRcStyle *rc_style;
Packit Service fb6fa5
  gint new_height;
Packit Service fb6fa5
  GtkRequisition old_requisition;
Packit Service fb6fa5
  GtkWidget *preview_entry = fontsel->preview_entry;
Packit Service fb6fa5
  const gchar *text;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_get_child_requisition (preview_entry, &old_requisition);
Packit Service fb6fa5
  
Packit Service fb6fa5
  rc_style = gtk_rc_style_new ();
Packit Service fb6fa5
  rc_style->font_desc = gtk_font_selection_get_font_description (fontsel);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_widget_modify_style (preview_entry, rc_style);
Packit Service fb6fa5
  g_object_unref (rc_style);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_size_request (preview_entry, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* We don't ever want to be over MAX_PREVIEW_HEIGHT pixels high. */
Packit Service fb6fa5
  new_height = CLAMP (preview_entry->requisition.height, INITIAL_PREVIEW_HEIGHT, MAX_PREVIEW_HEIGHT);
Packit Service fb6fa5
Packit Service fb6fa5
  if (new_height > old_requisition.height || new_height < old_requisition.height - 30)
Packit Service fb6fa5
    gtk_widget_set_size_request (preview_entry, -1, new_height);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* This sets the preview text, if it hasn't been set already. */
Packit Service fb6fa5
  text = gtk_entry_get_text (GTK_ENTRY (preview_entry));
Packit Service fb6fa5
  if (strlen (text) == 0)
Packit Service fb6fa5
    gtk_entry_set_text (GTK_ENTRY (preview_entry), _(PREVIEW_TEXT));
Packit Service fb6fa5
  gtk_editable_set_position (GTK_EDITABLE (preview_entry), 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkFont*
Packit Service fb6fa5
gtk_font_selection_get_font_internal (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!fontsel->font)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      PangoFontDescription *font_desc = gtk_font_selection_get_font_description (fontsel);
Packit Service fb6fa5
      fontsel->font = gdk_font_from_description_for_display (gtk_widget_get_display (GTK_WIDGET (fontsel)), font_desc);
Packit Service fb6fa5
      pango_font_description_free (font_desc);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->font;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/*****************************************************************************
Packit Service fb6fa5
 * These functions are the main public interface for getting/setting the font.
Packit Service fb6fa5
 *****************************************************************************/
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_family_list:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This returns the #GtkTreeView that lists font families, for
Packit Service fb6fa5
 * example, 'Sans', 'Serif', etc.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): A #GtkWidget that is part of @fontsel
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_get_family_list (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->family_list;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_face_list:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This returns the #GtkTreeView which lists all styles available for
Packit Service fb6fa5
 * the selected font. For example, 'Regular', 'Bold', etc.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: (transfer none): A #GtkWidget that is part of @fontsel
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_get_face_list (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->face_list;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_size_entry:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This returns the #GtkEntry used to allow the user to edit the font
Packit Service fb6fa5
 * number manually instead of selecting it from the list of font sizes.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): A #GtkWidget that is part of @fontsel
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_get_size_entry (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->size_entry;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_size_list:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This returns the #GtkTreeeView used to list font sizes.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): A #GtkWidget that is part of @fontsel
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_get_size_list (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->size_list;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_preview_entry:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This returns the #GtkEntry used to display the font as a preview.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): A #GtkWidget that is part of @fontsel
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_get_preview_entry (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->preview_entry;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_family:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the #PangoFontFamily representing the selected font family.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): A #PangoFontFamily representing the
Packit Service fb6fa5
 *     selected font family. Font families are a collection of font
Packit Service fb6fa5
 *     faces. The returned object is owned by @fontsel and must not
Packit Service fb6fa5
 *     be modified or freed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
PangoFontFamily *
Packit Service fb6fa5
gtk_font_selection_get_family (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->family;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_face:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the #PangoFontFace representing the selected font group
Packit Service fb6fa5
 * details (i.e. family, slant, weight, width, etc).
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): A #PangoFontFace representing the
Packit Service fb6fa5
 *     selected font group details. The returned object is owned by
Packit Service fb6fa5
 *     @fontsel and must not be modified or freed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
PangoFontFace *
Packit Service fb6fa5
gtk_font_selection_get_face (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->face;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_size:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * The selected font size.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: A n integer representing the selected font size,
Packit Service fb6fa5
 *     or -1 if no font size is selected.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint
Packit Service fb6fa5
gtk_font_selection_get_size (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), -1);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return fontsel->size;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_font:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the currently-selected font.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: A #GdkFont.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.0: Use gtk_font_selection_get_font_name() instead.
Packit Service fb6fa5
 */
Packit Service fb6fa5
GdkFont *
Packit Service fb6fa5
gtk_font_selection_get_font (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_font_selection_get_font_internal (fontsel);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_font_name:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the currently-selected font name. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that this can be a different string than what you set with 
Packit Service fb6fa5
 * gtk_font_selection_set_font_name(), as the font selection widget may 
Packit Service fb6fa5
 * normalize font names and thus return a string with a different structure. 
Packit Service fb6fa5
 * For example, "Helvetica Italic Bold 12" could be normalized to 
Packit Service fb6fa5
 * "Helvetica Bold Italic 12". Use pango_font_description_equal()
Packit Service fb6fa5
 * if you want to compare two font descriptions.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: A string with the name of the current font, or %NULL if 
Packit Service fb6fa5
 *     no font is selected. You must free this string with g_free().
Packit Service fb6fa5
 */
Packit Service fb6fa5
gchar *
Packit Service fb6fa5
gtk_font_selection_get_font_name (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gchar *result;
Packit Service fb6fa5
  
Packit Service fb6fa5
  PangoFontDescription *font_desc = gtk_font_selection_get_font_description (fontsel);
Packit Service fb6fa5
  result = pango_font_description_to_string (font_desc);
Packit Service fb6fa5
  pango_font_description_free (font_desc);
Packit Service fb6fa5
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* This selects the appropriate list rows.
Packit Service fb6fa5
   First we check the fontname is valid and try to find the font family
Packit Service fb6fa5
   - i.e. the name in the main list. If we can't find that, then just return.
Packit Service fb6fa5
   Next we try to set each of the properties according to the fontname.
Packit Service fb6fa5
   Finally we select the font family & style in the lists. */
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_font_selection_select_font_desc (GtkFontSelection      *fontsel,
Packit Service fb6fa5
				     PangoFontDescription  *new_desc,
Packit Service fb6fa5
				     PangoFontFamily      **pfamily,
Packit Service fb6fa5
				     PangoFontFace        **pface)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PangoFontFamily *new_family = NULL;
Packit Service fb6fa5
  PangoFontFace *new_face = NULL;
Packit Service fb6fa5
  PangoFontFace *fallback_face = NULL;
Packit Service fb6fa5
  GtkTreeModel *model;
Packit Service fb6fa5
  GtkTreeIter iter;
Packit Service fb6fa5
  GtkTreeIter match_iter;
Packit Service fb6fa5
  gboolean valid;
Packit Service fb6fa5
  const gchar *new_family_name;
Packit Service fb6fa5
Packit Service fb6fa5
  new_family_name = pango_font_description_get_family (new_desc);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!new_family_name)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Check to make sure that this is in the list of allowed fonts 
Packit Service fb6fa5
   */
Packit Service fb6fa5
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list));
Packit Service fb6fa5
  for (valid = gtk_tree_model_get_iter_first (model, &iter);
Packit Service fb6fa5
       valid;
Packit Service fb6fa5
       valid = gtk_tree_model_iter_next (model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      PangoFontFamily *family;
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (g_ascii_strcasecmp (pango_font_family_get_name (family),
Packit Service fb6fa5
			      new_family_name) == 0)
Packit Service fb6fa5
	new_family = g_object_ref (family);
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_unref (family);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (new_family)
Packit Service fb6fa5
	break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!new_family)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (pfamily)
Packit Service fb6fa5
    *pfamily = new_family;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    g_object_unref (new_family);
Packit Service fb6fa5
  set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &iter);
Packit Service fb6fa5
  gtk_font_selection_show_available_styles (fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
  model = gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->face_list));
Packit Service fb6fa5
  for (valid = gtk_tree_model_get_iter_first (model, &iter);
Packit Service fb6fa5
       valid;
Packit Service fb6fa5
       valid = gtk_tree_model_iter_next (model, &iter))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      PangoFontFace *face;
Packit Service fb6fa5
      PangoFontDescription *tmp_desc;
Packit Service fb6fa5
      
Packit Service fb6fa5
      gtk_tree_model_get (model, &iter, FACE_COLUMN, &face, -1);
Packit Service fb6fa5
      tmp_desc = pango_font_face_describe (face);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (font_description_style_equal (tmp_desc, new_desc))
Packit Service fb6fa5
	new_face = g_object_ref (face);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (!fallback_face)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  fallback_face = g_object_ref (face);
Packit Service fb6fa5
	  match_iter = iter;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      pango_font_description_free (tmp_desc);
Packit Service fb6fa5
      g_object_unref (face);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (new_face)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  match_iter = iter;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!new_face)
Packit Service fb6fa5
    new_face = fallback_face;
Packit Service fb6fa5
  else if (fallback_face)
Packit Service fb6fa5
    g_object_unref (fallback_face);
Packit Service fb6fa5
Packit Service fb6fa5
  if (pface)
Packit Service fb6fa5
    *pface = new_face;
Packit Service fb6fa5
  else if (new_face)
Packit Service fb6fa5
    g_object_unref (new_face);
Packit Service fb6fa5
  set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_iter);  
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_set_size (fontsel, pango_font_description_get_size (new_desc));
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* This sets the current font, then selecting the appropriate list rows. */
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_set_font_name:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 * @fontname: a font name like "Helvetica 12" or "Times Bold 18"
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets the currently-selected font. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that the @fontsel needs to know the screen in which it will appear 
Packit Service fb6fa5
 * for this to work; this can be guaranteed by simply making sure that the 
Packit Service fb6fa5
 * @fontsel is inserted in a toplevel window before you call this function.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if the font could be set successfully; %FALSE if no 
Packit Service fb6fa5
 *     such font exists or if the @fontsel doesn't belong to a particular 
Packit Service fb6fa5
 *     screen yet.
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_font_selection_set_font_name (GtkFontSelection *fontsel,
Packit Service fb6fa5
				  const gchar      *fontname)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PangoFontFamily *family = NULL;
Packit Service fb6fa5
  PangoFontFace *face = NULL;
Packit Service fb6fa5
  PangoFontDescription *new_desc;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gtk_widget_has_screen (GTK_WIDGET (fontsel)))
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  new_desc = pango_font_description_from_string (fontname);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gtk_font_selection_select_font_desc (fontsel, new_desc, &family, &face))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gtk_font_selection_ref_family (fontsel, family);
Packit Service fb6fa5
      if (family)
Packit Service fb6fa5
        g_object_unref (family);
Packit Service fb6fa5
Packit Service fb6fa5
      gtk_font_selection_ref_face (fontsel, face);
Packit Service fb6fa5
      if (face)
Packit Service fb6fa5
        g_object_unref (face);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  pango_font_description_free (new_desc);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_freeze_notify (G_OBJECT (fontsel));
Packit Service fb6fa5
  g_object_notify (G_OBJECT (fontsel), "font-name");
Packit Service fb6fa5
  g_object_notify (G_OBJECT (fontsel), "font");
Packit Service fb6fa5
  g_object_thaw_notify (G_OBJECT (fontsel));
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_get_preview_text:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the text displayed in the preview area.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the text displayed in the preview area. 
Packit Service fb6fa5
 *     This string is owned by the widget and should not be 
Packit Service fb6fa5
 *     modified or freed 
Packit Service fb6fa5
 */
Packit Service fb6fa5
const gchar*
Packit Service fb6fa5
gtk_font_selection_get_preview_text (GtkFontSelection *fontsel)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION (fontsel), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_entry_get_text (GTK_ENTRY (fontsel->preview_entry));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_set_preview_text:
Packit Service fb6fa5
 * @fontsel: a #GtkFontSelection
Packit Service fb6fa5
 * @text: the text to display in the preview area 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the text displayed in the preview area.
Packit Service fb6fa5
 * The @text is used to show how the selected font looks.
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_font_selection_set_preview_text  (GtkFontSelection *fontsel,
Packit Service fb6fa5
				      const gchar      *text)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_FONT_SELECTION (fontsel));
Packit Service fb6fa5
  g_return_if_fail (text != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_entry_set_text (GTK_ENTRY (fontsel->preview_entry), text);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*****************************************************************************
Packit Service fb6fa5
 * GtkFontSelectionDialog
Packit Service fb6fa5
 *****************************************************************************/
Packit Service fb6fa5
Packit Service fb6fa5
static void gtk_font_selection_dialog_buildable_interface_init     (GtkBuildableIface *iface);
Packit Service fb6fa5
static GObject * gtk_font_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
Packit Service fb6fa5
									  GtkBuilder   *builder,
Packit Service fb6fa5
									  const gchar  *childname);
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE_WITH_CODE (GtkFontSelectionDialog, gtk_font_selection_dialog,
Packit Service fb6fa5
			 GTK_TYPE_DIALOG,
Packit Service fb6fa5
			 G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
Packit Service fb6fa5
						gtk_font_selection_dialog_buildable_interface_init))
Packit Service fb6fa5
Packit Service fb6fa5
static GtkBuildableIface *parent_buildable_iface;
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_dialog_class_init (GtkFontSelectionDialogClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_dialog_init (GtkFontSelectionDialog *fontseldiag)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkDialog *dialog = GTK_DIALOG (fontseldiag);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_dialog_set_has_separator (dialog, FALSE);
Packit Service fb6fa5
  gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
Packit Service fb6fa5
  gtk_box_set_spacing (GTK_BOX (dialog->vbox), 2); /* 2 * 5 + 2 = 12 */
Packit Service fb6fa5
  gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 5);
Packit Service fb6fa5
  gtk_box_set_spacing (GTK_BOX (dialog->action_area), 6);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_push_composite_child ();
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_window_set_resizable (GTK_WINDOW (fontseldiag), TRUE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontseldiag->main_vbox = dialog->vbox;
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontseldiag->fontsel = gtk_font_selection_new ();
Packit Service fb6fa5
  gtk_container_set_border_width (GTK_CONTAINER (fontseldiag->fontsel), 5);
Packit Service fb6fa5
  gtk_widget_show (fontseldiag->fontsel);
Packit Service fb6fa5
  gtk_box_pack_start (GTK_BOX (fontseldiag->main_vbox),
Packit Service fb6fa5
		      fontseldiag->fontsel, TRUE, TRUE, 0);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Create the action area */
Packit Service fb6fa5
  fontseldiag->action_area = dialog->action_area;
Packit Service fb6fa5
Packit Service fb6fa5
  fontseldiag->cancel_button = gtk_dialog_add_button (dialog,
Packit Service fb6fa5
                                                      GTK_STOCK_CANCEL,
Packit Service fb6fa5
                                                      GTK_RESPONSE_CANCEL);
Packit Service fb6fa5
Packit Service fb6fa5
  fontseldiag->apply_button = gtk_dialog_add_button (dialog,
Packit Service fb6fa5
                                                     GTK_STOCK_APPLY,
Packit Service fb6fa5
                                                     GTK_RESPONSE_APPLY);
Packit Service fb6fa5
  gtk_widget_hide (fontseldiag->apply_button);
Packit Service fb6fa5
Packit Service fb6fa5
  fontseldiag->ok_button = gtk_dialog_add_button (dialog,
Packit Service fb6fa5
                                                  GTK_STOCK_OK,
Packit Service fb6fa5
                                                  GTK_RESPONSE_OK);
Packit Service fb6fa5
  gtk_widget_grab_default (fontseldiag->ok_button);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gtk_dialog_set_alternative_button_order (GTK_DIALOG (fontseldiag),
Packit Service fb6fa5
					   GTK_RESPONSE_OK,
Packit Service fb6fa5
					   GTK_RESPONSE_APPLY,
Packit Service fb6fa5
					   GTK_RESPONSE_CANCEL,
Packit Service fb6fa5
					   -1);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_window_set_title (GTK_WINDOW (fontseldiag),
Packit Service fb6fa5
                        _("Font Selection"));
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_pop_composite_child ();
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_dialog_set_ignore_separator (dialog, TRUE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_new:
Packit Service fb6fa5
 * @title: the title of the dialog window 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Creates a new #GtkFontSelectionDialog.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: a new #GtkFontSelectionDialog
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_font_selection_dialog_new (const gchar *title)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkFontSelectionDialog *fontseldiag;
Packit Service fb6fa5
  
Packit Service fb6fa5
  fontseldiag = g_object_new (GTK_TYPE_FONT_SELECTION_DIALOG, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (title)
Packit Service fb6fa5
    gtk_window_set_title (GTK_WINDOW (fontseldiag), title);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return GTK_WIDGET (fontseldiag);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_font_selection:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Retrieves the #GtkFontSelection widget embedded in the dialog.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: (transfer none): the embedded #GtkFontSelection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.22
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkWidget*
Packit Service fb6fa5
gtk_font_selection_dialog_get_font_selection (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return fsd->fontsel;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_ok_button:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the 'OK' button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): the #GtkWidget used in the dialog
Packit Service fb6fa5
 *     for the 'OK' button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_dialog_get_ok_button (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return fsd->ok_button;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_apply_button:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Obtains a button. The button doesn't have any function.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: a #GtkWidget
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.16: Don't use this function.
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_dialog_get_apply_button (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return fsd->apply_button;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_cancel_button:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the 'Cancel' button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): the #GtkWidget used in the dialog
Packit Service fb6fa5
 *     for the 'Cancel' button.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.14
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkWidget *
Packit Service fb6fa5
gtk_font_selection_dialog_get_cancel_button (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return fsd->cancel_button;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_font_selection_dialog_buildable_interface_init (GtkBuildableIface *iface)
Packit Service fb6fa5
{
Packit Service fb6fa5
  parent_buildable_iface = g_type_interface_peek_parent (iface);
Packit Service fb6fa5
  iface->get_internal_child = gtk_font_selection_dialog_buildable_get_internal_child;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GObject *
Packit Service fb6fa5
gtk_font_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
Packit Service fb6fa5
							GtkBuilder   *builder,
Packit Service fb6fa5
							const gchar  *childname)
Packit Service fb6fa5
{
Packit Service fb6fa5
    if (strcmp(childname, "ok_button") == 0)
Packit Service fb6fa5
	return G_OBJECT (GTK_FONT_SELECTION_DIALOG(buildable)->ok_button);
Packit Service fb6fa5
    else if (strcmp(childname, "cancel_button") == 0)
Packit Service fb6fa5
	return G_OBJECT (GTK_FONT_SELECTION_DIALOG (buildable)->cancel_button);
Packit Service fb6fa5
    else if (strcmp(childname, "apply_button") == 0)
Packit Service fb6fa5
	return G_OBJECT (GTK_FONT_SELECTION_DIALOG(buildable)->apply_button);
Packit Service fb6fa5
    else if (strcmp(childname, "font_selection") == 0)
Packit Service fb6fa5
	return G_OBJECT (GTK_FONT_SELECTION_DIALOG(buildable)->fontsel);
Packit Service fb6fa5
Packit Service fb6fa5
    return parent_buildable_iface->get_internal_child (buildable, builder, childname);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_font_name:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the currently-selected font name.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that this can be a different string than what you set with 
Packit Service fb6fa5
 * gtk_font_selection_dialog_set_font_name(), as the font selection widget
Packit Service fb6fa5
 * may normalize font names and thus return a string with a different 
Packit Service fb6fa5
 * structure. For example, "Helvetica Italic Bold 12" could be normalized 
Packit Service fb6fa5
 * to "Helvetica Bold Italic 12".  Use pango_font_description_equal()
Packit Service fb6fa5
 * if you want to compare two font descriptions.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: A string with the name of the current font, or %NULL if no 
Packit Service fb6fa5
 *     font is selected. You must free this string with g_free().
Packit Service fb6fa5
 */
Packit Service fb6fa5
gchar*
Packit Service fb6fa5
gtk_font_selection_dialog_get_font_name (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_font_selection_get_font_name (GTK_FONT_SELECTION (fsd->fontsel));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_font:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the currently-selected font.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: the #GdkFont from the #GtkFontSelection for the
Packit Service fb6fa5
 *     currently selected font in the dialog, or %NULL if no font is selected
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.0: Use gtk_font_selection_dialog_get_font_name() instead.
Packit Service fb6fa5
 */
Packit Service fb6fa5
GdkFont*
Packit Service fb6fa5
gtk_font_selection_dialog_get_font (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_font_selection_get_font_internal (GTK_FONT_SELECTION (fsd->fontsel));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_set_font_name:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 * @fontname: a font name like "Helvetica 12" or "Times Bold 18"
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the currently selected font. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if the font selected in @fsd is now the
Packit Service fb6fa5
 *     @fontname specified, %FALSE otherwise. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_font_selection_dialog_set_font_name (GtkFontSelectionDialog *fsd,
Packit Service fb6fa5
					 const gchar	        *fontname)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (fontname, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_font_selection_set_font_name (GTK_FONT_SELECTION (fsd->fontsel), fontname);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_get_preview_text:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the text displayed in the preview area.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the text displayed in the preview area. 
Packit Service fb6fa5
 *     This string is owned by the widget and should not be 
Packit Service fb6fa5
 *     modified or freed 
Packit Service fb6fa5
 */
Packit Service fb6fa5
const gchar*
Packit Service fb6fa5
gtk_font_selection_dialog_get_preview_text (GtkFontSelectionDialog *fsd)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return gtk_font_selection_get_preview_text (GTK_FONT_SELECTION (fsd->fontsel));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_font_selection_dialog_set_preview_text:
Packit Service fb6fa5
 * @fsd: a #GtkFontSelectionDialog
Packit Service fb6fa5
 * @text: the text to display in the preview area
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the text displayed in the preview area. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_font_selection_dialog_set_preview_text (GtkFontSelectionDialog *fsd,
Packit Service fb6fa5
					    const gchar	           *text)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_FONT_SELECTION_DIALOG (fsd));
Packit Service fb6fa5
  g_return_if_fail (text != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_font_selection_set_preview_text (GTK_FONT_SELECTION (fsd->fontsel), text);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GTK_FONTSEL_C__
Packit Service fb6fa5
#include "gtkaliasdef.c"