Add the ability to set the text direction

The direction of the text depends on the locale, and it is the
basic setting needed to enable internationalization of user
interfaces.

This commit allows setting the direction of the PangoContext instance
used by Clutter by using the CLUTTER_TEXT_DIRECTION environment
variable, or by passing the --clutter-text-direction command line
argument. Valid values are:

        ltr     - for left-to-right locales
        rtl     - for right-to-left locales

The default is LTR.

Ideally, this should be a value set by the localization teams on the
PO file, but this step requires some build system surgery to allow
the translation of the Clutter strings.
This commit is contained in:
Emmanuele Bassi 2008-12-23 16:40:26 +00:00
parent b4a3944b2b
commit 9389d9755d

View File

@ -53,21 +53,23 @@
#include "pango/cogl-pango.h"
/* main context */
static ClutterMainContext *ClutterCntx = NULL;
static ClutterMainContext *ClutterCntx = NULL;
/* main lock and locking/unlocking functions */
static GMutex *clutter_threads_mutex = NULL;
static GCallback clutter_threads_lock = NULL;
static GCallback clutter_threads_unlock = NULL;
static GMutex *clutter_threads_mutex = NULL;
static GCallback clutter_threads_lock = NULL;
static GCallback clutter_threads_unlock = NULL;
static gboolean clutter_is_initialized = FALSE;
static gboolean clutter_show_fps = FALSE;
static gboolean clutter_fatal_warnings = FALSE;
static gboolean clutter_is_initialized = FALSE;
static gboolean clutter_show_fps = FALSE;
static gboolean clutter_fatal_warnings = FALSE;
static guint clutter_default_fps = 60;
static guint clutter_default_fps = 60;
static guint clutter_main_loop_level = 0;
static GSList *main_loops = NULL;
static guint clutter_main_loop_level = 0;
static GSList *main_loops = NULL;
static PangoDirection clutter_text_direction = PANGO_DIRECTION_LTR;
guint clutter_debug_flags = 0; /* global clutter debug flag */
@ -401,21 +403,51 @@ _clutter_do_pick (ClutterStage *stage,
return clutter_get_actor_by_gid (id);
}
static PangoDirection
clutter_get_text_direction (void)
{
const gchar *direction;
PangoDirection dir = PANGO_DIRECTION_LTR;
direction = g_getenv ("CLUTTER_TEXT_DIRECTION");
if (direction && *direction != '\0')
{
if (strcmp (direction, "rtl") == 0)
dir = PANGO_DIRECTION_RTL;
else
dir = PANGO_DIRECTION_LTR;
}
else
dir = PANGO_DIRECTION_LTR;
return dir;
}
static void
update_pango_context (ClutterBackend *backend,
ClutterMainContext *main_context)
{
PangoContext *context = main_context->pango_context;
PangoFontDescription *font_desc;
cairo_font_options_t *font_options;
const gchar *font_name;
gdouble resolution;
font_name = clutter_backend_get_font_name (backend);
font_desc = pango_font_description_from_string (font_name);
font_options = clutter_backend_get_font_options (backend);
resolution = clutter_backend_get_resolution (backend);
if (resolution < 0)
resolution = 96.0; /* fall back */
pango_context_set_font_description (context, font_desc);
pango_context_set_base_dir (context, clutter_text_direction);
pango_cairo_context_set_font_options (context, font_options);
pango_cairo_context_set_resolution (context, resolution);
pango_font_description_free (font_desc);
}
PangoContext *
@ -1025,6 +1057,17 @@ clutter_get_timestamp (void)
#endif
}
static gboolean
clutter_arg_direction_cb (const char *key,
const char *value,
gpointer user_data)
{
clutter_text_direction =
(strcmp (value, "rtl") == 0) ? PANGO_DIRECTION_RTL
: PANGO_DIRECTION_LTR;
return TRUE;
}
#ifdef CLUTTER_ENABLE_DEBUG
static gboolean
@ -1098,6 +1141,8 @@ clutter_init_real (GError **error)
cogl_pango_font_map_set_resolution (ctx->font_map, resolution);
cogl_pango_font_map_set_use_mipmapping (ctx->font_map, TRUE);
clutter_text_direction = clutter_get_text_direction ();
/* Stage will give us a GL Context etc */
stage = clutter_stage_get_default ();
if (!stage)
@ -1168,6 +1213,9 @@ static GOptionEntry clutter_args[] = {
"Default frame rate", "FPS" },
{ "g-fatal-warnings", 0, 0, G_OPTION_ARG_NONE, &clutter_fatal_warnings,
"Make all warnings fatal", NULL },
{ "clutter-text-direction", 0, 0, G_OPTION_ARG_CALLBACK,
clutter_arg_direction_cb,
"Direction for the text", "DIRECTION" },
#ifdef CLUTTER_ENABLE_DEBUG
{ "clutter-debug", 0, 0, G_OPTION_ARG_CALLBACK, clutter_arg_debug_cb,
"Clutter debugging flags to set", "FLAGS" },