diff options
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | 43 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 137 |
2 files changed, 118 insertions, 62 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h index 9557c11c..eda81485 100644 --- a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h +++ b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | |||
@@ -6,6 +6,10 @@ | |||
6 | extern "C" { | 6 | extern "C" { |
7 | #endif | 7 | #endif |
8 | 8 | ||
9 | // forward declare | ||
10 | |||
11 | typedef struct _THEME THEME; | ||
12 | |||
9 | #define ReleaseTheme(p) if (p) { ThemeFree(p); p = NULL; } | 13 | #define ReleaseTheme(p) if (p) { ThemeFree(p); p = NULL; } |
10 | 14 | ||
11 | typedef HRESULT(CALLBACK *PFNTHM_EVALUATE_VARIABLE_CONDITION)( | 15 | typedef HRESULT(CALLBACK *PFNTHM_EVALUATE_VARIABLE_CONDITION)( |
@@ -111,6 +115,10 @@ typedef enum _WM_THMUTIL | |||
111 | // wparam is THEME_CONTROLWMNOTIFY_ARGS* and lparam is THEME_CONTROLWMNOTIFY_RESULTS*. | 115 | // wparam is THEME_CONTROLWMNOTIFY_ARGS* and lparam is THEME_CONTROLWMNOTIFY_RESULTS*. |
112 | // Return code is TRUE to prevent further processing of the message. | 116 | // Return code is TRUE to prevent further processing of the message. |
113 | WM_THMUTIL_CONTROL_WM_NOTIFY = WM_APP - 3, | 117 | WM_THMUTIL_CONTROL_WM_NOTIFY = WM_APP - 3, |
118 | // Sent after created a control. | ||
119 | // wparam is THEME_LOADEDCONTROL_ARGS* and lparam is THEME_LOADEDCONTROL_RESULTS*. | ||
120 | // Return code is TRUE if it was processed. | ||
121 | WM_THMUTIL_LOADED_CONTROL = WM_APP - 4, | ||
114 | } WM_THMUTIL; | 122 | } WM_THMUTIL; |
115 | 123 | ||
116 | struct THEME_COLUMN | 124 | struct THEME_COLUMN |
@@ -287,6 +295,7 @@ struct THEME_CONTROL | |||
287 | // state variables that should be ignored | 295 | // state variables that should be ignored |
288 | HWND hWnd; | 296 | HWND hWnd; |
289 | DWORD dwData; // type specific data | 297 | DWORD dwData; // type specific data |
298 | THEME* pTheme; | ||
290 | }; | 299 | }; |
291 | 300 | ||
292 | 301 | ||
@@ -340,7 +349,7 @@ struct THEME_FONT | |||
340 | }; | 349 | }; |
341 | 350 | ||
342 | 351 | ||
343 | struct THEME | 352 | typedef struct _THEME |
344 | { | 353 | { |
345 | WORD wNextControlId; | 354 | WORD wNextControlId; |
346 | 355 | ||
@@ -403,7 +412,7 @@ struct THEME | |||
403 | PFNTHM_SET_VARIABLE_STRING pfnSetStringVariable; | 412 | PFNTHM_SET_VARIABLE_STRING pfnSetStringVariable; |
404 | 413 | ||
405 | LPVOID pvVariableContext; | 414 | LPVOID pvVariableContext; |
406 | }; | 415 | } THEME; |
407 | 416 | ||
408 | typedef struct _THEME_CONTROLWMCOMMAND_ARGS | 417 | typedef struct _THEME_CONTROLWMCOMMAND_ARGS |
409 | { | 418 | { |
@@ -431,6 +440,18 @@ typedef struct _THEME_CONTROLWMNOTIFY_RESULTS | |||
431 | LRESULT lResult; | 440 | LRESULT lResult; |
432 | } THEME_CONTROLWMNOTIFY_RESULTS; | 441 | } THEME_CONTROLWMNOTIFY_RESULTS; |
433 | 442 | ||
443 | typedef struct _THEME_LOADEDCONTROL_ARGS | ||
444 | { | ||
445 | DWORD cbSize; | ||
446 | const THEME_CONTROL* pThemeControl; | ||
447 | } THEME_LOADEDCONTROL_ARGS; | ||
448 | |||
449 | typedef struct _THEME_LOADEDCONTROL_RESULTS | ||
450 | { | ||
451 | DWORD cbSize; | ||
452 | HRESULT hr; | ||
453 | } THEME_LOADEDCONTROL_RESULTS; | ||
454 | |||
434 | typedef struct _THEME_LOADINGCONTROL_ARGS | 455 | typedef struct _THEME_LOADINGCONTROL_ARGS |
435 | { | 456 | { |
436 | DWORD cbSize; | 457 | DWORD cbSize; |
@@ -528,24 +549,6 @@ HRESULT DAPI ThemeCreateParentWindow( | |||
528 | ); | 549 | ); |
529 | 550 | ||
530 | /******************************************************************** | 551 | /******************************************************************** |
531 | ThemeLoadControls - creates the windows for all the theme controls | ||
532 | using the window created in ThemeCreateParentWindow. | ||
533 | |||
534 | *******************************************************************/ | ||
535 | HRESULT DAPI ThemeLoadControls( | ||
536 | __in THEME* pTheme | ||
537 | ); | ||
538 | |||
539 | /******************************************************************** | ||
540 | ThemeUnloadControls - resets all the theme control windows so the theme | ||
541 | controls can be reloaded. | ||
542 | |||
543 | *******************************************************************/ | ||
544 | void DAPI ThemeUnloadControls( | ||
545 | __in THEME* pTheme | ||
546 | ); | ||
547 | |||
548 | /******************************************************************** | ||
549 | ThemeLocalize - Localizes all of the strings in the theme. | 552 | ThemeLocalize - Localizes all of the strings in the theme. |
550 | 553 | ||
551 | *******************************************************************/ | 554 | *******************************************************************/ |
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp index a3c5d80c..068638f6 100644 --- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp | |||
@@ -205,6 +205,7 @@ static HRESULT ParseControl( | |||
205 | __in_opt THEME_PAGE* pPage | 205 | __in_opt THEME_PAGE* pPage |
206 | ); | 206 | ); |
207 | static void InitializeThemeControl( | 207 | static void InitializeThemeControl( |
208 | THEME* pTheme, | ||
208 | THEME_CONTROL* pControl | 209 | THEME_CONTROL* pControl |
209 | ); | 210 | ); |
210 | static HRESULT ParseActions( | 211 | static HRESULT ParseActions( |
@@ -273,6 +274,12 @@ static HRESULT FindImageList( | |||
273 | __in_z LPCWSTR wzImageListName, | 274 | __in_z LPCWSTR wzImageListName, |
274 | __out HIMAGELIST *phImageList | 275 | __out HIMAGELIST *phImageList |
275 | ); | 276 | ); |
277 | static HRESULT LoadThemeControls( | ||
278 | __in THEME* pTheme | ||
279 | ); | ||
280 | static void UnloadThemeControls( | ||
281 | __in THEME* pTheme | ||
282 | ); | ||
276 | static HRESULT OnLoadingControl( | 283 | static HRESULT OnLoadingControl( |
277 | __in THEME* pTheme, | 284 | __in THEME* pTheme, |
278 | __in const THEME_CONTROL* pControl, | 285 | __in const THEME_CONTROL* pControl, |
@@ -452,6 +459,10 @@ static BOOL OnNotifyEnMsgFilter( | |||
452 | __in const THEME_CONTROL* pThemeControl, | 459 | __in const THEME_CONTROL* pThemeControl, |
453 | __in MSGFILTER* msgFilter | 460 | __in MSGFILTER* msgFilter |
454 | ); | 461 | ); |
462 | static BOOL OnPanelCreate( | ||
463 | __in THEME_CONTROL* pControl, | ||
464 | __in HWND hWnd | ||
465 | ); | ||
455 | static BOOL OnWmCommand( | 466 | static BOOL OnWmCommand( |
456 | __in THEME* pTheme, | 467 | __in THEME* pTheme, |
457 | __in WPARAM wParam, | 468 | __in WPARAM wParam, |
@@ -888,35 +899,6 @@ LExit: | |||
888 | return hr; | 899 | return hr; |
889 | } | 900 | } |
890 | 901 | ||
891 | |||
892 | DAPI_(HRESULT) ThemeLoadControls( | ||
893 | __in THEME* pTheme | ||
894 | ) | ||
895 | { | ||
896 | HRESULT hr = S_OK; | ||
897 | |||
898 | if (!pTheme->hwndParent) | ||
899 | { | ||
900 | ThmExitOnFailure(hr = E_INVALIDSTATE, "ThemeLoadControls called before theme parent window created."); | ||
901 | } | ||
902 | |||
903 | hr = LoadControls(pTheme, NULL); | ||
904 | |||
905 | LExit: | ||
906 | return hr; | ||
907 | } | ||
908 | |||
909 | |||
910 | DAPI_(void) ThemeUnloadControls( | ||
911 | __in THEME* pTheme | ||
912 | ) | ||
913 | { | ||
914 | UnloadControls(pTheme->cControls, pTheme->rgControls); | ||
915 | |||
916 | pTheme->hwndHover = NULL; | ||
917 | pTheme->hwndParent = NULL; | ||
918 | } | ||
919 | |||
920 | DAPI_(HRESULT) ThemeLocalize( | 902 | DAPI_(HRESULT) ThemeLocalize( |
921 | __in THEME *pTheme, | 903 | __in THEME *pTheme, |
922 | __in const WIX_LOCALIZATION *pWixLoc | 904 | __in const WIX_LOCALIZATION *pWixLoc |
@@ -1089,6 +1071,17 @@ extern "C" LRESULT CALLBACK ThemeDefWindowProc( | |||
1089 | } | 1071 | } |
1090 | break; | 1072 | break; |
1091 | 1073 | ||
1074 | case WM_CREATE: | ||
1075 | if (FAILED(LoadThemeControls(pTheme))) | ||
1076 | { | ||
1077 | return -1; | ||
1078 | } | ||
1079 | break; | ||
1080 | |||
1081 | case WM_DESTROY: | ||
1082 | UnloadThemeControls(pTheme); | ||
1083 | break; | ||
1084 | |||
1092 | case WM_NCHITTEST: | 1085 | case WM_NCHITTEST: |
1093 | if (pTheme->dwStyle & WS_POPUP) | 1086 | if (pTheme->dwStyle & WS_POPUP) |
1094 | { | 1087 | { |
@@ -3406,7 +3399,7 @@ static HRESULT ParseControl( | |||
3406 | BOOL fAnyTextChildren = FALSE; | 3399 | BOOL fAnyTextChildren = FALSE; |
3407 | BOOL fAnyNoteChildren = FALSE; | 3400 | BOOL fAnyNoteChildren = FALSE; |
3408 | 3401 | ||
3409 | InitializeThemeControl(pControl); | 3402 | InitializeThemeControl(pTheme, pControl); |
3410 | 3403 | ||
3411 | hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); | 3404 | hr = XmlGetAttributeEx(pixn, L"Name", &pControl->sczName); |
3412 | ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control Name attribute."); | 3405 | ThmExitOnOptionalXmlQueryFailure(hr, fXmlFound, "Failed when querying control Name attribute."); |
@@ -3715,6 +3708,7 @@ LExit: | |||
3715 | } | 3708 | } |
3716 | 3709 | ||
3717 | static void InitializeThemeControl( | 3710 | static void InitializeThemeControl( |
3711 | THEME* pTheme, | ||
3718 | THEME_CONTROL* pControl | 3712 | THEME_CONTROL* pControl |
3719 | ) | 3713 | ) |
3720 | { | 3714 | { |
@@ -3722,6 +3716,7 @@ static void InitializeThemeControl( | |||
3722 | pControl->dwFontId = THEME_INVALID_ID; | 3716 | pControl->dwFontId = THEME_INVALID_ID; |
3723 | pControl->dwFontSelectedId = THEME_INVALID_ID; | 3717 | pControl->dwFontSelectedId = THEME_INVALID_ID; |
3724 | pControl->uStringId = UINT_MAX; | 3718 | pControl->uStringId = UINT_MAX; |
3719 | pControl->pTheme = pTheme; | ||
3725 | } | 3720 | } |
3726 | 3721 | ||
3727 | 3722 | ||
@@ -3854,7 +3849,7 @@ static HRESULT ParseBillboardPanels( | |||
3854 | pControl = pParentControl->rgControls + pParentControl->cControls; | 3849 | pControl = pParentControl->rgControls + pParentControl->cControls; |
3855 | pParentControl->cControls += 1; | 3850 | pParentControl->cControls += 1; |
3856 | pControl->type = THEME_CONTROL_TYPE_PANEL; | 3851 | pControl->type = THEME_CONTROL_TYPE_PANEL; |
3857 | InitializeThemeControl(pControl); | 3852 | InitializeThemeControl(pTheme, pControl); |
3858 | 3853 | ||
3859 | if (pPage) | 3854 | if (pPage) |
3860 | { | 3855 | { |
@@ -5400,6 +5395,24 @@ static BOOL OnNotifyEnMsgFilter( | |||
5400 | return fProcessed; | 5395 | return fProcessed; |
5401 | } | 5396 | } |
5402 | 5397 | ||
5398 | static BOOL OnPanelCreate( | ||
5399 | __in THEME_CONTROL* pControl, | ||
5400 | __in HWND hWnd | ||
5401 | ) | ||
5402 | { | ||
5403 | HRESULT hr = S_OK; | ||
5404 | |||
5405 | ThmExitOnNull(pControl, hr, E_INVALIDSTATE, "Null control for OnPanelCreate"); | ||
5406 | |||
5407 | pControl->hWnd = hWnd; | ||
5408 | |||
5409 | hr = LoadControls(pControl->pTheme, pControl); | ||
5410 | ThmExitOnFailure(hr, "Failed to load panel controls."); | ||
5411 | |||
5412 | LExit: | ||
5413 | return SUCCEEDED(hr); | ||
5414 | } | ||
5415 | |||
5403 | static BOOL OnWmCommand( | 5416 | static BOOL OnWmCommand( |
5404 | __in THEME* pTheme, | 5417 | __in THEME* pTheme, |
5405 | __in WPARAM wParam, | 5418 | __in WPARAM wParam, |
@@ -6017,17 +6030,24 @@ static LRESULT CALLBACK PanelWndProc( | |||
6017 | ) | 6030 | ) |
6018 | { | 6031 | { |
6019 | LRESULT lres = 0; | 6032 | LRESULT lres = 0; |
6020 | THEME* pTheme = reinterpret_cast<THEME*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); | 6033 | THEME_CONTROL* pControl = reinterpret_cast<THEME_CONTROL*>(::GetWindowLongPtrW(hWnd, GWLP_USERDATA)); |
6021 | 6034 | ||
6022 | switch (uMsg) | 6035 | switch (uMsg) |
6023 | { | 6036 | { |
6024 | case WM_NCCREATE: | 6037 | case WM_NCCREATE: |
6025 | { | 6038 | { |
6026 | LPCREATESTRUCTW lpcs = reinterpret_cast<LPCREATESTRUCTW>(lParam); | 6039 | LPCREATESTRUCTW lpcs = reinterpret_cast<LPCREATESTRUCTW>(lParam); |
6027 | pTheme = reinterpret_cast<THEME*>(lpcs->lpCreateParams); | 6040 | pControl = reinterpret_cast<THEME_CONTROL*>(lpcs->lpCreateParams); |
6028 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pTheme)); | 6041 | ::SetWindowLongPtrW(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pControl)); |
6042 | break; | ||
6029 | } | 6043 | } |
6030 | break; | 6044 | |
6045 | case WM_CREATE: | ||
6046 | if (!OnPanelCreate(pControl, hWnd)) | ||
6047 | { | ||
6048 | return -1; | ||
6049 | } | ||
6050 | break; | ||
6031 | 6051 | ||
6032 | case WM_NCDESTROY: | 6052 | case WM_NCDESTROY: |
6033 | lres = ::DefWindowProcW(hWnd, uMsg, wParam, lParam); | 6053 | lres = ::DefWindowProcW(hWnd, uMsg, wParam, lParam); |
@@ -6039,7 +6059,7 @@ static LRESULT CALLBACK PanelWndProc( | |||
6039 | break; | 6059 | break; |
6040 | } | 6060 | } |
6041 | 6061 | ||
6042 | return ControlGroupDefWindowProc(pTheme, hWnd, uMsg, wParam, lParam); | 6062 | return ControlGroupDefWindowProc(pControl ? pControl->pTheme : NULL, hWnd, uMsg, wParam, lParam); |
6043 | } | 6063 | } |
6044 | 6064 | ||
6045 | static LRESULT CALLBACK StaticOwnerDrawWndProc( | 6065 | static LRESULT CALLBACK StaticOwnerDrawWndProc( |
@@ -6087,6 +6107,30 @@ static HRESULT OnLoadingControl( | |||
6087 | return hr; | 6107 | return hr; |
6088 | } | 6108 | } |
6089 | 6109 | ||
6110 | static HRESULT LoadThemeControls( | ||
6111 | __in THEME* pTheme | ||
6112 | ) | ||
6113 | { | ||
6114 | HRESULT hr = S_OK; | ||
6115 | |||
6116 | ThmExitOnNull(pTheme->hwndParent, hr, E_INVALIDSTATE, "LoadThemeControls called before theme parent window created."); | ||
6117 | |||
6118 | hr = LoadControls(pTheme, NULL); | ||
6119 | |||
6120 | LExit: | ||
6121 | return hr; | ||
6122 | } | ||
6123 | |||
6124 | static void UnloadThemeControls( | ||
6125 | __in THEME* pTheme | ||
6126 | ) | ||
6127 | { | ||
6128 | UnloadControls(pTheme->cControls, pTheme->rgControls); | ||
6129 | |||
6130 | pTheme->hwndHover = NULL; | ||
6131 | pTheme->hwndParent = NULL; | ||
6132 | } | ||
6133 | |||
6090 | static HRESULT LoadControls( | 6134 | static HRESULT LoadControls( |
6091 | __in THEME* pTheme, | 6135 | __in THEME* pTheme, |
6092 | __in_opt THEME_CONTROL* pParentControl | 6136 | __in_opt THEME_CONTROL* pParentControl |
@@ -6103,10 +6147,15 @@ static HRESULT LoadControls( | |||
6103 | int h = 0; | 6147 | int h = 0; |
6104 | int x = 0; | 6148 | int x = 0; |
6105 | int y = 0; | 6149 | int y = 0; |
6150 | THEME_LOADEDCONTROL_ARGS loadedControlArgs = { }; | ||
6151 | THEME_LOADEDCONTROL_RESULTS loadedControlResults = { }; | ||
6106 | 6152 | ||
6107 | GetControls(pTheme, pParentControl, cControls, rgControls); | 6153 | GetControls(pTheme, pParentControl, cControls, rgControls); |
6108 | ::GetClientRect(hwndParent, &rcParent); | 6154 | ::GetClientRect(hwndParent, &rcParent); |
6109 | 6155 | ||
6156 | loadedControlArgs.cbSize = sizeof(loadedControlArgs); | ||
6157 | loadedControlResults.cbSize = sizeof(loadedControlResults); | ||
6158 | |||
6110 | for (DWORD i = 0; i < cControls; ++i) | 6159 | for (DWORD i = 0; i < cControls; ++i) |
6111 | { | 6160 | { |
6112 | THEME_CONTROL* pControl = rgControls + i; | 6161 | THEME_CONTROL* pControl = rgControls + i; |
@@ -6124,8 +6173,7 @@ static HRESULT LoadControls( | |||
6124 | 6173 | ||
6125 | switch (pControl->type) | 6174 | switch (pControl->type) |
6126 | { | 6175 | { |
6127 | case THEME_CONTROL_TYPE_BILLBOARD: | 6176 | case THEME_CONTROL_TYPE_BILLBOARD: __fallthrough; |
6128 | __fallthrough; | ||
6129 | case THEME_CONTROL_TYPE_PANEL: | 6177 | case THEME_CONTROL_TYPE_PANEL: |
6130 | wzWindowClass = vsczPanelClass; | 6178 | wzWindowClass = vsczPanelClass; |
6131 | dwWindowExBits |= WS_EX_CONTROLPARENT; | 6179 | dwWindowExBits |= WS_EX_CONTROLPARENT; |
@@ -6309,7 +6357,7 @@ static HRESULT LoadControls( | |||
6309 | pControl->dwStyle &= ~WS_VISIBLE; | 6357 | pControl->dwStyle &= ~WS_VISIBLE; |
6310 | } | 6358 | } |
6311 | 6359 | ||
6312 | pControl->hWnd = ::CreateWindowExW(dwWindowExBits, wzWindowClass, pControl->sczText, pControl->dwStyle | dwWindowBits, x, y, w, h, hwndParent, reinterpret_cast<HMENU>(wControlId), NULL, pTheme); | 6360 | pControl->hWnd = ::CreateWindowExW(dwWindowExBits, wzWindowClass, pControl->sczText, pControl->dwStyle | dwWindowBits, x, y, w, h, hwndParent, reinterpret_cast<HMENU>(wControlId), NULL, pControl); |
6313 | ThmExitOnNullWithLastError(pControl->hWnd, hr, "Failed to create window."); | 6361 | ThmExitOnNullWithLastError(pControl->hWnd, hr, "Failed to create window."); |
6314 | 6362 | ||
6315 | if (pControl->sczTooltip) | 6363 | if (pControl->sczTooltip) |
@@ -6445,10 +6493,15 @@ static HRESULT LoadControls( | |||
6445 | } | 6493 | } |
6446 | } | 6494 | } |
6447 | 6495 | ||
6448 | if (pControl->cControls) | 6496 | loadedControlArgs.pThemeControl = pControl; |
6497 | loadedControlResults.hr = E_NOTIMPL; | ||
6498 | if (::SendMessageW(pTheme->hwndParent, WM_THMUTIL_LOADED_CONTROL, reinterpret_cast<WPARAM>(&loadedControlArgs), reinterpret_cast<LPARAM>(&loadedControlResults))) | ||
6449 | { | 6499 | { |
6450 | hr = LoadControls(pTheme, pControl); | 6500 | if (E_NOTIMPL != loadedControlResults.hr) |
6451 | ThmExitOnFailure(hr, "Failed to load child controls."); | 6501 | { |
6502 | hr = loadedControlResults.hr; | ||
6503 | ThmExitOnFailure(hr, "ThmLoadedControl failed"); | ||
6504 | } | ||
6452 | } | 6505 | } |
6453 | } | 6506 | } |
6454 | 6507 | ||