[gtk/switch-label-fallback] Add fallbacks for GtkSwitch state labels



commit ed39721aa7435860f46da69998cf6cac4ae7e735
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Tue Jan 15 15:22:09 2019 +0000

    Add fallbacks for GtkSwitch state labels
    
    While the IEC power symbols have been part of Unicode since version 9.0,
    released in 2016, not every font supports them.
    
    We can use the old symbols as a fallback, as they seem to have the
    better coverage, if not the best appearance.

 gtk/gtkswitch.c | 41 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkswitch.c b/gtk/gtkswitch.c
index bf63f34fd2..1d42f572a9 100644
--- a/gtk/gtkswitch.c
+++ b/gtk/gtkswitch.c
@@ -298,11 +298,48 @@ gtk_switch_create_pango_layouts (GtkSwitch *self)
 {
   GtkSwitchPrivate *priv = self->priv;
 
+  /* Glyphs for the ON state, in descending order of preference */
+  const char *on_glyphs[] = {
+    "⏽", /* U+23FD POWER ON SYMBOL */
+    "❙", /* U+2759 MEDIUM VERTICAL BAR */
+  };
+
+  /* Glyphs for the OFF state, in descending order of preference */
+  const char *off_glyphs[] = {
+    "⭘", /* U+2B58 HEAVY CIRCLE */
+    "○", /* U+25CB WHITE CIRCLE */
+  };
+  int i;
+
   g_clear_object (&priv->on_layout);
-  priv->on_layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "⏽");
+
+  for (i = 0; i < G_N_ELEMENTS (on_glyphs); i++)
+    {
+      PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), on_glyphs[i]);
+
+      if (pango_layout_get_unknown_glyphs_count (layout) == 0)
+        {
+          priv->on_layout = layout;
+          break;
+        }
+
+      g_object_unref (layout);
+    }
 
   g_clear_object (&priv->off_layout);
-  priv->off_layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "⭘");
+
+  for (i = 0; i < G_N_ELEMENTS (off_glyphs); i++)
+    {
+      PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), off_glyphs[i]);
+
+      if (pango_layout_get_unknown_glyphs_count (layout) == 0)
+        {
+          priv->off_layout = layout;
+          break;
+        }
+
+      g_object_unref (layout);
+    }
 }
 
 static void


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