/* * Copyright (C) 2020 KeePassXC Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 or (at your option) * version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "WinUtils.h" #include #include #include #include QPointer WinUtils::m_instance = nullptr; QScopedPointer WinUtils::m_eventFilter; WinUtils* WinUtils::instance() { if (!m_instance) { m_instance = new WinUtils(qApp); } return m_instance; } WinUtils::WinUtils(QObject* parent) : OSUtilsBase(parent) { } WinUtils::~WinUtils() { } /** * Register event filters to handle native platform events such as theme changes. */ void WinUtils::registerEventFilters() { if (!m_eventFilter) { m_eventFilter.reset(new DWMEventFilter); qApp->installNativeEventFilter(m_eventFilter.data()); } } bool WinUtils::DWMEventFilter::nativeEventFilter(const QByteArray& eventType, void* message, long*) { if (eventType != "windows_generic_MSG") { return false; } auto* msg = static_cast(message); if (!msg->hwnd) { return false; } switch (msg->message) { case WM_CREATE: case WM_INITDIALOG: { if (winUtils()->isDarkMode()) { // TODO: indicate dark mode support for black title bar } break; } } return false; } bool WinUtils::isDarkMode() { QSettings settings(R"(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize)", QSettings::NativeFormat); return settings.value("AppsUseLightTheme", 1).toInt() == 0; } bool WinUtils::isCapslockEnabled() { return GetKeyState(VK_CAPITAL) == 1; }