10#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
11#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
14std::tuple<int, int, int> UtilsOSDependable::parse_terminal_color_response() {
15 HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
16 HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
19 DWORD originalOutMode = 0;
20 GetConsoleMode(hOutput, &originalOutMode);
23 SetConsoleMode(hOutput, originalOutMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
26 DWORD originalInMode = 0;
27 GetConsoleMode(hInput, &originalInMode);
28 SetConsoleMode(hInput, originalInMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT));
31 const char* query =
"\x1b]11;?\x1b\\";
33 WriteConsoleA(hOutput, query, (DWORD)strlen(query), &written,
nullptr);
39 for (
int i = 0; i < 20; ++i) {
40 if (ReadFile(hInput, buffer,
sizeof(buffer), &read,
nullptr) && read > 0) {
41 response.append(buffer, read);
42 if (response.find(
'\x1b') != std::string::npos && response.find(
"rgb:") != std::string::npos) {
50 SetConsoleMode(hInput, originalInMode);
51 SetConsoleMode(hOutput, originalOutMode);
54 size_t start = response.find(
"rgb:");
55 if (start == std::string::npos)
59 size_t end = response.find(
"/", start);
60 if (end == std::string::npos)
62 std::string rStr = response.substr(start, end - start);
65 end = response.find(
"/", start);
66 if (end == std::string::npos)
68 std::string gStr = response.substr(start, end - start);
71 end = response.find(
"\x1b", start);
72 if (end == std::string::npos)
74 std::string bStr = response.substr(start, end - start);
77 auto r = std::stoi(rStr,
nullptr, 16) / 256;
78 auto g = std::stoi(gStr,
nullptr, 16) / 256;
79 auto b = std::stoi(bStr,
nullptr, 16) / 256;
86float UtilsOSDependable::get_terminal_bg_color_luminance() {
87 auto [r, g, b] = parse_terminal_color_response();
88 float luminance = 0.2126 * (r / 255.0) + 0.7152 * (g / 255.0) + 0.0722 * (b / 255.0);
94 return get_terminal_bg_color_luminance() <= 0.5;
98 return _spawnvp(_P_OVERLAY, cmd, argv);
static int run_process(const char *cmd, char *const argv[])
Executes an external program, replacing the current process (exec-style).
static bool is_bg_color_dark()
Determines if terminal background color is dark.