From c8a745fe2352dcf638801b2eba3e5652763da59b Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <calcurse@cryptocrack.de>
Date: Mon, 6 Jun 2011 22:45:28 +0200
Subject: Make display_item() UTF-8 compatible

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
---
 src/day.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

(limited to 'src')

diff --git a/src/day.c b/src/day.c
index 4c73f43..2d0737e 100644
--- a/src/day.c
+++ b/src/day.c
@@ -347,14 +347,15 @@ display_item_date (int incolor, struct apoint *i, int type, long date,
  * Print an item description in the corresponding panel window.
  */
 static void
-display_item (int incolor, char *msg, int recur, int note, int len, int y,
+display_item (int incolor, char *msg, int recur, int note, int width, int y,
               int x)
 {
   WINDOW *win;
   int ch_recur, ch_note;
-  char buf[len];
+  char buf[width * 6];
+  int i;
 
-  if (len <= 0)
+  if (width <= 0)
     return;
 
   win = apad.ptrwin;
@@ -362,12 +363,20 @@ display_item (int incolor, char *msg, int recur, int note, int len, int y,
   ch_note = (note) ? '>' : ' ';
   if (incolor == 0)
     custom_apply_attr (win, ATTR_HIGHEST);
-  if (strlen (msg) < len)
+  if (utf8_strwidth (msg) < width)
     mvwprintw (win, y, x, " %c%c%s", ch_recur, ch_note, msg);
   else
     {
-      (void)strncpy (buf, msg, len - 1);
-      buf[len - 1] = '\0';
+      for (i = 0; msg[i] && width > 0; i++)
+        {
+          if (!UTF8_ISCONT (msg[i]))
+            width -= utf8_width (&msg[i]);
+          buf[i] = msg[i];
+        }
+      if (i)
+        buf[i - 1] = 0;
+      else
+        buf[0] = 0;
       mvwprintw (win, y, x, " %c%c%s...", ch_recur, ch_note, buf);
     }
   if (incolor == 0)
-- 
cgit v1.2.3-70-g09d2