xcal
基于 C++23 的现代图形渲染引擎
载入中...
搜索中...
未找到
glfwdarkheadersupport.inc
浏览该文件的文档.
1// 平台检测宏
2#include <xcal/public.h>
3#if defined(_WIN32) || defined(_WIN64)
4# define XC_PLATFORM_WINDOWS 1
5# define GLFW_EXPOSE_NATIVE_WIN32
6# include <GLFW/glfw3.h>
7# include <GLFW/glfw3native.h>
8# include <dwmapi.h>
9# include <windows.h>
10# pragma comment(lib, "dwmapi.lib")
11#elif defined(__APPLE__)
12# define XC_PLATFORM_MACOS 1
13# include <TargetConditionals.h>
14# if TARGET_OS_MAC
15# define XC_PLATFORM_MAC 1
16# endif
17#elif defined(__linux__)
18# define XC_PLATFORM_LINUX 1
19// Linux 平台可能需要额外的头文件
20#endif
21
22// Windows 深色模式常量定义
23#ifdef XC_PLATFORM_WINDOWS
24# ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
25# define DWMWA_USE_IMMERSIVE_DARK_MODE 20
26# endif
27# ifndef DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1
28# define DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 19
29# endif
30#endif
31
37XCAL_API inline bool enable_window_dark_titlebar(GLFWwindow* window) {
38 if (!window) return false;
39
40#if defined(XC_PLATFORM_WINDOWS)
41 // Windows 平台实现
42 HWND hwnd = glfwGetWin32Window(window);
43 if (!hwnd) return false;
44
45 // 尝试使用较新的 API (Windows 10 20H1+)
46 BOOL useDarkMode = TRUE;
47 HRESULT result = DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE,
48 &useDarkMode, sizeof(useDarkMode));
49
50 if (FAILED(result)) {
51 // 回退到旧版 API (Windows 10 1809-1909)
52 result = DwmSetWindowAttribute(
53 hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, &useDarkMode,
54 sizeof(useDarkMode));
55 }
56
57 if (SUCCEEDED(result)) {
58 // 强制窗口重绘以应用新样式
59 RECT rect;
60 if (GetWindowRect(hwnd, &rect)) {
61 SetWindowPos(hwnd, NULL, rect.left, rect.top,
62 rect.right - rect.left, rect.bottom - rect.top - 1,
63 SWP_NOZORDER | SWP_FRAMECHANGED);
64 SetWindowPos(hwnd, NULL, rect.left, rect.top,
65 rect.right - rect.left, rect.bottom - rect.top,
66 SWP_NOZORDER | SWP_FRAMECHANGED);
67 }
68 return true;
69 }
70 return false;
71
72#elif defined(XC_PLATFORM_MAC)
73// macOS 平台实现
74// 注意:GLFW 在 macOS 上使用 NSWindow,需要 Objective-C 或 Swift 代码
75// 这里只是一个占位符,实际需要 Objective-C++ 实现
76# pragma message( \
77 "macOS dark titlebar support requires Objective-C implementation")
78 return false;
79
80#elif defined(XC_PLATFORM_LINUX)
81// Linux 平台实现
82// Linux 桌面环境多样,需要根据不同的桌面环境实现
83// 常见的如 GNOME、KDE、Xfce 等各有不同的方法
84# pragma message( \
85 "Linux dark titlebar support depends on desktop environment")
86 return false;
87
88#else
89// 其他不支持的平台
90# pragma message("Dark titlebar not supported on this platform")
91 return false;
92#endif
93}
94
100XCAL_API inline bool disable_window_dark_titlebar(GLFWwindow* window) {
101 if (!window) return false;
102
103#if defined(XC_PLATFORM_WINDOWS)
104 HWND hwnd = glfwGetWin32Window(window);
105 if (!hwnd) return false;
106
107 BOOL useDarkMode = FALSE;
108 HRESULT result = DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE,
109 &useDarkMode, sizeof(useDarkMode));
110
111 if (FAILED(result)) {
112 result = DwmSetWindowAttribute(
113 hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, &useDarkMode,
114 sizeof(useDarkMode));
115 }
116
117 if (SUCCEEDED(result)) {
118 // 强制重绘
119 RECT rect;
120 if (GetWindowRect(hwnd, &rect)) {
121 SetWindowPos(hwnd, NULL, rect.left, rect.top,
122 rect.right - rect.left, rect.bottom - rect.top,
123 SWP_NOZORDER | SWP_FRAMECHANGED);
124 }
125 return true;
126 }
127 return false;
128
129#else
130 // 其他平台暂不支持或需要相应实现
131 return false;
132#endif
133}
134
135// 平台检测辅助函数
136XCAL_API inline const char* get_platform_name() {
137#if defined(XC_PLATFORM_WINDOWS)
138 return "Windows";
139#elif defined(XC_PLATFORM_MAC)
140 return "macOS";
141#elif defined(XC_PLATFORM_LINUX)
142 return "Linux";
143#else
144 return "Unknown";
145#endif
146}
#define XCAL_API
Definition public.h:69
struct GLFWwindow GLFWwindow
Definition typedef.hpp:6