ObsidianDragon - DragonX ImGui Wallet
Full-node GUI wallet for DragonX cryptocurrency. Built with Dear ImGui, SDL3, and OpenGL3/DX11. Features: - Send/receive shielded and transparent transactions - Autoshield with merged transaction display - Built-in CPU mining (xmrig) - Peer management and network monitoring - Wallet encryption with PIN lock - QR code generation for receive addresses - Transaction history with pagination - Console for direct RPC commands - Cross-platform (Linux, Windows)
This commit is contained in:
182
src/platform/windows_backdrop.cpp
Normal file
182
src/platform/windows_backdrop.cpp
Normal file
@@ -0,0 +1,182 @@
|
||||
// DragonX Wallet - ImGui Edition
|
||||
// Copyright 2024-2026 The Hush Developers
|
||||
// Released under the GPLv3
|
||||
|
||||
#include "windows_backdrop.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#include <windows.h>
|
||||
#include <dwmapi.h>
|
||||
#include <SDL3/SDL.h>
|
||||
#include <cstdio>
|
||||
#include "../util/logger.h"
|
||||
|
||||
// Link with dwmapi.lib
|
||||
#pragma comment(lib, "dwmapi.lib")
|
||||
|
||||
// DWM attribute values not in older SDK headers
|
||||
#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
|
||||
#define DWMWA_USE_IMMERSIVE_DARK_MODE 20
|
||||
#endif
|
||||
|
||||
#ifndef DWMWA_SYSTEMBACKDROP_TYPE
|
||||
#define DWMWA_SYSTEMBACKDROP_TYPE 38
|
||||
#endif
|
||||
|
||||
#ifndef DWMWA_MICA_EFFECT
|
||||
#define DWMWA_MICA_EFFECT 1029
|
||||
#endif
|
||||
|
||||
// System backdrop types (Windows 11 22H2+)
|
||||
typedef enum {
|
||||
DWMSBT_AUTO = 0,
|
||||
DWMSBT_NONE = 1,
|
||||
DWMSBT_MAINWINDOW = 2, // Mica
|
||||
DWMSBT_TRANSIENTWINDOW = 3, // Acrylic
|
||||
DWMSBT_TABBEDWINDOW = 4 // Mica Alt
|
||||
} DWM_SYSTEMBACKDROP_TYPE;
|
||||
|
||||
namespace dragonx {
|
||||
namespace platform {
|
||||
|
||||
// Helper to get HWND from SDL window
|
||||
static HWND getHWND(SDL_Window* window) {
|
||||
if (!window) return nullptr;
|
||||
|
||||
SDL_PropertiesID props = SDL_GetWindowProperties(window);
|
||||
if (props == 0) return nullptr;
|
||||
|
||||
return (HWND)SDL_GetPointerProperty(props, SDL_PROP_WINDOW_WIN32_HWND_POINTER, nullptr);
|
||||
}
|
||||
|
||||
WindowsVersionInfo getWindowsVersion() {
|
||||
WindowsVersionInfo info = {};
|
||||
|
||||
// Use RtlGetVersion to get the real version (GetVersionEx is deprecated/lies)
|
||||
typedef NTSTATUS (WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW);
|
||||
|
||||
HMODULE ntdll = GetModuleHandleW(L"ntdll.dll");
|
||||
if (ntdll) {
|
||||
RtlGetVersionPtr rtlGetVersion = (RtlGetVersionPtr)GetProcAddress(ntdll, "RtlGetVersion");
|
||||
if (rtlGetVersion) {
|
||||
RTL_OSVERSIONINFOW osvi = {};
|
||||
osvi.dwOSVersionInfoSize = sizeof(osvi);
|
||||
if (rtlGetVersion(&osvi) == 0) {
|
||||
info.major = osvi.dwMajorVersion;
|
||||
info.minor = osvi.dwMinorVersion;
|
||||
info.build = osvi.dwBuildNumber;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
info.isWindows11 = (info.major >= 10 && info.build >= 22000);
|
||||
info.isWindows10 = (info.major >= 10 && info.build >= 10240);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
bool isWindowsBackdropAvailable() {
|
||||
WindowsVersionInfo ver = getWindowsVersion();
|
||||
// Backdrop effects require at least Windows 10
|
||||
return ver.isWindows10;
|
||||
}
|
||||
|
||||
bool enableWindowsBackdrop(SDL_Window* window, WindowsBackdrop type) {
|
||||
HWND hwnd = getHWND(window);
|
||||
if (!hwnd) {
|
||||
DEBUG_LOGF("WindowsBackdrop: Failed to get HWND\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
WindowsVersionInfo ver = getWindowsVersion();
|
||||
DEBUG_LOGF("WindowsBackdrop: Windows %d.%d.%d detected\n", ver.major, ver.minor, ver.build);
|
||||
|
||||
if (!ver.isWindows10) {
|
||||
DEBUG_LOGF("WindowsBackdrop: Windows 10+ required\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Enable dark mode for title bar (looks better with acrylic)
|
||||
BOOL useDarkMode = TRUE;
|
||||
DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &useDarkMode, sizeof(useDarkMode));
|
||||
|
||||
// Auto-detect best backdrop type
|
||||
if (type == WindowsBackdrop::Auto) {
|
||||
if (ver.isWindows11 && ver.build >= 22621) {
|
||||
// Windows 11 22H2+ - use Mica Alt for dark themed apps
|
||||
type = WindowsBackdrop::MicaAlt;
|
||||
} else if (ver.isWindows11) {
|
||||
// Windows 11 21H2 - use Mica
|
||||
type = WindowsBackdrop::Mica;
|
||||
} else {
|
||||
// Windows 10 - use Acrylic
|
||||
type = WindowsBackdrop::Acrylic;
|
||||
}
|
||||
}
|
||||
|
||||
// Extend DWM frame into entire client area - required for all backdrop types
|
||||
// This lets the DWM composition show through where we render with alpha = 0
|
||||
MARGINS margins = {-1, -1, -1, -1};
|
||||
DwmExtendFrameIntoClientArea(hwnd, &margins);
|
||||
|
||||
HRESULT hr = S_OK;
|
||||
|
||||
if (ver.build >= 22621) {
|
||||
// Windows 11 22H2+ - use DWMWA_SYSTEMBACKDROP_TYPE
|
||||
DWM_SYSTEMBACKDROP_TYPE backdrop;
|
||||
switch (type) {
|
||||
case WindowsBackdrop::Mica:
|
||||
backdrop = DWMSBT_MAINWINDOW;
|
||||
DEBUG_LOGF("WindowsBackdrop: Enabling Mica\n");
|
||||
break;
|
||||
case WindowsBackdrop::MicaAlt:
|
||||
backdrop = DWMSBT_TABBEDWINDOW;
|
||||
DEBUG_LOGF("WindowsBackdrop: Enabling Mica Alt\n");
|
||||
break;
|
||||
case WindowsBackdrop::Acrylic:
|
||||
backdrop = DWMSBT_TRANSIENTWINDOW;
|
||||
DEBUG_LOGF("WindowsBackdrop: Enabling Acrylic\n");
|
||||
break;
|
||||
default:
|
||||
backdrop = DWMSBT_NONE;
|
||||
break;
|
||||
}
|
||||
hr = DwmSetWindowAttribute(hwnd, DWMWA_SYSTEMBACKDROP_TYPE, &backdrop, sizeof(backdrop));
|
||||
}
|
||||
else if (ver.isWindows11) {
|
||||
// Windows 11 21H2 - use legacy DWMWA_MICA_EFFECT
|
||||
BOOL enableMica = (type == WindowsBackdrop::Mica || type == WindowsBackdrop::MicaAlt);
|
||||
hr = DwmSetWindowAttribute(hwnd, DWMWA_MICA_EFFECT, &enableMica, sizeof(enableMica));
|
||||
DEBUG_LOGF("WindowsBackdrop: Enabling Mica (legacy API)\n");
|
||||
}
|
||||
else {
|
||||
// Windows 10 - frame already extended above, basic DWM transparency
|
||||
// Note: Full acrylic on Win10 requires undocumented APIs
|
||||
DEBUG_LOGF("WindowsBackdrop: Using extended frame (Win10)\n");
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
DEBUG_LOGF("WindowsBackdrop: Successfully enabled\n");
|
||||
return true;
|
||||
} else {
|
||||
DEBUG_LOGF("WindowsBackdrop: DWM call failed with HRESULT 0x%08lx\n", hr);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void disableWindowsBackdrop(SDL_Window* window) {
|
||||
HWND hwnd = getHWND(window);
|
||||
if (!hwnd) return;
|
||||
|
||||
DWM_SYSTEMBACKDROP_TYPE backdrop = DWMSBT_NONE;
|
||||
DwmSetWindowAttribute(hwnd, DWMWA_SYSTEMBACKDROP_TYPE, &backdrop, sizeof(backdrop));
|
||||
|
||||
MARGINS margins = {0, 0, 0, 0};
|
||||
DwmExtendFrameIntoClientArea(hwnd, &margins);
|
||||
}
|
||||
|
||||
} // namespace platform
|
||||
} // namespace dragonx
|
||||
|
||||
#endif // _WIN32
|
||||
Reference in New Issue
Block a user