aboutsummaryrefslogtreecommitdiff
path: root/src/libs
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs')
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/thmutil.h43
-rw-r--r--src/libs/dutil/WixToolset.DUtil/thmutil.cpp137
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 @@
6extern "C" { 6extern "C" {
7#endif 7#endif
8 8
9// forward declare
10
11typedef 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
11typedef HRESULT(CALLBACK *PFNTHM_EVALUATE_VARIABLE_CONDITION)( 15typedef 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
116struct THEME_COLUMN 124struct 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
343struct THEME 352typedef 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
408typedef struct _THEME_CONTROLWMCOMMAND_ARGS 417typedef 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
443typedef struct _THEME_LOADEDCONTROL_ARGS
444{
445 DWORD cbSize;
446 const THEME_CONTROL* pThemeControl;
447} THEME_LOADEDCONTROL_ARGS;
448
449typedef struct _THEME_LOADEDCONTROL_RESULTS
450{
451 DWORD cbSize;
452 HRESULT hr;
453} THEME_LOADEDCONTROL_RESULTS;
454
434typedef struct _THEME_LOADINGCONTROL_ARGS 455typedef 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*******************************************************************/
535HRESULT 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*******************************************************************/
544void 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 );
207static void InitializeThemeControl( 207static void InitializeThemeControl(
208 THEME* pTheme,
208 THEME_CONTROL* pControl 209 THEME_CONTROL* pControl
209 ); 210 );
210static HRESULT ParseActions( 211static 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 );
277static HRESULT LoadThemeControls(
278 __in THEME* pTheme
279 );
280static void UnloadThemeControls(
281 __in THEME* pTheme
282 );
276static HRESULT OnLoadingControl( 283static 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 );
462static BOOL OnPanelCreate(
463 __in THEME_CONTROL* pControl,
464 __in HWND hWnd
465 );
455static BOOL OnWmCommand( 466static 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
892DAPI_(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
905LExit:
906 return hr;
907}
908
909
910DAPI_(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
920DAPI_(HRESULT) ThemeLocalize( 902DAPI_(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
3717static void InitializeThemeControl( 3710static 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
5398static 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
5412LExit:
5413 return SUCCEEDED(hr);
5414}
5415
5403static BOOL OnWmCommand( 5416static 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
6045static LRESULT CALLBACK StaticOwnerDrawWndProc( 6065static LRESULT CALLBACK StaticOwnerDrawWndProc(
@@ -6087,6 +6107,30 @@ static HRESULT OnLoadingControl(
6087 return hr; 6107 return hr;
6088} 6108}
6089 6109
6110static 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
6120LExit:
6121 return hr;
6122}
6123
6124static 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
6090static HRESULT LoadControls( 6134static 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