summarylogtreecommitdiffstats
path: root/utf8-in-index.diff
blob: e7ee5b660007bfee1f3834a153e311a82efc6377 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Display the columns correctly in the index screen when the names are
encoded in UTF-8 characters.  This hack is obtained by changing the way
the set_menu_print_format function sets the menu_print_format variable.
I am not fully happy with this solution, but it works and seems to close
Bug#514933.  Note also that the configure.ac script must be changed in order
to have the right CFLAGS and LIBS variables being passed to Makefile.

 -- Rafael Laboissiere <rafael@debian.org>  Fri, 13 Feb 2009 02:21:34 +0100

--- a/configure.ac
+++ b/configure.ac
@@ -19,6 +19,10 @@
 AC_CHECK_LIB(formw, new_form)
 CFLAGS="$CFLAGS -I/usr/include/ncursesw/"
 
+# Glib settings
+LIBS="$LIBS $(pkg-config glib-2.0 --libs)"
+CFLAGS="$CFLAGS $(pkg-config glib-2.0 --cflags)"
+
 # Checks for header files.
 AC_HEADER_STDC
 
--- a/src/entry.c
+++ b/src/entry.c
@@ -24,8 +24,9 @@
 #include <ncurses.h>
 #include <string.h>
 #include <vc.h>
+#include <glib/gunicode.h>
 
-#define MENU_PRINT_FORMAT_SIZE 38
+#define MENU_PRINT_FORMAT_SIZE 80
 
 static int cmp_tel (const char *desc_a, const char *desc_b);
 static int cmp_email (const char *desc_a, const char *desc_b);
@@ -37,7 +38,9 @@
 static char *construct_menu_name (const char *family_name,
                                   const char *given_name, const char *email,
                                   const char *tel);
-static void set_menu_print_format (char *menu_print_format, int width);
+static void set_menu_print_format (char *menu_print_format,
+				   const char* fn, const char* gn,
+				   const char* em);
 
 /***************************************************************************
  */
@@ -451,9 +454,10 @@
   /* FIXME: get the y and x vals from arguments passed to this function 
      so that this module will not need to rely on ncurses.h */
   getmaxyx (stdscr, y, x);
-  menu_name = (char *) malloc (sizeof (char) * (x - 5 + 1));
+  /* Allow enough room for UTF-8 characters */
+  menu_name = (char *) malloc (sizeof (char) * 2 * x);
 
-  set_menu_print_format (menu_print_format, x);
+  set_menu_print_format (menu_print_format, family_name, given_name, email);
   sprintf (menu_name, menu_print_format,
            family_name ? family_name : "",
            given_name ? given_name : "", email ? email : "", tel ? tel : "");
@@ -466,8 +470,23 @@
  */
 
 static void
-set_menu_print_format (char *menu_print_format, int width)
+set_menu_print_format (char *menu_print_format,
+		       const char* fn, const char* gn, const char* em)
 {
+  int fn_len, gn_len, em_len;
+  fn_len = gn_len = 12;
+  em_len = 30;
+  if (fn)
+      fn_len += strlen (fn) - g_utf8_strlen (fn, -1);
+  if (gn)
+      gn_len += strlen (gn) - g_utf8_strlen (gn, -1);
+  if (em)
+      em_len += strlen (em) - g_utf8_strlen (em, -1);
+
+  snprintf (menu_print_format, MENU_PRINT_FORMAT_SIZE,
+	    "%%-%d.%ds %%-%d.%ds %%-%d.%ds %%-18.18s",
+	    fn_len, fn_len, gn_len, gn_len, em_len, em_len);
+
   /* 75 characters long -- fits into 80 character wide screen */
-  strcpy (menu_print_format, "%-12.12s %-12.12s %-30.30s %-18.18s");
+  /* strcpy (menu_print_format, "%-12.12s %-12.12s %-30.30s %-18.18s"); */
 }