terminal/tools/ColorTool/ColorTool/Program.cs

298 lines
9.1 KiB
C#

//
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the terms described in the LICENSE file in the root of this project.
//
using System;
using static ColorTool.ConsoleAPI;
using Microsoft.Win32;
using System.Reflection;
namespace ColorTool
{
class Program
{
static int DARK_BLACK = 0;
static int DARK_BLUE = 1;
static int DARK_GREEN = 2;
static int DARK_CYAN = 3;
static int DARK_RED = 4;
static int DARK_MAGENTA = 5;
static int DARK_YELLOW = 6;
static int DARK_WHITE = 7;
static int BRIGHT_BLACK = 8;
static int BRIGHT_BLUE = 9;
static int BRIGHT_GREEN = 10;
static int BRIGHT_CYAN = 11;
static int BRIGHT_RED = 12;
static int BRIGHT_MAGENTA = 13;
static int BRIGHT_YELLOW = 14;
static int BRIGHT_WHITE = 15;
static int[] saneFgs = {
DARK_BLACK ,
DARK_RED ,
DARK_GREEN ,
DARK_YELLOW ,
DARK_BLUE ,
DARK_MAGENTA ,
DARK_CYAN ,
DARK_WHITE ,
BRIGHT_BLACK ,
BRIGHT_RED ,
BRIGHT_GREEN ,
BRIGHT_YELLOW ,
BRIGHT_MAGENTA ,
BRIGHT_BLUE ,
BRIGHT_CYAN ,
BRIGHT_WHITE
};
// This is the order of colors when output by the table.
static int[] outputFgs = {
BRIGHT_WHITE ,
DARK_BLACK ,
BRIGHT_BLACK ,
DARK_RED ,
BRIGHT_RED ,
DARK_GREEN ,
BRIGHT_GREEN ,
DARK_YELLOW ,
BRIGHT_YELLOW ,
DARK_BLUE ,
BRIGHT_BLUE ,
DARK_MAGENTA ,
BRIGHT_MAGENTA ,
DARK_CYAN ,
BRIGHT_CYAN ,
DARK_WHITE ,
BRIGHT_WHITE
};
static int[] saneBgs = {
DARK_BLACK ,
DARK_RED ,
DARK_GREEN ,
DARK_YELLOW ,
DARK_BLUE ,
DARK_MAGENTA ,
DARK_CYAN ,
DARK_WHITE
};
static bool quietMode = false;
static bool setDefaults = false;
static bool setProperties = true;
static void Usage()
{
Console.WriteLine(Resources.Usage);
}
static void Version()
{
//System.Reflection.Assembly.GetEntryAssembly();
//AssemblyName.GetAssemblyName(@"c:\path\to\file.dll").Version;
string exePath = System.Reflection.Assembly.GetEntryAssembly().Location;
Version ver = AssemblyName.GetAssemblyName(exePath).Version;
Console.WriteLine("colortool v" + ver);
}
static void PrintTable()
{
ConsoleColor[] colors = (ConsoleColor[])ConsoleColor.GetValues(typeof(ConsoleColor));
// Save the current background and foreground colors.
ConsoleColor currentBackground = Console.BackgroundColor;
ConsoleColor currentForeground = Console.ForegroundColor;
string test = " gYw ";
string[] FGs = {
"m",
"1m",
"30m",
"1;30m",
"31m",
"1;31m",
"32m",
"1;32m",
"33m",
"1;33m",
"34m",
"1;34m",
"35m",
"1;35m",
"36m",
"1;36m",
"37m",
"1;37m"
};
string[] BGs = {
"m",
"40m",
"41m",
"42m",
"43m",
"44m",
"45m",
"46m",
"47m"
};
Console.Write("\t");
for (int bg = 0; bg < BGs.Length; bg++)
{
if (bg > 0) Console.Write(" ");
Console.Write(" ");
Console.Write(bg == 0 ? " " : BGs[bg]);
Console.Write(" ");
}
Console.WriteLine();
for (int fg = 0; fg < FGs.Length; fg++)
{
Console.ForegroundColor = currentForeground;
Console.BackgroundColor = currentBackground;
if (fg >= 0) Console.Write(FGs[fg] + "\t");
if (fg == 0) Console.ForegroundColor = currentForeground;
else Console.ForegroundColor = colors[outputFgs[fg - 1]];
for (int bg = 0; bg < BGs.Length; bg++)
{
if (bg > 0) Console.Write(" ");
if (bg == 0)
Console.BackgroundColor = currentBackground;
else Console.BackgroundColor = colors[saneBgs[bg - 1]];
Console.Write(test);
Console.BackgroundColor = currentBackground;
}
Console.Write("\n");
}
Console.Write("\n");
// Reset foreground and background colors
Console.ForegroundColor = currentForeground;
Console.BackgroundColor = currentBackground;
}
static bool SetProperties(ColorScheme colorScheme)
{
CONSOLE_SCREEN_BUFFER_INFO_EX csbiex = CONSOLE_SCREEN_BUFFER_INFO_EX.Create();
int STD_OUTPUT_HANDLE = -11;
IntPtr hOut = GetStdHandle(STD_OUTPUT_HANDLE);
bool success = GetConsoleScreenBufferInfoEx(hOut, ref csbiex);
if (success)
{
csbiex.srWindow.Bottom++;
for (int i = 0; i < 16; i++)
{
csbiex.ColorTable[i] = colorScheme.colorTable[i];
}
if(colorScheme.background != null && colorScheme.foreground != null)
{
int fgidx = colorScheme.CalculateIndex(colorScheme.foreground.Value);
int bgidx = colorScheme.CalculateIndex(colorScheme.background.Value);
csbiex.wAttributes = (ushort)(fgidx | (bgidx << 4));
}
SetConsoleScreenBufferInfoEx(hOut, ref csbiex);
}
if (success)
{
if (!quietMode)
{
PrintTable();
}
}
return success;
}
static bool SetDefaults(ColorScheme colorScheme)
{
//TODO
RegistryKey consoleKey = Registry.CurrentUser.OpenSubKey("Console", true);
for (int i = 0; i < colorScheme.colorTable.Length; i++)
{
string valueName = "ColorTable" + (i < 10 ? "0" : "") + i;
consoleKey.SetValue(valueName, colorScheme.colorTable[i], RegistryValueKind.DWord);
}
Console.WriteLine(Resources.WroteToDefaults);
return true;
}
static void Main(string[] args)
{
if (args.Length < 1)
{
Usage();
return;
}
foreach (string arg in args)
{
switch (arg)
{
case "-c":
case "--current":
PrintTable();
return;
case "-q":
case "--quiet":
quietMode = true;
break;
case "-d":
case "--defaults":
setDefaults = true;
setProperties = false;
break;
case "-b":
case "--both":
setDefaults = true;
setProperties = true;
break;
case "-?":
case "--help":
Usage();
return;
case "-v":
case "--version":
Version();
return;
default:
break;
}
}
string schemeName = args[args.Length - 1];
ColorScheme colorScheme = null;
ISchemeParser[] parsers = { new XmlSchemeParser(), new IniSchemeParser() };
foreach (var parser in parsers)
{
var scheme = parser.ParseScheme(schemeName);
if (scheme != null)
{
colorScheme = scheme;
break;
}
}
if (colorScheme == null)
{
Console.WriteLine(string.Format(Resources.SchemeNotFound, schemeName));
return;
}
if (setDefaults)
{
SetDefaults(colorScheme);
}
if (setProperties)
{
SetProperties(colorScheme);
}
}
}
}