From 4af48392ccddceaa1a20fe4bec89efbbfb183813 Mon Sep 17 00:00:00 2001 From: BDisp Date: Thu, 6 May 2021 18:29:50 +0100 Subject: [PATCH] Fixes #1281. Fixed CursesDriver colors. Added BasicColors scenario. (#1282) * Fixes #1281. Fixed CursesDriver colors. Added BasicColors scenario. * Normalizing NetDriver too. * Fixing others colors. --- .../CursesDriver/CursesDriver.cs | 64 ++++++++++--------- .../ConsoleDrivers/CursesDriver/constants.cs | 1 + Terminal.Gui/ConsoleDrivers/NetDriver.cs | 30 ++++----- Terminal.Gui/ConsoleDrivers/WindowsDriver.cs | 2 +- UICatalog/Scenarios/BasicColors.cs | 48 ++++++++++++++ 5 files changed, 99 insertions(+), 46 deletions(-) create mode 100644 UICatalog/Scenarios/BasicColors.cs diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs index c8c4a2720..338b9cce9 100644 --- a/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs @@ -118,7 +118,7 @@ namespace Terminal.Gui { public Curses.Window window; - static short last_color_pair = 16; + //static short last_color_pair = 16; /// /// Creates a curses color from the provided foreground and background colors @@ -128,12 +128,15 @@ namespace Terminal.Gui { /// public static Attribute MakeColor (short foreground, short background) { - Curses.InitColorPair (++last_color_pair, foreground, background); + var v = (short)((int)foreground | background << 4); + //Curses.InitColorPair (++last_color_pair, foreground, background); + Curses.InitColorPair (v, foreground, background); return new Attribute ( - value: Curses.ColorPair (last_color_pair), + //value: Curses.ColorPair (last_color_pair), + value: Curses.ColorPair (v), foreground: (Color)foreground, - background: (Color)background - ); + background: (Color)background); + } int [,] colorPairs = new int [16, 16]; @@ -144,9 +147,9 @@ namespace Terminal.Gui { int b = (short)background; var v = colorPairs [f, b]; if ((v & 0x10000) == 0) { - b = b & 0x7; + b &= 0x7; bool bold = (f & 0x8) != 0; - f = f & 0x7; + f &= 0x7; v = MakeColor ((short)f, (short)b) | (bold ? Curses.A_BOLD : 0); colorPairs [(int)foreground, (int)background] = v | 0x1000; @@ -157,7 +160,7 @@ namespace Terminal.Gui { Dictionary rawPairs = new Dictionary (); public override void SetColors (short foreColorId, short backgroundColorId) { - int key = (((ushort)foreColorId << 16)) | (ushort)backgroundColorId; + int key = ((ushort)foreColorId << 16) | (ushort)backgroundColorId; if (!rawPairs.TryGetValue (key, out var v)) { v = MakeColor (foreColorId, backgroundColorId); rawPairs [key] = v; @@ -781,33 +784,33 @@ namespace Terminal.Gui { Colors.TopLevel.Normal = MakeColor (Curses.COLOR_GREEN, Curses.COLOR_BLACK); Colors.TopLevel.Focus = MakeColor (Curses.COLOR_WHITE, Curses.COLOR_CYAN); Colors.TopLevel.HotNormal = MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_BLACK); - Colors.TopLevel.HotFocus = MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_CYAN); + Colors.TopLevel.HotFocus = MakeColor (Curses.COLOR_BLUE, Curses.COLOR_CYAN); Colors.Base.Normal = MakeColor (Curses.COLOR_WHITE, Curses.COLOR_BLUE); - Colors.Base.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_CYAN); - Colors.Base.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_BLUE); - Colors.Base.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_CYAN); + Colors.Base.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_WHITE); + Colors.Base.HotNormal = MakeColor (Curses.COLOR_CYAN, Curses.COLOR_BLUE); + Colors.Base.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_BLUE, Curses.COLOR_GRAY); // Focused, // Selected, Hot: Yellow on Black // Selected, text: white on black // Unselected, hot: yellow on cyan // unselected, text: same as unfocused - Colors.Menu.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_BLACK); + Colors.Menu.Normal = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_GRAY); Colors.Menu.Focus = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_BLACK); - Colors.Menu.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_CYAN); - Colors.Menu.Normal = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_CYAN); - Colors.Menu.Disabled = MakeColor (Curses.COLOR_WHITE, Curses.COLOR_CYAN); + Colors.Menu.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_GRAY); + Colors.Menu.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_BLACK); + Colors.Menu.Disabled = MakeColor (Curses.COLOR_WHITE, Curses.COLOR_GRAY); Colors.Dialog.Normal = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_WHITE); - Colors.Dialog.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_CYAN); + Colors.Dialog.Focus = MakeColor (Curses.COLOR_WHITE, Curses.COLOR_GRAY); Colors.Dialog.HotNormal = MakeColor (Curses.COLOR_BLUE, Curses.COLOR_WHITE); - Colors.Dialog.HotFocus = MakeColor (Curses.COLOR_BLUE, Curses.COLOR_CYAN); + Colors.Dialog.HotFocus = MakeColor (Curses.COLOR_BLUE, Curses.COLOR_GRAY); - Colors.Error.Normal = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_RED); - Colors.Error.Focus = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_WHITE); - Colors.Error.HotNormal = Curses.A_BOLD | MakeColor (Curses.COLOR_YELLOW, Curses.COLOR_RED); - Colors.Error.HotFocus = Colors.Error.HotNormal; + Colors.Error.Normal = MakeColor (Curses.COLOR_RED, Curses.COLOR_WHITE); + Colors.Error.Focus = Curses.A_BOLD | MakeColor (Curses.COLOR_WHITE, Curses.COLOR_RED); + Colors.Error.HotNormal = MakeColor (Curses.COLOR_BLACK, Curses.COLOR_WHITE); + Colors.Error.HotFocus = Curses.A_BOLD | MakeColor (Curses.COLOR_BLACK, Curses.COLOR_RED); } else { Colors.TopLevel.Normal = Curses.COLOR_GREEN; Colors.TopLevel.Focus = Curses.COLOR_WHITE; @@ -852,21 +855,22 @@ namespace Terminal.Gui { case Color.Gray: return Curses.COLOR_WHITE; case Color.DarkGray: - return Curses.COLOR_BLACK | Curses.A_BOLD; + //return Curses.COLOR_BLACK | Curses.A_BOLD; + return Curses.COLOR_GRAY; case Color.BrightBlue: - return Curses.COLOR_BLUE | Curses.A_BOLD; + return Curses.COLOR_BLUE | Curses.A_BOLD | Curses.COLOR_GRAY; case Color.BrightGreen: - return Curses.COLOR_GREEN | Curses.A_BOLD; + return Curses.COLOR_GREEN | Curses.A_BOLD | Curses.COLOR_GRAY; case Color.BrightCyan: - return Curses.COLOR_CYAN | Curses.A_BOLD; + return Curses.COLOR_CYAN | Curses.A_BOLD | Curses.COLOR_GRAY; case Color.BrightRed: - return Curses.COLOR_RED | Curses.A_BOLD; + return Curses.COLOR_RED | Curses.A_BOLD | Curses.COLOR_GRAY; case Color.BrightMagenta: - return Curses.COLOR_MAGENTA | Curses.A_BOLD; + return Curses.COLOR_MAGENTA | Curses.A_BOLD | Curses.COLOR_GRAY; case Color.BrightYellow: - return Curses.COLOR_YELLOW | Curses.A_BOLD; + return Curses.COLOR_YELLOW | Curses.A_BOLD | Curses.COLOR_GRAY; case Color.White: - return Curses.COLOR_WHITE | Curses.A_BOLD; + return Curses.COLOR_WHITE | Curses.A_BOLD | Curses.COLOR_GRAY; } throw new ArgumentException ("Invalid color code"); } diff --git a/Terminal.Gui/ConsoleDrivers/CursesDriver/constants.cs b/Terminal.Gui/ConsoleDrivers/CursesDriver/constants.cs index 77e9c9678..b9a63834a 100644 --- a/Terminal.Gui/ConsoleDrivers/CursesDriver/constants.cs +++ b/Terminal.Gui/ConsoleDrivers/CursesDriver/constants.cs @@ -51,6 +51,7 @@ namespace Unix.Terminal { public const int COLOR_MAGENTA = unchecked((int)0x5); public const int COLOR_CYAN = unchecked((int)0x6); public const int COLOR_WHITE = unchecked((int)0x7); + public const int COLOR_GRAY = unchecked((int)0x8); public const int KEY_CODE_YES = unchecked((int)0x100); public const int KEY_CODE_SEQ = unchecked((int)0x5b); public const int ERR = unchecked((int)0xffffffff); diff --git a/Terminal.Gui/ConsoleDrivers/NetDriver.cs b/Terminal.Gui/ConsoleDrivers/NetDriver.cs index 7125c4070..cc1117f16 100644 --- a/Terminal.Gui/ConsoleDrivers/NetDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/NetDriver.cs @@ -1210,31 +1210,31 @@ namespace Terminal.Gui { Colors.TopLevel.HotNormal = MakeColor (ConsoleColor.DarkYellow, ConsoleColor.Black); Colors.TopLevel.HotFocus = MakeColor (ConsoleColor.DarkBlue, ConsoleColor.DarkCyan); - Colors.Base.Normal = MakeColor (ConsoleColor.White, ConsoleColor.Blue); - Colors.Base.Focus = MakeColor (ConsoleColor.Black, ConsoleColor.Cyan); - Colors.Base.HotNormal = MakeColor (ConsoleColor.Yellow, ConsoleColor.Blue); - Colors.Base.HotFocus = MakeColor (ConsoleColor.Yellow, ConsoleColor.Cyan); + Colors.Base.Normal = MakeColor (ConsoleColor.White, ConsoleColor.DarkBlue); + Colors.Base.Focus = MakeColor (ConsoleColor.Black, ConsoleColor.Gray); + Colors.Base.HotNormal = MakeColor (ConsoleColor.DarkCyan, ConsoleColor.DarkBlue); + Colors.Base.HotFocus = MakeColor (ConsoleColor.Blue, ConsoleColor.Gray); // Focused, // Selected, Hot: Yellow on Black // Selected, text: white on black // Unselected, hot: yellow on cyan // unselected, text: same as unfocused - Colors.Menu.HotFocus = MakeColor (ConsoleColor.Yellow, ConsoleColor.Black); + Colors.Menu.Normal = MakeColor (ConsoleColor.White, ConsoleColor.DarkGray); Colors.Menu.Focus = MakeColor (ConsoleColor.White, ConsoleColor.Black); - Colors.Menu.HotNormal = MakeColor (ConsoleColor.Yellow, ConsoleColor.Cyan); - Colors.Menu.Normal = MakeColor (ConsoleColor.White, ConsoleColor.Cyan); - Colors.Menu.Disabled = MakeColor (ConsoleColor.DarkGray, ConsoleColor.Cyan); + Colors.Menu.HotNormal = MakeColor (ConsoleColor.Yellow, ConsoleColor.DarkGray); + Colors.Menu.HotFocus = MakeColor (ConsoleColor.Yellow, ConsoleColor.Black); + Colors.Menu.Disabled = MakeColor (ConsoleColor.Gray, ConsoleColor.DarkGray); Colors.Dialog.Normal = MakeColor (ConsoleColor.Black, ConsoleColor.Gray); - Colors.Dialog.Focus = MakeColor (ConsoleColor.Black, ConsoleColor.Cyan); - Colors.Dialog.HotNormal = MakeColor (ConsoleColor.Blue, ConsoleColor.Gray); - Colors.Dialog.HotFocus = MakeColor (ConsoleColor.Blue, ConsoleColor.Cyan); + Colors.Dialog.Focus = MakeColor (ConsoleColor.White, ConsoleColor.DarkGray); + Colors.Dialog.HotNormal = MakeColor (ConsoleColor.DarkBlue, ConsoleColor.Gray); + Colors.Dialog.HotFocus = MakeColor (ConsoleColor.DarkBlue, ConsoleColor.DarkGray); - Colors.Error.Normal = MakeColor (ConsoleColor.White, ConsoleColor.Red); - Colors.Error.Focus = MakeColor (ConsoleColor.Black, ConsoleColor.Gray); - Colors.Error.HotNormal = MakeColor (ConsoleColor.Yellow, ConsoleColor.Red); - Colors.Error.HotFocus = Colors.Error.HotNormal; + Colors.Error.Normal = MakeColor (ConsoleColor.DarkRed, ConsoleColor.White); + Colors.Error.Focus = MakeColor (ConsoleColor.White, ConsoleColor.DarkRed); + Colors.Error.HotNormal = MakeColor (ConsoleColor.Black, ConsoleColor.White); + Colors.Error.HotFocus = MakeColor (ConsoleColor.Black, ConsoleColor.DarkRed); } void ResizeScreen () diff --git a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs index 9c626bf53..3d23c796d 100644 --- a/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs +++ b/Terminal.Gui/ConsoleDrivers/WindowsDriver.cs @@ -1210,7 +1210,7 @@ namespace Terminal.Gui { Colors.Menu.Disabled = MakeColor (ConsoleColor.Gray, ConsoleColor.DarkGray); Colors.Dialog.Normal = MakeColor (ConsoleColor.Black, ConsoleColor.Gray); - Colors.Dialog.Focus = MakeColor (ConsoleColor.Black, ConsoleColor.DarkGray); + Colors.Dialog.Focus = MakeColor (ConsoleColor.White, ConsoleColor.DarkGray); Colors.Dialog.HotNormal = MakeColor (ConsoleColor.DarkBlue, ConsoleColor.Gray); Colors.Dialog.HotFocus = MakeColor (ConsoleColor.DarkBlue, ConsoleColor.DarkGray); diff --git a/UICatalog/Scenarios/BasicColors.cs b/UICatalog/Scenarios/BasicColors.cs new file mode 100644 index 000000000..62b49ff89 --- /dev/null +++ b/UICatalog/Scenarios/BasicColors.cs @@ -0,0 +1,48 @@ +using Terminal.Gui; + +namespace UICatalog { + [ScenarioMetadata (Name: "Basic Colors", Description: "Show all basic colors.")] + [ScenarioCategory ("Colors")] + class BasicColors : Scenario { + public override void Setup () + { + var vx = 30; + var x = 30; + var y = 14; + var colors = System.Enum.GetValues (typeof (Color)); + + foreach (Color bg in colors) { + var vl = new Label (bg.ToString (), TextDirection.TopBottom_LeftRight) { + X = vx, + Y = 0, + Width = 1, + Height = 13, + VerticalTextAlignment = VerticalTextAlignment.Bottom, + ColorScheme = new ColorScheme () { Normal = new Attribute (bg, colors.Length - 1 - bg) } + }; + Win.Add (vl); + var hl = new Label (bg.ToString ()) { + X = 15, + Y = y, + Width = 13, + Height = 1, + TextAlignment = TextAlignment.Right, + ColorScheme = new ColorScheme () { Normal = new Attribute (bg, colors.Length - 1 - bg) } + }; + Win.Add (hl); + vx++; + foreach (Color fg in colors) { + var c = new Attribute (fg, bg); + var t = x.ToString (); + var l = new Label (x, y, t [t.Length - 1].ToString ()) { + ColorScheme = new ColorScheme () { Normal = c } + }; + Win.Add (l); + x++; + } + x = 30; + y++; + } + } + } +} \ No newline at end of file