[gtk/wip/fanc999/fontchooser.win32: 1392/1393] gtk/gtkfontchooserwidget.c: Use Native Windows API for language/scripts



commit fc72980f8b1ed6d6976d09e28ed9e758dbb3512d
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Mon Apr 15 18:39:40 2019 +0800

    gtk/gtkfontchooserwidget.c: Use Native Windows API for language/scripts
    
    This eliminates the need to install iso-codes on Windows, which is
    largely unneeded because we can just use the Windows APIs to do that for
    us.

 gtk/gtkpangofontutils.c        | 76 ++++++++++++++++++++++++++++++++++++++++++
 gtk/gtkpangofontutilsprivate.h |  3 ++
 2 files changed, 79 insertions(+)
---
diff --git a/gtk/gtkpangofontutils.c b/gtk/gtkpangofontutils.c
index 8e0e94215d..6013d1803f 100644
--- a/gtk/gtkpangofontutils.c
+++ b/gtk/gtkpangofontutils.c
@@ -25,6 +25,12 @@
 
 #include "gtkpangofontutilsprivate.h"
 
+#ifdef G_OS_WIN32
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
+# include <hb.h>
+#endif
+
 #ifdef HAVE_PANGOFT
 # include <pango/pangofc-font.h>
 
@@ -234,6 +240,76 @@ pangowin32_font_release_extra_ft_items (gpointer ft_item)
 
 }
 
+/* if we are using native Windows (PangoWin32),
+ * use native Windows API for language/script names
+ */
+static BOOL CALLBACK
+get_win32_all_locales_scripts (LPWSTR locale_w, DWORD flags, LPARAM param)
+{
+  wchar_t *langname_w = NULL;
+  wchar_t *locale_abbrev_w = NULL;
+  gchar *langname, *locale_abbrev, *locale, *p;
+  gint i;
+  hb_language_t lang;
+  GHashTable *ht_scripts_langs = (GHashTable *)param;
+
+  gint langname_size, locale_abbrev_size;
+  langname_size = GetLocaleInfoEx (locale_w, LOCALE_SLOCALIZEDDISPLAYNAME, langname_w, 0);
+  if (langname_size == 0)
+    return FALSE;
+
+  langname_w = g_new0 (wchar_t, langname_size);
+
+  if (langname_size == 0)
+    return FALSE;
+
+  GetLocaleInfoEx (locale_w, LOCALE_SLOCALIZEDDISPLAYNAME, langname_w, langname_size);
+  langname = g_utf16_to_utf8 (langname_w, -1, NULL, NULL, NULL);
+  locale = g_utf16_to_utf8 (locale_w, -1, NULL, NULL, NULL);
+  p = strchr (locale, '-');
+  lang = hb_language_from_string (locale, p ? p - locale : -1);
+  if (g_hash_table_lookup (ht_scripts_langs, lang) == NULL)
+    g_hash_table_insert (ht_scripts_langs, lang, langname);
+
+  /* track 3-letter ISO639-2/3 language codes as well */
+  locale_abbrev_size = GetLocaleInfoEx (locale_w, LOCALE_SABBREVLANGNAME, locale_abbrev_w, 0);
+  if (locale_abbrev_size > 0)
+    {
+      locale_abbrev_w = g_new0 (wchar_t, locale_abbrev_size);
+      GetLocaleInfoEx (locale_w, LOCALE_SABBREVLANGNAME, locale_abbrev_w, locale_abbrev_size);
+
+         locale_abbrev = g_utf16_to_utf8 (locale_abbrev_w, -1, NULL, NULL, NULL);
+      lang = hb_language_from_string (locale_abbrev, -1);
+      if (g_hash_table_lookup (ht_scripts_langs, lang) == NULL)
+        g_hash_table_insert (ht_scripts_langs, lang, langname);
+
+      g_free (locale_abbrev);
+      g_free (locale_abbrev_w);
+    }
+
+  g_free (locale);
+  g_free (langname_w);
+
+  return TRUE;
+}
+
+GHashTable *
+_gtk_font_chooser_widget_get_win32_locales (void)
+{
+  static GHashTable *ht_langtag_locales = NULL;
+  static volatile gsize inited = 0;
+
+  if (g_once_init_enter (&inited))
+    {
+      gchar *locales, *script;
+      ht_langtag_locales = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
+      EnumSystemLocalesEx (&get_win32_all_locales_scripts, LOCALE_ALL, (LPARAM)ht_langtag_locales, NULL);
+      g_once_init_leave (&inited, 1);
+    }
+
+  return ht_langtag_locales;
+}
+
 #endif /* G_OS_WIN32 */
 
 gpointer
diff --git a/gtk/gtkpangofontutilsprivate.h b/gtk/gtkpangofontutilsprivate.h
index 2a238ed795..87d816d4f6 100644
--- a/gtk/gtkpangofontutilsprivate.h
+++ b/gtk/gtkpangofontutilsprivate.h
@@ -36,6 +36,9 @@ void     _gtk_pango_font_release_ft_face     (PangoFont    *font,
 
 gboolean _gtk_pango_font_release_ft_items    (gpointer      ft_items);
 
+GHashTable *
+_gtk_font_chooser_widget_get_win32_locales   (void);
+
 #endif /* HAVE_HARFBUZZ */
 
 #endif /* __GTK_PANGO_FONT_UTILS_PRIVATE_H__ */


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