diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llwindow/llwindowwin32.cpp | 82 | ||||
| -rw-r--r-- | indra/llwindow/llwindowwin32.h | 4 | 
2 files changed, 86 insertions, 0 deletions
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index af53b6fb3f..d97d6e0bb2 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -76,6 +76,11 @@  #pragma comment(lib, "dxguid.lib") // needed for llurlentry test to build on some systems  #pragma comment(lib, "dinput8") +#pragma comment(lib, "UxTheme.lib") +#pragma comment(lib, "Dwmapi.lib") +#include <Uxtheme.h> +#include <dwmapi.h> // needed for DwmSetWindowAttribute to set window theme +  const S32   MAX_MESSAGE_PER_UPDATE = 20;  const S32   BITS_PER_PIXEL = 32;  const S32   MAX_NUM_RESOLUTIONS = 32; @@ -85,6 +90,10 @@ const F32   ICON_FLASH_TIME = 0.5f;  #define USER_DEFAULT_SCREEN_DPI 96 // Win7  #endif +#ifndef WM_DWMCOLORIZATIONCOLORCHANGED +#define WM_DWMCOLORIZATIONCOLORCHANGED 0x0320 +#endif +  // Claim a couple unused GetMessage() message IDs  const UINT WM_DUMMY_(WM_USER + 0x0017);  const UINT WM_POST_FUNCTION_(WM_USER + 0x0018); @@ -137,6 +146,17 @@ typedef HRESULT(STDAPICALLTYPE *GetDpiForMonitorType)(      _Out_ UINT *dpiX,      _Out_ UINT *dpiY); +typedef enum PREFERRED_APP_MODE +{ +    DEFAULT, +    ALLOW_DARK, +    FORCE_DARK, +    FORCE_LIGHT, +    MAX +} PREFERRED_APP_MODE; + +typedef PREFERRED_APP_MODE(WINAPI* fnSetPreferredAppMode)(PREFERRED_APP_MODE mode); +  //  // LLWindowWin32  // @@ -1809,6 +1829,8 @@ void LLWindowWin32::recreateWindow(RECT window_rect, DWORD dw_ex_style, DWORD dw      mhDC = pair.second;      sWindowHandleForMessageBox = mWindowHandle; + +    updateWindowTheme();  }  void* LLWindowWin32::createSharedContext() @@ -3007,6 +3029,17 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_                      WINDOW_IMP_POST(window_imp->mMouseVanish = true);                  }              } +            // Check if theme-related settings changed +            else if (l_param && (wcscmp((LPCWSTR)l_param, L"ImmersiveColorSet") == 0)) +            { +                WINDOW_IMP_POST(window_imp->updateWindowTheme()); +            } +        } +        break; + +        case WM_DWMCOLORIZATIONCOLORCHANGED: +        { +            WINDOW_IMP_POST(window_imp->updateWindowTheme());          }          break; @@ -4962,3 +4995,52 @@ void LLWindowWin32::updateWindowRect()              });      }  } + +bool LLWindowWin32::isSystemAppDarkMode() +{ +    HKEY  hKey; +    DWORD dwValue = 1; // Default to light theme +    DWORD dwSize  = sizeof(DWORD); + +    // Check registry for system theme preference +    LSTATUS ret_code = +        RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize", 0, KEY_READ, &hKey); +    if (ERROR_SUCCESS == ret_code) +    { +        if (RegQueryValueExW(hKey, L"AppsUseLightTheme", NULL, NULL, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS) +        { +            // If AppsUseLightTheme is not found, check SystemUsesLightTheme +            dwSize = sizeof(DWORD); +            RegQueryValueExW(hKey, L"SystemUsesLightTheme", NULL, NULL, (LPBYTE)&dwValue, &dwSize); +        } +        RegCloseKey(hKey); +    } + +    // Return true if dark mode +    return dwValue == 0; +} + +void LLWindowWin32::updateWindowTheme() +{ +    bool use_dark_mode = isSystemAppDarkMode(); +    if (use_dark_mode == mCurrentDarkMode) +    { +        return; +    } +    mCurrentDarkMode = use_dark_mode; + +    HMODULE hUxTheme = LoadLibraryExW(L"uxtheme.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); +    if (hUxTheme) +    { +        auto SetPreferredAppMode = (fnSetPreferredAppMode)GetProcAddress(hUxTheme, "SetPreferredAppMode"); +        if (SetPreferredAppMode) +        { +            SetPreferredAppMode(use_dark_mode ? ALLOW_DARK : FORCE_LIGHT); +        } +        FreeLibrary(hUxTheme); +    } +    BOOL dark_mode(use_dark_mode); +    DwmSetWindowAttribute(mWindowHandle, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark_mode, sizeof(dark_mode)); + +    LL_INFOS("Window") << "Viewer window theme is set to " << (use_dark_mode ? "dark" : "light") << " mode" << LL_ENDL; +} diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 561f07d388..fdaa024363 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -246,6 +246,10 @@ protected:      RECT mRect;      RECT mClientRect; +    void updateWindowTheme(); +    bool isSystemAppDarkMode(); +    bool mCurrentDarkMode { false }; +      struct LLWindowWin32Thread;      LLWindowWin32Thread* mWindowThread = nullptr;      LLThreadSafeQueue<std::function<void()>> mFunctionQueue;  | 
