From: Randy Dunlap <rdunlap@xenotime.net>

Extend 'make menuconfig' to support an alternate color theme or
monochrome mode by using
  make menuconfig MENUCONFIG_COLOR=monochrome|mono|alternate|alt

This is a merger of patches by Han Boetes (alternate color theme) and
Jan Benedict Glaw (monochrome).

Signed-off-by: Randy Dunlap <rdunlap@xenotime.net>
---
 scripts/kconfig/lxdialog/colors.h |   89 +++++++++++++++++++++++++++++++++-
 scripts/kconfig/lxdialog/dialog.h |    2 
 scripts/kconfig/lxdialog/util.c   |   99 ++++++++++++++++++++++++++++++++------
 scripts/kconfig/mconf.c           |   15 ++++-
 4 files changed, 187 insertions(+), 18 deletions(-)

--- linux-2617-rc1.orig/scripts/kconfig/lxdialog/dialog.h
+++ linux-2617-rc1/scripts/kconfig/lxdialog/dialog.h
@@ -142,7 +142,7 @@ void init_dialog(void);
 void end_dialog(void);
 void attr_clear(WINDOW * win, int height, int width, chtype attr);
 void dialog_clear(void);
-void color_setup(void);
+void color_setup(int which);
 void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x);
 void print_button(WINDOW * win, const char *label, int y, int x, int selected);
 void print_title(WINDOW *dialog, const char *title, int width);
--- linux-2617-rc1.orig/scripts/kconfig/mconf.c
+++ linux-2617-rc1/scripts/kconfig/mconf.c
@@ -146,7 +146,7 @@ static const char mconf_readme[] = N_(
 "become confused when those variables (LINES & COLUMNS) don't reflect\n"
 "the true screen size.\n"
 "\n"
-"Optional personality available\n"
+"Optional personalities available\n"
 "------------------------------\n"
 "If you prefer to have all of the kernel options listed in a single\n"
 "menu, rather than the default multimenu hierarchy, run the menuconfig\n"
@@ -159,7 +159,18 @@ static const char mconf_readme[] = N_(
 "\n"
 "Note that this mode can eventually be a little more CPU expensive\n"
 "(especially with a larger number of unrolled categories) than the\n"
-"default mode.\n"),
+"default mode.\n"
+"\n"
+"Another personality is alternate colors or monochromatic display.\n"
+"You can select these by using the MENUCONFIG_COLOR environment\n"
+"variable, for example:\n"
+"\n"
+"make MENUCONFIG_COLOR=alternate menuconfig\n"
+"or\n"
+"make MENUCONFIG_COLOR=monochrome menuconfig\n"
+"\n"
+"You can specify 'alternate' as 'alt' and 'monochrome' as 'mono'.\n"
+),
 menu_instructions[] = N_(
 	"Arrow keys navigate the menu.  "
 	"<Enter> selects submenus --->.  "
--- linux-2617-rc1.orig/scripts/kconfig/lxdialog/colors.h
+++ linux-2617-rc1/scripts/kconfig/lxdialog/colors.h
@@ -23,123 +23,210 @@
  *
  *   *_FG = foreground
  *   *_BG = background
- *   *_HL = highlight?
+ *   *_HL = highlight
  */
 #define SCREEN_FG                    COLOR_CYAN
 #define SCREEN_BG                    COLOR_BLUE
 #define SCREEN_HL                    TRUE
+#define SCREEN_FG_ALT                COLOR_BLACK
+#define SCREEN_BG_ALT                COLOR_BLACK
+#define SCREEN_HL_ALT                TRUE
 
 #define SHADOW_FG                    COLOR_BLACK
 #define SHADOW_BG                    COLOR_BLACK
 #define SHADOW_HL                    TRUE
+#define SHADOW_FG_ALT                COLOR_BLACK
+#define SHADOW_BG_ALT                COLOR_BLACK
+#define SHADOW_HL_ALT                FALSE
 
 #define DIALOG_FG                    COLOR_BLACK
 #define DIALOG_BG                    COLOR_WHITE
 #define DIALOG_HL                    FALSE
+#define DIALOG_FG_ALT                COLOR_WHITE
+#define DIALOG_BG_ALT                COLOR_BLACK
+#define DIALOG_HL_ALT                FALSE
 
 #define TITLE_FG                     COLOR_YELLOW
 #define TITLE_BG                     COLOR_WHITE
 #define TITLE_HL                     TRUE
+#define TITLE_FG_ALT                 COLOR_RED
+#define TITLE_BG_ALT                 COLOR_BLACK
+#define TITLE_HL_ALT                 FALSE
 
 #define BORDER_FG                    COLOR_WHITE
 #define BORDER_BG                    COLOR_WHITE
 #define BORDER_HL                    TRUE
+#define BORDER_FG_ALT                COLOR_BLACK
+#define BORDER_BG_ALT                COLOR_BLACK
+#define BORDER_HL_ALT                TRUE
 
 #define BUTTON_ACTIVE_FG             COLOR_WHITE
 #define BUTTON_ACTIVE_BG             COLOR_BLUE
 #define BUTTON_ACTIVE_HL             TRUE
+#define BUTTON_ACTIVE_FG_ALT         COLOR_YELLOW
+#define BUTTON_ACTIVE_BG_ALT         COLOR_RED
+#define BUTTON_ACTIVE_HL_ALT         FALSE
 
 #define BUTTON_INACTIVE_FG           COLOR_BLACK
 #define BUTTON_INACTIVE_BG           COLOR_WHITE
 #define BUTTON_INACTIVE_HL           FALSE
+#define BUTTON_INACTIVE_FG_ALT       COLOR_YELLOW
+#define BUTTON_INACTIVE_BG_ALT       COLOR_BLACK
+#define BUTTON_INACTIVE_HL_ALT       FALSE
 
 #define BUTTON_KEY_ACTIVE_FG         COLOR_WHITE
 #define BUTTON_KEY_ACTIVE_BG         COLOR_BLUE
 #define BUTTON_KEY_ACTIVE_HL         TRUE
+#define BUTTON_KEY_ACTIVE_FG_ALT     COLOR_YELLOW
+#define BUTTON_KEY_ACTIVE_BG_ALT     COLOR_RED
+#define BUTTON_KEY_ACTIVE_HL_ALT     TRUE
 
 #define BUTTON_KEY_INACTIVE_FG       COLOR_RED
 #define BUTTON_KEY_INACTIVE_BG       COLOR_WHITE
 #define BUTTON_KEY_INACTIVE_HL       FALSE
+#define BUTTON_KEY_INACTIVE_FG_ALT   COLOR_RED
+#define BUTTON_KEY_INACTIVE_BG_ALT   COLOR_BLACK
+#define BUTTON_KEY_INACTIVE_HL_ALT   FALSE
 
 #define BUTTON_LABEL_ACTIVE_FG       COLOR_YELLOW
 #define BUTTON_LABEL_ACTIVE_BG       COLOR_BLUE
 #define BUTTON_LABEL_ACTIVE_HL       TRUE
+#define BUTTON_LABEL_ACTIVE_FG_ALT   COLOR_WHITE
+#define BUTTON_LABEL_ACTIVE_BG_ALT   COLOR_RED
+#define BUTTON_LABEL_ACTIVE_HL_ALT   FALSE
 
 #define BUTTON_LABEL_INACTIVE_FG     COLOR_BLACK
 #define BUTTON_LABEL_INACTIVE_BG     COLOR_WHITE
 #define BUTTON_LABEL_INACTIVE_HL     TRUE
+#define BUTTON_LABEL_INACTIVE_FG_ALT COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_BG_ALT COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_HL_ALT TRUE
 
 #define INPUTBOX_FG                  COLOR_BLACK
 #define INPUTBOX_BG                  COLOR_WHITE
 #define INPUTBOX_HL                  FALSE
+#define INPUTBOX_FG_ALT              COLOR_YELLOW
+#define INPUTBOX_BG_ALT              COLOR_BLACK
+#define INPUTBOX_HL_ALT              FALSE
 
 #define INPUTBOX_BORDER_FG           COLOR_BLACK
 #define INPUTBOX_BORDER_BG           COLOR_WHITE
 #define INPUTBOX_BORDER_HL           FALSE
+#define INPUTBOX_BORDER_FG_ALT       COLOR_YELLOW
+#define INPUTBOX_BORDER_BG_ALT       COLOR_BLACK
+#define INPUTBOX_BORDER_HL_ALT       FALSE
 
 #define SEARCHBOX_FG                 COLOR_BLACK
 #define SEARCHBOX_BG                 COLOR_WHITE
 #define SEARCHBOX_HL                 FALSE
+#define SEARCHBOX_FG_ALT             COLOR_YELLOW
+#define SEARCHBOX_BG_ALT             COLOR_BLACK
+#define SEARCHBOX_HL_ALT             FALSE
 
 #define SEARCHBOX_TITLE_FG           COLOR_YELLOW
 #define SEARCHBOX_TITLE_BG           COLOR_WHITE
 #define SEARCHBOX_TITLE_HL           TRUE
+#define SEARCHBOX_TITLE_FG_ALT       COLOR_YELLOW
+#define SEARCHBOX_TITLE_BG_ALT       COLOR_BLACK
+#define SEARCHBOX_TITLE_HL_ALT       TRUE
 
 #define SEARCHBOX_BORDER_FG          COLOR_WHITE
 #define SEARCHBOX_BORDER_BG          COLOR_WHITE
 #define SEARCHBOX_BORDER_HL          TRUE
+#define SEARCHBOX_BORDER_FG_ALT      COLOR_BLACK
+#define SEARCHBOX_BORDER_BG_ALT      COLOR_BLACK
+#define SEARCHBOX_BORDER_HL_ALT      TRUE
 
 #define POSITION_INDICATOR_FG        COLOR_YELLOW
 #define POSITION_INDICATOR_BG        COLOR_WHITE
 #define POSITION_INDICATOR_HL        TRUE
+#define POSITION_INDICATOR_FG_ALT    COLOR_RED
+#define POSITION_INDICATOR_BG_ALT    COLOR_BLACK
+#define POSITION_INDICATOR_HL_ALT    FALSE
 
 #define MENUBOX_FG                   COLOR_BLACK
 #define MENUBOX_BG                   COLOR_WHITE
 #define MENUBOX_HL                   FALSE
+#define MENUBOX_FG_ALT               COLOR_YELLOW
+#define MENUBOX_BG_ALT               COLOR_BLACK
+#define MENUBOX_HL_ALT               FALSE
 
 #define MENUBOX_BORDER_FG            COLOR_WHITE
 #define MENUBOX_BORDER_BG            COLOR_WHITE
 #define MENUBOX_BORDER_HL            TRUE
+#define MENUBOX_BORDER_FG_ALT        COLOR_BLACK
+#define MENUBOX_BORDER_BG_ALT        COLOR_BLACK
+#define MENUBOX_BORDER_HL_ALT        TRUE
 
 #define ITEM_FG                      COLOR_BLACK
 #define ITEM_BG                      COLOR_WHITE
 #define ITEM_HL                      FALSE
+#define ITEM_FG_ALT                  COLOR_WHITE
+#define ITEM_BG_ALT                  COLOR_BLACK
+#define ITEM_HL_ALT                  FALSE
 
 #define ITEM_SELECTED_FG             COLOR_WHITE
 #define ITEM_SELECTED_BG             COLOR_BLUE
 #define ITEM_SELECTED_HL             TRUE
+#define ITEM_SELECTED_FG_ALT         COLOR_WHITE
+#define ITEM_SELECTED_BG_ALT         COLOR_RED
+#define ITEM_SELECTED_HL_ALT         FALSE
 
 #define TAG_FG                       COLOR_YELLOW
 #define TAG_BG                       COLOR_WHITE
 #define TAG_HL                       TRUE
+#define TAG_FG_ALT                   COLOR_RED
+#define TAG_BG_ALT                   COLOR_BLACK
+#define TAG_HL_ALT                   FALSE
 
 #define TAG_SELECTED_FG              COLOR_YELLOW
 #define TAG_SELECTED_BG              COLOR_BLUE
 #define TAG_SELECTED_HL              TRUE
+#define TAG_SELECTED_FG_ALT          COLOR_YELLOW
+#define TAG_SELECTED_BG_ALT          COLOR_RED
+#define TAG_SELECTED_HL_ALT          TRUE
 
 #define TAG_KEY_FG                   COLOR_YELLOW
 #define TAG_KEY_BG                   COLOR_WHITE
 #define TAG_KEY_HL                   TRUE
+#define TAG_KEY_FG_ALT               COLOR_RED
+#define TAG_KEY_BG_ALT               COLOR_BLACK
+#define TAG_KEY_HL_ALT               FALSE
 
 #define TAG_KEY_SELECTED_FG          COLOR_YELLOW
 #define TAG_KEY_SELECTED_BG          COLOR_BLUE
 #define TAG_KEY_SELECTED_HL          TRUE
+#define TAG_KEY_SELECTED_FG_ALT      COLOR_YELLOW
+#define TAG_KEY_SELECTED_BG_ALT      COLOR_RED
+#define TAG_KEY_SELECTED_HL_ALT      TRUE
 
 #define CHECK_FG                     COLOR_BLACK
 #define CHECK_BG                     COLOR_WHITE
 #define CHECK_HL                     FALSE
+#define CHECK_FG_ALT                 COLOR_YELLOW
+#define CHECK_BG_ALT                 COLOR_BLACK
+#define CHECK_HL_ALT                 FALSE
 
 #define CHECK_SELECTED_FG            COLOR_WHITE
 #define CHECK_SELECTED_BG            COLOR_BLUE
 #define CHECK_SELECTED_HL            TRUE
+#define CHECK_SELECTED_FG_ALT        COLOR_YELLOW
+#define CHECK_SELECTED_BG_ALT        COLOR_RED
+#define CHECK_SELECTED_HL_ALT        TRUE
 
 #define UARROW_FG                    COLOR_GREEN
 #define UARROW_BG                    COLOR_WHITE
 #define UARROW_HL                    TRUE
+#define UARROW_FG_ALT                COLOR_RED
+#define UARROW_BG_ALT                COLOR_BLACK
+#define UARROW_HL_ALT                FALSE
 
 #define DARROW_FG                    COLOR_GREEN
 #define DARROW_BG                    COLOR_WHITE
 #define DARROW_HL                    TRUE
+#define DARROW_FG_ALT                COLOR_RED
+#define DARROW_BG_ALT                COLOR_BLACK
+#define DARROW_HL_ALT                FALSE
 
 /* End of default color definitions */
 
--- linux-2617-rc1.orig/scripts/kconfig/lxdialog/util.c
+++ linux-2617-rc1/scripts/kconfig/lxdialog/util.c
@@ -21,9 +21,6 @@
 
 #include "dialog.h"
 
-/* use colors by default? */
-bool use_colors = 1;
-
 const char *backtitle = NULL;
 
 /*
@@ -63,10 +60,12 @@ chtype attributes[] = {
 
 #include "colors.h"
 
+#define ROW_SIZE	3
+
 /*
  * Table of color values
  */
-int color_table[][3] = {
+int color_table[ATTRIBUTE_COUNT][ROW_SIZE] = {
 	{SCREEN_FG, SCREEN_BG, SCREEN_HL},
 	{SHADOW_FG, SHADOW_BG, SHADOW_HL},
 	{DIALOG_FG, DIALOG_BG, DIALOG_HL},
@@ -101,6 +100,49 @@ int color_table[][3] = {
 	{DARROW_FG, DARROW_BG, DARROW_HL},
 };				/* color_table */
 
+ /*
++ * Alternate Table of color values
++ */
+int color_table_alt [ATTRIBUTE_COUNT][ROW_SIZE] =
+{
+	{SCREEN_FG_ALT, SCREEN_BG_ALT, SCREEN_HL_ALT},
+	{SHADOW_FG_ALT, SHADOW_BG_ALT, SHADOW_HL_ALT},
+	{DIALOG_FG_ALT, DIALOG_BG_ALT, DIALOG_HL_ALT},
+	{TITLE_FG_ALT, TITLE_BG_ALT, TITLE_HL_ALT},
+	{BORDER_FG_ALT, BORDER_BG_ALT, BORDER_HL_ALT},
+	{BUTTON_ACTIVE_FG_ALT, BUTTON_ACTIVE_BG_ALT, BUTTON_ACTIVE_HL_ALT},
+	{BUTTON_INACTIVE_FG_ALT, BUTTON_INACTIVE_BG_ALT, BUTTON_INACTIVE_HL_ALT},
+	{BUTTON_KEY_ACTIVE_FG_ALT, BUTTON_KEY_ACTIVE_BG_ALT,
+	 BUTTON_KEY_ACTIVE_HL_ALT},
+	{BUTTON_KEY_INACTIVE_FG_ALT, BUTTON_KEY_INACTIVE_BG_ALT,
+	 BUTTON_KEY_INACTIVE_HL_ALT},
+	{BUTTON_LABEL_ACTIVE_FG_ALT, BUTTON_LABEL_ACTIVE_BG_ALT,
+	 BUTTON_LABEL_ACTIVE_HL_ALT},
+	{BUTTON_LABEL_INACTIVE_FG_ALT, BUTTON_LABEL_INACTIVE_BG_ALT,
+	 BUTTON_LABEL_INACTIVE_HL_ALT},
+	{INPUTBOX_FG_ALT, INPUTBOX_BG_ALT, INPUTBOX_HL_ALT},
+	{INPUTBOX_BORDER_FG_ALT, INPUTBOX_BORDER_BG_ALT, INPUTBOX_BORDER_HL_ALT},
+	{SEARCHBOX_FG_ALT, SEARCHBOX_BG_ALT, SEARCHBOX_HL_ALT},
+	{SEARCHBOX_TITLE_FG_ALT, SEARCHBOX_TITLE_BG_ALT, SEARCHBOX_TITLE_HL_ALT},
+	{SEARCHBOX_BORDER_FG_ALT, SEARCHBOX_BORDER_BG_ALT,
+	 SEARCHBOX_BORDER_HL_ALT},
+	{POSITION_INDICATOR_FG_ALT, POSITION_INDICATOR_BG_ALT,
+	 POSITION_INDICATOR_HL_ALT},
+	{MENUBOX_FG_ALT, MENUBOX_BG_ALT, MENUBOX_HL_ALT},
+	{MENUBOX_BORDER_FG_ALT, MENUBOX_BORDER_BG_ALT, MENUBOX_BORDER_HL_ALT},
+	{ITEM_FG_ALT, ITEM_BG_ALT, ITEM_HL_ALT},
+	{ITEM_SELECTED_FG_ALT, ITEM_SELECTED_BG_ALT, ITEM_SELECTED_HL_ALT},
+	{TAG_FG_ALT, TAG_BG_ALT, TAG_HL_ALT},
+	{TAG_SELECTED_FG_ALT, TAG_SELECTED_BG_ALT, TAG_SELECTED_HL_ALT},
+	{TAG_KEY_FG_ALT, TAG_KEY_BG_ALT, TAG_KEY_HL_ALT},
+	{TAG_KEY_SELECTED_FG_ALT, TAG_KEY_SELECTED_BG_ALT,
+	 TAG_KEY_SELECTED_HL_ALT},
+	{CHECK_FG_ALT, CHECK_BG_ALT, CHECK_HL_ALT},
+	{CHECK_SELECTED_FG_ALT, CHECK_SELECTED_BG_ALT, CHECK_SELECTED_HL_ALT},
+	{UARROW_FG_ALT, UARROW_BG_ALT, UARROW_HL_ALT},
+	{DARROW_FG_ALT, DARROW_BG_ALT, DARROW_HL_ALT},
+};				/* color_table_alt */
+
 /*
  * Set window to attribute 'attr'
  */
@@ -138,13 +180,28 @@ void dialog_clear(void)
  */
 void init_dialog(void)
 {
+	/* "mono" ==> -1, 0 ==> default, "alternate" ==> 1 */
+	int color_which = 0;
+	char *colormode;
+
 	initscr();		/* Init curses */
 	keypad(stdscr, TRUE);
 	cbreak();
 	noecho();
 
-	if (use_colors)		/* Set up colors */
-		color_setup();
+	/* check for MENUCONFIG_COLOR = mono(chrome) | alt(ernate) */
+	colormode = getenv("MENUCONFIG_COLOR");
+	if (colormode) {
+		if (!strcasecmp (colormode, "alt")
+		    || !strcasecmp (colormode, "alternate"))
+			color_which = 1;
+		else if (!strcasecmp (colormode, "mono")
+		    || !strcasecmp (colormode, "monochrome"))
+			color_which = -1;
+	}
+
+	if (color_which >= 0)
+		color_setup (color_which);
 
 	dialog_clear();
 }
@@ -152,20 +209,34 @@ void init_dialog(void)
 /*
  * Setup for color display
  */
-void color_setup(void)
+void color_setup(int which)
 {
 	int i;
 
 	if (has_colors()) {	/* Terminal supports color? */
 		start_color();
 
-		/* Initialize color pairs */
-		for (i = 0; i < ATTRIBUTE_COUNT; i++)
-			init_pair(i + 1, color_table[i][0], color_table[i][1]);
-
-		/* Setup color attributes */
-		for (i = 0; i < ATTRIBUTE_COUNT; i++)
-			attributes[i] = C_ATTR(color_table[i][2], i + 1);
+		if (which == 0) {
+			/* Initialize color pairs */
+			for (i = 0; i < ATTRIBUTE_COUNT; i++)
+				init_pair(i + 1, color_table[i][0],
+						color_table[i][1]);
+
+			/* Setup color attributes */
+			for (i = 0; i < ATTRIBUTE_COUNT; i++)
+				attributes[i] = C_ATTR(color_table[i][2], i + 1);
+			}
+		else {	/* alternate color table */
+			/* Initialize color pairs */
+			for (i = 0; i < ATTRIBUTE_COUNT; i++)
+				init_pair (i + 1, color_table_alt[i][0],
+						color_table_alt[i][1]);
+
+			/* Setup color attributes */
+			for (i = 0; i < ATTRIBUTE_COUNT; i++)
+				attributes[i] = C_ATTR (color_table_alt[i][2],
+							i + 1);
+		}
 	}
 }
 
