dmenu-bidi-20210723-b34d318.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dmenu-bidi-20210723-b34d318.diff (3015B)
---
1 From b34d318bfed8557f2a1e53fc523b8ecff7c79374 Mon Sep 17 00:00:00 2001
2 From: Eyal Seelig <eyal.seelig@gmail.com>
3 Date: Fri, 23 Jul 2021 18:31:11 +0300
4 Subject: [PATCH] Added support for RTL languages, such as Hebrew, Arabic, and
5 Farsi, using the FriBiDi library
6
7 ---
8 config.mk | 8 ++++++--
9 dmenu.c | 29 +++++++++++++++++++++++++++--
10 2 files changed, 33 insertions(+), 4 deletions(-)
11
12 diff --git a/config.mk b/config.mk
13 index 05d5a3e..eefd0ae 100644
14 --- a/config.mk
15 +++ b/config.mk
16 @@ -8,6 +8,8 @@ MANPREFIX = $(PREFIX)/share/man
17 X11INC = /usr/X11R6/include
18 X11LIB = /usr/X11R6/lib
19
20 +BDINC = /usr/include/fribidi
21 +
22 # Xinerama, comment if you don't want it
23 XINERAMALIBS = -lXinerama
24 XINERAMAFLAGS = -DXINERAMA
25 @@ -18,9 +20,11 @@ FREETYPEINC = /usr/include/freetype2
26 # OpenBSD (uncomment)
27 #FREETYPEINC = $(X11INC)/freetype2
28
29 +BDLIBS = -lfribidi
30 +
31 # includes and libs
32 -INCS = -I$(X11INC) -I$(FREETYPEINC)
33 -LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS)
34 +INCS = -I$(X11INC) -I$(FREETYPEINC) -I$(BDINC)
35 +LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) $(BDLIBS)
36
37 # flags
38 CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS)
39 diff --git a/dmenu.c b/dmenu.c
40 index 65f25ce..389916b 100644
41 --- a/dmenu.c
42 +++ b/dmenu.c
43 @@ -16,6 +16,8 @@
44 #endif
45 #include <X11/Xft/Xft.h>
46
47 +#include <fribidi.h>
48 +
49 #include "drw.h"
50 #include "util.h"
51
52 @@ -35,6 +37,7 @@ struct item {
53 };
54
55 static char text[BUFSIZ] = "";
56 +static char fribidi_text[BUFSIZ] = "";
57 static char *embed;
58 static int bh, mw, mh;
59 static int inputw = 0, promptw;
60 @@ -113,6 +116,26 @@ cistrstr(const char *s, const char *sub)
61 return NULL;
62 }
63
64 +static void
65 +apply_fribidi(char *str)
66 +{
67 + FriBidiStrIndex len = strlen(str);
68 + FriBidiChar logical[BUFSIZ];
69 + FriBidiChar visual[BUFSIZ];
70 + FriBidiParType base = FRIBIDI_PAR_ON;
71 + FriBidiCharSet charset;
72 + fribidi_boolean result;
73 +
74 + fribidi_text[0] = 0;
75 + if (len>0)
76 + {
77 + charset = fribidi_parse_charset("UTF-8");
78 + len = fribidi_charset_to_unicode(charset, str, len, logical);
79 + result = fribidi_log2vis(logical, len, &base, visual, NULL, NULL, NULL);
80 + len = fribidi_unicode_to_charset(charset, visual, len, fribidi_text);
81 + }
82 +}
83 +
84 static int
85 drawitem(struct item *item, int x, int y, int w)
86 {
87 @@ -123,7 +146,8 @@ drawitem(struct item *item, int x, int y, int w)
88 else
89 drw_setscheme(drw, scheme[SchemeNorm]);
90
91 - return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
92 + apply_fribidi(item->text);
93 + return drw_text(drw, x, y, w, bh, lrpad / 2, fribidi_text, 0);
94 }
95
96 static void
97 @@ -143,7 +167,8 @@ drawmenu(void)
98 /* draw input field */
99 w = (lines > 0 || !matches) ? mw - x : inputw;
100 drw_setscheme(drw, scheme[SchemeNorm]);
101 - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
102 + apply_fribidi(text);
103 + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0);
104
105 curpos = TEXTW(text) - TEXTW(&text[cursor]);
106 if ((curpos += lrpad / 2 - 1) < w) {
107 --
108 2.32.0
109