Skip to contentSkip to conversation

menuconfig: fix to center checklist correctly in a corner case

PATCH In review Li Zefan 2 participants 5 messages Jun 3, 2010 – Jun 4, 2010

Subsystems (2)
lore
Share & tools
lore

Li Zefan

author
#0 lore raw

PATCH 1/2 menuconfig: fix to center checklist correctly in a corner case

Run:
make ARCH=arm menuconfig

And then select "System Type" -> "ARM system type". The kconfig "choice" menu at this point looks empty.

It's because config ARCH_S3C2410 has a long prompt:

config ARCH_S3C2410

        bool "Samsung S3C2410, S3C2412, S3C2413, S3C2416, S3C2440, S3C2442, S3C2443, S3C2450"
	...

menuconfig centers the checklist according to this prompt without considering the width of the list, and then things get wrong.

---

Please queue these 2 patches for 2.6.35.

---
 scripts/kconfig/lxdialog/checklist.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
scripts/kconfig/lxdialog/checklist.c +1 -0
index bcc6f19..c92a05a 100644
@@ -175,6 +175,7 @@ do_resize:
 	check_x = 0;
 	item_foreach()
 		check_x = MAX(check_x, strlen(item_str()) + 4);
+	check_x = MIN(check_x, list_width);
 
 	check_x = (list_width - check_x) / 2;
 	item_x = check_x + 4;
Signature · 1 line
1.6.3
author
#1 lore raw

PATCH 2/2 menuconfig: truncate list items

Truncate list items to fit in a single line, otherwise those items which have long prompts will cover some other items.

This follows the behavior of menubox.

---
 scripts/kconfig/lxdialog/checklist.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
scripts/kconfig/lxdialog/checklist.c +7 -2
index c92a05a..a2eb80f 100644
@@ -31,6 +31,10 @@ static int list_width, check_x, item_x;
 static void print_item(WINDOW * win, int choice, int selected)
 {
 	int i;
+	char *list_item = malloc(list_width + 1);
+
+	strncpy(list_item, item_str(), list_width - item_x);
+	list_item[list_width - item_x] = '\0';
 
 	/* Clear 'residue' of last item */
 	wattrset(win, dlg.menubox.atr);
@@ -45,13 +49,14 @@ static void print_item(WINDOW * win, int choice, int selected)
 		wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
 
 	wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
-	mvwaddch(win, choice, item_x, item_str()[0]);
+	mvwaddch(win, choice, item_x, list_item[0]);
 	wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
-	waddstr(win, (char *)item_str() + 1);
+	waddstr(win, list_item + 1);
 	if (selected) {
 		wmove(win, choice, check_x + 1);
 		wrefresh(win);
 	}
+	free(list_item);
 }
 
 /*
Signature · 1 line
1.6.3
Tested-by on v1 2/2
#2 lore raw

Re: [PATCH 2/2] menuconfig: truncate list items

Quoted 6 lines · Li Zefan

Truncate list items to fit in a single line, otherwise those items which have long prompts will cover some other items.

This follows the behavior of menubox.

Thanks :)

Ben, the Samsung S3C24* prompt still gets truncated with this patch (when using an 80-column wide xterm). If you care about seeing all of the models, you might want to shorten the prompt.

Quoted 36 lines
---
 scripts/kconfig/lxdialog/checklist.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
scripts/kconfig/lxdialog/checklist.c +7 -2
index c92a05a..a2eb80f 100644
@@ -31,6 +31,10 @@ static int list_width, check_x, item_x;
 static void print_item(WINDOW * win, int choice, int selected)
 {
 	int i;
+	char *list_item = malloc(list_width + 1);
+
+	strncpy(list_item, item_str(), list_width - item_x);
+	list_item[list_width - item_x] = '\0';
 
 	/* Clear 'residue' of last item */
 	wattrset(win, dlg.menubox.atr);
@@ -45,13 +49,14 @@ static void print_item(WINDOW * win, int choice, int selected)
 		wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
 
 	wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
-	mvwaddch(win, choice, item_x, item_str()[0]);
+	mvwaddch(win, choice, item_x, list_item[0]);
 	wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
-	waddstr(win, (char *)item_str() + 1);
+	waddstr(win, list_item + 1);
 	if (selected) {
 		wmove(win, choice, check_x + 1);
 		wrefresh(win);
 	}
+	free(list_item);
 }
 
 /*
Signature · 2 lines
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***
author
#3 lore raw

Re: [PATCH 2/2] menuconfig: truncate list items

Quoted 8 lines · Randy Dunlap
Quoted 6 lines · Li Zefan

Truncate list items to fit in a single line, otherwise those items which have long prompts will cover some other items.

This follows the behavior of menubox.

Quoted 8 lines

Thanks :)

Ben, the Samsung S3C24* prompt still gets truncated with this patch (when using an 80-column wide xterm). If you care about seeing all of the models, you might want to shorten the prompt.

An alterative is to print the truncated string and end it with "...":

( ) Samsung S3C2410, S3C2412, S3C2413, S3C2416, S3C2440...

Tested-by on v1 1/2
#4 lore raw
In reply to Li Zefan
Quoted 12 lines · Li Zefan

Run:
make ARCH=arm menuconfig

And then select "System Type" -> "ARM system type". The kconfig "choice" menu at this point looks empty.

It's because config ARCH_S3C2410 has a long prompt:

config ARCH_S3C2410

        bool "Samsung S3C2410, S3C2412, S3C2413, S3C2416, S3C2440, S3C2442, S3C2443, S3C2450"
	...
Quoted 8 lines

menuconfig centers the checklist according to this prompt without considering the width of the list, and then things get wrong.

---

Please queue these 2 patches for 2.6.35.

Thanks.

Quoted 16 lines
---
 scripts/kconfig/lxdialog/checklist.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
scripts/kconfig/lxdialog/checklist.c +1 -0
index bcc6f19..c92a05a 100644
@@ -175,6 +175,7 @@ do_resize:
 	check_x = 0;
 	item_foreach()
 		check_x = MAX(check_x, strlen(item_str()) + 4);
+	check_x = MIN(check_x, list_width);
 
 	check_x = (list_width - check_x) / 2;
 	item_x = check_x + 4;
Signature · 2 lines
~Randy
*** Remember to use Documentation/SubmitChecklist when testing your code ***