UTF-8 support for lxdialog with wchar. The installed wide ncurses 
(ncursesw) is optional because some languages (ex. English, Italian) 
and ISO 8859-xx charsets don't require this patch.

Signed-off-by: Egry Gabor <[EMAIL PROTECTED]>
---

 scripts/lxdialog/Makefile    |   43 +++++++++--
 scripts/lxdialog/checklist.c |   66 ++++++++++++++++-
 scripts/lxdialog/dialog.h    |    9 ++
 scripts/lxdialog/inputbox.c  |   23 ++++++
 scripts/lxdialog/menubox.c   |  161 ++++++++++++++++++++++++++++++++++++++++++-
 scripts/lxdialog/msgbox.c    |   22 +++++
 scripts/lxdialog/textbox.c   |   34 ++++++++-
 scripts/lxdialog/util.c      |  148 +++++++++++++++++++++++++++++++++++++--
 scripts/lxdialog/yesno.c     |   22 +++++
 9 files changed, 502 insertions(+), 26 deletions(-)

diff -puN scripts/lxdialog/checklist.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/checklist.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/checklist.c~kconfig-i18n-04-lxdialog-multibyte
       2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/checklist.c  
2005-07-13 18:32:16.000000000 +0200
@@ -33,7 +33,11 @@ print_item (WINDOW * win, const char *it
            int choice, int selected)
 {
     int i, item_width=list_width+check_x-item_x;
+#ifdef USE_WIDE_CURSES
+    wchar_t *witems, list_item[item_width+1], fc[2];
+#else /* USE_WIDE_CURSES */
     char list_item[item_width+1];
+#endif /* USE_WIDE_CURSES */
 
     /* Clear 'residue' of last item */
     wattrset (win, menubox_attr);
@@ -48,6 +52,20 @@ print_item (WINDOW * win, const char *it
     else
        wprintw (win, "(%c)", status ? 'X' : ' ');
 
+#ifdef USE_WIDE_CURSES
+    witems = to_wchar (item);
+    if (witems) {
+       wcsncpy (list_item, witems, item_width);
+       list_item[item_width] = 0;
+       wattrset (win, selected ? tag_selected_attr : tag_attr);
+       fc[0] = list_item[0];
+       fc[1] = 0;
+       mvwaddwstr(win, choice, item_x, fc);
+       wattrset (win, selected ? item_selected_attr : item_attr);
+       waddwstr (win, &list_item[1]);
+       free (witems);
+    }
+#else /* USE_WIDE_CURSES */
     strncpy (list_item, item, item_width);
     list_item[item_width] = 0;
 
@@ -55,6 +73,7 @@ print_item (WINDOW * win, const char *it
     mvwaddch(win, choice, item_x, list_item[0]);
     wattrset (win, selected ? item_selected_attr : item_attr);
     waddstr (win, &list_item[1]);
+#endif /* USE_WIDE_CURSES */
     if (selected) {
        wmove (win, choice, check_x+1);
        wrefresh (win);
@@ -128,6 +147,9 @@ dialog_checklist (const char *title, con
     int i, x, y, box_x, box_y;
     int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
     WINDOW *dialog, *list;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wtitle, *witems;
+#endif /* USE_WIDE_CURSES */
 
     checkflag = flag;
 
@@ -167,6 +189,25 @@ dialog_checklist (const char *title, con
     wattrset (dialog, dialog_attr);
     waddch (dialog, ACS_RTEE);
 
+#ifdef USE_WIDE_CURSES
+    wtitle = to_wchar (title);
+    if (wtitle != NULL && wcslen(wtitle) >= width-2 ) {
+       /* truncate long title -- mec */
+       wchar_t * title2 = malloc((width-2+1)*sizeof(wchar_t));
+       memcpy( title2, wtitle, (width-2)*sizeof(wchar_t));
+       title2[width-2] = '\0';
+       free (wtitle);
+       wtitle = title2;
+    }
+
+    if (wtitle != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - wcslen(wtitle))/2 - 1, ' ');
+       waddwstr (dialog, wtitle);
+       waddch (dialog, ' ');
+       free (wtitle);
+    }
+#else /* USE_WIDE_CURSES */
     if (title != NULL && strlen(title) >= width-2 ) {
        /* truncate long title -- mec */
        char * title2 = malloc(width-2+1);
@@ -181,6 +222,7 @@ dialog_checklist (const char *title, con
        waddstr (dialog, (char *)title);
        waddch (dialog, ' ');
     }
+#endif /* USE_WIDE_CURSES */
 
     wattrset (dialog, dialog_attr);
     print_autowrap (dialog, prompt, width - 2, 1, 3);
@@ -200,8 +242,16 @@ dialog_checklist (const char *title, con
 
     /* Find length of longest item in order to center checklist */
     check_x = 0;
-    for (i = 0; i < item_no; i++) 
+    for (i = 0; i < item_no; i++) {
+#ifdef USE_WIDE_CURSES
+       witems = to_wchar (items[i * 3 + 1]);
+       if (witems)
+           check_x = MAX (check_x, MIN(list_width, wcslen (witems) + 4));
+       free (witems);
+#else /* USE_WIDE_CURSES */
        check_x = MAX (check_x, MIN(list_width, strlen (items[i * 3 + 1]) + 4));
+#endif /* USE_WIDE_CURSES */
+    }
 
     check_x = (list_width - check_x) / 2;
     item_x = check_x + 4;
@@ -228,12 +278,17 @@ dialog_checklist (const char *title, con
 
     while (key != ESC) {
        key = wgetch (dialog);
-
-       for (i = 0; i < max_choice; i++)
+       for (i = 0; i < max_choice; i++) {
+#ifdef USE_WIDE_CURSES
+           witems = to_wchar (items[(scroll+i)*3+1]);
+            if (witems && towupper(key) == towupper(witems[0]))
+                break;
+           free (witems);
+#else /* USE_WIDE_CURSES */
             if (toupper(key) == toupper(items[(scroll+i)*3+1][0]))
                 break;
-
-
+#endif /* USE_WIDE_CURSES */
+       }
        if ( i < max_choice || key == KEY_UP || key == KEY_DOWN || 
            key == '+' || key == '-' ) {
            if (key == KEY_UP || key == '-') {
@@ -369,7 +424,6 @@ dialog_checklist (const char *title, con
        /* Now, update everything... */
        doupdate ();
     }
-    
 
     delwin (dialog);
     free (status);
diff -puN scripts/lxdialog/dialog.h~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/dialog.h
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/dialog.h~kconfig-i18n-04-lxdialog-multibyte
  2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/dialog.h     
2005-07-13 18:32:16.000000000 +0200
@@ -36,6 +36,11 @@
 #endif
 #include CURSES_LOC
 
+#ifdef USE_WIDE_CURSES
+#include <wchar.h>
+#include <wctype.h>
+#endif
+
 /*
  * Colors in ncurses 1.9.9e do not work properly since foreground and
  * background colors are OR'd rather than separately masked.  This version
@@ -158,6 +163,10 @@ void draw_box (WINDOW * win, int y, int 
 void draw_shadow (WINDOW * win, int y, int x, int height, int width);
 
 int first_alpha (const char *string, const char *exempt);
+#ifdef USE_WIDE_CURSES
+int first_alphaw (const wchar_t *string, const char *exempt);
+wchar_t* to_wchar (const char *mbs);
+#endif
 int dialog_yesno (const char *title, const char *prompt, int height, int 
width);
 int dialog_msgbox (const char *title, const char *prompt, int height,
                int width, int pause);
diff -puN scripts/lxdialog/inputbox.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/inputbox.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/inputbox.c~kconfig-i18n-04-lxdialog-multibyte
        2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/inputbox.c   
2005-07-13 18:32:16.000000000 +0200
@@ -50,6 +50,9 @@ dialog_inputbox (const char *title, cons
     int input_x = 0, scroll = 0, key = 0, button = -1;
     unsigned char *instr = dialog_input_result;
     WINDOW *dialog;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wtitle;
+#endif /* USE_WIDE_CURSES */
 
     /* center dialog box on screen */
     x = (COLS - width) / 2;
@@ -69,6 +72,25 @@ dialog_inputbox (const char *title, cons
     wattrset (dialog, dialog_attr);
     waddch (dialog, ACS_RTEE);
 
+#ifdef USE_WIDE_CURSES
+    wtitle = to_wchar (title);
+    if (wtitle != NULL && wcslen(wtitle) >= width-2 ) {
+       /* truncate long title -- mec */
+       wchar_t * title2 = malloc((width-2+1)*sizeof(wchar_t));
+       memcpy( title2, wtitle, (width-2)*sizeof(wchar_t));
+       title2[width-2] = '\0';
+       free (wtitle);
+       wtitle = title2;
+    }
+
+    if (wtitle != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - wcslen(wtitle))/2 - 1, ' ');
+       waddwstr (dialog, wtitle);
+       waddch (dialog, ' ');
+       free (wtitle);
+    }
+#else /* USE_WIDE_CURSES */
     if (title != NULL && strlen(title) >= width-2 ) {
        /* truncate long title -- mec */
        char * title2 = malloc(width-2+1);
@@ -83,6 +105,7 @@ dialog_inputbox (const char *title, cons
        waddstr (dialog, (char *)title);
        waddch (dialog, ' ');
     }
+#endif /* USE_WIDE_CURSES */
 
     wattrset (dialog, dialog_attr);
     print_autowrap (dialog, prompt, width - 2, 1, 3);
diff -puN scripts/lxdialog/Makefile~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/Makefile
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/Makefile~kconfig-i18n-04-lxdialog-multibyte
  2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/Makefile     
2005-07-13 18:32:16.000000000 +0200
@@ -1,23 +1,39 @@
 HOST_EXTRACFLAGS := -DLOCALE 
-ifeq ($(shell uname),SunOS)
-HOST_LOADLIBES   := -lcurses
-else
-HOST_LOADLIBES   := -lncurses
-endif
 
-ifeq (/usr/include/ncurses/ncurses.h, $(wildcard 
/usr/include/ncurses/ncurses.h))
-        HOST_EXTRACFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+ifeq (/usr/include/ncursesw/curses.h, $(wildcard 
/usr/include/ncursesw/curses.h))
+        HOST_EXTRACFLAGS += -I/usr/include/ncursesw 
-DCURSES_LOC="<ncursesw/curses.h>"
+        HOST_EXTRACFLAGS += -DUSE_WIDE_CURSES
+        NCURSES_LIB := -lncursesw
+else
+ifeq (/usr/include/ncursesw/ncurses.h, $(wildcard 
/usr/include/ncursesw/ncurses.h))
+        HOST_EXTRACFLAGS += -I/usr/include/ncursesw 
-DCURSES_LOC="<ncursesw/ncurses.h>"
+        HOST_EXTRACFLAGS += -DUSE_WIDE_CURSES
+        NCURSES_LIB := -lncursesw
 else
 ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
         HOST_EXTRACFLAGS += -I/usr/include/ncurses 
-DCURSES_LOC="<ncurses/curses.h>"
+        NCURSES_LIB := -lncurses
+else
+ifeq (/usr/include/ncurses/ncurses.h, $(wildcard 
/usr/include/ncurses/ncurses.h))
+        HOST_EXTRACFLAGS += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+        NCURSES_LIB := -lncurses
 else
 ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
         HOST_EXTRACFLAGS += -DCURSES_LOC="<ncurses.h>"
+        NCURSES_LIB := -lncurses
 else
-       HOST_EXTRACFLAGS += -DCURSES_LOC="<curses.h>"
+        HOST_EXTRACFLAGS += -DCURSES_LOC="<curses.h>"
+endif
 endif
 endif
 endif
+endif
+
+ifeq ($(shell uname),SunOS)
+HOST_LOADLIBES   := -lcurses
+else
+HOST_LOADLIBES   := $(NCURSES_LIB)
+endif
 
 hostprogs-y    := lxdialog
 always         := ncurses $(hostprogs-y)
@@ -25,8 +41,19 @@ always               := ncurses $(hostprogs-y)
 lxdialog-objs := checklist.o menubox.o textbox.o yesno.o inputbox.o \
                 util.o lxdialog.o msgbox.o
 
+
 .PHONY: $(obj)/ncurses
 $(obj)/ncurses:
+       @if $$(echo $(HOST_LOADLIBES)|grep -qv "-lnursesw"); then \
+               LANGUAGE=$$(echo $$LANG $$LC_ALL) ;\
+       fi ;\
+       if $$(echo $$LANGUAGE|grep -v "en_"|grep -q ".UTF-8"); \
+       then \
+               echo ;\
+               echo ">> Warning: You need wide Ncurses libraries" ;\
+               echo ">> in order to display UTF-8 characters." ;\
+               echo ;\
+       fi
        @echo "main() {}" > lxtemp.c
        @if $(HOSTCC) lxtemp.c  $(HOST_LOADLIBES); then \
                rm -f lxtemp.c a.out; \
diff -puN scripts/lxdialog/menubox.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/menubox.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/menubox.c~kconfig-i18n-04-lxdialog-multibyte
 2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/menubox.c    
2005-07-13 18:36:59.000000000 +0200
@@ -67,11 +67,20 @@ static void
 print_item (WINDOW * win, const char *item, int choice, int selected, int 
hotkey)
 {
     int j;
+#ifdef USE_WIDE_CURSES
+    wchar_t menu_item[menu_width+1], *witems, fc[2];
+
+    witems = to_wchar (item);
+    wcsncpy(menu_item, witems, menu_width);
+    menu_item[menu_width] = 0;
+    j = first_alphaw(menu_item, "YyNnMmHh");
+#else /* USE_WIDE_CURSES */
     char menu_item[menu_width+1];
 
     strncpy(menu_item, item, menu_width);
     menu_item[menu_width] = 0;
     j = first_alpha(menu_item, "YyNnMmHh");
+#endif /* USE_WIDE_CURSES */
 
     /* Clear 'residue' of last item */
     wattrset (win, menubox_attr);
@@ -82,14 +91,24 @@ print_item (WINDOW * win, const char *it
         for (i = 0; i < menu_width; i++)
            waddch (win, ' ');
     }
-#else
+#else /* OLD_NCURSES */
     wclrtoeol(win);
-#endif
+#endif /* OLD_NCURSES */
     wattrset (win, selected ? item_selected_attr : item_attr);
+#ifdef USE_WIDE_CURSES
+    mvwaddwstr (win, choice, item_x, menu_item);
+#else /* USE_WIDE_CURSES */
     mvwaddstr (win, choice, item_x, menu_item);
+#endif /* USE_WIDE_CURSES */
     if (hotkey) {
        wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
+#ifdef USE_WIDE_CURSES
+               fc[0] = menu_item[j];
+               fc[1] = 0;
+       mvwaddwstr(win, choice, item_x+j, fc);
+#else /* USE_WIDE_CURSES */
        mvwaddch(win, choice, item_x+j, menu_item[j]);
+#endif /* USE_WIDE_CURSES */
     }
     if (selected) {
        wmove (win, choice, item_x+1);
@@ -172,6 +191,9 @@ dialog_menu (const char *title, const ch
     int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, 
max_choice;
     WINDOW *dialog, *menu;
     FILE *f;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wtitle, *witems, *witem2, *wcurrent;
+#endif /* USE_WIDE_CURSES */
 
     max_choice = MIN (menu_height, item_no);
 
@@ -193,6 +215,24 @@ dialog_menu (const char *title, const ch
     wbkgdset (dialog, dialog_attr & A_COLOR);
     waddch (dialog, ACS_RTEE);
 
+#ifdef USE_WIDE_CURSES
+    wtitle = to_wchar (title);
+    if (wtitle != NULL && wcslen(wtitle) >= width-2 ) {
+       /* truncate long title -- mec */
+       wchar_t * title2 = malloc((width-2+1)*sizeof(wchar_t));
+       memcpy( title2, wtitle, (width-2)*sizeof(wchar_t));
+       title2[width-2] = '\0';
+       free (wtitle);
+       wtitle = title2;
+    }
+
+    if (wtitle != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - wcslen(wtitle))/2 - 1, ' ');
+       waddwstr (dialog, wtitle);
+       waddch (dialog, ' ');
+    }
+#else /* USE_WIDE_CURSES */
     if (title != NULL && strlen(title) >= width-2 ) {
        /* truncate long title -- mec */
        char * title2 = malloc(width-2+1);
@@ -207,6 +247,7 @@ dialog_menu (const char *title, const ch
        waddstr (dialog, (char *)title);
        waddch (dialog, ' ');
     }
+#endif /* USE_WIDE_CURSES */
 
     wattrset (dialog, dialog_attr);
     print_autowrap (dialog, prompt, width - 2, 1, 3);
@@ -229,10 +270,26 @@ dialog_menu (const char *title, const ch
      * Set 'choice' to default item. 
      */
     item_x = 0;
+#ifdef USE_WIDE_CURSES
+    wcurrent = to_wchar (current);
+#endif /* USE_WIDE_CURSES */
     for (i = 0; i < item_no; i++) {
+#ifdef USE_WIDE_CURSES
+       witems = to_wchar (items[i * 2 + 1]);
+       witem2 = to_wchar (items[i * 2]);
+       if (witems)
+           item_x = MAX (item_x, MIN(menu_width, wcslen (witems) + 2));
+       if (witem2 && wcurrent && wcscmp(wcurrent, witem2) == 0) choice = i;
+       free (witems);
+       free (witem2);
+#else /* USE_WIDE_CURSES */
        item_x = MAX (item_x, MIN(menu_width, strlen (items[i * 2 + 1]) + 2));
        if (strcmp(current, items[i*2]) == 0) choice = i;
+#endif /* USE_WIDE_CURSES */
     }
+#ifdef USE_WIDE_CURSES
+    free (wcurrent);
+#endif /* USE_WIDE_CURSES */
 
     item_x = (menu_width - item_x) / 2;
 
@@ -261,8 +318,18 @@ dialog_menu (const char *title, const ch
 
     /* Print the menu */
     for (i=0; i < max_choice; i++) {
+#ifdef USE_WIDE_CURSES
+       witems = to_wchar (items[(first_item + i)*2]);
+       if (witems)
+           print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice,
+                    (witems[0] != ':'));
+       else
+           print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice, 
TRUE);
+       free (witems);
+#else /* USE_WIDE_CURSES */
        print_item (menu, items[(first_item + i) * 2 + 1], i, i == choice,
                     (items[(first_item + i)*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
     }
 
     wnoutrefresh (menu);
@@ -284,14 +351,32 @@ dialog_menu (const char *title, const ch
        else {
         for (i = choice+1; i < max_choice; i++) {
                j = first_alpha(items[(scroll+i)*2+1], "YyNnMmHh");
+#ifdef USE_WIDE_CURSES
+               witems = to_wchar (items[(scroll+i)*2+1]);
+               if (key == towlower(witems[j])) {
+                       free (witems);
+                       break;
+               }
+               free (witems);
+#else /* USE_WIDE_CURSES */
                if (key == tolower(items[(scroll+i)*2+1][j]))
                        break;
+#endif /* USE_WIDE_CURSES */
        }
        if (i == max_choice)
                        for (i = 0; i < max_choice; i++) {
                        j = first_alpha(items[(scroll+i)*2+1], "YyNnMmHh");
+#ifdef USE_WIDE_CURSES
+                       witems = to_wchar (items[(scroll+i)*2+1]);
+                       if (key == towlower(witems[j])) {
+                               free (witems);
+                               break;
+                       }
+                       free (witems);
+#else /* USE_WIDE_CURSES */
                        if (key == tolower(items[(scroll+i)*2+1][j]))
                                break;
+#endif /* USE_WIDE_CURSES */
                }
        }
 
@@ -300,8 +385,18 @@ dialog_menu (const char *title, const ch
             key == '-' || key == '+' ||
             key == KEY_PPAGE || key == KEY_NPAGE) {
 
+#ifdef USE_WIDE_CURSES
+           witems = to_wchar (items[(scroll+choice)*2]);
+           if (witems)
+               print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
+                    (witems[0] != ':'));
+           else
+               print_item (menu, items[(scroll+choice)*2+1], choice, FALSE, 
TRUE);
+           free (witems);
+#else /* USE_WIDE_CURSES */
             print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
                        (items[(scroll+choice)*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
 
            if (key == KEY_UP || key == '-') {
                 if (choice < 2 && scroll) {
@@ -312,15 +407,35 @@ dialog_menu (const char *title, const ch
 
                     scroll--;
 
+#ifdef USE_WIDE_CURSES
+                   witems = to_wchar (items[scroll*2]);
+                   if (witems)
+                       print_item (menu, items[scroll*2+1], 0, FALSE,
+                           (witems[0] != ':'));
+                   else
+                       print_item (menu, items[scroll*2+1], 0, FALSE, TRUE);
+                   free (witems);
+#else /* USE_WIDE_CURSES */
                     print_item (menu, items[scroll * 2 + 1], 0, FALSE,
                                (items[scroll*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
                } else
                    choice = MAX(choice - 1, 0);
 
            } else if (key == KEY_DOWN || key == '+')  {
 
+#ifdef USE_WIDE_CURSES
+               witems = to_wchar (items[(scroll+choice)*2]);
+               if (witems)
+                   print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
+                       (witems[0] != ':'));
+               else
+                   print_item (menu, items[(scroll+choice)*2+1], choice, 
FALSE, TRUE);
+               free (witems);
+#else /* USE_WIDE_CURSES */
                print_item (menu, items[(scroll+choice)*2+1], choice, FALSE,
                                 (items[(scroll+choice)*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
 
                 if ((choice > max_choice-3) &&
                     (scroll + max_choice < item_no)
@@ -332,9 +447,20 @@ dialog_menu (const char *title, const ch
 
                     scroll++;
 
+#ifdef USE_WIDE_CURSES
+               witems = to_wchar (items[(scroll+max_choice-1)*2]);
+               if (witems)
+                   print_item (menu, items[(scroll+max_choice-1)*2+1],
+                       max_choice-1, FALSE,
+                       (witems[0] != ':'));
+               else
+                   print_item (menu, items[(scroll+max_choice-1)*2+1], 
max_choice-1, FALSE, TRUE);
+               free (witems);
+#else /* USE_WIDE_CURSES */
                     print_item (menu, items[(scroll+max_choice-1)*2+1],
                                max_choice-1, FALSE,
                                (items[(scroll+max_choice-1)*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
                 } else
                     choice = MIN(choice+1, max_choice-1);
 
@@ -344,8 +470,18 @@ dialog_menu (const char *title, const ch
                     if (scroll > 0) {
                        wscrl (menu, -1);
                        scroll--;
+#ifdef USE_WIDE_CURSES
+               witems = to_wchar (items[scroll*2]);
+               if (witems)
+                   print_item (menu, items[scroll * 2 + 1], 0, FALSE,
+                       (witems[0] != ':'));
+               else
+                   print_item (menu, items[scroll * 2 + 1], 0, FALSE, TRUE);
+               free (witems);
+#else /* USE_WIDE_CURSES */
                        print_item (menu, items[scroll * 2 + 1], 0, FALSE,
                        (items[scroll*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
                     } else {
                         if (choice > 0)
                             choice--;
@@ -360,9 +496,20 @@ dialog_menu (const char *title, const ch
                        wscrl (menu, 1);
                        scrollok (menu, FALSE);
                        scroll++;
+#ifdef USE_WIDE_CURSES
+                       witems = to_wchar (items[(scroll+max_choice-1)*2]);
+                       if (witems)
+                           print_item (menu, items[(scroll+max_choice-1)*2+1],
+                               max_choice-1, FALSE,
+                               (witems[0] != ':'));
+                       else
+                           print_item (menu, items[(scroll+max_choice-1)*2+1], 
max_choice-1, FALSE, TRUE);
+                       free (witems);
+#else /* USE_WIDE_CURSES */
                        print_item (menu, items[(scroll+max_choice-1)*2+1],
                                    max_choice-1, FALSE,
                                    (items[(scroll+max_choice-1)*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
                    } else {
                        if (choice+1 < max_choice)
                            choice++;
@@ -372,8 +519,18 @@ dialog_menu (const char *title, const ch
             } else
                 choice = i;
 
+#ifdef USE_WIDE_CURSES
+           witems = to_wchar (items[(scroll+choice)*2]);
+           if (witems)
+               print_item (menu, items[(scroll+choice)*2+1], choice, TRUE,
+                    (witems[0] != ':'));
+           else
+               print_item (menu, items[(scroll+choice)*2+1], choice, TRUE, 
TRUE);
+           free (witems);
+#else /* USE_WIDE_CURSES */
             print_item (menu, items[(scroll+choice)*2+1], choice, TRUE,
                        (items[(scroll+choice)*2][0] != ':'));
+#endif /* USE_WIDE_CURSES */
 
             print_arrows(dialog, item_no, scroll,
                          box_y, box_x+item_x+1, menu_height);
diff -puN scripts/lxdialog/msgbox.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/msgbox.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/msgbox.c~kconfig-i18n-04-lxdialog-multibyte
  2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/msgbox.c     
2005-07-13 18:32:16.000000000 +0200
@@ -31,6 +31,9 @@ dialog_msgbox (const char *title, const 
 {
     int i, x, y, key = 0;
     WINDOW *dialog;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wtitle;
+#endif /* USE_WIDE_CURSES */
 
     /* center dialog box on screen */
     x = (COLS - width) / 2;
@@ -43,6 +46,24 @@ dialog_msgbox (const char *title, const 
 
     draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
 
+#ifdef USE_WIDE_CURSES
+    wtitle = to_wchar (title);
+    if (wtitle != NULL && wcslen(wtitle) >= width-2 ) {
+       /* truncate long title -- mec */
+       wchar_t * title2 = malloc((width-2+1)*sizeof(wchar_t));
+       memcpy( title2, wtitle, (width-2)*sizeof(wchar_t));
+       title2[width-2] = '\0';
+       free (wtitle);
+       wtitle = title2;
+    }
+
+    if (wtitle != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - wcslen(wtitle))/2 - 1, ' ');
+       waddwstr (dialog, wtitle);
+       waddch (dialog, ' ');
+    }
+#else /* USE_WIDE_CURSES */
     if (title != NULL && strlen(title) >= width-2 ) {
        /* truncate long title -- mec */
        char * title2 = malloc(width-2+1);
@@ -57,6 +78,7 @@ dialog_msgbox (const char *title, const 
        waddstr (dialog, (char *)title);
        waddch (dialog, ' ');
     }
+#endif /* USE_WIDE_CURSES */
     wattrset (dialog, dialog_attr);
     print_autowrap (dialog, prompt, width - 2, 1, 2);
 
diff -puN scripts/lxdialog/textbox.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/textbox.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/textbox.c~kconfig-i18n-04-lxdialog-multibyte
 2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/textbox.c    
2005-07-13 18:32:16.000000000 +0200
@@ -41,6 +41,9 @@ dialog_textbox (const char *title, const
     int passed_end;
     char search_term[MAX_LEN + 1];
     WINDOW *dialog, *text;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wtitle;
+#endif /* USE_WIDE_CURSES */
 
     search_term[0] = '\0';     /* no search term entered yet */
 
@@ -106,6 +109,24 @@ dialog_textbox (const char *title, const
     wbkgdset (dialog, dialog_attr & A_COLOR);
     waddch (dialog, ACS_RTEE);
 
+#ifdef USE_WIDE_CURSES
+    wtitle = to_wchar (title);
+    if (wtitle != NULL && wcslen(wtitle) >= width-2 ) {
+       /* truncate long title -- mec */
+       wchar_t * title2 = malloc((width-2+1)*sizeof(wchar_t));
+       memcpy( title2, wtitle, (width-2)*sizeof(wchar_t));
+       title2[width-2] = '\0';
+       free (wtitle);
+       wtitle = title2;
+    }
+
+    if (wtitle != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - wcslen(wtitle))/2 - 1, ' ');
+       waddwstr (dialog, wtitle);
+       waddch (dialog, ' ');
+    }
+#else /* USE_WIDE_CURSES */
     if (title != NULL && strlen(title) >= width-2 ) {
        /* truncate long title -- mec */
        char * title2 = malloc(width-2+1);
@@ -120,6 +141,7 @@ dialog_textbox (const char *title, const
        waddstr (dialog, (char *)title);
        waddch (dialog, ' ');
     }
+#endif /* USE_WIDE_CURSES */
     print_button (dialog, _(" Exit "), height - 2, width / 2 - 4, TRUE);
     wnoutrefresh (dialog);
     getyx (dialog, cur_y, cur_x);      /* Save cursor position */
@@ -461,9 +483,17 @@ print_line (WINDOW * win, int row, int w
 {
     int y, x;
     char *line;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wline;
 
     line = get_line ();
+    wline = to_wchar (line);
+    if (wline)
+       line += MIN (wcslen (wline), hscroll);  /* Scroll horizontally */
+#else /* USE_WIDE_CURSES */
+    line = get_line ();
     line += MIN (strlen (line), hscroll);      /* Scroll horizontally */
+#endif /* USE_WIDE_CURSES */
     wmove (win, row, 0);       /* move cursor to correct line */
     waddch (win, ' ');
     waddnstr (win, line, MIN (strlen (line), width - 2));
@@ -476,9 +506,9 @@ print_line (WINDOW * win, int row, int w
         for (i = 0; i < width - x; i++)
            waddch (win, ' ');
     }
-#else
+#else /* OLD_NCURSES */
     wclrtoeol(win);
-#endif
+#endif /* OLD_NCURSES */
 }
 
 /*
diff -puN scripts/lxdialog/util.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/util.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/util.c~kconfig-i18n-04-lxdialog-multibyte
    2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/util.c       
2005-07-13 18:32:16.000000000 +0200
@@ -199,12 +199,63 @@ print_autowrap (WINDOW * win, const char
 {
     int newl, cur_x, cur_y;
     int i, prompt_len, room, wlen;
+#ifdef USE_WIDE_CURSES
+    wchar_t *tempstr, *word, *sp, *sp2;
+
+    tempstr = to_wchar (prompt);
+
+    prompt_len = wcslen(tempstr);
+    /*
+     * Remove newlines
+     */
+    for(i=0; i<prompt_len; i++) {
+       if(tempstr[i] == '\n') tempstr[i] = ' ';
+    }
+
+    if (prompt_len <= width - x * 2) { /* If prompt is short */
+       wmove (win, y, (width - prompt_len) / 2);
+       waddwstr (win, tempstr);
+    } else {
+       cur_x = x;
+       cur_y = y;
+       newl = 1;
+       word = tempstr;
+       while (word && *word) {
+           sp = wcschr(word, ' ');
+           if (sp)
+               *sp++ = 0;
+           /* Wrap to next line if either the word does not fit,
+              or it is the first word of a new sentence, and it is
+              short, and the next word does not fit. */
+           room = width - cur_x;
+           wlen = wcslen(word);
+           if (wlen > room ||
+              (newl && wlen < 4 && sp && wlen+1+wcslen(sp) > room
+                    && (!(sp2 = wcschr(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
+               cur_y++;
+               cur_x = x;
+           }
+           wmove (win, cur_y, cur_x);
+           waddwstr (win, word);
+           getyx (win, cur_y, cur_x);
+           cur_x++;
+           if (sp && *sp == ' ') {
+               cur_x++;        /* double space */
+
+               while (*++sp == ' ');
+               newl = 1;
+           } else
+               newl = 0;
+           word = sp;
+       }
+    }
+#else /* USE_WIDE_CURSES */
     char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
 
     strcpy (tempstr, prompt);
 
     prompt_len = strlen(tempstr);
-       
+
     /*
      * Remove newlines
      */
@@ -249,6 +300,7 @@ print_autowrap (WINDOW * win, const char
            word = sp;
        }
     }
+#endif /* USE_WIDE_CURSES */
 }
 
 /*
@@ -258,6 +310,9 @@ void
 print_button (WINDOW * win, const char *label, int y, int x, int selected)
 {
     int i, temp;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wlabel, fc[2];
+#endif /* USE_WIDE_CURSES */
 
     wmove (win, y, x);
     wattrset (win, selected ? button_active_attr : button_inactive_attr);
@@ -270,10 +325,22 @@ print_button (WINDOW * win, const char *
        waddch (win, ' ');
     wattrset (win, selected ? button_key_active_attr
              : button_key_inactive_attr);
+#ifdef USE_WIDE_CURSES
+    wlabel = to_wchar (label);
+    memset (&fc, 0, 2*sizeof(wchar_t));
+    if (wlabel) {
+       fc[0] = wlabel[0];
+       waddwstr (win, fc);
+       wattrset (win, selected ? button_label_active_attr
+             : button_label_inactive_attr);
+       waddwstr (win, &wlabel[1]);
+    }
+#else /* USE_WIDE_CURSES */
     waddch (win, label[0]);
     wattrset (win, selected ? button_label_active_attr
              : button_label_inactive_attr);
     waddstr (win, (char *)label + 1);
+#endif /* USE_WIDE_CURSES */
     wattrset (win, selected ? button_active_attr : button_inactive_attr);
     waddstr (win, ">");
     wmove (win, y, x + temp + 1);
@@ -342,18 +409,83 @@ draw_shadow (WINDOW * win, int y, int x,
 int
 first_alpha(const char *string, const char *exempt)
 {
-       int i, in_paren=0, c;
+#ifdef USE_WIDE_CURSES
+       int ret;
+       wchar_t *wstring;
+
+       wstring = to_wchar (string);
+       if (!wstring)
+           return 0;
 
-       for (i = 0; i < strlen(string); i++) {
-               c = tolower(string[i]);
+       ret = first_alphaw (wstring, exempt);
+       free (wstring);
+       
+       return ret;
+#else /* USE_WIDE_CURSES */
+        int i, in_paren=0, c;
+
+        for (i = 0; i < strlen(string); i++) {
+                c = tolower(string[i]);
+
+               if (strchr("<[(", c)) ++in_paren;
+               if (strchr(">])", c) && in_paren > 0) --in_paren;
+
+                if ((! in_paren) && isalpha(c) &&
+                     strchr(exempt, c) == 0)
+                     return i;
+       }
+       return 0;
+#endif /* USE_WIDE_CURSES */
+}
+
+#ifdef USE_WIDE_CURSES
+int
+first_alphaw(const wchar_t *wstring, const char *exempt)
+{
+       int i, in_paren=0;
+       wchar_t c, token1[4], token2[4], wexempt[200];
+
+       if (mbstowcs(token1, "<[(", 3) < 0)
+           return 0;
+       if (mbstowcs(token2, ">])", 3) < 0)
+           return 0;
+       if (mbstowcs(wexempt, exempt, 200) < 0)
+           return 0;
 
-               if (strchr("<[(", c)) ++in_paren;
-               if (strchr(">])", c) && in_paren > 0) --in_paren;
+       for (i = 0; i < wcslen(wstring); i++) {
+               c = towlower(wstring[i]);
 
-               if ((! in_paren) && isalpha(c) && 
-                    strchr(exempt, c) == 0)
+               if (wcschr(token1, c)) ++in_paren;
+               if (wcschr(token2, c) && in_paren > 0) --in_paren;
+
+               if ((! in_paren) && iswalpha(c) && 
+                   wcschr(wexempt, c) == 0) {
                        return i;
+                   }
        }
 
        return 0;
 }
+
+wchar_t* to_wchar (const char *mbs)
+{
+    mbstate_t state;
+    wchar_t *wcs;
+    const char *mbsptr;
+
+    if (mbs) {
+       wcs = (wchar_t*) malloc ((2+strlen(mbs))*sizeof(wchar_t));
+        memset (&state, 0, sizeof(state));
+       mbsptr = mbs;
+       if (mbsrtowcs (wcs, &mbsptr, strlen(mbs)+1, &state) < 0) {
+           free (wcs);
+            wcs = 0;
+        }
+    }
+    else
+        wcs = 0;
+
+    return wcs;
+}
+#endif /* USE_WIDE_CURSES */
+
diff -puN scripts/lxdialog/yesno.c~kconfig-i18n-04-lxdialog-multibyte 
scripts/lxdialog/yesno.c
--- 
linux-2.6.13-rc3-i18n-kconfig/scripts/lxdialog/yesno.c~kconfig-i18n-04-lxdialog-multibyte
   2005-07-13 18:32:16.000000000 +0200
+++ linux-2.6.13-rc3-i18n-kconfig-gabaman/scripts/lxdialog/yesno.c      
2005-07-13 18:36:59.000000000 +0200
@@ -45,6 +45,9 @@ dialog_yesno (const char *title, const c
 {
     int i, x, y, key = 0, button = 0;
     WINDOW *dialog;
+#ifdef USE_WIDE_CURSES
+    wchar_t *wtitle;
+#endif /* USE_WIDE_CURSES */
 
     /* center dialog box on screen */
     x = (COLS - width) / 2;
@@ -63,6 +66,24 @@ dialog_yesno (const char *title, const c
     wattrset (dialog, dialog_attr);
     waddch (dialog, ACS_RTEE);
 
+#ifdef USE_WIDE_CURSES
+    wtitle = to_wchar (title);
+    if (wtitle != NULL && wcslen(wtitle) >= width-2 ) {
+       /* truncate long title -- mec */
+       wchar_t * title2 = malloc((width-2+1)*sizeof(wchar_t));
+       memcpy( title2, wtitle, (width-2)*sizeof(wchar_t) );
+       title2[width-2] = '\0';
+       free (wtitle);
+       wtitle = title2;
+    }
+
+    if (wtitle != NULL) {
+       wattrset (dialog, title_attr);
+       mvwaddch (dialog, 0, (width - wcslen(wtitle))/2 - 1, ' ');
+       waddwstr (dialog, wtitle);
+       waddch (dialog, ' ');
+    }
+#else /* USE_WIDE_CURSES */
     if (title != NULL && strlen(title) >= width-2 ) {
        /* truncate long title -- mec */
        char * title2 = malloc(width-2+1);
@@ -77,6 +98,7 @@ dialog_yesno (const char *title, const c
        waddstr (dialog, (char *)title);
        waddch (dialog, ' ');
     }
+#endif /* USE_WIDE_CURSES */
 
     wattrset (dialog, dialog_attr);
     print_autowrap (dialog, prompt, width - 2, 1, 3);
_


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to