Re: [dev] Problem with windows name
Thank you so much Страхиња Радић! This works perfectly. André. On 10/07/2023 9:35, Страхиња Радић wrote: > I managed to fix root window title being shown incorrectly by skipping > conversion only for root window. I attached a patch with this message. Feel > free to review it, I will make any necessary corrections. > From c5b399e138f6873e2eb9a292d55c5382e654f074 Mon Sep 17 00:00:00 2001 > From: =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=B0=D1=85=D0=B8=D1=9A=D0=B0=20=D0=A0?= > =?UTF-8?q?=D0=B0=D0=B4=D0=B8=D1=9B?= > Date: Mon, 10 Jul 2023 09:25:30 +0200 > Subject: [PATCH] dwm.c: Always convert title to UTF-8, except for root window > MIME-Version: 1.0 > Content-Type: text/plain; charset=UTF-8 > Content-Transfer-Encoding: 8bit > > Window names containing only ISO 8859-1 were broken on the location of > non-ASCII ISO 8859-1 character, for example áâãéíóôúç, because they were > treated as UTF-8. When commenting out the if-branch testing for XA_STRING, > root > window title, usually set by status programs such as slstatus to UTF-8 text, > was not shown correctly, so this patch adds an exception for root window > instead, skipping conversion in that case. > > Reported by Dr. André Desgualdo Pereira. > > Signed-off-by: Страхиња Радић > --- > dwm.c | 5 - > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/dwm.c b/dwm.c > index f1d86b2..c896325 100644 > --- a/dwm.c > +++ b/dwm.c > @@ -917,7 +917,10 @@ gettextprop(Window w, Atom atom, char *text, unsigned > int size) > text[0] = '\0'; > if (!XGetTextProperty(dpy, w, , atom) || !name.nitems) > return 0; > - if (name.encoding == XA_STRING) { > + /*if (name.encoding == XA_STRING) { > + strncpy(text, (char *)name.value, size - 1); > + } else */ > + if (w == DefaultRootWindow(dpy)) { > strncpy(text, (char *)name.value, size - 1); > } else if (XmbTextPropertyToTextList(dpy, , , ) >= Success > && n > 0 && *list) { > strncpy(text, *list, size - 1); > -- > 2.38.5 > -- Dr. André Desgualdo Pereira Psiquiatra - CRM/SP: 120218 - RQE: 61032 WhatsApp: (11) 985-847-809 - email: des...@gmail.com Consultório Lapa: Rua Clélia, 2208 - sala 307 Consultório Santana: Av. Gen. Ataliba Leonel, 93 - sala 61
Re: [dev] Problem with windows name
I managed to fix root window title being shown incorrectly by skipping conversion only for root window. I attached a patch with this message. Feel free to review it, I will make any necessary corrections. From c5b399e138f6873e2eb9a292d55c5382e654f074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=B0=D1=85=D0=B8=D1=9A=D0=B0=20=D0=A0?= =?UTF-8?q?=D0=B0=D0=B4=D0=B8=D1=9B?= Date: Mon, 10 Jul 2023 09:25:30 +0200 Subject: [PATCH] dwm.c: Always convert title to UTF-8, except for root window MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Window names containing only ISO 8859-1 were broken on the location of non-ASCII ISO 8859-1 character, for example áâãéíóôúç, because they were treated as UTF-8. When commenting out the if-branch testing for XA_STRING, root window title, usually set by status programs such as slstatus to UTF-8 text, was not shown correctly, so this patch adds an exception for root window instead, skipping conversion in that case. Reported by Dr. André Desgualdo Pereira. Signed-off-by: Страхиња Радић --- dwm.c | 5 - 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dwm.c b/dwm.c index f1d86b2..c896325 100644 --- a/dwm.c +++ b/dwm.c @@ -917,7 +917,10 @@ gettextprop(Window w, Atom atom, char *text, unsigned int size) text[0] = '\0'; if (!XGetTextProperty(dpy, w, , atom) || !name.nitems) return 0; - if (name.encoding == XA_STRING) { + /*if (name.encoding == XA_STRING) { + strncpy(text, (char *)name.value, size - 1); + } else */ + if (w == DefaultRootWindow(dpy)) { strncpy(text, (char *)name.value, size - 1); } else if (XmbTextPropertyToTextList(dpy, , , ) >= Success && n > 0 && *list) { strncpy(text, *list, size - 1); -- 2.38.5 signature.asc Description: PGP signature
Re: [dev] Problem with windows name
Adding to gettextprop in dwm.c: // ... if (!XGetTextProperty(dpy, w, , atom) || !name.nitems) return 0; FILE* log = fopen("/home/user/dwm.log", "at"); fprintf(log, "---\n"); fprintf(log, "atom = {%lu}\n", atom); fprintf(log, "text = {%s}\n", text); fprintf(log, "value= {%s}\n", name.value); fprintf(log, "encoding = {%lu}\n", name.encoding); fprintf(log, "format = {%d}\n", name.format); fprintf(log, "nitems = {%lu}\n", name.nitems); fclose(log); if (name.encoding == XA_STRING) { // ... I got: --- atom = {39} text = {} value= {thistest.odt - LibreOffice Writer} encoding = {31} format = {8} nitems = {34} --- atom = {39} text = {} value= {thistestL.odt - LibreOffice Writer} encoding = {385} format = {8} nitems = {38} So COMPOUND_TEXT sets the encoding field of XTextProperty to 385, a value not listed in Xatom.h, while STRING sets it to 31 (XA_STRING). The code: if (name.encoding == XA_STRING) { strncpy(text, (char *)name.value, size - 1); } else if (XmbTextPropertyToTextList(dpy, , , ) >= Success && n > 0 && *list) { strncpy(text, *list, size - 1); XFreeStringList(list); } converts any string not having XA_STRING as encoding with XmbTextPropertyToTextList[1]. The issue is that ISO 8859-1-encoded text, marked as XA_STRING, is copied with strncpy, and treated as UTF-8 later on in drw_text in drw.c. It probably should be converted to UTF-8 from the current locale, even when encoding field is set to XA_STRING. However, when I commented out the first branch like this: /*if (name.encoding == XA_STRING) { strncpy(text, (char *)name.value, size - 1); } else*/ if (XmbTextPropertyToTextList(dpy, , , ) >= Success && n > 0 && *list) { strncpy(text, *list, size - 1); XFreeStringList(list); } The document title in LibreOffice was shown correctly. *However*, the output from slstatus, containing UTF-8 while having the encoding field also set to XA_STRING, was *not* shown correctly, even though the description of XmbTextPropertyToTextList states that > The input text strings must be given in the current locale encoding (for > XmbTextListToTextProperty and XwcTextListToTextProperty), or in UTF-8 > encoding > (for Xutf8TextListToTextProperty). and my LANG is set to sr_RS.UTF-8 (so my "current locale encoding" should be UTF-8). So, this would be a workaround, but one with further potential issues. [1]: https://linux.die.net/man/3/xmbtextpropertytotextlist
Re: [dev] Problem with windows name
I debugged dwm, adding to drw.c: static void log_msg(const char* fmt, ...) { char buf[4096]; va_list args; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); fprintf(logfile, "%s\n", buf); } and calls to utf8decodebyte: static long utf8decodebyte(const char c, size_t *i) { for (*i = 0; *i < (UTF_SIZ + 1); ++(*i)) if (((unsigned char)c & utfmask[*i]) == utfbyte[*i]) { log_msg("*i = %lu, for '%c' returning '%c'", *i, c, (unsigned char)c & ~utfmask[*i]); return (unsigned char)c & ~utfmask[*i]; } return 0; } and drw_text: utf8str = text; nextfont = NULL; while (*text) { log_msg("*text == '0x%X' == '%c'", *text, *text); utf8charlen = utf8decode(text, , UTF_SIZ); for (curfont = drw->fonts; curfont; curfont = curfont->next) { charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint); I got the following output from "thisátest.odt" // á *text == '0xFFE1' == '' *i = 3, for '' returning '^A' *i = 1, for 't' returning 't' *text == '0x74' == 't' *i = 1, for 't' returning 't' and the following from "thisátestњ.odt": // á *text == '0xFFC3' == '' *i = 2, for '' returning '^C' *i = 0, for '' returning '!' [...] // њ *text == '0xFFD1' == '' *i = 2, for '' returning '^Q' *i = 0, for '<9A>' returning '^Z' From here, it seems that dwm is receiving correct UTF-8 representations of "á" (0xC3 0xA1) and "њ" (0xD1 0x9A) for "thisátestњ.odt", but it receives ISO 8859-1 representation of "á" (no wonder, given it is passed a STRING instead of UTF8_STRING or COMPOUND_TEXT), 0xE1, followed by the next ASCII character, 0x74 ("t"), still interpreting the two as UTF-8 sequence, when those two bytes form an invalid UTF-8. That invalid UTF-8 is further passed to libfreetype or whatever, which just interrupts output at that point. signature.asc Description: PGP signature
Re: [dev] Problem with windows name
On 23/07/09 08:43AM, Dr. André Desgualdo Pereira wrote: > # xprop > xprop shows the correct name, but it doesn't has the _NET_WM_NAME defined as > it used to have on Debian 11 and before (I guess it is because missing > library > tkinter for python2.7). > Example: WM_NAME(STRING) = "André Desgualdo.odt - OpenOffice Writer" I have made two files, one with á and ASCII characters and another with added њ. The results from xprop are: WM_NAME(STRING) = "thisátest.odt - LibreOffice Writer" ^^ WM_NAME(COMPOUND_TEXT) = "thisátestњ.odt - LibreOffice Writer" ^ This implies that this is a X.Org issue. Strings having only ISO 8859-1 characters are silently degraded to STRINGs when they should really be COMPOUND_TEXT. signature.asc Description: PGP signature
[dev] Problem with windows name
# The Problem: dwm status bar fails to display the name of Libreoffice and OpenOffice windows # Conditions (when it happens): 1) Debian 12 (previous Debian worked fine) 2) The file name must contain a latin character (one of these: áâãéíóôúç) and NOT contain other glyphs characters (for example Japanese 你) # Examples: name of the filename displayed on dwm status "André Desgualdo.odt" -> "Andr Desgualdo.odt - OpenOffice Writer" (wrong, it miss the é) "Andre Desgualdo.odt" -> "Andre Desgualdo.odt - OpenOffice Writer" (right) "你 André Desgualdo.odt"-> "你 André Desgualdo.odt - OpenOffice Writer" (right) "André Desgualdo 你.odt"-> "André Desgualdo 你.odt - OpenOffice Writer" (right) # xprop xprop shows the correct name, but it doesn't has the _NET_WM_NAME defined as it used to have on Debian 11 and before (I guess it is because missing library tkinter for python2.7). Example: WM_NAME(STRING) = "André Desgualdo.odt - OpenOffice Writer" # xwininfo But xwininfo also fails to show the name properly. Example: xwininfo: Window id: 0xe031bd "Andr Desgualdo.odt - OpenOffice Writer" # Other window managers Other window managers show the window's name correctly. Tested: xfce4wm and i3wm. # Other programs that are not Libreoffice or OpenOffice When opening the same file with other program (for example opening "André Desgualdo.odt" with file-roller), the name is displayed correctly and xprop shows the following info: _NET_WM_NAME(STRING) = "Andr\303\251 Desgualdo.odt - OpenOffice"). # Workaround Any suggestion to further investigate or possible workarounds or fix would be really appreciated. (Currently I made a script to use xdotool to rename the window as soon as it is opened by OpenOffice).