@@ -125,29 +125,46 @@ static uint32_t sToolbarForegroundColor;
125
125
126
126
static ThemeMode sTheme = ThemeMode::Invalid;
127
127
128
- #define MOZ_DECL_IMPORTED_WIN32_FN (name ) \
129
- static decltype (&::name) s##name = nullptr
130
- MOZ_DECL_IMPORTED_WIN32_FN (EnableNonClientDpiScaling);
131
- MOZ_DECL_IMPORTED_WIN32_FN (GetSystemMetricsForDpi);
132
- MOZ_DECL_IMPORTED_WIN32_FN (GetDpiForWindow);
133
- MOZ_DECL_IMPORTED_WIN32_FN (RegisterClassW);
134
- MOZ_DECL_IMPORTED_WIN32_FN (LoadIconW);
135
- MOZ_DECL_IMPORTED_WIN32_FN (LoadCursorW);
136
- MOZ_DECL_IMPORTED_WIN32_FN (CreateWindowExW);
137
- MOZ_DECL_IMPORTED_WIN32_FN (ShowWindow);
138
- MOZ_DECL_IMPORTED_WIN32_FN (SetWindowPos);
139
- MOZ_DECL_IMPORTED_WIN32_FN (GetWindowDC);
140
- MOZ_DECL_IMPORTED_WIN32_FN (GetWindowRect);
141
- MOZ_DECL_IMPORTED_WIN32_FN (MapWindowPoints);
142
- MOZ_DECL_IMPORTED_WIN32_FN (FillRect);
143
- MOZ_DECL_IMPORTED_WIN32_FN (DeleteObject);
144
- MOZ_DECL_IMPORTED_WIN32_FN (ReleaseDC);
145
- MOZ_DECL_IMPORTED_WIN32_FN (MonitorFromWindow);
146
- MOZ_DECL_IMPORTED_WIN32_FN (GetMonitorInfoW);
147
- MOZ_DECL_IMPORTED_WIN32_FN (SetWindowLongPtrW);
148
- MOZ_DECL_IMPORTED_WIN32_FN (StretchDIBits);
149
- MOZ_DECL_IMPORTED_WIN32_FN (CreateSolidBrush);
150
- #undef MOZ_DECL_IMPORTED_WIN32_FN
128
+ typedef BOOL (WINAPI* EnableNonClientDpiScalingProc)(HWND);
129
+ static EnableNonClientDpiScalingProc sEnableNonClientDpiScaling = NULL ;
130
+ typedef int (WINAPI* GetSystemMetricsForDpiProc)(int , UINT);
131
+ GetSystemMetricsForDpiProc sGetSystemMetricsForDpi = NULL ;
132
+ typedef UINT (WINAPI* GetDpiForWindowProc)(HWND);
133
+ GetDpiForWindowProc sGetDpiForWindow = NULL ;
134
+ typedef ATOM (WINAPI* RegisterClassWProc)(const WNDCLASSW*);
135
+ RegisterClassWProc sRegisterClassW = NULL ;
136
+ typedef HICON (WINAPI* LoadIconWProc)(HINSTANCE, LPCWSTR);
137
+ LoadIconWProc sLoadIconW = NULL ;
138
+ typedef HICON (WINAPI* LoadCursorWProc)(HINSTANCE, LPCWSTR);
139
+ LoadCursorWProc sLoadCursorW = NULL ;
140
+ typedef HWND (WINAPI* CreateWindowExWProc)(DWORD, LPCWSTR, LPCWSTR, DWORD, int ,
141
+ int , int , int , HWND, HMENU, HINSTANCE,
142
+ LPVOID);
143
+ CreateWindowExWProc sCreateWindowExW = NULL ;
144
+ typedef BOOL (WINAPI* ShowWindowProc)(HWND, int );
145
+ ShowWindowProc sShowWindow = NULL ;
146
+ typedef BOOL (WINAPI* SetWindowPosProc)(HWND, HWND, int , int , int , int , UINT);
147
+ SetWindowPosProc sSetWindowPos = NULL ;
148
+ typedef HDC (WINAPI* GetWindowDCProc)(HWND);
149
+ GetWindowDCProc sGetWindowDC = NULL ;
150
+ typedef int (WINAPI* FillRectProc)(HDC, const RECT*, HBRUSH);
151
+ FillRectProc sFillRect = NULL ;
152
+ typedef BOOL (WINAPI* DeleteObjectProc)(HGDIOBJ);
153
+ DeleteObjectProc sDeleteObject = NULL ;
154
+ typedef int (WINAPI* ReleaseDCProc)(HWND, HDC);
155
+ ReleaseDCProc sReleaseDC = NULL ;
156
+ typedef HMONITOR (WINAPI* MonitorFromWindowProc)(HWND, DWORD);
157
+ MonitorFromWindowProc sMonitorFromWindow = NULL ;
158
+ typedef BOOL (WINAPI* GetMonitorInfoWProc)(HMONITOR, LPMONITORINFO);
159
+ GetMonitorInfoWProc sGetMonitorInfoW = NULL ;
160
+ typedef LONG_PTR (WINAPI* SetWindowLongPtrWProc)(HWND, int , LONG_PTR);
161
+ SetWindowLongPtrWProc sSetWindowLongPtrW = NULL ;
162
+ typedef int (WINAPI* StretchDIBitsProc)(HDC, int , int , int , int , int , int , int ,
163
+ int , const VOID*, const BITMAPINFO*,
164
+ UINT, DWORD);
165
+ StretchDIBitsProc sStretchDIBits = NULL ;
166
+ typedef HBRUSH (WINAPI* CreateSolidBrushProc)(COLORREF);
167
+ CreateSolidBrushProc sCreateSolidBrush = NULL ;
151
168
152
169
static int sWindowWidth ;
153
170
static int sWindowHeight ;
@@ -1377,14 +1394,6 @@ Result<Ok, PreXULSkeletonUIError> LoadGdi32AndUser32Procedures() {
1377
1394
return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1378
1395
}
1379
1396
1380
- #define MOZ_LOAD_OR_FAIL (dll_handle, name ) \
1381
- do { \
1382
- s##name = (decltype (&::name))::GetProcAddress (dll_handle, #name); \
1383
- if (!s##name) { \
1384
- return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs); \
1385
- } \
1386
- } while (0 )
1387
-
1388
1397
auto getThreadDpiAwarenessContext =
1389
1398
(decltype (GetThreadDpiAwarenessContext)*)::GetProcAddress (
1390
1399
user32Dll, " GetThreadDpiAwarenessContext" );
@@ -1394,33 +1403,89 @@ Result<Ok, PreXULSkeletonUIError> LoadGdi32AndUser32Procedures() {
1394
1403
if (getThreadDpiAwarenessContext && areDpiAwarenessContextsEqual &&
1395
1404
areDpiAwarenessContextsEqual (getThreadDpiAwarenessContext (),
1396
1405
DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE)) {
1397
- // EnableNonClientDpiScaling is first available in Win10 Build 1607, but
1398
- // it's optional - we can handle not having it.
1399
- Unused << [&]() -> Result<Ok, PreXULSkeletonUIError> {
1400
- MOZ_LOAD_OR_FAIL (user32Dll, EnableNonClientDpiScaling);
1401
- return Ok{};
1402
- }();
1403
- }
1404
-
1405
- MOZ_LOAD_OR_FAIL (user32Dll, GetSystemMetricsForDpi);
1406
- MOZ_LOAD_OR_FAIL (user32Dll, GetDpiForWindow);
1407
- MOZ_LOAD_OR_FAIL (user32Dll, RegisterClassW);
1408
- MOZ_LOAD_OR_FAIL (user32Dll, CreateWindowExW);
1409
- MOZ_LOAD_OR_FAIL (user32Dll, ShowWindow);
1410
- MOZ_LOAD_OR_FAIL (user32Dll, SetWindowPos);
1411
- MOZ_LOAD_OR_FAIL (user32Dll, GetWindowDC);
1412
- MOZ_LOAD_OR_FAIL (user32Dll, FillRect);
1413
- MOZ_LOAD_OR_FAIL (user32Dll, ReleaseDC);
1414
- MOZ_LOAD_OR_FAIL (user32Dll, LoadIconW);
1415
- MOZ_LOAD_OR_FAIL (user32Dll, LoadCursorW);
1416
- MOZ_LOAD_OR_FAIL (user32Dll, MonitorFromWindow);
1417
- MOZ_LOAD_OR_FAIL (user32Dll, GetMonitorInfoW);
1418
- MOZ_LOAD_OR_FAIL (user32Dll, SetWindowLongPtrW);
1419
- MOZ_LOAD_OR_FAIL (gdi32Dll, StretchDIBits);
1420
- MOZ_LOAD_OR_FAIL (gdi32Dll, CreateSolidBrush);
1421
- MOZ_LOAD_OR_FAIL (gdi32Dll, DeleteObject);
1422
-
1423
- #undef MOZ_LOAD_OR_FAIL
1406
+ // EnableNonClientDpiScaling is optional - we can handle not having it.
1407
+ sEnableNonClientDpiScaling =
1408
+ (EnableNonClientDpiScalingProc)::GetProcAddress (
1409
+ user32Dll, " EnableNonClientDpiScaling" );
1410
+ }
1411
+
1412
+ sGetSystemMetricsForDpi = (GetSystemMetricsForDpiProc)::GetProcAddress (
1413
+ user32Dll, " GetSystemMetricsForDpi" );
1414
+ if (!sGetSystemMetricsForDpi ) {
1415
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1416
+ }
1417
+ sGetDpiForWindow =
1418
+ (GetDpiForWindowProc)::GetProcAddress (user32Dll, " GetDpiForWindow" );
1419
+ if (!sGetDpiForWindow ) {
1420
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1421
+ }
1422
+ sRegisterClassW =
1423
+ (RegisterClassWProc)::GetProcAddress (user32Dll, " RegisterClassW" );
1424
+ if (!sRegisterClassW ) {
1425
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1426
+ }
1427
+ sCreateWindowExW =
1428
+ (CreateWindowExWProc)::GetProcAddress (user32Dll, " CreateWindowExW" );
1429
+ if (!sCreateWindowExW ) {
1430
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1431
+ }
1432
+ sShowWindow = (ShowWindowProc)::GetProcAddress (user32Dll, " ShowWindow" );
1433
+ if (!sShowWindow ) {
1434
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1435
+ }
1436
+ sSetWindowPos = (SetWindowPosProc)::GetProcAddress (user32Dll, " SetWindowPos" );
1437
+ if (!sSetWindowPos ) {
1438
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1439
+ }
1440
+ sGetWindowDC = (GetWindowDCProc)::GetProcAddress (user32Dll, " GetWindowDC" );
1441
+ if (!sGetWindowDC ) {
1442
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1443
+ }
1444
+ sFillRect = (FillRectProc)::GetProcAddress (user32Dll, " FillRect" );
1445
+ if (!sFillRect ) {
1446
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1447
+ }
1448
+ sReleaseDC = (ReleaseDCProc)::GetProcAddress (user32Dll, " ReleaseDC" );
1449
+ if (!sReleaseDC ) {
1450
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1451
+ }
1452
+ sLoadIconW = (LoadIconWProc)::GetProcAddress (user32Dll, " LoadIconW" );
1453
+ if (!sLoadIconW ) {
1454
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1455
+ }
1456
+ sLoadCursorW = (LoadCursorWProc)::GetProcAddress (user32Dll, " LoadCursorW" );
1457
+ if (!sLoadCursorW ) {
1458
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1459
+ }
1460
+ sMonitorFromWindow =
1461
+ (MonitorFromWindowProc)::GetProcAddress (user32Dll, " MonitorFromWindow" );
1462
+ if (!sMonitorFromWindow ) {
1463
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1464
+ }
1465
+ sGetMonitorInfoW =
1466
+ (GetMonitorInfoWProc)::GetProcAddress (user32Dll, " GetMonitorInfoW" );
1467
+ if (!sGetMonitorInfoW ) {
1468
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1469
+ }
1470
+ sSetWindowLongPtrW =
1471
+ (SetWindowLongPtrWProc)::GetProcAddress (user32Dll, " SetWindowLongPtrW" );
1472
+ if (!sSetWindowLongPtrW ) {
1473
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1474
+ }
1475
+ sStretchDIBits =
1476
+ (StretchDIBitsProc)::GetProcAddress (gdi32Dll, " StretchDIBits" );
1477
+ if (!sStretchDIBits ) {
1478
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1479
+ }
1480
+ sCreateSolidBrush =
1481
+ (CreateSolidBrushProc)::GetProcAddress (gdi32Dll, " CreateSolidBrush" );
1482
+ if (!sCreateSolidBrush ) {
1483
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1484
+ }
1485
+ sDeleteObject = (DeleteObjectProc)::GetProcAddress (gdi32Dll, " DeleteObject" );
1486
+ if (!sDeleteObject ) {
1487
+ return Err (PreXULSkeletonUIError::FailedLoadingDynamicProcs);
1488
+ }
1424
1489
1425
1490
return Ok ();
1426
1491
}
0 commit comments