summaryrefslogtreecommitdiff
path: root/gtk/gtkmain.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2023-01-02 15:19:42 -0500
committerMatthias Clasen <mclasen@redhat.com>2023-01-02 16:30:27 -0500
commit1f7783224b7bc6bd8ca4b0f906e3ee542cc249db (patch)
tree382d1436c1505b4d4b13dfc7e38e1a64a6b4fe62 /gtk/gtkmain.c
parente126110ae0d6ee59a8272591d599b830b192236b (diff)
downloadgtk+-1f7783224b7bc6bd8ca4b0f906e3ee542cc249db.tar.gz
Determine direction from language
We can determine the direction to return here without relying on translations, by using pango and HarfBuzz apis to go language -> script -> direction.
Diffstat (limited to 'gtk/gtkmain.c')
-rw-r--r--gtk/gtkmain.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 48bcb136fb..eb0319a917 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -48,6 +48,8 @@
#undef STRICT
#endif
+#include <hb-glib.h>
+
#include <glib/gi18n-lib.h>
#include "gtkbox.h"
@@ -781,20 +783,37 @@ gtk_is_initialized (void)
GtkTextDirection
gtk_get_locale_direction (void)
{
- /* Translate to default:RTL if you want your widgets
- * to be RTL, otherwise translate to default:LTR.
- * Do *not* translate it to "predefinito:LTR", if it
- * it isn't default:LTR or default:RTL it will not work
- */
- char *e = _("default:LTR");
- GtkTextDirection dir = GTK_TEXT_DIR_LTR;
+ PangoLanguage *language;
+ const PangoScript *scripts;
+ int n_scripts;
+
+ language = gtk_get_default_language ();
+ scripts = pango_language_get_scripts (language, &n_scripts);
+
+ if (n_scripts > 0)
+ {
+ for (int i = 0; i < n_scripts; i++)
+ {
+ hb_script_t script;
- if (g_strcmp0 (e, "default:RTL") == 0)
- dir = GTK_TEXT_DIR_RTL;
- else if (g_strcmp0 (e, "default:LTR") != 0)
- g_warning ("Whoever translated default:LTR did so wrongly. Defaulting to LTR.");
+ script = hb_glib_script_to_script ((GUnicodeScript) scripts[i]);
+
+ switch (hb_script_get_horizontal_direction (script))
+ {
+ case HB_DIRECTION_LTR:
+ return GTK_TEXT_DIR_LTR;
+ case HB_DIRECTION_RTL:
+ return GTK_TEXT_DIR_RTL;
+ case HB_DIRECTION_TTB:
+ case HB_DIRECTION_BTT:
+ case HB_DIRECTION_INVALID:
+ default:
+ break;
+ }
+ }
+ }
- return dir;
+ return GTK_TEXT_DIR_LTR;
}
/**