clutter: Avoid string translation to find text direction

Use Pango and Harfbuzz for the task, getting the default language,
then its scripts, then their directions. We pick the first valid
horizontal direction, resorting to LTR as a fallback.

Related: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/5385
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2780>
This commit is contained in:
Carlos Garnacho 2023-01-02 23:11:37 +01:00 committed by Marge Bot
parent 95c2154039
commit 9e0b5b1886
4 changed files with 25 additions and 14 deletions

View File

@ -51,6 +51,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
#include <hb-glib.h>
#include "clutter-actor-private.h" #include "clutter-actor-private.h"
#include "clutter-backend-private.h" #include "clutter-backend-private.h"
@ -221,20 +222,28 @@ clutter_get_text_direction (void)
} }
else else
{ {
/* PangoLanguage *language;
* Translate to default:RTL if you want your widgets const PangoScript *scripts;
* to be RTL, otherwise translate to default:LTR. int n_scripts, i;
* Do *not* translate it to "predefinito:LTR", if it
* it isn't default:LTR or default:RTL it will not work
*/
const char *e = _("default:LTR");
if (strcmp (e, "default:RTL") == 0) language = pango_language_get_default ();
dir = CLUTTER_TEXT_DIRECTION_RTL; scripts = pango_language_get_scripts (language, &n_scripts);
else if (strcmp (e, "default:LTR") == 0)
dir = CLUTTER_TEXT_DIRECTION_LTR; for (i = 0; i < n_scripts; i++)
else {
g_warning ("Whoever translated default:LTR did so wrongly."); hb_script_t script;
hb_direction_t text_dir;
script = hb_glib_script_to_script ((GUnicodeScript) scripts[i]);
text_dir = hb_script_get_horizontal_direction (script);
if (text_dir == HB_DIRECTION_LTR)
dir = CLUTTER_TEXT_DIRECTION_LTR;
else if (text_dir == HB_DIRECTION_RTL)
dir = CLUTTER_TEXT_DIRECTION_RTL;
else
continue;
}
} }
CLUTTER_NOTE (MISC, "Text direction: %s", CLUTTER_NOTE (MISC, "Text direction: %s",

View File

@ -36,6 +36,7 @@ clutter_pkg_deps = [
gio_dep, gio_dep,
json_glib_dep, json_glib_dep,
pango_dep, pango_dep,
harfbuzz_dep,
] ]
clutter_pkg_private_deps = [ clutter_pkg_private_deps = [

View File

@ -38,6 +38,7 @@ libstartup_notification_req = '>= 0.7'
libcanberra_req = '>= 0.26' libcanberra_req = '>= 0.26'
libwacom_req = '>= 0.13' libwacom_req = '>= 0.13'
atk_req = '>= 2.5.3' atk_req = '>= 2.5.3'
harfbuzz_req = '>= 2.6'
# optional version requirements # optional version requirements
udev_req = '>= 228' udev_req = '>= 228'
@ -128,6 +129,7 @@ atk_dep = dependency('atk', version: atk_req)
dbus_dep = dependency('dbus-1') dbus_dep = dependency('dbus-1')
colord_dep = dependency('colord', version: colord_req) colord_dep = dependency('colord', version: colord_req)
lcms2_dep = dependency('lcms2', version: lcms2_req) lcms2_dep = dependency('lcms2', version: lcms2_req)
harfbuzz_dep = dependency('harfbuzz', version: harfbuzz_req)
have_wayland = get_option('wayland') have_wayland = get_option('wayland')
# For now always require X11 support # For now always require X11 support

View File

@ -11,7 +11,6 @@ src/backends/meta-input-settings.c
src/backends/meta-monitor.c src/backends/meta-monitor.c
src/backends/meta-monitor-manager.c src/backends/meta-monitor-manager.c
src/backends/x11/meta-clutter-backend-x11.c src/backends/x11/meta-clutter-backend-x11.c
src/clutter/clutter/clutter-main.c
src/compositor/compositor.c src/compositor/compositor.c
src/compositor/meta-background.c src/compositor/meta-background.c
src/core/bell.c src/core/bell.c