sent-bidi-20220622-9ed2713.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       sent-bidi-20220622-9ed2713.diff (3347B)
       ---
            1 From 9ed271353ddeadd66e6550aa79065b601b3d6cf4 Mon Sep 17 00:00:00 2001
            2 From: Mahdi Mirzadeh <mahdi@mirzadeh.pro>
            3 Date: Wed, 22 Jun 2022 02:55:13 +0430
            4 Subject: [PATCH] Added support for RTL languages (Farsi, Arabic and Hebrew
            5  using the FriBiDi library) to sent
            6 
            7 ---
            8  config.mk | 13 ++++++++-----
            9  sent.c    | 28 ++++++++++++++++++++++++++--
           10  2 files changed, 34 insertions(+), 7 deletions(-)
           11 
           12 diff --git a/config.mk b/config.mk
           13 index d61c554..8e74aee 100644
           14 --- a/config.mk
           15 +++ b/config.mk
           16 @@ -10,14 +10,17 @@ MANPREFIX = ${PREFIX}/share/man
           17  X11INC = /usr/X11R6/include
           18  X11LIB = /usr/X11R6/lib
           19  
           20 +BDINC = /usr/include/fribidi
           21 +BDLIBS = -lfribidi
           22 +
           23  # includes and libs
           24 -INCS = -I. -I/usr/include -I/usr/include/freetype2 -I${X11INC}
           25 -LIBS = -L/usr/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11
           26 +INCS = -I. -I/usr/include -I/usr/include/freetype2 -I${X11INC} -I$(BDINC)
           27 +LIBS = -L/usr/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11 $(BDLIBS)
           28  # OpenBSD (uncomment)
           29 -#INCS = -I. -I${X11INC} -I${X11INC}/freetype2
           30 +#INCS = -I. -I${X11INC} -I${X11INC}/freetype2 -I$(BDINC)
           31  # FreeBSD (uncomment)
           32 -#INCS = -I. -I/usr/local/include -I/usr/local/include/freetype2 -I${X11INC}
           33 -#LIBS = -L/usr/local/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11
           34 +#INCS = -I. -I/usr/local/include -I/usr/local/include/freetype2 -I${X11INC} -I/usr/local/include/fribidi
           35 +#LIBS = -L/usr/local/lib -lc -lm -L${X11LIB} -lXft -lfontconfig -lX11 $(BDLIBS)
           36  
           37  # flags
           38  CPPFLAGS = -DVERSION=\"${VERSION}\" -D_XOPEN_SOURCE=600
           39 diff --git a/sent.c b/sent.c
           40 index 9534fca..a03475b 100644
           41 --- a/sent.c
           42 +++ b/sent.c
           43 @@ -18,6 +18,7 @@
           44  #include <X11/Xlib.h>
           45  #include <X11/Xutil.h>
           46  #include <X11/Xft/Xft.h>
           47 +#include <fribidi.h>
           48  
           49  #include "arg.h"
           50  #include "util.h"
           51 @@ -117,6 +118,7 @@ static void configure(XEvent *);
           52  
           53  /* Globals */
           54  static const char *fname = NULL;
           55 +static char fribidi_text[BUFSIZ] = "";
           56  static Slide *slides = NULL;
           57  static int idx = 0;
           58  static int slidecount = 0;
           59 @@ -134,6 +136,26 @@ static void (*handler[LASTEvent])(XEvent *) = {
           60          [KeyPress] = kpress,
           61  };
           62  
           63 +static void
           64 +apply_fribidi(char *str)
           65 +{
           66 +        FriBidiStrIndex len = strlen(str);
           67 +        FriBidiChar logical[BUFSIZ];
           68 +        FriBidiChar visual[BUFSIZ];
           69 +        FriBidiParType base = FRIBIDI_PAR_ON;
           70 +        FriBidiCharSet charset;
           71 +        fribidi_boolean result;
           72 +
           73 +        fribidi_text[0] = 0;
           74 +        if (len>0)
           75 +        {
           76 +                charset = fribidi_parse_charset("UTF-8");
           77 +                len = fribidi_charset_to_unicode(charset, str, len, logical);
           78 +                result = fribidi_log2vis(logical, len, &base, visual, NULL, NULL, NULL);
           79 +                len = fribidi_unicode_to_charset(charset, visual, len, fribidi_text);
           80 +        }
           81 +}
           82 +
           83  int
           84  filter(int fd, const char *cmd)
           85  {
           86 @@ -528,15 +550,17 @@ xdraw()
           87  
           88          if (!im) {
           89                  drw_rect(d, 0, 0, xw.w, xw.h, 1, 1);
           90 -                for (i = 0; i < slides[idx].linecount; i++)
           91 +                for (i = 0; i < slides[idx].linecount; i++) {
           92 +                        apply_fribidi(slides[idx].lines[i]);
           93                          drw_text(d,
           94                                   (xw.w - width) / 2,
           95                                   (xw.h - height) / 2 + i * linespacing * d->fonts->h,
           96                                   width,
           97                                   d->fonts->h,
           98                                   0,
           99 -                                 slides[idx].lines[i],
          100 +                                 fribidi_text,
          101                                   0);
          102 +                }
          103                  drw_map(d, xw.win, 0, 0, xw.w, xw.h);
          104          } else {
          105                  if (!(im->state & SCALED))
          106 -- 
          107 2.35.2
          108