Hi Michael,

I used the attached patch so the utf8 hardstatus would display
correctly in my xterm titlebar. Is it ok or how could I improve it?

Thanks in advance.

Roger

On Mon, Apr 23, 2007 at 08:28:17PM +0200, Michael Schroeder wrote:
> On Wed, Mar 28, 2007 at 12:04:09PM +0200, Zvi Har'El wrote:
> > Comparing Unicode, it replaces U+03B1 GREEK SMALL LETTER ALPHA with 
> > U+00B1 PLUS-MINUS SIGN and so on, i.e, the Unicode  values seem to be
> > taken modulo U+0100.
> 
> Yes, it's because StringChar() in ansi.c discards the upper bits.
> To fix this bug we'd have to change the way the string gets stored.
> Note that we can't just simply transcode to the display's encoding,
> as the window may be displayed on multiple displays with different
> encodings...
> 
> Cheers,
>   Michael.
> 
> -- 
> Michael Schroeder           mlsch...@informatik.uni-erlangen.de
> main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);}
> 
> 
diff -uNr screen-4.0.3/ansi.c screen.1/ansi.c
--- screen-4.0.3/ansi.c	2003-12-05 21:57:05.000000000 +0800
+++ screen.1/ansi.c	2009-04-06 13:13:46.000000000 +0800
@@ -1440,6 +1440,19 @@
 StringChar(c)
 int c;
 {
+#ifdef UTF8
+    if (curr->w_encoding == UTF8)
+    {
+        char buf[] = { 0, 0, 0, 0 }; /* last one is the \0 terminator. */
+        int i, len = ToUtf8(buf, c);
+        if (curr->w_stringp >= curr->w_string + MAXSTR - len)
+            curr->w_state = LIT;
+        for (i=0; i<len; i++)
+            *curr->w_stringp++ = buf[i];
+        debug1("StringChar: %s\n", buf);
+        return;
+    }
+#endif
   if (curr->w_stringp >= curr->w_string + MAXSTR - 1)
     curr->w_state = LIT;
   else
diff -uNr screen-4.0.3/display.c screen.1/display.c
--- screen-4.0.3/display.c	2003-12-05 21:45:41.000000000 +0800
+++ screen.1/display.c	2009-04-06 13:25:21.000000000 +0800
@@ -2405,9 +2410,9 @@
       AddCStr2(D_TS, 0);
       max = D_WS > 0 ? D_WS : (D_width - !D_CLP);
       if ((int)strlen(str) > max)
-	AddStrn(str, max);
+	AddStrnPlain(str, max);
       else
-	AddStr(str);
+	AddStrPlain(str);
       AddCStr(D_FS);
       D_hstatus = 1;
     }
@@ -3111,6 +3121,18 @@
 }
 
 void
+AddStrPlain(str)
+char *str;
+{
+  register char c;
+
+  ASSERT(display);
+
+  while ((c = *str++))
+    AddChar(c);
+}
+
+void
 AddStrn(str, n)
 char *str;
 int n;
@@ -3133,6 +3155,21 @@
 }
 
 void
+AddStrnPlain(str, n)
+char *str;
+int n;
+{
+  register char c;
+
+  ASSERT(display);
+  while ((c = *str++) && n-- > 0)
+    AddChar(c);
+  while (n-- > 0)
+    AddChar(' ');
+}
+
+
+void
 Flush()
 {
   register int l;
diff -uNr screen-4.0.3/extern.h screen.1/extern.h
--- screen-4.0.3/extern.h	2003-08-22 20:27:57.000000000 +0800
+++ screen.1/extern.h	2009-04-06 13:26:18.000000000 +0800
@@ -281,6 +281,8 @@
 extern int   ResizeDisplay __P((int, int));
 extern void  AddStr __P((char *));
 extern void  AddStrn __P((char *, int));
+extern void  AddStrPlain __P((char *));
+extern void  AddStrnPlain __P((char *, int));
 extern void  Flush __P((void));
 extern void  freetty __P((void));
 extern void  Resize_obuf __P((void));
_______________________________________________
screen-users mailing list
screen-users@gnu.org
http://lists.gnu.org/mailman/listinfo/screen-users

Reply via email to