changeset 981:553b8ecf901f

Fixes truncating of utf-8 buddy names (again) This patch fixes the problem with utf-8 buddy names, which include multibyte characters. This patch version (maybe) fixes issue for utf-8 locales too.
author Myhailo Danylenko <isbear@ukrpost.net>
date Sun, 22 Oct 2006 20:27:28 +0200
parents 023891f99732
children 9cd7d00812f9
files mcabber/src/screen.c
diffstat 1 files changed, 8 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/src/screen.c	Sat Oct 21 15:00:41 2006 +0200
+++ b/mcabber/src/screen.c	Sun Oct 22 20:27:28 2006 +0200
@@ -1135,8 +1135,6 @@
     return;
   }
 
-  name = g_new0(char, Roster_Width);
-
   // Update offset if necessary
   // a) Try to show as many buddylist items as possible
   i = g_list_length(buddylist) - maxy;
@@ -1148,7 +1146,6 @@
   i = g_list_position(buddylist, current_buddy);
   if (i == -1) { // This is bad
     scr_LogPrint(LPRINT_NORMAL, "Doh! Can't find current selected buddy!!");
-    g_free(name);
     curs_set(cursor_backup);
     return;
   } else if (i < offset) {
@@ -1162,14 +1159,15 @@
   else
     x_pos = 0;
 
-  rline = g_new0(char, Roster_Width+1);
+  name = g_new0(char, 4*Roster_Width);
+  rline = g_new0(char, 4*Roster_Width+1);
 
   buddy = buddylist;
   rOffset = offset;
 
   for (i=0; i<maxy && buddy; buddy = g_list_next(buddy)) {
     unsigned short bflags, btype, ismsg, isgrp, ismuc, ishid, isspe;
-    gchar *name_locale;
+    gchar *rline_locale;
 
     bflags = buddy_getflags(BUDDATA(buddy));
     btype = buddy_gettype(BUDDATA(buddy));
@@ -1221,9 +1219,8 @@
         wattrset(rosterWnd, get_color(COLOR_ROSTER));
     }
 
-    name_locale = from_utf8(buddy_getname(BUDDATA(buddy)));
     if (Roster_Width > 7)
-      strncpy(name, name_locale, Roster_Width-7);
+      g_utf8_strncpy(name, buddy_getname(BUDDATA(buddy)), Roster_Width-7);
     else
       name[0] = 0;
 
@@ -1249,12 +1246,13 @@
         }
       }
 
-      snprintf(rline, Roster_Width,
+      snprintf(rline, 4*Roster_Width,
                " %c%c%c%c %s", pending, sepleft, status, sepright, name);
     }
 
-    mvwprintw(rosterWnd, i, x_pos, "%s", rline);
-    g_free(name_locale);
+    rline_locale = from_utf8(rline);
+    mvwprintw(rosterWnd, i, x_pos, "%s", rline_locale);
+    g_free(rline_locale);
     i++;
   }