All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Egry Gábor" <gaboregry@t-online.hu>
To: Linus Torvalds <torvalds@osdl.org>, Andrew Morton <akpm@osdl.org>
Cc: Roman Zippel <zippel@linux-m68k.org>,
	Massimo Maiurana <maiurana@inwind.it>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	KernelFR <kernelfr@traduc.org>,
	Arnaldo Carvalho de Melo <acme@conectiva.com.br>
Subject: [PATCH 4/19] Kconfig I18N: lxdialog: multibyte character support
Date: Wed, 13 Jul 2005 19:11:34 +0200	[thread overview]
Message-ID: <1121274694.2975.18.camel@spirit> (raw)
In-Reply-To: <1121273456.2975.3.camel@spirit>


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 <gaboregry@t-online.hu>
---

 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);
_



  parent reply	other threads:[~2005-07-13 17:14 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-07-13 16:50 [PATCH 0/19] Kconfig I18N completion Egry Gábor
2005-07-13 17:04 ` [PATCH 1/19] Kconfig I18N: sublocale Egry Gábor
2005-07-13 17:07 ` [PATCH 2/19] Kconfig I18N: lxdialog: width fix Egry Gábor
2005-07-13 17:26   ` [PATCH] Kconfig: lxdialog: Enable UTF8 Jan Engelhardt
2005-07-14  0:26     ` Ken Moffat
2005-07-16  9:54       ` Sam Ravnborg
2005-07-16 10:12         ` Ken Moffat
2005-07-16 22:14           ` Ken Moffat
2005-07-13 17:09 ` [PATCH 3/19] Kconfig I18N: lxdialog Egry Gábor
2005-07-13 17:11 ` Egry Gábor [this message]
2005-07-14  0:10   ` [PATCH 4/19] Kconfig I18N: lxdialog: multibyte character support Roman Zippel
2005-07-13 17:13 ` [PATCH 5/19] Kconfig I18N: lxdialog: answering Egry Gábor
2005-07-13 17:15 ` [PATCH 6/19] Kconfig I18N: config Egry Gábor
2005-07-13 17:17 ` [PATCH 7/19] Kconfig I18N: gconfig Egry Gábor
2005-07-13 17:18 ` [PATCH 8/19] Kconfig I18N: gconfig: GUI Egry Gábor
2005-07-13 17:20 ` [PATCH 9/19] Kconfig I18N: gconfig: answering Egry Gábor
2005-07-13 17:21 ` [PATCH 10/19] Kconfig I18N: gconfig: missing macros Egry Gábor
2005-07-13 17:23 ` [PATCH 11/19] Kconfig I18N: gconfig: symbol fix Egry Gábor
2005-07-13 17:24 ` [PATCH 12/19] Kconfig I18N: menuconfig Egry Gábor
2005-07-13 17:26 ` [PATCH 13/19] Kconfig I18N: menuconfig: answering Egry Gábor
2005-07-13 17:27 ` [PATCH 14/19] Kconfig I18N: menuconfig: missing macros Egry Gábor
2005-07-13 17:28 ` [PATCH 15/19] Kconfig I18n: xconfig Egry Gábor
2005-07-13 17:30 ` [PATCH 16/19] Kconfig I18n: xconfig: answering Egry Gábor
2005-07-13 17:31 ` [PATCH 17/19] Kconfig I18N: xconfig: symbol fix Egry Gábor
2005-07-13 17:33 ` [PATCH 18/19] Kconfig I18N: LKC: whitespace removing Egry Gábor
2005-07-14  0:12   ` Roman Zippel
2005-07-13 17:35 ` [PATCH 19/19] Kconfig I18N: UI: Hungarian translation Egry Gábor
2005-07-13 17:41 ` [PATCH 0/19] Kconfig I18N completion Linus Torvalds
2005-07-13 18:03   ` Egry Gábor
2005-07-13 20:11     ` Sam Ravnborg
2005-07-13 18:41       ` Egry Gábor
2005-07-13 19:02         ` Linus Torvalds
2005-07-15 17:41           ` Arnaldo Carvalho de Melo
2005-07-13 20:48         ` Sam Ravnborg
2005-07-14 10:03         ` Jan Engelhardt
2005-07-13 20:04   ` Jan Engelhardt
2005-07-13 20:45 ` Sam Ravnborg
2005-07-14  3:42   ` Sam Ravnborg
2005-07-14  0:06 ` Roman Zippel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1121274694.2975.18.camel@spirit \
    --to=gaboregry@t-online.hu \
    --cc=acme@conectiva.com.br \
    --cc=akpm@osdl.org \
    --cc=kernelfr@traduc.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maiurana@inwind.it \
    --cc=torvalds@osdl.org \
    --cc=zippel@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.