From 4f81c12b8118b8b0f49c403134301f5c981219e3 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Thu, 28 Aug 2025 14:34:39 +0600 Subject: [PATCH] Add ability to switch color scheme from system default on Windows --- src/86box.c | 1 + src/config.c | 6 + src/include/86box/86box.h | 2 + src/qt/languages/86box.pot | 12 ++ src/qt/languages/cs-CZ.po | 9 ++ src/qt/languages/de-DE.po | 9 ++ src/qt/languages/es-ES.po | 9 ++ src/qt/languages/fi-FI.po | 9 ++ src/qt/languages/fr-FR.po | 9 ++ src/qt/languages/hr-HR.po | 9 ++ src/qt/languages/it-IT.po | 9 ++ src/qt/languages/ja-JP.po | 9 ++ src/qt/languages/ko-KR.po | 9 ++ src/qt/languages/nb-NO.po | 9 ++ src/qt/languages/nl-NL.po | 9 ++ src/qt/languages/pl-PL.po | 9 ++ src/qt/languages/pt-BR.po | 9 ++ src/qt/languages/pt-PT.po | 9 ++ src/qt/languages/ru-RU.po | 9 ++ src/qt/languages/sk-SK.po | 9 ++ src/qt/languages/sl-SI.po | 9 ++ src/qt/languages/sv-SE.po | 9 ++ src/qt/languages/tr-TR.po | 9 ++ src/qt/languages/uk-UA.po | 9 ++ src/qt/languages/vi-VN.po | 9 ++ src/qt/languages/zh-CN.po | 9 ++ src/qt/languages/zh-TW.po | 9 ++ src/qt/qt_main.cpp | 16 +++ src/qt/qt_progsettings.cpp | 12 ++ src/qt/qt_progsettings.ui | 152 +++++++++++++--------- src/qt/qt_specifydimensions.cpp | 2 + src/qt/qt_util.cpp | 4 + src/qt/qt_vmmanager_windarkmodefilter.cpp | 3 +- src/qt/qt_winrawinputfilter.cpp | 57 +++++++- 34 files changed, 410 insertions(+), 64 deletions(-) diff --git a/src/86box.c b/src/86box.c index 87dbfc0b1..0b5a26131 100644 --- a/src/86box.c +++ b/src/86box.c @@ -236,6 +236,7 @@ char monitor_edid_path[1024] = { 0 }; /* (C) Path to double video_gl_input_scale = 1.0; /* (C) OpenGL 3.x input scale */ int video_gl_input_scale_mode = FULLSCR_SCALE_FULL; /* (C) OpenGL 3.x input stretch mode */ +int color_scheme = 0; /* (C) Color scheme of UI (Windows-only) */ // Accelerator key array struct accelKey acc_keys[NUM_ACCELS]; diff --git a/src/config.c b/src/config.c index a3c2dc0ec..737e7313b 100644 --- a/src/config.c +++ b/src/config.c @@ -128,6 +128,7 @@ load_global(void) confirm_reset = ini_section_get_int(cat, "confirm_reset", 1); confirm_exit = ini_section_get_int(cat, "confirm_exit", 1); confirm_save = ini_section_get_int(cat, "confirm_save", 1); + color_scheme = ini_section_get_int(cat, "color_scheme", 0); inhibit_multimedia_keys = ini_section_get_int(cat, "inhibit_multimedia_keys", 0); @@ -2222,6 +2223,11 @@ save_global(void) ini_section_set_string(cat, "language", buffer); } + if (color_scheme) + ini_section_set_int(cat, "color_scheme", color_scheme); + else + ini_section_delete_var(cat, "color_scheme"); + if (open_dir_usr_path) ini_section_set_int(cat, "open_dir_usr_path", open_dir_usr_path); else diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 08def802b..ce39652bc 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -206,6 +206,8 @@ extern int portable_mode; /* we are running in portable mode extern int monitor_edid; /* (C) Which EDID to use. 0=default, 1=custom. */ extern char monitor_edid_path[1024]; /* (C) Path to custom EDID */ +extern int color_scheme; /* (C) Color scheme of UI (Windows-only) */ + #ifndef USE_NEW_DYNAREC extern FILE *stdlog; /* file to log output to */ #endif diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index 4fc54d4a7..a65578eae 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -2972,3 +2972,15 @@ msgstr "" msgid "OpenGL input stretch mode" msgstr "" + +msgid "Color scheme" +msgstr "" + +msgid "System" +msgstr "" + +msgid "Light" +msgstr "" + +msgid "Dark" +msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 21f55dfd6..ae265593c 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2972,3 +2972,12 @@ msgstr "Vstupní měřítko OpenGL" msgid "OpenGL input stretch mode" msgstr "režim roztažení vstupu OpenGL" + +msgid "Color scheme" +msgstr "Barevné schéma" + +msgid "Light" +msgstr "Světlo" + +msgid "Dark" +msgstr "Tmavá" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index c2e47f777..4385811c0 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -2972,3 +2972,12 @@ msgstr "Eingabeskala von OpenGL" msgid "OpenGL input stretch mode" msgstr "Eingabestreckungsmodus von OpenGL" + +msgid "Color scheme" +msgstr "Farbschema" + +msgid "Light" +msgstr "Licht" + +msgid "Dark" +msgstr "Dunkel" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index d15f98e76..b3d8835cf 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2972,3 +2972,12 @@ msgstr "Escala de entrada de OpenGL" msgid "OpenGL input stretch mode" msgstr "Modo de estiramiento de entrada de OpenGL" + +msgid "Color scheme" +msgstr "Esquema de colores" + +msgid "Light" +msgstr "Luz" + +msgid "Dark" +msgstr "Oscuro" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index ef9f90f48..475d94b7b 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL:n syöttöasteikko" msgid "OpenGL input stretch mode" msgstr "OpenGL:n syötteen venytystila" + +msgid "Color scheme" +msgstr "Värimaailma" + +msgid "Light" +msgstr "Valo" + +msgid "Dark" +msgstr "Tumma" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 983994783..3f28b4af8 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2972,3 +2972,12 @@ msgstr "Échelle d'entrée d'OpenGL" msgid "OpenGL input stretch mode" msgstr "Mode d'étirement des données d'entrée d'OpenGL" + +msgid "Color scheme" +msgstr "Palette de couleurs" + +msgid "Light" +msgstr "Lumière" + +msgid "Dark" +msgstr "Sombre" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 9b901c03e..4996db404 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2972,3 +2972,12 @@ msgstr "Ulazna skala OpenGL-a" msgid "OpenGL input stretch mode" msgstr "Način rastezanja ulaza u OpenGL-u" + +msgid "Color scheme" +msgstr "Shema boja" + +msgid "Light" +msgstr "Svjetlo" + +msgid "Dark" +msgstr "Tamno" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 5fad20cb9..9ad2559ee 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2972,3 +2972,12 @@ msgstr "Scala di input di OpenGL" msgid "OpenGL input stretch mode" msgstr "Modalità di allungamento dell'input di OpenGL" + +msgid "Color scheme" +msgstr "Combinazione di colori" + +msgid "Light" +msgstr "Luce" + +msgid "Dark" +msgstr "Scuro" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 49f1d7cf2..35944487a 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2972,3 +2972,12 @@ msgstr "OpenGLの入力スケール" msgid "OpenGL input stretch mode" msgstr "OpenGLの入力ストレッチモード" + +msgid "Color scheme" +msgstr "配色" + +msgid "Light" +msgstr "光" + +msgid "Dark" +msgstr "暗闇" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 63c9d8a94..14da0ec8b 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL 입력 스케일" msgid "OpenGL input stretch mode" msgstr "OpenGL 입력 스트레치 모드" + +msgid "Color scheme" +msgstr "색상 구성" + +msgid "Light" +msgstr "빛" + +msgid "Dark" +msgstr "어둠" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index 0568aa565..8d9f97521 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -2972,3 +2972,12 @@ msgstr "Inngangsskala for OpenGL" msgid "OpenGL input stretch mode" msgstr "Inngangsstrekkmodus for OpenGL" + +msgid "Color scheme" +msgstr "Fargevalg" + +msgid "Light" +msgstr "Lys" + +msgid "Dark" +msgstr "Mørk" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 9183ece94..d28a72651 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -2972,3 +2972,12 @@ msgstr "Invoerschaal van OpenGL" msgid "OpenGL input stretch mode" msgstr "Input stretch-modus van OpenGL" + +msgid "Color scheme" +msgstr "Kleurenschema" + +msgid "Light" +msgstr "Licht" + +msgid "Dark" +msgstr "Donker" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 2baa525e4..2a0cde697 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2972,3 +2972,12 @@ msgstr "Skala wejściowa OpenGL" msgid "OpenGL input stretch mode" msgstr "Tryb rozciągania wejściowego OpenGL" + +msgid "Color scheme" +msgstr "Schemat kolorów" + +msgid "Light" +msgstr "Światło" + +msgid "Dark" +msgstr "Ciemny" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 6cee38ff5..078cd2fb9 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2972,3 +2972,12 @@ msgstr "Escala de entrada do OpenGL" msgid "OpenGL input stretch mode" msgstr "Modo de expansão de entrada do OpenGL" + +msgid "Color scheme" +msgstr "Esquema de cores" + +msgid "Light" +msgstr "Luz" + +msgid "Dark" +msgstr "Escuro" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 3e16ac722..d03344c50 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2972,3 +2972,12 @@ msgstr "Escala de entrada do OpenGL" msgid "OpenGL input stretch mode" msgstr "Modo de expansão de entrada do OpenGL" + +msgid "Color scheme" +msgstr "Esquema de cores" + +msgid "Light" +msgstr "Luz" + +msgid "Dark" +msgstr "Escuro" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index f26353b6a..0ef98bf88 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2972,3 +2972,12 @@ msgstr "Масштаб ввода OpenGL" msgid "OpenGL input stretch mode" msgstr "Режим растяжения ввода OpenGL" + +msgid "Color scheme" +msgstr "Цветовая гамма" + +msgid "Light" +msgstr "Свет" + +msgid "Dark" +msgstr "Темный" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 5f079509f..3a5e3b863 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2972,3 +2972,12 @@ msgstr "Vstupná stupnica OpenGL" msgid "OpenGL input stretch mode" msgstr "Režim rozťahovania vstupu OpenGL" + +msgid "Color scheme" +msgstr "Farebná schéma" + +msgid "Light" +msgstr "Svetlo" + +msgid "Dark" +msgstr "Tmavá" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 18437c5b2..c23024a33 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2972,3 +2972,12 @@ msgstr "Vhodna lestvica OpenGL" msgid "OpenGL input stretch mode" msgstr "Način raztezanja vhoda OpenGL" + +msgid "Color scheme" +msgstr "Barvna shema" + +msgid "Light" +msgstr "Svetloba" + +msgid "Dark" +msgstr "Temno" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 180eecf64..58ead9405 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -2972,3 +2972,12 @@ msgstr "Inmatningsskala för OpenGL" msgid "OpenGL input stretch mode" msgstr "Inmatningssträckningsläge för OpenGL" + +msgid "Color scheme" +msgstr "Färgschema" + +msgid "Light" +msgstr "Ljus" + +msgid "Dark" +msgstr "Mörk" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 53b15d1c7..538cc7af6 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL'nin giriş ölçeği" msgid "OpenGL input stretch mode" msgstr "OpenGL'nin giriş germe modu" + +msgid "Color scheme" +msgstr "Renk şeması" + +msgid "Light" +msgstr "Işık" + +msgid "Dark" +msgstr "Karanlık" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 093f507b2..c079fc141 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -2972,3 +2972,12 @@ msgstr "Шкала введення OpenGL" msgid "OpenGL input stretch mode" msgstr "Режим розтягування вхідних даних OpenGL" + +msgid "Color scheme" +msgstr "Колірна гамма" + +msgid "Light" +msgstr "Світло" + +msgid "Dark" +msgstr "Темний" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 9d967145e..0190aee4c 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -2972,3 +2972,12 @@ msgstr "Độ phân giải đầu vào của OpenGL" msgid "OpenGL input stretch mode" msgstr "Chế độ kéo giãn đầu vào của OpenGL" + +msgid "Color scheme" +msgstr "Bảng màu" + +msgid "Light" +msgstr "Ánh sáng" + +msgid "Dark" +msgstr "Tối" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 4cfee3fff..a265bfdc1 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL的输入比例" msgid "OpenGL input stretch mode" msgstr "OpenGL的输入拉伸模式" + +msgid "Color scheme" +msgstr "配色方案" + +msgid "Light" +msgstr "光" + +msgid "Dark" +msgstr "黑暗" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 39bbe7f5b..21a984ebd 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -2972,3 +2972,12 @@ msgstr "OpenGL 的輸入比例" msgid "OpenGL input stretch mode" msgstr "OpenGL 的輸入拉伸模式" + +msgid "Color scheme" +msgstr "配色方案" + +msgid "Light" +msgstr "光" + +msgid "Dark" +msgstr "黑暗" diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 6a2ba1a3a..5d213fe31 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -519,6 +519,7 @@ int main(int argc, char *argv[]) { #ifdef Q_OS_WINDOWS + bool wasDarkTheme = false; /* Check if Windows supports UTF-8 */ if (GetACP() == CP_UTF8) acp_utf8 = 1; @@ -554,6 +555,7 @@ main(int argc, char *argv[]) f.open(QFile::ReadOnly | QFile::Text); QTextStream ts(&f); qApp->setStyleSheet(ts.readAll()); + wasDarkTheme = true; } QPalette palette(qApp->palette()); palette.setColor(QPalette::Link, Qt::white); @@ -585,6 +587,16 @@ main(int argc, char *argv[]) return 0; } +#ifdef Q_OS_WINDOWS + if (util::isWindowsLightTheme() && wasDarkTheme) { + qApp->setStyleSheet(""); + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::blue); + palette.setColor(QPalette::LinkVisited, Qt::magenta); + qApp->setPalette(palette); + } +#endif + if (!start_vmm) #ifdef Q_OS_MACOS qt_set_sequence_auto_mnemonic(false); @@ -864,6 +876,10 @@ main(int argc, char *argv[]) /* Initialize the rendering window, or fullscreen. */ QTimer::singleShot(0, &app, [] { +#ifdef Q_OS_WINDOWS + extern bool NewDarkMode; + NewDarkMode = util::isWindowsLightTheme(); +#endif pc_reset_hard_init(); /* Set the PAUSE mode depending on the renderer. */ diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index c2fa75dff..4d9a267a5 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -96,8 +96,13 @@ ProgSettings::ProgSettings(QWidget *parent) ui->checkBoxConfirmSave->setChecked(confirm_save); ui->checkBoxConfirmHardReset->setChecked(confirm_reset); + ui->radioButtonSystem->setChecked(color_scheme == 0); + ui->radioButtonLight->setChecked(color_scheme == 1); + ui->radioButtonDark->setChecked(color_scheme == 2); + #ifndef Q_OS_WINDOWS ui->checkBoxMultimediaKeys->setHidden(true); + ui->groupBox->setHidden(true); #endif } @@ -111,6 +116,13 @@ ProgSettings::accept() confirm_reset = ui->checkBoxConfirmHardReset->isChecked() ? 1 : 0; inhibit_multimedia_keys = ui->checkBoxMultimediaKeys->isChecked() ? 1 : 0; + color_scheme = (ui->radioButtonSystem->isChecked()) ? 0 : (ui->radioButtonLight->isChecked() ? 1 : 2); + +#ifdef Q_OS_WINDOWS + extern void selectDarkMode(); + selectDarkMode(); +#endif + loadTranslators(QCoreApplication::instance()); reloadStrings(); update_mouse_msg(); diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index abaee5019..ca33726b1 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -7,7 +7,7 @@ 0 0 458 - 391 + 508 @@ -27,7 +27,7 @@ - QLayout::SetFixedSize + QLayout::SizeConstraint::SetFixedSize @@ -36,6 +36,40 @@ + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + Inhibit multimedia keys + + + + + + + Mouse sensitivity: + + + + + + + Default + + + @@ -48,30 +82,10 @@ - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - + + - Default - - - - - - - Mouse sensitivity: + Ask for confirmation before saving settings @@ -93,27 +107,7 @@ 100 - Qt::Horizontal - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Default + Qt::Orientation::Horizontal @@ -127,19 +121,25 @@ - - + + - Inhibit multimedia keys + Default - - - - Ask for confirmation before saving settings + + + + Qt::Orientation::Horizontal - + + + 40 + 20 + + + @@ -148,6 +148,16 @@ + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + @@ -155,14 +165,34 @@ - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + Color scheme + + + + + System + + + + + + + Light + + + + + + + Dark + + + + diff --git a/src/qt/qt_specifydimensions.cpp b/src/qt/qt_specifydimensions.cpp index 4999c6a83..0b88e9b57 100644 --- a/src/qt/qt_specifydimensions.cpp +++ b/src/qt/qt_specifydimensions.cpp @@ -118,5 +118,7 @@ SpecifyDimensions::on_SpecifyDimensions_accepted() + main_window->menuBar()->height() + (main_window->statusBar()->height() * !hide_status_bar) + (main_window->ui->toolBar->height() * !hide_tool_bar)); + window_w = ui->spinBoxWidth->value(); + window_h = ui->spinBoxHeight->value(); } } diff --git a/src/qt/qt_util.cpp b/src/qt/qt_util.cpp index 201b61b3f..a95226247 100644 --- a/src/qt/qt_util.cpp +++ b/src/qt/qt_util.cpp @@ -66,6 +66,10 @@ screenOfWidget(QWidget *widget) bool isWindowsLightTheme(void) { + if (color_scheme != 0) { + return (color_scheme == 1); + } + // based on https://stackoverflow.com/questions/51334674/how-to-detect-windows-10-light-dark-mode-in-win32-application // The value is expected to be a REG_DWORD, which is a signed 32-bit little-endian diff --git a/src/qt/qt_vmmanager_windarkmodefilter.cpp b/src/qt/qt_vmmanager_windarkmodefilter.cpp index 195419ad9..76d4abdb1 100644 --- a/src/qt/qt_vmmanager_windarkmodefilter.cpp +++ b/src/qt/qt_vmmanager_windarkmodefilter.cpp @@ -52,7 +52,8 @@ WindowsDarkModeFilter::nativeEventFilter(const QByteArray &eventType, void *mess if ((msg != nullptr) && (msg->message == WM_SETTINGCHANGE)) { if ((((void *) msg->lParam) != nullptr) && - (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0)) { + (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0) && + color_scheme == 0) { bool OldDarkMode = NewDarkMode; diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 9b7adce1d..9029f4fcd 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -74,7 +74,9 @@ extern void win_keyboard_handle(uint32_t scancode, int up, int e0, int e1); #include "qt_util.hpp" #include "ui_qt_mainwindow.h" -static bool NewDarkMode = FALSE; +bool NewDarkMode = FALSE; + +extern MainWindow* main_window; struct { @@ -307,6 +309,56 @@ device_change(WPARAM wParam, LPARAM lParam) } } +void +selectDarkMode() +{ + bool OldDarkMode = NewDarkMode; + + if (!util::isWindowsLightTheme()) { + QFile f(":qdarkstyle/dark/darkstyle.qss"); + + if (!f.exists()) + printf("Unable to set stylesheet, file not found\n"); + else { + f.open(QFile::ReadOnly | QFile::Text); + QTextStream ts(&f); + qApp->setStyleSheet(ts.readAll()); + } + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::white); + palette.setColor(QPalette::LinkVisited, Qt::lightGray); + qApp->setPalette(palette); + NewDarkMode = TRUE; + } else { + qApp->setStyleSheet(""); + QPalette palette(qApp->palette()); + palette.setColor(QPalette::Link, Qt::blue); + palette.setColor(QPalette::LinkVisited, Qt::magenta); + qApp->setPalette(palette); + NewDarkMode = FALSE; + } + + if (NewDarkMode != OldDarkMode) + QTimer::singleShot(1000, []() { + BOOL DarkMode = NewDarkMode; + DwmSetWindowAttribute((HWND) main_window->winId(), + DWMWA_USE_IMMERSIVE_DARK_MODE, + (LPCVOID) &DarkMode, + sizeof(DarkMode)); + + main_window->resizeContents(monitors[0].mon_scrnsz_x, + monitors[0].mon_scrnsz_y); + + for (int i = 1; i < MONITORS_NUM; i++) { + auto mon = &(monitors[i]); + + if ((main_window->renderers[i] != nullptr) && !main_window->renderers[i]->isHidden()) + main_window->resizeContentsMonitor(mon->mon_scrnsz_x, + mon->mon_scrnsz_y, i); + } + }); +} + bool WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *message, result_t *result) { @@ -328,7 +380,8 @@ WindowsRawInputFilter::nativeEventFilter(const QByteArray &eventType, void *mess return true; case WM_SETTINGCHANGE: if ((((void *) msg->lParam) != nullptr) && - (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0)) { + (wcscmp(L"ImmersiveColorSet", (wchar_t*)msg->lParam) == 0) && + color_scheme == 0) { bool OldDarkMode = NewDarkMode; #if 0