mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-14 22:30:22 +00:00
Merge branch 'fix-build-no-pangoft' into 'main'
Improve and fix building font features on Windows (was: Fix builds without PangoFT2) Closes #4605 See merge request GNOME/gtk!4339
This commit is contained in:
commit
5bf5d25bc1
@ -12,7 +12,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <pango/pangofc-font.h>
|
|
||||||
#include <hb.h>
|
#include <hb.h>
|
||||||
#include <hb-ot.h>
|
#include <hb-ot.h>
|
||||||
#include <glib/gi18n.h>
|
#include <glib/gi18n.h>
|
||||||
|
@ -18,15 +18,81 @@
|
|||||||
|
|
||||||
#include "language-names.h"
|
#include "language-names.h"
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
|
||||||
#ifndef ISO_CODES_PREFIX
|
#ifndef ISO_CODES_PREFIX
|
||||||
#define ISO_CODES_PREFIX "/usr"
|
#define ISO_CODES_PREFIX "/usr"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes"
|
#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes"
|
||||||
#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale"
|
#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale"
|
||||||
|
#endif
|
||||||
|
|
||||||
static GHashTable *language_map;
|
static GHashTable *language_map;
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
/* if we are using native Windows use native Windows API for language 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[9];
|
||||||
|
gchar *langname, *locale_abbrev, *locale, *p;
|
||||||
|
gint i;
|
||||||
|
const LCTYPE iso639_lctypes[] = { LOCALE_SISO639LANGNAME, LOCALE_SISO639LANGNAME2 };
|
||||||
|
GHashTable *ht_scripts_langs = (GHashTable *) param;
|
||||||
|
PangoLanguage *lang;
|
||||||
|
|
||||||
|
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 = pango_language_from_string (locale);
|
||||||
|
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 (these have a max length of 9 including terminating NUL)
|
||||||
|
* ISO639-2: iso639_lctypes[0] = LOCALE_SISO639LANGNAME
|
||||||
|
* ISO639-3: iso639_lctypes[1] = LOCALE_SISO639LANGNAME2
|
||||||
|
*/
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
locale_abbrev_size = GetLocaleInfoEx (locale_w, iso639_lctypes[i], locale_abbrev_w, 0);
|
||||||
|
if (locale_abbrev_size > 0)
|
||||||
|
{
|
||||||
|
GetLocaleInfoEx (locale_w, iso639_lctypes[i], locale_abbrev_w, locale_abbrev_size);
|
||||||
|
|
||||||
|
locale_abbrev = g_utf16_to_utf8 (locale_abbrev_w, -1, NULL, NULL, NULL);
|
||||||
|
lang = pango_language_from_string (locale_abbrev);
|
||||||
|
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);
|
||||||
|
g_free (langname_w);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* non-Windows */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
get_first_item_in_semicolon_list (const char *list)
|
get_first_item_in_semicolon_list (const char *list)
|
||||||
{
|
{
|
||||||
@ -210,6 +276,7 @@ languages_variant_init (const char *variant)
|
|||||||
g_free (filename);
|
g_free (filename);
|
||||||
g_free (buf);
|
g_free (buf);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
languages_init (void)
|
languages_init (void)
|
||||||
@ -218,8 +285,13 @@ languages_init (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
language_map = g_hash_table_new_full (NULL, NULL, NULL, g_free);
|
language_map = g_hash_table_new_full (NULL, NULL, NULL, g_free);
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
g_return_if_fail (EnumSystemLocalesEx (&get_win32_all_locales_scripts, LOCALE_ALL, (LPARAM) language_map, NULL));
|
||||||
|
#else
|
||||||
languages_variant_init ("iso_639");
|
languages_variant_init ("iso_639");
|
||||||
languages_variant_init ("iso_639_3");
|
languages_variant_init ("iso_639_3");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
|
@ -98,6 +98,7 @@ demos = files([
|
|||||||
'transparent.c',
|
'transparent.c',
|
||||||
'tree_store.c',
|
'tree_store.c',
|
||||||
'video_player.c',
|
'video_player.c',
|
||||||
|
'font_features.c',
|
||||||
])
|
])
|
||||||
|
|
||||||
gtkdemo_deps = [ libgtk_dep, ]
|
gtkdemo_deps = [ libgtk_dep, ]
|
||||||
@ -128,14 +129,9 @@ extra_demo_sources = files([
|
|||||||
'script-names.c',
|
'script-names.c',
|
||||||
'unicode-names.c',
|
'unicode-names.c',
|
||||||
'suggestionentry.c',
|
'suggestionentry.c',
|
||||||
|
'language-names.c',
|
||||||
])
|
])
|
||||||
|
|
||||||
if harfbuzz_dep.found() and pangoft_dep.found()
|
|
||||||
demos += files(['font_features.c'])
|
|
||||||
extra_demo_sources += files(['language-names.c'])
|
|
||||||
gtkdemo_deps += [ harfbuzz_dep, epoxy_dep ]
|
|
||||||
endif
|
|
||||||
|
|
||||||
if os_unix
|
if os_unix
|
||||||
demos += files('pagesetup.c')
|
demos += files('pagesetup.c')
|
||||||
endif
|
endif
|
||||||
|
@ -19,15 +19,80 @@
|
|||||||
|
|
||||||
#include "language-names.h"
|
#include "language-names.h"
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
#ifndef ISO_CODES_PREFIX
|
#ifndef ISO_CODES_PREFIX
|
||||||
#define ISO_CODES_PREFIX "/usr"
|
#define ISO_CODES_PREFIX "/usr"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes"
|
#define ISO_CODES_DATADIR ISO_CODES_PREFIX "/share/xml/iso-codes"
|
||||||
#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale"
|
#define ISO_CODES_LOCALESDIR ISO_CODES_PREFIX "/share/locale"
|
||||||
|
#endif
|
||||||
|
|
||||||
static GHashTable *language_map;
|
static GHashTable *language_map;
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
/* if we are using native Windows use native Windows API for language 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[9];
|
||||||
|
gchar *langname, *locale_abbrev, *locale, *p;
|
||||||
|
gint i;
|
||||||
|
const LCTYPE iso639_lctypes[] = { LOCALE_SISO639LANGNAME, LOCALE_SISO639LANGNAME2 };
|
||||||
|
GHashTable *ht_scripts_langs = (GHashTable *) param;
|
||||||
|
PangoLanguage *lang;
|
||||||
|
|
||||||
|
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 = pango_language_from_string (locale);
|
||||||
|
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 (these have a max length of 9 including terminating NUL)
|
||||||
|
* ISO639-2: iso639_lctypes[0] = LOCALE_SISO639LANGNAME
|
||||||
|
* ISO639-3: iso639_lctypes[1] = LOCALE_SISO639LANGNAME2
|
||||||
|
*/
|
||||||
|
for (i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
locale_abbrev_size = GetLocaleInfoEx (locale_w, iso639_lctypes[i], locale_abbrev_w, 0);
|
||||||
|
if (locale_abbrev_size > 0)
|
||||||
|
{
|
||||||
|
GetLocaleInfoEx (locale_w, iso639_lctypes[i], locale_abbrev_w, locale_abbrev_size);
|
||||||
|
|
||||||
|
locale_abbrev = g_utf16_to_utf8 (locale_abbrev_w, -1, NULL, NULL, NULL);
|
||||||
|
lang = pango_language_from_string (locale_abbrev);
|
||||||
|
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);
|
||||||
|
g_free (langname_w);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* non-Windows */
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
get_first_item_in_semicolon_list (const char *list)
|
get_first_item_in_semicolon_list (const char *list)
|
||||||
{
|
{
|
||||||
@ -232,6 +297,8 @@ languages_variant_init (const char *variant)
|
|||||||
g_free (buf);
|
g_free (buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
languages_init (void)
|
languages_init (void)
|
||||||
{
|
{
|
||||||
@ -239,8 +306,13 @@ languages_init (void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
language_map = g_hash_table_new_full (NULL, NULL, NULL, g_free);
|
language_map = g_hash_table_new_full (NULL, NULL, NULL, g_free);
|
||||||
|
|
||||||
|
#ifdef G_OS_WIN32
|
||||||
|
g_return_if_fail (EnumSystemLocalesEx (&get_win32_all_locales_scripts, LOCALE_ALL, (LPARAM) language_map, NULL));
|
||||||
|
#else
|
||||||
languages_variant_init ("iso_639");
|
languages_variant_init ("iso_639");
|
||||||
languages_variant_init ("iso_639_3");
|
languages_variant_init ("iso_639_3");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
|
@ -1072,6 +1072,10 @@ gtk_gen_headers = [
|
|||||||
gtkversion,
|
gtkversion,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
font_script_language_sources = files([
|
||||||
|
'language-names.c',
|
||||||
|
])
|
||||||
|
|
||||||
gtk_sources += [
|
gtk_sources += [
|
||||||
gtk_a11y_src,
|
gtk_a11y_src,
|
||||||
gtk_dbus_src,
|
gtk_dbus_src,
|
||||||
@ -1081,6 +1085,7 @@ gtk_sources += [
|
|||||||
gtkmarshalers,
|
gtkmarshalers,
|
||||||
gtkprivatetypebuiltins,
|
gtkprivatetypebuiltins,
|
||||||
gtktypebuiltins,
|
gtktypebuiltins,
|
||||||
|
font_script_language_sources,
|
||||||
]
|
]
|
||||||
|
|
||||||
gtk_deps = [
|
gtk_deps = [
|
||||||
@ -1097,13 +1102,6 @@ gtk_deps = [
|
|||||||
graphene_dep,
|
graphene_dep,
|
||||||
]
|
]
|
||||||
|
|
||||||
if harfbuzz_dep.found() and pangoft_dep.found()
|
|
||||||
gtk_deps += [ harfbuzz_dep, pangoft_dep ]
|
|
||||||
gtk_sources += files([
|
|
||||||
'language-names.c',
|
|
||||||
])
|
|
||||||
endif
|
|
||||||
|
|
||||||
if x11_enabled
|
if x11_enabled
|
||||||
x11_data_prefix = dependency('x11').get_variable(pkgconfig: 'prefix')
|
x11_data_prefix = dependency('x11').get_variable(pkgconfig: 'prefix')
|
||||||
|
|
||||||
@ -1151,6 +1149,9 @@ endif
|
|||||||
# So we don't add these twice
|
# So we don't add these twice
|
||||||
if x11_enabled or wayland_enabled
|
if x11_enabled or wayland_enabled
|
||||||
gtk_sources += gtk_use_wayland_or_x11_c_sources
|
gtk_sources += gtk_use_wayland_or_x11_c_sources
|
||||||
|
endif
|
||||||
|
|
||||||
|
if pangoft_dep.found()
|
||||||
gtk_deps += pangoft_dep
|
gtk_deps += pangoft_dep
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
10
meson.build
10
meson.build
@ -455,10 +455,12 @@ cdata.set('HAVE_TRACKER3', tracker3_dep.found())
|
|||||||
colord_dep = dependency('colord', version: '>= 0.1.9', required: get_option('colord'))
|
colord_dep = dependency('colord', version: '>= 0.1.9', required: get_option('colord'))
|
||||||
cdata.set('HAVE_COLORD', colord_dep.found())
|
cdata.set('HAVE_COLORD', colord_dep.found())
|
||||||
|
|
||||||
if iso_codes_dep.found()
|
if not os_win32
|
||||||
cdata.set_quoted('ISO_CODES_PREFIX', iso_codes_dep.get_variable(pkgconfig: 'prefix'))
|
if iso_codes_dep.found()
|
||||||
else
|
cdata.set_quoted('ISO_CODES_PREFIX', iso_codes_dep.get_variable(pkgconfig: 'prefix'))
|
||||||
cdata.set_quoted('ISO_CODES_PREFIX', '/usr')
|
else
|
||||||
|
cdata.set_quoted('ISO_CODES_PREFIX', '/usr')
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user