9#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
10#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
14 HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
15 HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
18 DWORD originalOutMode = 0;
19 GetConsoleMode(hOutput, &originalOutMode);
22 SetConsoleMode(hOutput, originalOutMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
25 DWORD originalInMode = 0;
26 GetConsoleMode(hInput, &originalInMode);
27 SetConsoleMode(hInput, originalInMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT));
30 const char* query =
"\x1b]11;?\x1b\\";
32 WriteConsoleA(hOutput, query, (DWORD)strlen(query), &written,
nullptr);
38 for (
int i = 0; i < 20; ++i) {
39 if (ReadFile(hInput, buffer,
sizeof(buffer), &read,
nullptr) && read > 0) {
40 response.append(buffer, read);
41 if (response.find(
'\x1b') != std::string::npos && response.find(
"rgb:") != std::string::npos) {
49 SetConsoleMode(hInput, originalInMode);
50 SetConsoleMode(hOutput, originalOutMode);
53 size_t start = response.find(
"rgb:");
54 if (start == std::string::npos)
return false;
57 size_t end = response.find(
"/", start);
58 if (end == std::string::npos)
return false;
59 std::string rStr = response.substr(start, end - start);
62 end = response.find(
"/", start);
63 if (end == std::string::npos)
return false;
64 std::string gStr = response.substr(start, end - start);
67 end = response.find(
"\x1b", start);
68 if (end == std::string::npos)
return false;
69 std::string bStr = response.substr(start, end - start);
72 r = std::stoi(rStr,
nullptr, 16) / 256;
73 g = std::stoi(gStr,
nullptr, 16) / 256;
74 b = std::stoi(bStr,
nullptr, 16) / 256;
83 float luminance = 0.2126 * (r/255.0) + 0.7152 * (g/255.0) + 0.0722 * (b/255.0);
tuple< int, int, int > parse_terminal_color_response()
Parses terminal color response into RGB components on Windows.
bool is_bg_color_dark()
Determines if terminal background color is dark.
tuple< int, int, int > parse_terminal_color_response(const string &response)
Parses terminal color response into RGB components.
float get_terminal_bg_color_luminance()
Gets the luminance of terminal background color.
Windows-specific utility functions.