gtkfontchooser.c 14 KB
Newer Older
1
/* GTK - The GIMP Toolkit
2 3 4
 * gtkfontchooser.c - Abstract interface for font file selectors GUIs
 *
 * Copyright (C) 2006, Emmanuele Bassi
5
 * Copyright (C) 2011 Alberto Ruiz <aruiz@gnome.org>
6 7 8 9 10 11 12 13 14 15 16 17
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
Javier Jardon's avatar
Javier Jardon committed
18
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
19 20 21 22
 */

#include "config.h"

23
#include "gtkfontchooser.h"
24
#include "gtkfontchooserprivate.h"
25
#include "gtkintl.h"
26
#include "gtktypebuiltins.h"
27 28 29
#include "gtkprivate.h"

/**
30
 * SECTION:gtkfontchooser
31
 * @Short_description: Interface implemented by widgets displaying fonts
32
 * @Title: GtkFontChooser
33
 * @See_also: #GtkFontChooserDialog, #GtkFontChooserWidget, #GtkFontButton
34
 *
35
 * #GtkFontChooser is an interface that can be implemented by widgets
36
 * displaying the list of fonts. In GTK+, the main objects
37
 * that implement this interface are #GtkFontChooserWidget,
38 39
 * #GtkFontChooserDialog and #GtkFontButton. The GtkFontChooser interface
 * has been introducted in GTK+ 3.2.
40 41
 */

42
enum
43
{
44
  SIGNAL_FONT_ACTIVATED,
45
  LAST_SIGNAL
46 47
};

48
static guint chooser_signals[LAST_SIGNAL];
49

50 51
typedef GtkFontChooserIface GtkFontChooserInterface;
G_DEFINE_INTERFACE (GtkFontChooser, gtk_font_chooser, G_TYPE_OBJECT);
52 53

static void
54 55
gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
{
56 57 58 59 60
  /**
   * GtkFontChooser:font:
   *
   * The font description as a string, e.g. "Sans Italic 12".
   */
61 62
  g_object_interface_install_property
     (iface,
63 64
      g_param_spec_string ("font",
                          P_("Font"),
65 66 67 68 69 70 71 72 73 74 75 76
                           P_("Font description as a string, e.g. \"Sans Italic 12\""),
                           GTK_FONT_CHOOSER_DEFAULT_FONT_NAME,
                           GTK_PARAM_READWRITE));

  /**
   * GtkFontChooser:font-desc:
   *
   * The font description as a #PangoFontDescription.
   */
  g_object_interface_install_property
     (iface,
      g_param_spec_boxed ("font-desc",
77
                          P_("Font description"),
78 79
                          P_("Font description as a PangoFontDescription struct"),
                          PANGO_TYPE_FONT_DESCRIPTION,
80 81
                          GTK_PARAM_READWRITE));

82 83 84 85 86
  /**
   * GtkFontChooser:preview-text:
   *
   * The string with which to preview the font.
   */
87 88 89 90 91 92 93 94
  g_object_interface_install_property
     (iface,
      g_param_spec_string ("preview-text",
                          P_("Preview text"),
                          P_("The text to display in order to demonstrate the selected font"),
                          pango_language_get_sample_string (NULL),
                          GTK_PARAM_READWRITE));

95 96 97 98 99
  /**
   * GtkFontChooser:show-preview-entry:
   *
   * Whether to show an entry to change the preview text.
   */
100 101 102 103 104 105
  g_object_interface_install_property
     (iface,
      g_param_spec_boolean ("show-preview-entry",
                          P_("Show preview text entry"),
                          P_("Whether the preview text entry is shown or not"),
                          TRUE,
106
                          GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
107

108
  /**
Matthias Clasen's avatar
Matthias Clasen committed
109
   * GtkFontChooser::font-activated:
110 111 112
   * @self: the object which received the signal
   * @fontname: the font name
   *
Matthias Clasen's avatar
Matthias Clasen committed
113
   * Emitted when a font is activated.
114 115 116
   * This usually happens when the user double clicks an item,
   * or an item is selected and the user presses one of the keys
   * Space, Shift+Space, Return or Enter.
117 118
    */
  chooser_signals[SIGNAL_FONT_ACTIVATED] =
119
    g_signal_new (I_("font-activated"),
120 121
                  GTK_TYPE_FONT_CHOOSER,
                  G_SIGNAL_RUN_FIRST,
122
                  G_STRUCT_OFFSET (GtkFontChooserIface, font_activated),
123 124 125 126
                  NULL, NULL,
                  NULL,
                  G_TYPE_NONE,
                  1, G_TYPE_STRING);
127 128 129
}

/**
130
 * gtk_font_chooser_get_font_family:
131
 * @fontchooser: a #GtkFontChooser
132 133
 *
 * Gets the #PangoFontFamily representing the selected font family.
134
 * Font families are a collection of font faces.
135
 *
136 137
 * If the selected font is not installed, returns %NULL.
 *
138
 * Returns: (nullable) (transfer none): A #PangoFontFamily representing the
139
 *     selected font family, or %NULL. The returned object is owned by @fontchooser
140
 *     and must not be modified or freed.
141
 *
142
 * Since: 3.2
143 144
 */
PangoFontFamily *
145
gtk_font_chooser_get_font_family (GtkFontChooser *fontchooser)
146
{
147
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
148

149
  return GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_family (fontchooser);
150 151 152
}

/**
153
 * gtk_font_chooser_get_font_face:
154
 * @fontchooser: a #GtkFontChooser
155 156 157 158
 *
 * Gets the #PangoFontFace representing the selected font group
 * details (i.e. family, slant, weight, width, etc).
 *
159 160
 * If the selected font is not installed, returns %NULL.
 *
161
 * Returns: (nullable) (transfer none): A #PangoFontFace representing the
162
 *     selected font group details, or %NULL. The returned object is owned by
163
 *     @fontchooser and must not be modified or freed.
164
 *
165
 * Since: 3.2
166 167
 */
PangoFontFace *
168
gtk_font_chooser_get_font_face (GtkFontChooser *fontchooser)
169
{
170
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
171

172
  return GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_face (fontchooser);
173 174 175
}

/**
176
 * gtk_font_chooser_get_font_size:
177
 * @fontchooser: a #GtkFontChooser
178 179 180
 *
 * The selected font size.
 *
181
 * Returns: A n integer representing the selected font size,
182 183
 *     or -1 if no font size is selected.
 *
184
 * Since: 3.2
Matthias Clasen's avatar
Matthias Clasen committed
185
 */
186
gint
187
gtk_font_chooser_get_font_size (GtkFontChooser *fontchooser)
188
{
189
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), -1);
190

191
  return GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_size (fontchooser);
192 193 194
}

/**
195
 * gtk_font_chooser_get_font:
196
 * @fontchooser: a #GtkFontChooser
197
 *
198 199 200
 * Gets the currently-selected font name.
 *
 * Note that this can be a different string than what you set with
201
 * gtk_font_chooser_set_font(), as the font chooser widget may
202
 * normalize font names and thus return a string with a different
203 204
 * structure. For example, “Helvetica Italic Bold 12” could be
 * normalized to “Helvetica Bold Italic 12”.
205 206 207 208
 *
 * Use pango_font_description_equal() if you want to compare two
 * font descriptions.
 *
209
 * Returns: (nullable) (transfer full): A string with the name
210 211
 *     of the current font, or %NULL if  no font is selected. You must
 *     free this string with g_free().
212 213
 *
 * Since: 3.2
214 215
 */
gchar *
216
gtk_font_chooser_get_font (GtkFontChooser *fontchooser)
217
{
218 219
  gchar *fontname;

220
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
221

222 223 224 225
  g_object_get (fontchooser, "font", &fontname, NULL);


  return fontname;
226 227 228
}

/**
229
 * gtk_font_chooser_set_font:
230
 * @fontchooser: a #GtkFontChooser
231
 * @fontname: a font name like “Helvetica 12” or “Times Bold 18”
232
 *
233 234
 * Sets the currently-selected font.
 *
235
 * Since: 3.2
236
 */
237
void
238 239
gtk_font_chooser_set_font (GtkFontChooser *fontchooser,
                           const gchar    *fontname)
240
{
241 242
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
  g_return_if_fail (fontname != NULL);
243

244
  g_object_set (fontchooser, "font", fontname, NULL);
245 246
}

247 248 249 250 251 252 253 254 255
/**
 * gtk_font_chooser_get_font_desc:
 * @fontchooser: a #GtkFontChooser
 *
 * Gets the currently-selected font.
 *
 * Note that this can be a different string than what you set with
 * gtk_font_chooser_set_font(), as the font chooser widget may
 * normalize font names and thus return a string with a different
256 257
 * structure. For example, “Helvetica Italic Bold 12” could be
 * normalized to “Helvetica Bold Italic 12”.
258 259 260 261
 *
 * Use pango_font_description_equal() if you want to compare two
 * font descriptions.
 *
262
 * Returns: (nullable) (transfer full): A #PangoFontDescription for the
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
 *     current font, or %NULL if  no font is selected.
 *
 * Since: 3.2
 */
PangoFontDescription *
gtk_font_chooser_get_font_desc (GtkFontChooser *fontchooser)
{
  PangoFontDescription *font_desc;

  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);

  g_object_get (fontchooser, "font-desc", &font_desc, NULL);

  return font_desc;
}

/**
 * gtk_font_chooser_set_font_desc:
 * @fontchooser: a #GtkFontChooser
 * @font_desc: a #PangoFontDescription
 *
 * Sets the currently-selected font from @font_desc.
 *
 * Since: 3.2
 */
void
gtk_font_chooser_set_font_desc (GtkFontChooser             *fontchooser,
                                const PangoFontDescription *font_desc)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
  g_return_if_fail (font_desc != NULL);

  g_object_set (fontchooser, "font-desc", font_desc, NULL);
}

298
/**
299 300
 * gtk_font_chooser_get_preview_text:
 * @fontchooser: a #GtkFontChooser
301 302
 *
 * Gets the text displayed in the preview area.
303
 *
304
 * Returns: (transfer full): the text displayed in the
305
 *     preview area
306 307
 *
 * Since: 3.2
308
 */
309
gchar *
310
gtk_font_chooser_get_preview_text (GtkFontChooser *fontchooser)
311
{
312 313
  char *text;

314
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
315

316
  g_object_get (fontchooser, "preview-text", &text, NULL);
317

318 319
  return text;
}
320 321

/**
322 323
 * gtk_font_chooser_set_preview_text:
 * @fontchooser: a #GtkFontChooser
324
 * @text: (transfer none): the text to display in the preview area
325 326 327
 *
 * Sets the text displayed in the preview area.
 * The @text is used to show how the selected font looks.
328 329
 *
 * Since: 3.2
330 331
 */
void
332 333
gtk_font_chooser_set_preview_text (GtkFontChooser *fontchooser,
                                   const gchar    *text)
334
{
335
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
336 337
  g_return_if_fail (text != NULL);

338
  g_object_set (fontchooser, "preview-text", text, NULL);
339 340
}

341
/**
342 343
 * gtk_font_chooser_get_show_preview_entry:
 * @fontchooser: a #GtkFontChooser
344
 *
345 346
 * Returns whether the preview entry is shown or not.
 *
347
 * Returns: %TRUE if the preview entry is shown
348 349
 *     or %FALSE if it is hidden.
 *
350 351 352
 * Since: 3.2
 */
gboolean
353
gtk_font_chooser_get_show_preview_entry (GtkFontChooser *fontchooser)
354
{
355 356
  gboolean show;

357
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), FALSE);
358

359 360 361
  g_object_get (fontchooser, "show-preview-entry", &show, NULL);

  return show;
362 363 364
}

/**
365 366
 * gtk_font_chooser_set_show_preview_entry:
 * @fontchooser: a #GtkFontChooser
367 368 369
 * @show_preview_entry: whether to show the editable preview entry or not
 *
 * Shows or hides the editable preview entry.
370
 *
371 372 373
 * Since: 3.2
 */
void
374
gtk_font_chooser_set_show_preview_entry (GtkFontChooser *fontchooser,
375
                                         gboolean        show_preview_entry)
376
{
377
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
378

379 380
  show_preview_entry = show_preview_entry != FALSE;
  g_object_set (fontchooser, "show-preview-entry", show_preview_entry, NULL);
381
}
382 383 384 385 386

/**
 * gtk_font_chooser_set_filter_func:
 * @fontchooser: a #GtkFontChooser
 * @filter: (allow-none): a #GtkFontFilterFunc, or %NULL
387
 * @user_data: data to pass to @filter
388 389 390 391 392 393 394 395 396 397
 * @destroy: function to call to free @data when it is no longer needed
 *
 * Adds a filter function that decides which fonts to display
 * in the font chooser.
 *
 * Since: 3.2
 */
void
gtk_font_chooser_set_filter_func (GtkFontChooser   *fontchooser,
                                  GtkFontFilterFunc filter,
398
                                  gpointer          user_data,
399 400 401 402
                                  GDestroyNotify    destroy)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));

403 404 405 406 407
  GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->set_filter_func (fontchooser,
                                                             filter,
                                                             user_data,
                                                             destroy);
}
408

409 410 411 412 413
void
_gtk_font_chooser_font_activated (GtkFontChooser *chooser,
                                  const gchar    *fontname)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (chooser));
414

415
  g_signal_emit (chooser, chooser_signals[SIGNAL_FONT_ACTIVATED], 0, fontname);
416
}
417 418 419 420 421 422 423 424 425 426

/**
 * gtk_font_chooser_set_font_map:
 * @fontchooser: a #GtkFontChooser
 * @fontmap: (allow-none): a #PangoFontMap
 *
 * Sets a custom font map to use for this font chooser widget.
 * A custom font map can be used to present application-specific
 * fonts instead of or in addition to the normal system fonts.
 *
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
 * |[<!-- language="C" -->
 * FcConfig *config;
 * PangoFontMap *fontmap;
 *
 * config = FcInitLoadConfigAndFonts ();
 * FcConfigAppFontAddFile (config, my_app_font_file);
 *
 * fontmap = pango_cairo_font_map_new_for_font_type (CAIRO_FONT_TYPE_FT);
 * pango_fc_font_map_set_config (PANGO_FC_FONT_MAP (fontmap), config);
 *
 * gtk_font_chooser_set_font_map (font_chooser, fontmap);
 * ]|
 *
 * Note that other GTK+ widgets will only be able to use the application-specific
 * font if it is present in the font map they use:
 *
 * |[
 * context = gtk_widget_get_pango_context (label);
 * pango_context_set_font_map (context, fontmap);
 * ]|
 *
448 449 450 451 452 453 454 455 456
 * Since: 3.18
 */
void
gtk_font_chooser_set_font_map (GtkFontChooser *fontchooser,
                               PangoFontMap   *fontmap)
{
  g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
  g_return_if_fail (fontmap == NULL || PANGO_IS_FONT_MAP (fontmap));

457 458
  if (GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->set_font_map)
    GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->set_font_map (fontchooser, fontmap);
459 460 461 462 463 464 465 466 467
}

/**
 * gtk_font_chooser_get_font_map:
 * @fontchooser: a #GtkFontChooser
 *
 * Gets the custom font map of this font chooser widget,
 * or %NULL if it does not have one.
 *
468
 * Returns: (nullable) (transfer full): a #PangoFontMap, or %NULL
469 470 471 472 473 474
 *
 * Since: 3.18
 */
PangoFontMap *
gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser)
{
475
  PangoFontMap *fontmap = NULL;
476

477
  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
478

479 480
  if (GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_map)
    fontmap = GTK_FONT_CHOOSER_GET_IFACE (fontchooser)->get_font_map (fontchooser);
481 482 483

  return fontmap;
}