--- a/configure.ac +++ b/configure.ac @@ -33,6 +33,8 @@ AC_PROG_MKDIR_P AC_ARG_VAR([LD], [Linker loader command]) +PKG_PROG_PKG_CONFIG + AC_ARG_VAR([MKFONTDIR],[mkfontdir command. @<:@default=mkfontdir@:>@]) AC_PATH_PROG([MKFONTDIR],[mkfontdir],[],[$PATH$PATH_SEPARATOR/usr/X11R6/bin]) @@ -53,14 +55,23 @@ features="$features i18n" fi +AC_ARG_ENABLE([fribidi], + AC_HELP_STRING([--disable-fribidi],[Disable right to left support])) +if test "$enable_fribidi" != "no" && test "$enable_i18n" != "no"; then + PKG_CHECK_MODULES(FRIBIDI, fribidi) + + AC_DEFINE(CONFIG_FRIBIDI,1, [Define to enable fribidi support]) + + CORE_CFLAGS="${CORE_CFLAGS} ${FRIBIDI_CFLAGS}" + CORE_LIBS="${CORE_LIBS} ${FRIBIDI_LIBS}" +fi + AC_ARG_WITH([unicode-set], AC_HELP_STRING([--with-unicode-set=CODESET],[Your iconv unicode set in machine endian encoding (e.g. WCHAR_T, UCS-4-INTERNAL, UCS-4LE, UCS-4BE)]), [AC_DEFINE_UNQUOTED([CONFIG_UNICODE_SET],"$with_unicode_set",[Preferred unicode set.])]) -PKG_PROG_PKG_CONFIG - # Checks for libraries. # Checks for header files. --- a/src/yfontxft.cc +++ b/src/yfontxft.cc @@ -6,6 +6,11 @@ #include "ypaint.h" #include "yxapp.h" #include "intl.h" +#include + +#ifdef CONFIG_FRIBIDI + #include +#endif /******************************************************************************/ @@ -69,10 +74,45 @@ char_t * str, size_t len) { XftColor *c = *g.color(); + +#ifdef CONFIG_FRIBIDI + +#define STATIS_STRING_SIZE 256 + + // Based around upstream (1.3.2) patch with some optimization + // on my end. (reduce unnecessary memory allocation) + // - Gilboa + + char_t static_str[STATIS_STRING_SIZE]; + char_t *vis_str = static_str; + + if (len >= STATIS_STRING_SIZE) + { + vis_str = new char_t[len+1]; + if (!vis_str) + return; + } + + FriBidiCharType pbase_dir = FRIBIDI_TYPE_N; + fribidi_log2vis(str, len, &pbase_dir, //input + vis_str, // output + NULL, NULL, NULL // "statistics" that we don't need + ); + str = vis_str; +#endif + XftDrawString(g.handleXft(), c, font, x - g.xorigin(), y - g.yorigin(), str, len); + +#ifdef CONFIG_FRIBIDI + + if (vis_str != static_str) + delete[] str; + +#endif + } static void textExtents(XftFont * font, char_t * str, size_t len,