From a3ba150e896b7ddeb97c19a4a210076b42b5bf2b Mon Sep 17 00:00:00 2001 From: ozone10 Date: Fri, 23 Jul 2021 18:30:20 +0200 Subject: [PATCH] Apply dark mode on Windows dialog Use background and text colors from style theme in listview. Fix #10230, close #10231 --- .../src/WinControls/WindowsDlg/WindowsDlg.cpp | 77 ++++++++++++++++++- .../src/WinControls/WindowsDlg/WindowsDlg.h | 4 +- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp index 10b534521..4abd7b648 100644 --- a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp @@ -239,6 +239,8 @@ BEGIN_WINDOW_MAP(WindowsDlgMap) ENDGROUP() END_WINDOW_MAP() +LONG_PTR WindowsDlg::originalListViewProc = NULL; + RECT WindowsDlg::_lastKnownLocation; WindowsDlg::WindowsDlg() : MyBaseClass(WindowsDlgMap) @@ -268,9 +270,38 @@ INT_PTR CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPa { NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance()).getNativeLangSpeaker(); pNativeSpeaker->changeDlgLang(_hSelf, "Window"); + + NppDarkMode::autoSubclassAndThemeChildControls(_hSelf); + return MyBaseClass::run_dlgProc(message, wParam, lParam); } + case WM_CTLCOLORDLG: + case WM_CTLCOLORSTATIC: + { + if (NppDarkMode::isEnabled()) + { + return NppDarkMode::onCtlColorDarker(reinterpret_cast(wParam)); + } + break; + } + + case WM_PRINTCLIENT: + { + if (NppDarkMode::isEnabled()) + { + return TRUE; + } + break; + } + + case NPPM_INTERNAL_REFRESHDARKMODE: + { + NppDarkMode::autoThemeChildControls(getHSelf()); + NppDarkMode::setDarkListView(_hList); + return TRUE; + } + case WM_COMMAND : { switch (wParam) @@ -553,6 +584,16 @@ BOOL WindowsDlg::onInitDialog() exStyle |= LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER; ListView_SetExtendedListViewStyle(_hList, exStyle); + NppDarkMode::setDarkListView(_hList); + COLORREF fgColor = (NppParameters::getInstance()).getCurrentDefaultFgColor(); + COLORREF bgColor = (NppParameters::getInstance()).getCurrentDefaultBgColor(); + + ListView_SetBkColor(_hList, bgColor); + ListView_SetTextBkColor(_hList, bgColor); + ListView_SetTextColor(_hList, fgColor); + + originalListViewProc = ::SetWindowLongPtr(_hList, GWLP_WNDPROC, reinterpret_cast(listViewProc)); + RECT rc; GetClientRect(_hList, &rc); LONG width = rc.right - rc.left; @@ -988,6 +1029,41 @@ Buffer* WindowsDlg::getBuffer(int index) const return MainFileManager.getBufferByID(bufID); } +LRESULT CALLBACK WindowsDlg::listViewProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_NOTIFY: + { + switch (reinterpret_cast(lParam)->code) + { + case NM_CUSTOMDRAW: + { + LPNMCUSTOMDRAW nmcd = reinterpret_cast(lParam); + switch (nmcd->dwDrawStage) + { + case CDDS_PREPAINT: + { + return CDRF_NOTIFYITEMDRAW; + } + + case CDDS_ITEMPREPAINT: + { + bool isDarkModeSupported = NppDarkMode::isEnabled() && NppDarkMode::isExperimentalSupported(); + ::SetTextColor(nmcd->hdc, isDarkModeSupported ? NppDarkMode::getDarkerTextColor() : GetSysColor(COLOR_BTNTEXT)); + return CDRF_DODEFAULT; + } + break; + } + } + break; + } + } + break; + } + return CallWindowProc(reinterpret_cast(originalListViewProc), hwnd, Message, wParam, lParam); +} + WindowsMenu::WindowsMenu() {} @@ -1070,4 +1146,3 @@ void WindowsMenu::initPopupMenu(HMENU hMenu, DocTabView *pTab) } } } - diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h index e213a926b..fa6448991 100644 --- a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h @@ -78,6 +78,9 @@ protected : void putItemsToClipboard(bool isFullPath); Buffer* getBuffer(int index) const; + static LONG_PTR originalListViewProc; + static LRESULT CALLBACK listViewProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + HWND _hList = nullptr; static RECT _lastKnownLocation; SIZE _szMinButton; @@ -104,4 +107,3 @@ public: private: HMENU _hMenu = nullptr; }; -