Re: [hackers] [dwm][PATCH] Added support for RTL languages (Farsi, Arabic and Hebrew using the FriBiDi library)

From: <me_AT_mahdym.ir>
Date: Sat, 19 Feb 2022 14:14:55 +0330
hello sir, thank you I wanted this to be in the wiki, should I write a wiki for the patch and send it over as markdown? or someone from the team does it themselves?

On Feb 19, 2022 13:38, Hiltjo Posthuma <hiltjo_AT_codemadness.org> wrote:

On Sat, Feb 19, 2022 at 07:49:28AM +0330, Mahdi Mirzade wrote:
> From: mahdymirzade <me_AT_mahdym.ir>
>
> ---
>  config.mk |  8 ++++++--
>  dwm.c     | 45 ++++++++++++++++++++++++++++++++++++---------
>  2 files changed, 42 insertions(+), 11 deletions(-)
>
> diff --git a/config.mk b/config.mk
> index b6eb7e0..5b60a24 100644
> --- a/config.mk
> +++ b/config.mk
> _AT__AT_ -10,6 +10,8 _AT__AT_ MANPREFIX = ${PREFIX}/share/man
>  X11INC = /usr/X11R6/include
>  X11LIB = /usr/X11R6/lib

> +BDINC = /usr/include/fribidi
> +
>  # Xinerama, comment if you don't want it
>  XINERAMALIBS  = -lXinerama
>  XINERAMAFLAGS = -DXINERAMA
> _AT__AT_ -20,9 +22,11 _AT__AT_ FREETYPEINC = /usr/include/freetype2
>  # OpenBSD (uncomment)
>  #FREETYPEINC = ${X11INC}/freetype2

> +BDLIBS = -lfribidi
> +
>  # includes and libs
> -INCS = -I${X11INC} -I${FREETYPEINC}
> -LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
> +INCS = -I${X11INC} -I${FREETYPEINC} -I$(BDINC)
> +LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS} $(BDLIBS)

>  # flags
>  CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
> diff --git a/dwm.c b/dwm.c
> index a96f33c..2e7b8eb 100644
> --- a/dwm.c
> +++ b/dwm.c
> _AT__AT_ -40,6 +40,7 _AT__AT_
>  #include <X11/extensions/Xinerama.h>
>  #endif /* XINERAMA */
>  #include <X11/Xft/Xft.h>
> +#include <fribidi.h>

>  #include "drw.h"
>  #include "util.h"
> _AT__AT_ -238,6 +239,7 _AT__AT_ static void zoom(const Arg *arg);
>  /* variables */
>  static const char broken[] = "broken";
>  static char stext[256];
> +static char fribidi_text[BUFSIZ] = "";
>  static int screen;
>  static int sw, sh;           /* X display screen geometry width, height */
>  static int bh, blw = 0;      /* bar geometry */
> _AT__AT_ -276,6 +278,26 _AT__AT_ static Window root, wmcheckwin;
>  struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };

>  /* function implementations */
> +static void
> +apply_fribidi(char *str)
> +{
> +        FriBidiStrIndex len = strlen(str);
> +        FriBidiChar logical[BUFSIZ];
> +        FriBidiChar visual[BUFSIZ];
> +        FriBidiParType base = FRIBIDI_PAR_ON;
> +        FriBidiCharSet charset;
> +        fribidi_boolean result;
> +   
> +        fribidi_text[0] = 0;
> +        if (len>0)
> +        {
> +                charset = fribidi_parse_charset("UTF-8");
> +                len = fribidi_charset_to_unicode(charset, str, len, logical);
> +                result = fribidi_log2vis(logical, len, &base, visual, NULL, NULL, NULL);
> +                len = fribidi_unicode_to_charset(charset, visual, len, fribidi_text);
> +        }
> +}
> +
>  void
>  applyrules(Client *c)
>  {
> _AT__AT_ -708,8 +730,9 _AT__AT_ drawbar(Monitor *m)
>  /* draw status first so it can be overdrawn by tags later */
>  if (m == selmon) { /* status is only drawn on selected monitor */
>  drw_setscheme(drw, scheme[SchemeNorm]);
> - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
> - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
> +                apply_fribidi(stext);
> + tw = TEXTW(fribidi_text) - lrpad + 2; /* 2px right padding */
> + drw_text(drw, m->ww - tw, 0, tw, bh, 0, fribidi_text, 0);
>  }

>  for (c = m->clients; c; c = c->next) {
> _AT__AT_ -719,23 +742,26 _AT__AT_ drawbar(Monitor *m)
>  }
>  x = 0;
>  for (i = 0; i < LENGTH(tags); i++) {
> - w = TEXTW(tags[i]);
> +                apply_fribidi(tags[i]);
> + w = TEXTW(fribidi_text);
>  drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
> - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
> + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, urg & 1 << i);
>  if (occ & 1 << i)
>  drw_rect(drw, x + boxs, boxs, boxw, boxw,
>  m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
>  urg & 1 << i);
>  x += w;
>  }
> - w = blw = TEXTW(m->ltsymbol);
> +        apply_fribidi(m->ltsymbol);
> + w = blw = TEXTW(fribidi_text);
>  drw_setscheme(drw, scheme[SchemeNorm]);
> - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
> + x = drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0);

>  if ((w = m->ww - tw - x) > bh) {
>  if (m->sel) {
>  drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
> - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
> +                        apply_fribidi(m->sel->name);
> + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0);
>  if (m->sel->isfloating)
>  drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
>  } else {
> _AT__AT_ -1993,8 +2019,9 _AT__AT_ updatesizehints(Client *c)
>  void
>  updatestatus(void)
>  {
> - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
> - strcpy(stext, "dwm-"VERSION);
> +        apply_fribidi(stext);
> + if (!gettextprop(root, XA_WM_NAME, fribidi_text, sizeof(fribidi_text)))
> + strcpy(fribidi_text, "dwm-"VERSION);
>  drawbar(selmon);
>  }

> --
> 2.35.1
>
>

Hi,

This patch can be added to the wiki.

--
Kind regards,
Hiltjo


Received on Sat Feb 19 2022 - 11:44:55 CET

This archive was generated by hypermail 2.3.0 : Sat Feb 19 2022 - 11:48:36 CET