QWindowKit  1.5.1.0
Cross-platform window customization framework
Loading...
Searching...
No Matches
qwkwindowsextra_p.h
1// Copyright (C) 2023-present Stdware Collections (https://www.github.com/stdware)
2// Copyright (C) 2021-2023 wangwenx190 (Yuhang Zhao)
3// SPDX-License-Identifier: Apache-2.0
4
5#ifndef QWKWINDOWSEXTRA_P_H
6#define QWKWINDOWSEXTRA_P_H
7
8//
9// W A R N I N G !!!
10// -----------------
11//
12// This file is not part of the QWindowKit API. It is used purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or may even be removed.
15//
16
17#include <limits>
18
19#include <QWKCore/qwindowkit_windows.h>
20
21#include <QtGui/QGuiApplication>
22#include <QtGui/QStyleHints>
23#include <QtGui/QPalette>
24
25#include <QtCore/private/qsystemlibrary_p.h>
26
27// Don't include this header in any header files.
28
29typedef struct _MARGINS
30{
31 int cxLeftWidth;
32 int cxRightWidth;
33 int cyTopHeight;
34 int cyBottomHeight;
35} MARGINS, *PMARGINS;
36
37typedef enum MONITOR_DPI_TYPE {
38 MDT_EFFECTIVE_DPI = 0,
39 MDT_ANGULAR_DPI = 1,
40 MDT_RAW_DPI = 2,
41 MDT_DEFAULT = MDT_EFFECTIVE_DPI
42} MONITOR_DPI_TYPE;
43
44typedef struct _DWM_BLURBEHIND
45{
46 DWORD dwFlags;
47 BOOL fEnable;
48 HRGN hRgnBlur;
49 BOOL fTransitionOnMaximized;
50} DWM_BLURBEHIND, *PDWM_BLURBEHIND;
51
52extern "C" {
53 UINT WINAPI GetDpiForWindow(HWND);
54 UINT WINAPI GetDpiForSystem();
55 int WINAPI GetSystemMetricsForDpi(int, UINT);
56 BOOL WINAPI AdjustWindowRectExForDpi(LPRECT, DWORD, BOOL, DWORD, UINT);
57 HRESULT WINAPI GetDpiForMonitor(HMONITOR, MONITOR_DPI_TYPE, UINT *, UINT *);
58 HRESULT WINAPI DwmFlush();
59 HRESULT WINAPI DwmIsCompositionEnabled(BOOL*);
60 HRESULT WINAPI DwmGetWindowAttribute(HWND, DWORD, PVOID, DWORD);
61 HRESULT WINAPI DwmSetWindowAttribute(HWND, DWORD, LPCVOID, DWORD);
62 HRESULT WINAPI DwmExtendFrameIntoClientArea(HWND, const MARGINS*);
63 HRESULT WINAPI DwmEnableBlurBehindWindow(HWND, const DWM_BLURBEHIND*);
64} // extern "C"
65
66namespace QWK {
67
68 enum _DWMWINDOWATTRIBUTE {
69 // [set] BOOL, Allows the use of host backdrop brushes for the window.
70 _DWMWA_USE_HOSTBACKDROPBRUSH = 17,
71
72 // Undocumented, the same with DWMWA_USE_IMMERSIVE_DARK_MODE, but available on systems
73 // before Win10 20H1.
74 _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19,
75
76 // [set] BOOL, Allows a window to either use the accent color, or dark, according to the
77 // user Color Mode preferences.
78 _DWMWA_USE_IMMERSIVE_DARK_MODE = 20,
79
80 // [set] WINDOW_CORNER_PREFERENCE, Controls the policy that rounds top-level window corners
81 _DWMWA_WINDOW_CORNER_PREFERENCE = 33,
82
83 // [set] Set window border color [since Windows 11 Build 22000]
84 _DWMWA_BORDER_COLOR = 34,
85
86 // [get] UINT, width of the visible border around a thick frame window
87 _DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37,
88
89 // [get, set] SYSTEMBACKDROP_TYPE, Controls the system-drawn backdrop material of a window,
90 // including behind the non-client area.
91 _DWMWA_SYSTEMBACKDROP_TYPE = 38,
92
93 // Undocumented, use this value to enable Mica material on Win11 21H2. You should use
94 // DWMWA_SYSTEMBACKDROP_TYPE instead on Win11 22H2 and newer.
95 _DWMWA_MICA_EFFECT = 1029
96 };
97
98 // Types used with DWMWA_SYSTEMBACKDROP_TYPE
99 enum _DWM_SYSTEMBACKDROP_TYPE {
100 _DWMSBT_AUTO, // [Default] Let DWM automatically decide the system-drawn backdrop for this
101 // window.
102 _DWMSBT_NONE, // [Disable] Do not draw any system backdrop.
103 _DWMSBT_MAINWINDOW, // [Mica] Draw the backdrop material effect corresponding to a
104 // long-lived window.
105 _DWMSBT_TRANSIENTWINDOW, // [Acrylic] Draw the backdrop material effect corresponding to a
106 // transient window.
107 _DWMSBT_TABBEDWINDOW, // [Mica Alt] Draw the backdrop material effect corresponding to a
108 // window with a tabbed title bar.
109 };
110
111 enum WINDOWCOMPOSITIONATTRIB {
112 WCA_UNDEFINED = 0,
113 WCA_NCRENDERING_ENABLED = 1,
114 WCA_NCRENDERING_POLICY = 2,
115 WCA_TRANSITIONS_FORCEDISABLED = 3,
116 WCA_ALLOW_NCPAINT = 4,
117 WCA_CAPTION_BUTTON_BOUNDS = 5,
118 WCA_NONCLIENT_RTL_LAYOUT = 6,
119 WCA_FORCE_ICONIC_REPRESENTATION = 7,
120 WCA_EXTENDED_FRAME_BOUNDS = 8,
121 WCA_HAS_ICONIC_BITMAP = 9,
122 WCA_THEME_ATTRIBUTES = 10,
123 WCA_NCRENDERING_EXILED = 11,
124 WCA_NCADORNMENTINFO = 12,
125 WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
126 WCA_VIDEO_OVERLAY_ACTIVE = 14,
127 WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
128 WCA_DISALLOW_PEEK = 16,
129 WCA_CLOAK = 17,
130 WCA_CLOAKED = 18,
131 WCA_ACCENT_POLICY = 19,
132 WCA_FREEZE_REPRESENTATION = 20,
133 WCA_EVER_UNCLOAKED = 21,
134 WCA_VISUAL_OWNER = 22,
135 WCA_HOLOGRAPHIC = 23,
136 WCA_EXCLUDED_FROM_DDA = 24,
137 WCA_PASSIVEUPDATEMODE = 25,
138 WCA_USEDARKMODECOLORS = 26,
139 WCA_CORNER_STYLE = 27,
140 WCA_PART_COLOR = 28,
141 WCA_DISABLE_MOVESIZE_FEEDBACK = 29,
142 WCA_LAST = 30
143 };
144
145 enum ACCENT_STATE {
146 ACCENT_DISABLED = 0,
147 ACCENT_ENABLE_GRADIENT = 1,
148 ACCENT_ENABLE_TRANSPARENTGRADIENT = 2,
149 ACCENT_ENABLE_BLURBEHIND = 3, // Traditional DWM blur
150 ACCENT_ENABLE_ACRYLICBLURBEHIND = 4, // RS4 1803
151 ACCENT_ENABLE_HOST_BACKDROP = 5, // RS5 1809
152 ACCENT_INVALID_STATE = 6 // Using this value will remove the window background
153 };
154
155 enum ACCENT_FLAG {
156 ACCENT_NONE = 0,
157 ACCENT_ENABLE_ACRYLIC = 1,
158 ACCENT_ENABLE_ACRYLIC_WITH_LUMINOSITY = 482
159 };
160
161 struct ACCENT_POLICY {
162 DWORD dwAccentState;
163 DWORD dwAccentFlags;
164 DWORD dwGradientColor; // #AABBGGRR
165 DWORD dwAnimationId;
166 };
167 using PACCENT_POLICY = ACCENT_POLICY *;
168
169 struct WINDOWCOMPOSITIONATTRIBDATA {
170 WINDOWCOMPOSITIONATTRIB Attrib;
171 PVOID pvData;
172 SIZE_T cbData;
173 };
174 using PWINDOWCOMPOSITIONATTRIBDATA = WINDOWCOMPOSITIONATTRIBDATA *;
175
176 enum PREFERRED_APP_MODE {
177 PAM_DEFAULT = 0, // Default behavior on systems before Win10 1809. It indicates the
178 // application doesn't support dark mode at all.
179 PAM_AUTO =
180 1, // Available since Win10 1809, let system decide whether to enable dark mode or not.
181 PAM_DARK = 2, // Available since Win10 1903, force dark mode regardless of the system theme.
182 PAM_LIGHT =
183 3, // Available since Win10 1903, force light mode regardless of the system theme.
184 PAM_MAX = 4
185 };
186
187 using SetWindowCompositionAttributePtr = BOOL(WINAPI *)(HWND, PWINDOWCOMPOSITIONATTRIBDATA);
188
189 // Win10 1809 (10.0.17763)
190 using RefreshImmersiveColorPolicyStatePtr = VOID(WINAPI *)(VOID); // Ordinal 104
191 using AllowDarkModeForWindowPtr = BOOL(WINAPI *)(HWND, BOOL); // Ordinal 133
192 using AllowDarkModeForAppPtr = BOOL(WINAPI *)(BOOL); // Ordinal 135
193 using FlushMenuThemesPtr = VOID(WINAPI *)(VOID); // Ordinal 136
194 // Win10 1903 (10.0.18362)
195 using SetPreferredAppModePtr = PREFERRED_APP_MODE(WINAPI *)(PREFERRED_APP_MODE); // Ordinal 135
196
197 namespace {
198
199 struct DynamicApis {
200 static inline const DynamicApis &instance() {
201 static const DynamicApis inst;
202 return inst;
203 }
204
205#define DYNAMIC_API_DECLARE(NAME) decltype(&::NAME) p##NAME = nullptr
206
207 DYNAMIC_API_DECLARE(DwmFlush);
208 DYNAMIC_API_DECLARE(DwmIsCompositionEnabled);
209 DYNAMIC_API_DECLARE(DwmGetWindowAttribute);
210 DYNAMIC_API_DECLARE(DwmSetWindowAttribute);
211 DYNAMIC_API_DECLARE(DwmExtendFrameIntoClientArea);
212 DYNAMIC_API_DECLARE(DwmEnableBlurBehindWindow);
213 DYNAMIC_API_DECLARE(GetDpiForWindow);
214 DYNAMIC_API_DECLARE(GetDpiForSystem);
215 DYNAMIC_API_DECLARE(GetSystemMetricsForDpi);
216 DYNAMIC_API_DECLARE(AdjustWindowRectExForDpi);
217 DYNAMIC_API_DECLARE(GetDpiForMonitor);
218
219#undef DYNAMIC_API_DECLARE
220
221 SetWindowCompositionAttributePtr pSetWindowCompositionAttribute = nullptr;
222 RefreshImmersiveColorPolicyStatePtr pRefreshImmersiveColorPolicyState = nullptr;
223 AllowDarkModeForWindowPtr pAllowDarkModeForWindow = nullptr;
224 AllowDarkModeForAppPtr pAllowDarkModeForApp = nullptr;
225 FlushMenuThemesPtr pFlushMenuThemes = nullptr;
226 SetPreferredAppModePtr pSetPreferredAppMode = nullptr;
227
228 private:
229 inline DynamicApis() {
230#define DYNAMIC_API_RESOLVE(DLL, NAME) \
231 p##NAME = reinterpret_cast<decltype(p##NAME)>(DLL.resolve(#NAME))
232
233 QSystemLibrary user32(QStringLiteral("user32"));
234 DYNAMIC_API_RESOLVE(user32, GetDpiForWindow);
235 DYNAMIC_API_RESOLVE(user32, GetDpiForSystem);
236 DYNAMIC_API_RESOLVE(user32, GetSystemMetricsForDpi);
237 DYNAMIC_API_RESOLVE(user32, SetWindowCompositionAttribute);
238 DYNAMIC_API_RESOLVE(user32, AdjustWindowRectExForDpi);
239
240 QSystemLibrary shcore(QStringLiteral("shcore"));
241 DYNAMIC_API_RESOLVE(shcore, GetDpiForMonitor);
242
243 QSystemLibrary dwmapi(QStringLiteral("dwmapi"));
244 DYNAMIC_API_RESOLVE(dwmapi, DwmFlush);
245 DYNAMIC_API_RESOLVE(dwmapi, DwmIsCompositionEnabled);
246 DYNAMIC_API_RESOLVE(dwmapi, DwmGetWindowAttribute);
247 DYNAMIC_API_RESOLVE(dwmapi, DwmSetWindowAttribute);
248 DYNAMIC_API_RESOLVE(dwmapi, DwmExtendFrameIntoClientArea);
249 DYNAMIC_API_RESOLVE(dwmapi, DwmEnableBlurBehindWindow);
250
251#undef DYNAMIC_API_RESOLVE
252
253#define UNDOC_API_RESOLVE(DLL, NAME, ORDINAL) \
254 p##NAME = reinterpret_cast<decltype(p##NAME)>(DLL.resolve(MAKEINTRESOURCEA(ORDINAL)))
255
256 QSystemLibrary uxtheme(QStringLiteral("uxtheme"));
257 UNDOC_API_RESOLVE(uxtheme, RefreshImmersiveColorPolicyState, 104);
258 UNDOC_API_RESOLVE(uxtheme, AllowDarkModeForWindow, 133);
259 UNDOC_API_RESOLVE(uxtheme, AllowDarkModeForApp, 135);
260 UNDOC_API_RESOLVE(uxtheme, FlushMenuThemes, 136);
261 UNDOC_API_RESOLVE(uxtheme, SetPreferredAppMode, 135);
262
263#undef UNDOC_API_RESOLVE
264 }
265
266 inline ~DynamicApis() = default;
267
268 Q_DISABLE_COPY(DynamicApis)
269 };
270
271 }
272
273 inline constexpr bool operator==(const POINT &lhs, const POINT &rhs) noexcept {
274 return ((lhs.x == rhs.x) && (lhs.y == rhs.y));
275 }
276
277 inline constexpr bool operator!=(const POINT &lhs, const POINT &rhs) noexcept {
278 return !operator==(lhs, rhs);
279 }
280
281 inline constexpr bool operator==(const SIZE &lhs, const SIZE &rhs) noexcept {
282 return ((lhs.cx == rhs.cx) && (lhs.cy == rhs.cy));
283 }
284
285 inline constexpr bool operator!=(const SIZE &lhs, const SIZE &rhs) noexcept {
286 return !operator==(lhs, rhs);
287 }
288
289 inline constexpr bool operator==(const RECT &lhs, const RECT &rhs) noexcept {
290 return ((lhs.left == rhs.left) && (lhs.top == rhs.top) && (lhs.right == rhs.right) &&
291 (lhs.bottom == rhs.bottom));
292 }
293
294 inline constexpr bool operator!=(const RECT &lhs, const RECT &rhs) noexcept {
295 return !operator==(lhs, rhs);
296 }
297
298 inline constexpr QPoint point2qpoint(const POINT &point) {
299 return QPoint{int(point.x), int(point.y)};
300 }
301
302 inline constexpr POINT qpoint2point(const QPoint &point) {
303 return POINT{LONG(point.x()), LONG(point.y())};
304 }
305
306 inline constexpr QSize size2qsize(const SIZE &size) {
307 return QSize{int(size.cx), int(size.cy)};
308 }
309
310 inline constexpr SIZE qsize2size(const QSize &size) {
311 return SIZE{LONG(size.width()), LONG(size.height())};
312 }
313
314 inline constexpr QRect rect2qrect(const RECT &rect) {
315 return QRect{
316 QPoint{int(rect.left), int(rect.top) },
317 QSize{int(RECT_WIDTH(rect)), int(RECT_HEIGHT(rect))}
318 };
319 }
320
321 inline constexpr RECT qrect2rect(const QRect &qrect) {
322 return RECT{LONG(qrect.left()), LONG(qrect.top()), LONG(qrect.right()),
323 LONG(qrect.bottom())};
324 }
325
326 inline constexpr QMargins margins2qmargins(const MARGINS &margins) {
327 return {margins.cxLeftWidth, margins.cyTopHeight, margins.cxRightWidth,
328 margins.cyBottomHeight};
329 }
330
331 inline constexpr MARGINS qmargins2margins(const QMargins &qmargins) {
332 return {qmargins.left(), qmargins.right(), qmargins.top(), qmargins.bottom()};
333 }
334
335 inline /*constexpr*/ QString hwnd2str(const WId windowId) {
336 if (!windowId) {
337 return QStringLiteral("0x00000000");
338 }
339 return QStringLiteral("0x") +
340 QString::number(windowId, 16).toUpper().rightJustified(8, u'0');
341 }
342
343 inline /*constexpr*/ QString hwnd2str(HWND hwnd) {
344 // NULL handle is allowed here.
345 return hwnd2str(reinterpret_cast<WId>(hwnd));
346 }
347
348 inline bool isDwmCompositionEnabled() {
349 if (isWin8OrGreater()) {
350 return true;
351 }
352 const DynamicApis &apis = DynamicApis::instance();
353 if (!apis.pDwmIsCompositionEnabled) {
354 return false;
355 }
356 BOOL enabled = FALSE;
357 return SUCCEEDED(apis.pDwmIsCompositionEnabled(&enabled)) && enabled;
358 }
359
360 inline bool isWindowFrameBorderColorized() {
361 WindowsRegistryKey registry(HKEY_CURRENT_USER, LR"(Software\Microsoft\Windows\DWM)");
362 if (!registry.isValid()) {
363 return false;
364 }
365 auto value = registry.dwordValue(L"ColorPrevalence");
366 if (!value.second) {
367 return false;
368 }
369 return value.first;
370 }
371
372 inline bool isHighContrastModeEnabled() {
373 HIGHCONTRASTW hc{};
374 hc.cbSize = sizeof(hc);
375 ::SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(hc), &hc, FALSE);
376 return (hc.dwFlags & HCF_HIGHCONTRASTON);
377 }
378
379 inline bool isDarkThemeActive() {
380 if (!isWin101809OrGreater()) {
381 return false;
382 }
383#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
384 return QGuiApplication::styleHints()->colorScheme() == Qt::ColorScheme::Dark;
385#else
386 WindowsRegistryKey registry(
387 HKEY_CURRENT_USER, LR"(Software\Microsoft\Windows\CurrentVersion\Themes\Personalize)");
388 if (!registry.isValid()) {
389 return false;
390 }
391 auto value = registry.dwordValue(L"AppsUseLightTheme");
392 if (!value.second) {
393 return false;
394 }
395 return !value.first;
396#endif
397 }
398
399 inline bool isDarkWindowFrameEnabled(HWND hwnd) {
400 Q_ASSERT(hwnd);
401 if (!isWin101809OrGreater()) {
402 return false;
403 }
404 BOOL enabled = FALSE;
405 const DynamicApis &apis = DynamicApis::instance();
406 const auto attr = isWin1020H1OrGreater() ? _DWMWA_USE_IMMERSIVE_DARK_MODE
407 : _DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1;
408 return SUCCEEDED(apis.pDwmGetWindowAttribute(hwnd, attr, &enabled, sizeof(enabled))) &&
409 enabled;
410 }
411
412 inline QColor getAccentColor() {
413 WindowsRegistryKey registry(HKEY_CURRENT_USER, LR"(Software\Microsoft\Windows\DWM)");
414 if (!registry.isValid()) {
415 return {};
416 }
417 auto value = registry.dwordValue(L"AccentColor");
418 if (!value.second) {
419 return {};
420 }
421 // The retrieved value is in the #AABBGGRR format, we need to
422 // convert it to the #AARRGGBB format which Qt expects.
423 QColor color = QColor::fromRgba(value.first);
424 if (!color.isValid()) {
425 return {};
426 }
427 return QColor::fromRgb(color.blue(), color.green(), color.red(), color.alpha());
428 }
429
430 inline quint32 getSystemDpi() {
431 const DynamicApis &apis = DynamicApis::instance();
432 if (apis.pGetDpiForSystem)
433 return apis.pGetDpiForSystem();
434
435 HDC hdc = ::GetDC(nullptr);
436 if (!hdc)
437 return USER_DEFAULT_SCREEN_DPI;
438 const int dpiX = ::GetDeviceCaps(hdc, LOGPIXELSX);
439 ::ReleaseDC(nullptr, hdc);
440 return dpiX > 0 ? quint32(dpiX) : quint32(USER_DEFAULT_SCREEN_DPI);
441 }
442
443 inline quint32 getDpiForWindow(HWND hwnd) {
444 Q_ASSERT(hwnd);
445 const DynamicApis &apis = DynamicApis::instance();
446 if (apis.pGetDpiForWindow) { // Win10
447 const UINT dpi = apis.pGetDpiForWindow(hwnd);
448 if (dpi != 0)
449 return dpi;
450 }
451 if (apis.pGetDpiForMonitor) { // Win8.1
452 HMONITOR monitor = ::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
453 UINT dpiX{0};
454 UINT dpiY{0};
455 const HRESULT hr = apis.pGetDpiForMonitor(monitor, MDT_EFFECTIVE_DPI, &dpiX, &dpiY);
456 if (SUCCEEDED(hr) && dpiX != 0)
457 return dpiX;
458 }
459 return getSystemDpi(); // Win2K, or a failed modern API call
460 }
461
462 inline int getSystemMetricsForDpi(int index, quint32 dpi) {
463 Q_ASSERT(dpi);
464 if (!dpi)
465 return 0;
466
467 const DynamicApis &apis = DynamicApis::instance();
468 if (apis.pGetSystemMetricsForDpi) {
469 return apis.pGetSystemMetricsForDpi(index, dpi);
470 }
471 // GetSystemMetrics() is scaled for the system DPI. Rescale that value to the requested
472 // DPI, using the same integer rounding primitive as Windows.
473 return ::MulDiv(::GetSystemMetrics(index), int(dpi), int(getSystemDpi()));
474 }
475
476 inline int getWindowFrameBorderThickness(HWND hwnd) {
477 Q_ASSERT(hwnd);
478 const DynamicApis &apis = DynamicApis::instance();
479 if (isWin11OrGreater()) {
480 UINT result = 0;
481 if (SUCCEEDED(apis.pDwmGetWindowAttribute(hwnd, _DWMWA_VISIBLE_FRAME_BORDER_THICKNESS,
482 &result, sizeof(result))) &&
483 result <= static_cast<UINT>((std::numeric_limits<int>::max)())) {
484 return static_cast<int>(result);
485 }
486 }
487 if (isWin10OrGreater()) {
488 const quint32 dpi = getDpiForWindow(hwnd);
489 // When DPI is 96, it should be 1px.
490 return getSystemMetricsForDpi(SM_CXBORDER, dpi);
491 }
492 // There's no such thing (a visible frame border line) before Win10.
493 return 0;
494 }
495
496 inline int getResizeBorderThickness(HWND hwnd) {
497 Q_ASSERT(hwnd);
498 const quint32 dpi = getDpiForWindow(hwnd);
499 // When DPI is 96, SM_CXSIZEFRAME is 4px, SM_CXPADDEDBORDER is also 4px,
500 // so the result should be 8px. This result won't be affected by OS version,
501 // it's 8px in Win7, and so in Win11.
502 return getSystemMetricsForDpi(SM_CXSIZEFRAME, dpi) +
503 getSystemMetricsForDpi(SM_CXPADDEDBORDER, dpi);
504 }
505
506 inline int getTitleBarHeight(HWND hwnd) {
507 Q_ASSERT(hwnd);
508 const quint32 dpi = getDpiForWindow(hwnd);
509 // When DPI is 96, SM_CYCAPTION is 23px, so the result should be 31px.
510 // However, according to latest MS design manual, the title bar height
511 // should be 32px, maybe there's some rounding issue.
512 return getSystemMetricsForDpi(SM_CYCAPTION, dpi) +
513 getSystemMetricsForDpi(SM_CYSIZEFRAME, dpi) +
514 getSystemMetricsForDpi(SM_CXPADDEDBORDER, dpi);
515 }
516
517}
518
519#endif // QWKWINDOWSEXTRA_P_H
QWindowKit namespace.
Definition abstractwindowcontext.cpp:13