[gtk/wip/fanc999/fontchooser.win32: 3/4] gtk/gtkfontchooserwidget.c: Use Native Windows API for language/scripts
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/fanc999/fontchooser.win32: 3/4] gtk/gtkfontchooserwidget.c: Use Native Windows API for language/scripts
- Date: Wed, 17 Apr 2019 09:10:34 +0000 (UTC)
commit 17a60d57523d07bd41f5e9de9c791e3a2d13d205
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 1f4d43257b..c057474797 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]