dwm-bidi-20220219-302953a.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-bidi-20220219-302953a.diff (4790B)
---
1 From 302953ae637ffa4d106ca9b6567c2b5fc082f2b5 Mon Sep 17 00:00:00 2001
2 From: MahdiMirzadeh <mahdi@mirzadeh.pro>
3 Date: Sat, 19 Feb 2022 07:37:39 +0330
4 Subject: [PATCH] Added support for RTL languages (Farsi, Arabic and Hebrew
5 using the FriBiDi library)
6
7 ---
8 config.mk | 8 ++++++--
9 dwm.c | 45 ++++++++++++++++++++++++++++++++++++---------
10 2 files changed, 42 insertions(+), 11 deletions(-)
11
12 diff --git a/config.mk b/config.mk
13 index b6eb7e0..5b60a24 100644
14 --- a/config.mk
15 +++ b/config.mk
16 @@ -10,6 +10,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 @@ -20,9 +22,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_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
39 diff --git a/dwm.c b/dwm.c
40 index a96f33c..2e7b8eb 100644
41 --- a/dwm.c
42 +++ b/dwm.c
43 @@ -40,6 +40,7 @@
44 #include <X11/extensions/Xinerama.h>
45 #endif /* XINERAMA */
46 #include <X11/Xft/Xft.h>
47 +#include <fribidi.h>
48
49 #include "drw.h"
50 #include "util.h"
51 @@ -238,6 +239,7 @@ static void zoom(const Arg *arg);
52 /* variables */
53 static const char broken[] = "broken";
54 static char stext[256];
55 +static char fribidi_text[BUFSIZ] = "";
56 static int screen;
57 static int sw, sh; /* X display screen geometry width, height */
58 static int bh, blw = 0; /* bar geometry */
59 @@ -276,6 +278,26 @@ static Window root, wmcheckwin;
60 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
61
62 /* function implementations */
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 void
84 applyrules(Client *c)
85 {
86 @@ -708,8 +730,9 @@ drawbar(Monitor *m)
87 /* draw status first so it can be overdrawn by tags later */
88 if (m == selmon) { /* status is only drawn on selected monitor */
89 drw_setscheme(drw, scheme[SchemeNorm]);
90 - tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */
91 - drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0);
92 + apply_fribidi(stext);
93 + tw = TEXTW(fribidi_text) - lrpad + 2; /* 2px right padding */
94 + drw_text(drw, m->ww - tw, 0, tw, bh, 0, fribidi_text, 0);
95 }
96
97 for (c = m->clients; c; c = c->next) {
98 @@ -719,23 +742,26 @@ drawbar(Monitor *m)
99 }
100 x = 0;
101 for (i = 0; i < LENGTH(tags); i++) {
102 - w = TEXTW(tags[i]);
103 + apply_fribidi(tags[i]);
104 + w = TEXTW(fribidi_text);
105 drw_setscheme(drw, scheme[m->tagset[m->seltags] & 1 << i ? SchemeSel : SchemeNorm]);
106 - drw_text(drw, x, 0, w, bh, lrpad / 2, tags[i], urg & 1 << i);
107 + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, urg & 1 << i);
108 if (occ & 1 << i)
109 drw_rect(drw, x + boxs, boxs, boxw, boxw,
110 m == selmon && selmon->sel && selmon->sel->tags & 1 << i,
111 urg & 1 << i);
112 x += w;
113 }
114 - w = blw = TEXTW(m->ltsymbol);
115 + apply_fribidi(m->ltsymbol);
116 + w = blw = TEXTW(fribidi_text);
117 drw_setscheme(drw, scheme[SchemeNorm]);
118 - x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0);
119 + x = drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0);
120
121 if ((w = m->ww - tw - x) > bh) {
122 if (m->sel) {
123 drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]);
124 - drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0);
125 + apply_fribidi(m->sel->name);
126 + drw_text(drw, x, 0, w, bh, lrpad / 2, fribidi_text, 0);
127 if (m->sel->isfloating)
128 drw_rect(drw, x + boxs, boxs, boxw, boxw, m->sel->isfixed, 0);
129 } else {
130 @@ -1993,8 +2019,9 @@ updatesizehints(Client *c)
131 void
132 updatestatus(void)
133 {
134 - if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext)))
135 - strcpy(stext, "dwm-"VERSION);
136 + apply_fribidi(stext);
137 + if (!gettextprop(root, XA_WM_NAME, fribidi_text, sizeof(fribidi_text)))
138 + strcpy(fribidi_text, "dwm-"VERSION);
139 drawbar(selmon);
140 }
141
142 --
143 2.35.1
144