[gtk+] font chooser: Add properties for features and language



commit 894a0c0ff4560d9fb400b872d3170491786197f3
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jan 2 23:52:24 2018 -0500

    font chooser: Add properties for features and language
    
    These can't be returned as part of the font description,
    so we need new api for them. For now, this is just readonly
    properties. Maybe these should be writable too, eventually.

 docs/reference/gtk/gtk4-sections.txt |    2 +
 gtk/gtkfontbutton.c                  |   28 ++++++++++++-
 gtk/gtkfontchooser.c                 |   75 ++++++++++++++++++++++++++++++++++
 gtk/gtkfontchooser.h                 |    4 ++
 gtk/gtkfontchooserutils.c            |    6 +++
 gtk/gtkfontchooserutils.h            |    2 +
 gtk/gtkfontchooserwidget.c           |    8 ++++
 7 files changed, 123 insertions(+), 2 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index c3ba7f4..d0ab719 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1305,6 +1305,8 @@ gtk_font_chooser_get_font
 gtk_font_chooser_set_font
 gtk_font_chooser_get_font_desc
 gtk_font_chooser_set_font_desc
+gtk_font_chooser_get_font_features
+gtk_font_chooser_get_font_language
 gtk_font_chooser_get_preview_text
 gtk_font_chooser_set_preview_text
 gtk_font_chooser_get_show_preview_entry
diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c
index 739cba8..6b7932a 100644
--- a/gtk/gtkfontbutton.c
+++ b/gtk/gtkfontbutton.c
@@ -83,6 +83,8 @@ struct _GtkFontButtonPrivate
   PangoFontFace        *font_face;
   PangoFontMap         *font_map;
   gint                  font_size;
+  char                 *font_features;
+  char                 *language;
   gchar                *preview_text;
   GtkFontFilterFunc     font_filter;
   gpointer              font_filter_data;
@@ -159,6 +161,12 @@ clear_font_data (GtkFontButton *font_button)
 
   g_free (priv->fontname);
   priv->fontname = NULL;
+
+  g_free (priv->font_features);
+  priv->font_features = NULL;
+
+  g_free (priv->language);
+  priv->language = NULL;
 }
 
 static void
@@ -699,6 +707,12 @@ gtk_font_button_get_property (GObject    *object,
     case GTK_FONT_CHOOSER_PROP_FONT_DESC:
       g_value_set_boxed (value, gtk_font_button_get_font_desc (font_button));
       break;
+    case GTK_FONT_CHOOSER_PROP_FONT_FEATURES:
+      g_value_set_string (value, priv->font_features);
+      break;
+    case GTK_FONT_CHOOSER_PROP_LANGUAGE:
+      g_value_set_string (value, priv->language);
+      break;
     case GTK_FONT_CHOOSER_PROP_LEVEL:
       g_value_set_enum (value, priv->level);
       break;
@@ -1007,6 +1021,10 @@ response_cb (GtkDialog *dialog,
   if (priv->font_face)
     g_object_ref (priv->font_face);
   priv->font_size = gtk_font_chooser_get_font_size (font_chooser);
+  g_free (priv->font_features);
+  priv->font_features = gtk_font_chooser_get_font_features (font_chooser);
+  g_free (priv->language);
+  priv->language = gtk_font_chooser_get_language (font_chooser);
 
   /* Set label font */
   gtk_font_button_update_font_info (font_button);
@@ -1031,7 +1049,9 @@ dialog_destroy (GtkWidget *widget,
 } 
 
 static gchar *
-pango_font_description_to_css (PangoFontDescription *desc)
+pango_font_description_to_css (PangoFontDescription *desc,
+                               const char           *features,
+                               const char           *language)
 {
   GString *s;
   PangoFontMask set;
@@ -1153,6 +1173,10 @@ pango_font_description_to_css (PangoFontDescription *desc)
     {
       g_string_append_printf (s, "font-size: %dpt", pango_font_description_get_size (desc) / PANGO_SCALE);
     }
+  if (features)
+    {
+      g_string_append_printf (s, "font-feature-settings: %s;", features);
+    }
 
   g_string_append (s, "}");
 
@@ -1193,7 +1217,7 @@ gtk_font_button_label_use_font (GtkFontButton *font_button)
       if (!priv->use_size)
         pango_font_description_unset_fields (desc, PANGO_FONT_MASK_SIZE);
 
-      data = pango_font_description_to_css (desc);
+      data = pango_font_description_to_css (desc, priv->font_features, priv->language);
       gtk_css_provider_load_from_data (priv->provider, data, -1);
 
       g_free (data);
diff --git a/gtk/gtkfontchooser.c b/gtk/gtkfontchooser.c
index 41bb4b4..5c1547d 100644
--- a/gtk/gtkfontchooser.c
+++ b/gtk/gtkfontchooser.c
@@ -122,6 +122,39 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
                          GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
   /**
+   * GtkFontChooser:font-features:
+   *
+   * The selected font features, in a format that is compatible with
+   * CSS and with Pango attributes.
+   *
+   * Since: 3.94
+   */
+  g_object_interface_install_property
+     (iface,
+      g_param_spec_string ("font-features",
+                          P_("Font features"),
+                          P_("Font features as a string"),
+                          "",
+                          GTK_PARAM_READABLE));
+
+  /**
+   * GtkFontChooser:language:
+   *
+   * The language for which the #GtkFontChooser:font-features were
+   * selected, in a format that is compatible with CSS and with Pango
+   * attributes.
+   *
+   * Since: 3.94
+   */
+  g_object_interface_install_property
+     (iface,
+      g_param_spec_string ("language",
+                          P_("Language"),
+                          P_("Language for which features have been selected"),
+                          "",
+                          GTK_PARAM_READABLE));
+
+  /**
    * GtkFontChooser::font-activated:
    * @self: the object which received the signal
    * @fontname: the font name
@@ -536,3 +569,45 @@ gtk_font_chooser_get_level (GtkFontChooser *fontchooser)
 
   return level;
 }
+
+/**
+ * gtk_font_chooser_get_font_features:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Gets the currently-selected font features.
+ *
+ * Returns: the currently selected font features
+ * Since: 3.94
+ */
+char *
+gtk_font_chooser_get_font_features (GtkFontChooser *fontchooser)
+{
+  char *text;
+
+  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
+
+  g_object_get (fontchooser, "font-features", &text, NULL);
+
+  return text;
+}
+
+/**
+ * gtk_font_chooser_get_language:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Gets the currently-selected language for font features.
+ *
+ * Returns: the currently selected language
+ * Since: 3.94
+ */
+char *
+gtk_font_chooser_get_language (GtkFontChooser *fontchooser)
+{
+  char *text;
+
+  g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), NULL);
+
+  g_object_get (fontchooser, "language", &text, NULL);
+
+  return text;
+}
diff --git a/gtk/gtkfontchooser.h b/gtk/gtkfontchooser.h
index b60d92a..18ca5d0 100644
--- a/gtk/gtkfontchooser.h
+++ b/gtk/gtkfontchooser.h
@@ -146,6 +146,10 @@ void             gtk_font_chooser_set_level                (GtkFontChooser   *fo
 GDK_AVAILABLE_IN_3_94
 GtkFontChooserLevel
                  gtk_font_chooser_get_level                (GtkFontChooser   *fontchooser);
+GDK_AVAILABLE_IN_3_94
+char *           gtk_font_chooser_get_font_features        (GtkFontChooser   *fontchooser);
+GDK_AVAILABLE_IN_3_94
+char *           gtk_font_chooser_get_language             (GtkFontChooser   *fontchooser);
 
 G_END_DECLS
 
diff --git a/gtk/gtkfontchooserutils.c b/gtk/gtkfontchooserutils.c
index 09469bd..84079d2 100644
--- a/gtk/gtkfontchooserutils.c
+++ b/gtk/gtkfontchooserutils.c
@@ -137,6 +137,12 @@ _gtk_font_chooser_install_properties (GObjectClass *klass)
   g_object_class_override_property (klass,
                                     GTK_FONT_CHOOSER_PROP_LEVEL,
                                     "level");
+  g_object_class_override_property (klass,
+                                    GTK_FONT_CHOOSER_PROP_FONT_FEATURES,
+                                    "font-features");
+  g_object_class_override_property (klass,
+                                    GTK_FONT_CHOOSER_PROP_LANGUAGE,
+                                    "language");
 }
 
 /**
diff --git a/gtk/gtkfontchooserutils.h b/gtk/gtkfontchooserutils.h
index 8d4af1b..ac7bf18 100644
--- a/gtk/gtkfontchooserutils.h
+++ b/gtk/gtkfontchooserutils.h
@@ -38,6 +38,8 @@ typedef enum {
   GTK_FONT_CHOOSER_PROP_PREVIEW_TEXT,
   GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY,
   GTK_FONT_CHOOSER_PROP_LEVEL,
+  GTK_FONT_CHOOSER_PROP_FONT_FEATURES,
+  GTK_FONT_CHOOSER_PROP_LANGUAGE,
   GTK_FONT_CHOOSER_PROP_LAST
 } GtkFontChooserProp;
 
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index ad1cbe7..eb37bf8 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -330,6 +330,12 @@ gtk_font_chooser_widget_get_property (GObject         *object,
     case GTK_FONT_CHOOSER_PROP_LEVEL:
       g_value_set_enum (value, gtk_font_chooser_widget_get_level (fontchooser));
       break;
+    case GTK_FONT_CHOOSER_PROP_FONT_FEATURES:
+      g_value_set_string (value, fontchooser->priv->font_features);
+      break;
+    case GTK_FONT_CHOOSER_PROP_LANGUAGE:
+      g_value_set_string (value, pango_language_to_string (fontchooser->priv->font_language));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -1863,6 +1869,7 @@ update_font_features (GtkFontChooserWidget *fontchooser)
     {
       g_free (priv->font_features);
       priv->font_features = g_string_free (s, FALSE);
+      g_object_notify (G_OBJECT (fontchooser), "font-features");
     }
   else
     g_string_free (s, TRUE);
@@ -1890,6 +1897,7 @@ update_language (GtkFontChooserWidget *fontchooser)
       if (priv->font_language != lang)
         {
           priv->font_language = lang;
+          g_object_notify (G_OBJECT (fontchooser), "language");
         }
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]