10#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
11#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
14std::tuple<int, int, int> UtilsOSDependable::parse_terminal_color_response(
const std::string& response) {
16 size_t start = response.find(
"rgb:");
17 if (start == std::string::npos)
21 size_t end = response.find(
"/", start);
22 if (end == std::string::npos)
24 std::string rStr = response.substr(start, end - start);
27 end = response.find(
"/", start);
28 if (end == std::string::npos)
30 std::string gStr = response.substr(start, end - start);
33 end = response.find(
"\x1b", start);
34 if (end == std::string::npos)
36 std::string bStr = response.substr(start, end - start);
39 auto r = std::stoi(rStr,
nullptr, 16) / 256;
40 auto g = std::stoi(gStr,
nullptr, 16) / 256;
41 auto b = std::stoi(bStr,
nullptr, 16) / 256;
48std::string UtilsOSDependable::capture_terminal_response() {
49 HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
50 HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
53 DWORD originalOutMode = 0;
54 GetConsoleMode(hOutput, &originalOutMode);
57 SetConsoleMode(hOutput, originalOutMode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
60 DWORD originalInMode = 0;
61 GetConsoleMode(hInput, &originalInMode);
62 SetConsoleMode(hInput, originalInMode & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT));
65 const char* query =
"\x1b]11;?\x1b\\";
67 WriteConsoleA(hOutput, query, (DWORD)strlen(query), &written,
nullptr);
73 for (
int i = 0; i < 20; ++i) {
74 if (ReadFile(hInput, buffer,
sizeof(buffer), &read,
nullptr) && read > 0) {
75 response.append(buffer, read);
76 if (response.find(
'\x1b') != std::string::npos && response.find(
"rgb:") != std::string::npos) {
84 SetConsoleMode(hInput, originalInMode);
85 SetConsoleMode(hOutput, originalOutMode);
90float UtilsOSDependable::get_terminal_bg_color_luminance() {
91 std::string color_str = capture_terminal_response();
92 auto [r, g, b] = parse_terminal_color_response(color_str);
93 float luminance = 0.2126 * (r / 255.0) + 0.7152 * (g / 255.0) + 0.0722 * (b / 255.0);
99 return get_terminal_bg_color_luminance() <= 0.5;
103 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.