aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSean Hall <r.sean.hall@gmail.com>2021-10-27 14:42:32 -0500
committerSean Hall <r.sean.hall@gmail.com>2021-11-01 16:34:09 -0500
commitbad2e93524f376cfeb76d5231d4b08510bdad033 (patch)
treeb201ec4b1495a0af4805ea6b0bc4fce9f8bde7b7 /src
parent8fa040da9d0d3826f5ffda6bcbec4f53abd97452 (diff)
downloadwix-bad2e93524f376cfeb76d5231d4b08510bdad033.tar.gz
wix-bad2e93524f376cfeb76d5231d4b08510bdad033.tar.bz2
wix-bad2e93524f376cfeb76d5231d4b08510bdad033.zip
Add more thmutil window messages to simplify handling control events.
Diffstat (limited to 'src')
-rw-r--r--src/api/burn/balutil/inc/BAFunctions.h34
-rw-r--r--src/api/burn/balutil/inc/BalBaseBAFunctions.h24
-rw-r--r--src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h24
-rw-r--r--src/api/burn/balutil/inc/IBAFunctions.h22
-rw-r--r--src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp210
-rw-r--r--src/libs/dutil/WixToolset.DUtil/inc/thmutil.h34
-rw-r--r--src/libs/dutil/WixToolset.DUtil/thmutil.cpp302
-rw-r--r--src/samples/thmviewer/thmviewer.cpp57
-rw-r--r--src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp70
9 files changed, 564 insertions, 213 deletions
diff --git a/src/api/burn/balutil/inc/BAFunctions.h b/src/api/burn/balutil/inc/BAFunctions.h
index 2a34aaad..ab6ea4d7 100644
--- a/src/api/burn/balutil/inc/BAFunctions.h
+++ b/src/api/burn/balutil/inc/BAFunctions.h
@@ -86,6 +86,8 @@ enum BA_FUNCTIONS_MESSAGE
86 BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024, 86 BA_FUNCTIONS_MESSAGE_ONTHEMELOADED = 1024,
87 BA_FUNCTIONS_MESSAGE_WNDPROC, 87 BA_FUNCTIONS_MESSAGE_WNDPROC,
88 BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLLOADING, 88 BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLLOADING,
89 BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLWMCOMMAND,
90 BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLWMNOTIFY,
89}; 91};
90 92
91typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_PROC)( 93typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_PROC)(
@@ -126,6 +128,38 @@ struct BA_FUNCTIONS_ONTHEMECONTROLLOADING_RESULTS
126 WORD wId; 128 WORD wId;
127}; 129};
128 130
131struct BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_ARGS
132{
133 DWORD cbSize;
134 WPARAM wParam;
135 LPCWSTR wzName;
136 WORD wId;
137 HWND hWnd;
138};
139
140struct BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_RESULTS
141{
142 DWORD cbSize;
143 BOOL fProcessed;
144 LRESULT lResult;
145};
146
147struct BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_ARGS
148{
149 DWORD cbSize;
150 LPNMHDR lParam;
151 LPCWSTR wzName;
152 WORD wId;
153 HWND hWnd;
154};
155
156struct BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_RESULTS
157{
158 DWORD cbSize;
159 BOOL fProcessed;
160 LRESULT lResult;
161};
162
129struct BA_FUNCTIONS_ONTHEMELOADED_ARGS 163struct BA_FUNCTIONS_ONTHEMELOADED_ARGS
130{ 164{
131 DWORD cbSize; 165 DWORD cbSize;
diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctions.h b/src/api/burn/balutil/inc/BalBaseBAFunctions.h
index c2c8a6dc..f6c33f58 100644
--- a/src/api/burn/balutil/inc/BalBaseBAFunctions.h
+++ b/src/api/burn/balutil/inc/BalBaseBAFunctions.h
@@ -850,6 +850,30 @@ public: // IBAFunctions
850 return S_OK; 850 return S_OK;
851 } 851 }
852 852
853 virtual STDMETHODIMP OnThemeControlWmCommand(
854 __in WPARAM /*wParam*/,
855 __in LPCWSTR /*wzName*/,
856 __in WORD /*wId*/,
857 __in HWND /*hWnd*/,
858 __inout BOOL* /*pfProcessed*/,
859 __inout LRESULT* /*plResult*/
860 )
861 {
862 return S_OK;
863 }
864
865 virtual STDMETHODIMP OnThemeControlWmNotify(
866 __in LPNMHDR /*lParam*/,
867 __in LPCWSTR /*wzName*/,
868 __in WORD /*wId*/,
869 __in HWND /*hWnd*/,
870 __inout BOOL* /*pfProcessed*/,
871 __inout LRESULT* /*plResult*/
872 )
873 {
874 return S_OK;
875 }
876
853protected: 877protected:
854 CBalBaseBAFunctions( 878 CBalBaseBAFunctions(
855 __in HMODULE hModule, 879 __in HMODULE hModule,
diff --git a/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h b/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h
index efe22ddd..1d51c5b6 100644
--- a/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h
+++ b/src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h
@@ -33,6 +33,24 @@ static HRESULT BalBaseBAFunctionsProcOnThemeControlLoading(
33 return pBAFunctions->OnThemeControlLoading(pArgs->wzName, &pResults->fProcessed, &pResults->wId); 33 return pBAFunctions->OnThemeControlLoading(pArgs->wzName, &pResults->fProcessed, &pResults->wId);
34} 34}
35 35
36static HRESULT BalBaseBAFunctionsProcOnThemeControlWmCommand(
37 __in IBAFunctions* pBAFunctions,
38 __in BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_ARGS* pArgs,
39 __inout BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_RESULTS* pResults
40 )
41{
42 return pBAFunctions->OnThemeControlWmCommand(pArgs->wParam, pArgs->wzName, pArgs->wId, pArgs->hWnd, &pResults->fProcessed, &pResults->lResult);
43}
44
45static HRESULT BalBaseBAFunctionsProcOnThemeControlWmNotify(
46 __in IBAFunctions* pBAFunctions,
47 __in BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_ARGS* pArgs,
48 __inout BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_RESULTS* pResults
49 )
50{
51 return pBAFunctions->OnThemeControlWmNotify(pArgs->lParam, pArgs->wzName, pArgs->wId, pArgs->hWnd, &pResults->fProcessed, &pResults->lResult);
52}
53
36/******************************************************************* 54/*******************************************************************
37BalBaseBAFunctionsProc - requires pvContext to be of type IBAFunctions. 55BalBaseBAFunctionsProc - requires pvContext to be of type IBAFunctions.
38Provides a default mapping between the message based BAFunctions interface and 56Provides a default mapping between the message based BAFunctions interface and
@@ -137,6 +155,12 @@ static HRESULT WINAPI BalBaseBAFunctionsProc(
137 case BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLLOADING: 155 case BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLLOADING:
138 hr = BalBaseBAFunctionsProcOnThemeControlLoading(pBAFunctions, reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLLOADING_ARGS*>(pvArgs), reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLLOADING_RESULTS*>(pvResults)); 156 hr = BalBaseBAFunctionsProcOnThemeControlLoading(pBAFunctions, reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLLOADING_ARGS*>(pvArgs), reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLLOADING_RESULTS*>(pvResults));
139 break; 157 break;
158 case BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLWMCOMMAND:
159 hr = BalBaseBAFunctionsProcOnThemeControlWmCommand(pBAFunctions, reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_ARGS*>(pvArgs), reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_RESULTS*>(pvResults));
160 break;
161 case BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLWMNOTIFY:
162 hr = BalBaseBAFunctionsProcOnThemeControlWmNotify(pBAFunctions, reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_ARGS*>(pvArgs), reinterpret_cast<BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_RESULTS*>(pvResults));
163 break;
140 } 164 }
141 } 165 }
142 166
diff --git a/src/api/burn/balutil/inc/IBAFunctions.h b/src/api/burn/balutil/inc/IBAFunctions.h
index d41b7c9b..63395e1e 100644
--- a/src/api/burn/balutil/inc/IBAFunctions.h
+++ b/src/api/burn/balutil/inc/IBAFunctions.h
@@ -39,4 +39,26 @@ DECLARE_INTERFACE_IID_(IBAFunctions, IBootstrapperApplication, "0FB445ED-17BD-49
39 __inout BOOL* pfProcessed, 39 __inout BOOL* pfProcessed,
40 __inout WORD* pwId 40 __inout WORD* pwId
41 ) = 0; 41 ) = 0;
42
43 // OnThemeControlWmCommand - Called when WM_COMMAND is received for a control.
44 //
45 STDMETHOD(OnThemeControlWmCommand)(
46 __in WPARAM wParam,
47 __in LPCWSTR wzName,
48 __in WORD wId,
49 __in HWND hWnd,
50 __inout BOOL* pfProcessed,
51 __inout LRESULT* plResult
52 ) = 0;
53
54 // OnThemeControlWmNotify - Called when WM_NOTIFY is received for a control.
55 //
56 STDMETHOD(OnThemeControlWmNotify)(
57 __in LPNMHDR lParam,
58 __in LPCWSTR wzName,
59 __in WORD wId,
60 __in HWND hWnd,
61 __inout BOOL* pfProcessed,
62 __inout LRESULT* plResult
63 ) = 0;
42}; 64};
diff --git a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
index 8cdd31ce..2283880c 100644
--- a/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
+++ b/src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp
@@ -2878,65 +2878,11 @@ private:
2878 pBA->OnShowFailure(); 2878 pBA->OnShowFailure();
2879 return 0; 2879 return 0;
2880 2880
2881 case WM_COMMAND: 2881 case WM_THMUTIL_CONTROL_WM_COMMAND:
2882 switch (HIWORD(wParam)) 2882 return pBA->OnThemeControlWmCommand(reinterpret_cast<THEME_CONTROLWMCOMMAND_ARGS*>(wParam), reinterpret_cast<THEME_CONTROLWMCOMMAND_RESULTS*>(lParam));
2883 {
2884 case BN_CLICKED:
2885 switch (LOWORD(wParam))
2886 {
2887 case WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX:
2888 pBA->OnClickAcceptCheckbox();
2889 return 0;
2890
2891 case WIXSTDBA_CONTROL_INSTALL_BUTTON:
2892 pBA->OnClickInstallButton();
2893 return 0;
2894
2895 case WIXSTDBA_CONTROL_REPAIR_BUTTON:
2896 pBA->OnClickRepairButton();
2897 return 0;
2898
2899 case WIXSTDBA_CONTROL_UNINSTALL_BUTTON:
2900 pBA->OnClickUninstallButton();
2901 return 0;
2902
2903 case WIXSTDBA_CONTROL_LAUNCH_BUTTON:
2904 pBA->OnClickLaunchButton();
2905 return 0;
2906
2907 case WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON: __fallthrough;
2908 case WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON:
2909 pBA->OnClickRestartButton();
2910 return 0;
2911
2912 case WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON:
2913 pBA->OnClickCloseButton();
2914 return 0;
2915 }
2916 break;
2917 }
2918 break;
2919 2883
2920 case WM_NOTIFY: 2884 case WM_THMUTIL_CONTROL_WM_NOTIFY:
2921 if (lParam) 2885 return pBA->OnThemeControlWmNotify(reinterpret_cast<THEME_CONTROLWMNOTIFY_ARGS*>(wParam), reinterpret_cast<THEME_CONTROLWMNOTIFY_RESULTS*>(lParam));
2922 {
2923 LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam);
2924 switch (pnmhdr->code)
2925 {
2926 case NM_CLICK: __fallthrough;
2927 case NM_RETURN:
2928 switch (static_cast<DWORD>(pnmhdr->idFrom))
2929 {
2930 case WIXSTDBA_CONTROL_EULA_LINK:
2931 pBA->OnClickEulaLink();
2932 return 1;
2933 case WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK:
2934 pBA->OnClickLogFileLink();
2935 return 1;
2936 }
2937 }
2938 }
2939 break;
2940 } 2886 }
2941 2887
2942 if (pBA && pBA->m_pTaskbarList && uMsg == pBA->m_uTaskbarButtonCreatedMessage) 2888 if (pBA && pBA->m_pTaskbarList && uMsg == pBA->m_uTaskbarButtonCreatedMessage)
@@ -3666,6 +3612,154 @@ private:
3666 ReleaseStr(sczLogFile); 3612 ReleaseStr(sczLogFile);
3667 } 3613 }
3668 3614
3615 BOOL OnThemeControlWmCommand(
3616 __in const THEME_CONTROLWMCOMMAND_ARGS* pArgs,
3617 __in THEME_CONTROLWMCOMMAND_RESULTS* pResults
3618 )
3619 {
3620 HRESULT hr = S_OK;
3621 BOOL fProcessed = FALSE;
3622 BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_ARGS themeControlWmCommandArgs = { };
3623 BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_RESULTS themeControlWmCommandResults = { };
3624
3625 switch (HIWORD(pArgs->wParam))
3626 {
3627 case BN_CLICKED:
3628 switch (pArgs->pThemeControl->wId)
3629 {
3630 case WIXSTDBA_CONTROL_EULA_ACCEPT_CHECKBOX:
3631 OnClickAcceptCheckbox();
3632 fProcessed = TRUE;
3633 pResults->lResult = 0;
3634 ExitFunction();
3635
3636 case WIXSTDBA_CONTROL_INSTALL_BUTTON:
3637 OnClickInstallButton();
3638 fProcessed = TRUE;
3639 pResults->lResult = 0;
3640 ExitFunction();
3641
3642 case WIXSTDBA_CONTROL_REPAIR_BUTTON:
3643 OnClickRepairButton();
3644 fProcessed = TRUE;
3645 pResults->lResult = 0;
3646 ExitFunction();
3647
3648 case WIXSTDBA_CONTROL_UNINSTALL_BUTTON:
3649 OnClickUninstallButton();
3650 fProcessed = TRUE;
3651 pResults->lResult = 0;
3652 ExitFunction();
3653
3654 case WIXSTDBA_CONTROL_LAUNCH_BUTTON:
3655 OnClickLaunchButton();
3656 fProcessed = TRUE;
3657 pResults->lResult = 0;
3658 ExitFunction();
3659
3660 case WIXSTDBA_CONTROL_SUCCESS_RESTART_BUTTON: __fallthrough;
3661 case WIXSTDBA_CONTROL_FAILURE_RESTART_BUTTON:
3662 OnClickRestartButton();
3663 fProcessed = TRUE;
3664 pResults->lResult = 0;
3665 ExitFunction();
3666
3667 case WIXSTDBA_CONTROL_PROGRESS_CANCEL_BUTTON:
3668 OnClickCloseButton();
3669 fProcessed = TRUE;
3670 pResults->lResult = 0;
3671 ExitFunction();
3672 }
3673 break;
3674 }
3675
3676 if (m_pfnBAFunctionsProc)
3677 {
3678 themeControlWmCommandArgs.cbSize = sizeof(themeControlWmCommandArgs);
3679 themeControlWmCommandArgs.wParam = pArgs->wParam;
3680 themeControlWmCommandArgs.wzName = pArgs->pThemeControl->sczName;
3681 themeControlWmCommandArgs.wId = pArgs->pThemeControl->wId;
3682 themeControlWmCommandArgs.hWnd = pArgs->pThemeControl->hWnd;
3683
3684 themeControlWmCommandResults.cbSize = sizeof(themeControlWmCommandResults);
3685 themeControlWmCommandResults.lResult = pResults->lResult;
3686
3687 hr = m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLWMCOMMAND, &themeControlWmCommandArgs, &themeControlWmCommandResults, m_pvBAFunctionsProcContext);
3688 if (E_NOTIMPL != hr)
3689 {
3690 BalExitOnFailure(hr, "BAFunctions OnThemeControlWmCommand failed.");
3691
3692 if (themeControlWmCommandResults.fProcessed)
3693 {
3694 fProcessed = TRUE;
3695 pResults->lResult = themeControlWmCommandResults.lResult;
3696 ExitFunction();
3697 }
3698 }
3699 }
3700
3701LExit:
3702 return fProcessed;
3703 }
3704
3705 BOOL OnThemeControlWmNotify(
3706 __in const THEME_CONTROLWMNOTIFY_ARGS* pArgs,
3707 __in THEME_CONTROLWMNOTIFY_RESULTS* pResults
3708 )
3709 {
3710 HRESULT hr = S_OK;
3711 BOOL fProcessed = FALSE;
3712 BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_ARGS themeControlWmNotifyArgs = { };
3713 BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_RESULTS themeControlWmNotifyResults = { };
3714
3715 switch (pArgs->lParam->code)
3716 {
3717 case NM_CLICK: __fallthrough;
3718 case NM_RETURN:
3719 switch (pArgs->pThemeControl->wId)
3720 {
3721 case WIXSTDBA_CONTROL_EULA_LINK:
3722 OnClickEulaLink();
3723 fProcessed = TRUE;
3724 pResults->lResult = 1;
3725 ExitFunction();
3726 case WIXSTDBA_CONTROL_FAILURE_LOGFILE_LINK:
3727 OnClickLogFileLink();
3728 fProcessed = TRUE;
3729 pResults->lResult = 1;
3730 ExitFunction();
3731 }
3732 }
3733
3734 if (m_pfnBAFunctionsProc)
3735 {
3736 themeControlWmNotifyArgs.cbSize = sizeof(themeControlWmNotifyArgs);
3737 themeControlWmNotifyArgs.lParam = pArgs->lParam;
3738 themeControlWmNotifyArgs.wzName = pArgs->pThemeControl->sczName;
3739 themeControlWmNotifyArgs.wId = pArgs->pThemeControl->wId;
3740 themeControlWmNotifyArgs.hWnd = pArgs->pThemeControl->hWnd;
3741
3742 themeControlWmNotifyResults.cbSize = sizeof(themeControlWmNotifyResults);
3743 themeControlWmNotifyResults.lResult = pResults->lResult;
3744
3745 hr = m_pfnBAFunctionsProc(BA_FUNCTIONS_MESSAGE_ONTHEMECONTROLWMCOMMAND, &themeControlWmNotifyArgs, &themeControlWmNotifyResults, m_pvBAFunctionsProcContext);
3746 if (E_NOTIMPL != hr)
3747 {
3748 BalExitOnFailure(hr, "BAFunctions OnThemeControlWmNotify failed.");
3749
3750 if (themeControlWmNotifyResults.fProcessed)
3751 {
3752 fProcessed = TRUE;
3753 pResults->lResult = themeControlWmNotifyResults.lResult;
3754 ExitFunction();
3755 }
3756 }
3757 }
3758
3759LExit:
3760 return fProcessed;
3761 }
3762
3669 3763
3670 // 3764 //
3671 // SetState 3765 // SetState
diff --git a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h
index dc554219..9557c11c 100644
--- a/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h
+++ b/src/libs/dutil/WixToolset.DUtil/inc/thmutil.h
@@ -103,6 +103,14 @@ typedef enum _WM_THMUTIL
103 // wparam is THEME_LOADINGCONTROL_ARGS* and lparam is THEME_LOADINGCONTROL_RESULTS*. 103 // wparam is THEME_LOADINGCONTROL_ARGS* and lparam is THEME_LOADINGCONTROL_RESULTS*.
104 // Return code is TRUE if it was processed. 104 // Return code is TRUE if it was processed.
105 WM_THMUTIL_LOADING_CONTROL = WM_APP - 1, 105 WM_THMUTIL_LOADING_CONTROL = WM_APP - 1,
106 // Sent when WM_COMMAND is received for a control.
107 // wparam is THEME_CONTROLWMCOMMAND_ARGS* and lparam is THEME_CONTROLWMCOMMAND_RESULTS*.
108 // Return code is TRUE if it was processed.
109 WM_THMUTIL_CONTROL_WM_COMMAND = WM_APP - 2,
110 // Sent when WM_NOTIFY is received for a control.
111 // wparam is THEME_CONTROLWMNOTIFY_ARGS* and lparam is THEME_CONTROLWMNOTIFY_RESULTS*.
112 // Return code is TRUE to prevent further processing of the message.
113 WM_THMUTIL_CONTROL_WM_NOTIFY = WM_APP - 3,
106} WM_THMUTIL; 114} WM_THMUTIL;
107 115
108struct THEME_COLUMN 116struct THEME_COLUMN
@@ -397,6 +405,32 @@ struct THEME
397 LPVOID pvVariableContext; 405 LPVOID pvVariableContext;
398}; 406};
399 407
408typedef struct _THEME_CONTROLWMCOMMAND_ARGS
409{
410 DWORD cbSize;
411 WPARAM wParam;
412 const THEME_CONTROL* pThemeControl;
413} THEME_CONTROLWMCOMMAND_ARGS;
414
415typedef struct _THEME_CONTROLWMCOMMAND_RESULTS
416{
417 DWORD cbSize;
418 LRESULT lResult;
419} THEME_CONTROLWMCOMMAND_RESULTS;
420
421typedef struct _THEME_CONTROLWMNOTIFY_ARGS
422{
423 DWORD cbSize;
424 LPNMHDR lParam;
425 const THEME_CONTROL* pThemeControl;
426} THEME_CONTROLWMNOTIFY_ARGS;
427
428typedef struct _THEME_CONTROLWMNOTIFY_RESULTS
429{
430 DWORD cbSize;
431 LRESULT lResult;
432} THEME_CONTROLWMNOTIFY_RESULTS;
433
400typedef struct _THEME_LOADINGCONTROL_ARGS 434typedef struct _THEME_LOADINGCONTROL_ARGS
401{ 435{
402 DWORD cbSize; 436 DWORD cbSize;
diff --git a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
index d796bbaf..a3c5d80c 100644
--- a/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
+++ b/src/libs/dutil/WixToolset.DUtil/thmutil.cpp
@@ -421,12 +421,10 @@ static void CALLBACK OnBillboardTimer(
421 ); 421 );
422static void OnBrowseDirectory( 422static void OnBrowseDirectory(
423 __in THEME* pTheme, 423 __in THEME* pTheme,
424 __in HWND hWnd,
425 __in const THEME_ACTION* pAction 424 __in const THEME_ACTION* pAction
426 ); 425 );
427static BOOL OnButtonClicked( 426static BOOL OnButtonClicked(
428 __in THEME* pTheme, 427 __in THEME* pTheme,
429 __in HWND hWnd,
430 __in const THEME_CONTROL* pControl 428 __in const THEME_CONTROL* pControl
431 ); 429 );
432static BOOL OnDpiChanged( 430static BOOL OnDpiChanged(
@@ -434,20 +432,37 @@ static BOOL OnDpiChanged(
434 __in WPARAM wParam, 432 __in WPARAM wParam,
435 __in LPARAM lParam 433 __in LPARAM lParam
436 ); 434 );
435static BOOL OnHypertextClicked(
436 __in THEME* pTheme,
437 __in const THEME_CONTROL* pThemeControl,
438 __in PNMLINK pnmlink
439 );
437static void OnNcCreate( 440static void OnNcCreate(
438 __in THEME* pTheme, 441 __in THEME* pTheme,
439 __in HWND hWnd, 442 __in HWND hWnd,
440 __in LPARAM lParam 443 __in LPARAM lParam
441 ); 444 );
442static HRESULT OnRichEditEnLink( 445static BOOL OnNotifyEnLink(
443 __in LPARAM lParam, 446 __in THEME* pTheme,
444 __in HWND hWndRichEdit, 447 __in const THEME_CONTROL* pThemeControl,
445 __in HWND hWnd 448 __in ENLINK* link
446 ); 449 );
447static BOOL ControlIsType( 450static BOOL OnNotifyEnMsgFilter(
448 __in const THEME* pTheme, 451 __in THEME* pTheme,
449 __in DWORD dwControl, 452 __in const THEME_CONTROL* pThemeControl,
450 __in THEME_CONTROL_TYPE type 453 __in MSGFILTER* msgFilter
454 );
455static BOOL OnWmCommand(
456 __in THEME* pTheme,
457 __in WPARAM wParam,
458 __in const THEME_CONTROL* pThemeControl,
459 __inout LRESULT* plResult
460 );
461static BOOL OnWmNotify(
462 __in THEME* pTheme,
463 __in LPNMHDR lParam,
464 __in const THEME_CONTROL* pThemeControl,
465 __inout LRESULT* plResult
451 ); 466 );
452static const THEME_CONTROL* FindControlFromHWnd( 467static const THEME_CONTROL* FindControlFromHWnd(
453 __in const THEME* pTheme, 468 __in const THEME* pTheme,
@@ -5089,7 +5104,6 @@ static void CALLBACK OnBillboardTimer(
5089 5104
5090static void OnBrowseDirectory( 5105static void OnBrowseDirectory(
5091 __in THEME* pTheme, 5106 __in THEME* pTheme,
5092 __in HWND hWnd,
5093 __in const THEME_ACTION* pAction 5107 __in const THEME_ACTION* pAction
5094 ) 5108 )
5095{ 5109{
@@ -5098,7 +5112,7 @@ static void OnBrowseDirectory(
5098 BROWSEINFOW browseInfo = { }; 5112 BROWSEINFOW browseInfo = { };
5099 PIDLIST_ABSOLUTE pidl = NULL; 5113 PIDLIST_ABSOLUTE pidl = NULL;
5100 5114
5101 browseInfo.hwndOwner = hWnd; 5115 browseInfo.hwndOwner = pTheme->hwndParent;
5102 browseInfo.pszDisplayName = wzPath; 5116 browseInfo.pszDisplayName = wzPath;
5103 browseInfo.lpszTitle = pTheme->sczCaption; 5117 browseInfo.lpszTitle = pTheme->sczCaption;
5104 browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI; 5118 browseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_USENEWUI;
@@ -5148,7 +5162,6 @@ LExit:
5148 5162
5149static BOOL OnButtonClicked( 5163static BOOL OnButtonClicked(
5150 __in THEME* pTheme, 5164 __in THEME* pTheme,
5151 __in HWND hWnd,
5152 __in const THEME_CONTROL* pControl 5165 __in const THEME_CONTROL* pControl
5153 ) 5166 )
5154{ 5167{
@@ -5191,11 +5204,11 @@ static BOOL OnButtonClicked(
5191 switch (pChosenAction->type) 5204 switch (pChosenAction->type)
5192 { 5205 {
5193 case THEME_ACTION_TYPE_BROWSE_DIRECTORY: 5206 case THEME_ACTION_TYPE_BROWSE_DIRECTORY:
5194 OnBrowseDirectory(pTheme, hWnd, pChosenAction); 5207 OnBrowseDirectory(pTheme, pChosenAction);
5195 break; 5208 break;
5196 5209
5197 case THEME_ACTION_TYPE_CLOSE_WINDOW: 5210 case THEME_ACTION_TYPE_CLOSE_WINDOW:
5198 ::SendMessageW(hWnd, WM_CLOSE, 0, 0); 5211 ::SendMessageW(pTheme->hwndParent, WM_CLOSE, 0, 0);
5199 break; 5212 break;
5200 5213
5201 case THEME_ACTION_TYPE_CHANGE_PAGE: 5214 case THEME_ACTION_TYPE_CHANGE_PAGE:
@@ -5272,6 +5285,25 @@ LExit:
5272 return !fIgnored; 5285 return !fIgnored;
5273} 5286}
5274 5287
5288static BOOL OnHypertextClicked(
5289 __in THEME* pTheme,
5290 __in const THEME_CONTROL* /*pThemeControl*/,
5291 __in PNMLINK pnmlink
5292 )
5293{
5294 BOOL fProcessed = FALSE;
5295 HRESULT hr = S_OK;
5296 LITEM litem = pnmlink->item;
5297
5298 hr = ShelExec(litem.szUrl, NULL, L"open", NULL, SW_SHOWDEFAULT, pTheme->hwndParent, NULL);
5299 ThmExitOnFailure(hr, "Failed to launch hypertext link: %ls", litem.szUrl);
5300
5301 fProcessed = TRUE;
5302
5303LExit:
5304 return fProcessed;
5305}
5306
5275static void OnNcCreate( 5307static void OnNcCreate(
5276 __in THEME* pTheme, 5308 __in THEME* pTheme,
5277 __in HWND hWnd, 5309 __in HWND hWnd,
@@ -5291,63 +5323,185 @@ static void OnNcCreate(
5291 } 5323 }
5292} 5324}
5293 5325
5294static HRESULT OnRichEditEnLink( 5326static BOOL OnNotifyEnLink(
5295 __in LPARAM lParam, 5327 __in THEME* pTheme,
5296 __in HWND hWndRichEdit, 5328 __in const THEME_CONTROL* pThemeControl,
5297 __in HWND hWnd 5329 __in ENLINK* link
5298 ) 5330 )
5299{ 5331{
5332 BOOL fProcessed = FALSE;
5300 HRESULT hr = S_OK; 5333 HRESULT hr = S_OK;
5301 LPWSTR sczLink = NULL; 5334 LPWSTR sczLink = NULL;
5302 ENLINK* link = reinterpret_cast<ENLINK*>(lParam); 5335 TEXTRANGEW tr = { };
5303 5336
5304 switch (link->msg) 5337 // Hyperlink clicks from rich-edit control.
5338 if (THEME_CONTROL_TYPE_RICHEDIT == pThemeControl->type)
5305 { 5339 {
5306 case WM_LBUTTONDOWN: 5340 switch (link->msg)
5307 { 5341 {
5308 hr = StrAlloc(&sczLink, link->chrg.cpMax - link->chrg.cpMin + 2); 5342 case WM_LBUTTONDOWN:
5309 ThmExitOnFailure(hr, "Failed to allocate string for link."); 5343 hr = StrAlloc(&sczLink, (SIZE_T)2 + link->chrg.cpMax - link->chrg.cpMin);
5344 ThmExitOnFailure(hr, "Failed to allocate string for link.");
5310 5345
5311 TEXTRANGEW tr; 5346 tr.chrg.cpMin = link->chrg.cpMin;
5312 tr.chrg.cpMin = link->chrg.cpMin; 5347 tr.chrg.cpMax = link->chrg.cpMax;
5313 tr.chrg.cpMax = link->chrg.cpMax; 5348 tr.lpstrText = sczLink;
5314 tr.lpstrText = sczLink;
5315 5349
5316 if (0 < ::SendMessageW(hWndRichEdit, EM_GETTEXTRANGE, 0, reinterpret_cast<LPARAM>(&tr))) 5350 if (0 < ::SendMessageW(pThemeControl->hWnd, EM_GETTEXTRANGE, 0, reinterpret_cast<LPARAM>(&tr)))
5317 { 5351 {
5318 hr = ShelExec(sczLink, NULL, L"open", NULL, SW_SHOWDEFAULT, hWnd, NULL); 5352 hr = ShelExec(sczLink, NULL, L"open", NULL, SW_SHOWDEFAULT, pTheme->hwndParent, NULL);
5319 ThmExitOnFailure(hr, "Failed to launch link: %ls", sczLink); 5353 ThmExitOnFailure(hr, "Failed to launch link: %ls", sczLink);
5354
5355 fProcessed = TRUE;
5356 }
5357
5358 break;
5359
5360 case WM_SETCURSOR:
5361 ::SetCursor(vhCursorHand);
5362 fProcessed = TRUE;
5363
5364 break;
5320 } 5365 }
5321 5366 }
5322 break; 5367
5368LExit:
5369 ReleaseStr(sczLink);
5370
5371 return fProcessed;
5372}
5373
5374static BOOL OnNotifyEnMsgFilter(
5375 __in THEME* pTheme,
5376 __in const THEME_CONTROL* pThemeControl,
5377 __in MSGFILTER* msgFilter
5378 )
5379{
5380 BOOL fProcessed = FALSE;
5381
5382 // Tab/Shift+Tab support for rich-edit control.
5383 if (THEME_CONTROL_TYPE_RICHEDIT == pThemeControl->type)
5384 {
5385 switch (msgFilter->msg)
5386 {
5387 case WM_KEYDOWN:
5388 if (VK_TAB == msgFilter->wParam)
5389 {
5390 BOOL fShift = 0x8000 & ::GetKeyState(VK_SHIFT);
5391 HWND hwndFocus = ::GetNextDlgTabItem(pTheme->hwndParent, pThemeControl->hWnd, fShift);
5392 ::SetFocus(hwndFocus);
5393
5394 fProcessed = TRUE;
5395 }
5396 break;
5323 } 5397 }
5398 }
5399
5400 return fProcessed;
5401}
5324 5402
5325 case WM_SETCURSOR: 5403static BOOL OnWmCommand(
5326 ::SetCursor(vhCursorHand); 5404 __in THEME* pTheme,
5405 __in WPARAM wParam,
5406 __in const THEME_CONTROL* pThemeControl,
5407 __inout LRESULT* plResult
5408 )
5409{
5410 BOOL fProcessed = FALSE;
5411 THEME_CONTROLWMCOMMAND_ARGS args = { };
5412 THEME_CONTROLWMCOMMAND_RESULTS results = { };
5413
5414 args.cbSize = sizeof(args);
5415 args.wParam = wParam;
5416 args.pThemeControl = pThemeControl;
5417
5418 results.cbSize = sizeof(results);
5419 results.lResult = *plResult;
5420
5421 if (::SendMessageW(pTheme->hwndParent, WM_THMUTIL_CONTROL_WM_COMMAND, reinterpret_cast<WPARAM>(&args), reinterpret_cast<LPARAM>(&results)))
5422 {
5423 fProcessed = TRUE;
5424 *plResult = results.lResult;
5425 ExitFunction();
5426 }
5427
5428 switch (HIWORD(wParam))
5429 {
5430 case BN_CLICKED:
5431 if (OnButtonClicked(pTheme, pThemeControl))
5432 {
5433 fProcessed = TRUE;
5434 *plResult = 0;
5435 ExitFunction();
5436 }
5327 break; 5437 break;
5328 } 5438 }
5329 5439
5330LExit: 5440LExit:
5331 ReleaseStr(sczLink); 5441 return fProcessed;
5332
5333 return hr;
5334} 5442}
5335 5443
5336static BOOL ControlIsType( 5444static BOOL OnWmNotify(
5337 __in const THEME* pTheme, 5445 __in THEME* pTheme,
5338 __in DWORD dwControl, 5446 __in LPNMHDR lParam,
5339 __in const THEME_CONTROL_TYPE type 5447 __in const THEME_CONTROL* pThemeControl,
5448 __inout LRESULT* plResult
5340 ) 5449 )
5341{ 5450{
5342 BOOL fIsType = FALSE; 5451 BOOL fProcessed = FALSE;
5343 HWND hWnd = ::GetDlgItem(pTheme->hwndParent, dwControl); 5452 THEME_CONTROLWMNOTIFY_ARGS args = { };
5344 if (hWnd) 5453 THEME_CONTROLWMNOTIFY_RESULTS results = { };
5454
5455 args.cbSize = sizeof(args);
5456 args.lParam = lParam;
5457 args.pThemeControl = pThemeControl;
5458
5459 results.cbSize = sizeof(results);
5460 results.lResult = *plResult;
5461
5462 if (::SendMessageW(pTheme->hwndParent, WM_THMUTIL_CONTROL_WM_NOTIFY, reinterpret_cast<WPARAM>(&args), reinterpret_cast<LPARAM>(&results)))
5345 { 5463 {
5346 const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, hWnd); 5464 fProcessed = TRUE;
5347 fIsType = (pControl && type == pControl->type); 5465 *plResult = results.lResult;
5466 ExitFunction();
5348 } 5467 }
5349 5468
5350 return fIsType; 5469 switch (lParam->code)
5470 {
5471 case EN_MSGFILTER:
5472 if (OnNotifyEnMsgFilter(pTheme, pThemeControl, reinterpret_cast<MSGFILTER*>(lParam)))
5473 {
5474 fProcessed = TRUE;
5475 *plResult = 1;
5476 ExitFunction();
5477 }
5478 break;
5479
5480 case EN_LINK:
5481 if (OnNotifyEnLink(pTheme, pThemeControl, reinterpret_cast<ENLINK*>(lParam)))
5482 {
5483 fProcessed = TRUE;
5484 *plResult = 1;
5485 ExitFunction();
5486 }
5487
5488 case NM_CLICK: __fallthrough;
5489 case NM_RETURN:
5490 switch (pThemeControl->type)
5491 {
5492 case THEME_CONTROL_TYPE_HYPERTEXT:
5493 // Clicks on a hypertext/syslink control.
5494 if (OnHypertextClicked(pTheme, pThemeControl, reinterpret_cast<PNMLINK>(lParam)))
5495 {
5496 fProcessed = TRUE;
5497 *plResult = 1;
5498 ExitFunction();
5499 }
5500 }
5501 }
5502
5503LExit:
5504 return fProcessed;
5351} 5505}
5352 5506
5353static const THEME_CONTROL* FindControlFromHWnd( 5507static const THEME_CONTROL* FindControlFromHWnd(
@@ -5780,6 +5934,9 @@ static LRESULT CALLBACK ControlGroupDefWindowProc(
5780 __in LPARAM lParam 5934 __in LPARAM lParam
5781 ) 5935 )
5782{ 5936{
5937 LRESULT lres = 0;
5938 const THEME_CONTROL* pThemeControl = NULL;
5939
5783 if (pTheme) 5940 if (pTheme)
5784 { 5941 {
5785 switch (uMsg) 5942 switch (uMsg)
@@ -5827,55 +5984,22 @@ static LRESULT CALLBACK ControlGroupDefWindowProc(
5827 if (lParam) 5984 if (lParam)
5828 { 5985 {
5829 LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam); 5986 LPNMHDR pnmhdr = reinterpret_cast<LPNMHDR>(lParam);
5830 switch (pnmhdr->code) 5987 pThemeControl = FindControlFromHWnd(pTheme, pnmhdr->hwndFrom);
5988 if (pThemeControl && OnWmNotify(pTheme, pnmhdr, pThemeControl, &lres))
5831 { 5989 {
5832 // Tab/Shift+Tab support for rich-edit control. 5990 return lres;
5833 case EN_MSGFILTER:
5834 {
5835 MSGFILTER* msgFilter = reinterpret_cast<MSGFILTER*>(lParam);
5836 if (WM_KEYDOWN == msgFilter->msg && VK_TAB == msgFilter->wParam)
5837 {
5838 BOOL fShift = 0x8000 & ::GetKeyState(VK_SHIFT);
5839 HWND hwndFocus = ::GetNextDlgTabItem(hWnd, msgFilter->nmhdr.hwndFrom, fShift);
5840 ::SetFocus(hwndFocus);
5841 return 1;
5842 }
5843 break;
5844 }
5845
5846 // Hyperlink clicks from rich-edit control.
5847 case EN_LINK:
5848 return SUCCEEDED(OnRichEditEnLink(lParam, pnmhdr->hwndFrom, hWnd));
5849
5850 // Clicks on a hypertext/syslink control.
5851 case NM_CLICK: __fallthrough;
5852 case NM_RETURN:
5853 if (ControlIsType(pTheme, static_cast<DWORD>(pnmhdr->idFrom), THEME_CONTROL_TYPE_HYPERTEXT))
5854 {
5855 PNMLINK pnmlink = reinterpret_cast<PNMLINK>(lParam);
5856 LITEM litem = pnmlink->item;
5857 ShelExec(litem.szUrl, NULL, L"open", NULL, SW_SHOWDEFAULT, hWnd, NULL);
5858 return 1;
5859 }
5860
5861 return 0;
5862 } 5991 }
5863 } 5992 }
5864 break; 5993 break;
5865 5994
5866 case WM_COMMAND: 5995 case WM_COMMAND:
5867 switch (HIWORD(wParam)) 5996 if (lParam)
5868 { 5997 {
5869 case BN_CLICKED: 5998 pThemeControl = FindControlFromHWnd(pTheme, (HWND)lParam);
5870 if (lParam) 5999 if (pThemeControl && OnWmCommand(pTheme, wParam, pThemeControl, &lres))
5871 { 6000 {
5872 const THEME_CONTROL* pControl = FindControlFromHWnd(pTheme, (HWND)lParam); 6001 return lres;
5873 if (pControl && OnButtonClicked(pTheme, hWnd, pControl))
5874 {
5875 return 0;
5876 }
5877 } 6002 }
5878 break;
5879 } 6003 }
5880 break; 6004 break;
5881 } 6005 }
diff --git a/src/samples/thmviewer/thmviewer.cpp b/src/samples/thmviewer/thmviewer.cpp
index cffa3851..e593d6ad 100644
--- a/src/samples/thmviewer/thmviewer.cpp
+++ b/src/samples/thmviewer/thmviewer.cpp
@@ -52,6 +52,10 @@ static BOOL OnThemeLoadingControl(
52 __in const THEME_LOADINGCONTROL_ARGS* pArgs, 52 __in const THEME_LOADINGCONTROL_ARGS* pArgs,
53 __in THEME_LOADINGCONTROL_RESULTS* pResults 53 __in THEME_LOADINGCONTROL_RESULTS* pResults
54 ); 54 );
55static BOOL OnThemeControlWmNotify(
56 __in const THEME_CONTROLWMNOTIFY_ARGS* pArgs,
57 __in THEME_CONTROLWMNOTIFY_RESULTS* pResults
58 );
55static void CALLBACK ThmviewerTraceError( 59static void CALLBACK ThmviewerTraceError(
56 __in_z LPCSTR szFile, 60 __in_z LPCSTR szFile,
57 __in int iLine, 61 __in int iLine,
@@ -377,32 +381,11 @@ static LRESULT CALLBACK MainWndProc(
377 ::PostQuitMessage(0); 381 ::PostQuitMessage(0);
378 break; 382 break;
379 383
380 case WM_NOTIFY:
381 {
382 NMHDR* pnmhdr = reinterpret_cast<NMHDR*>(lParam);
383 switch (pnmhdr->code)
384 {
385 case TVN_SELCHANGEDW:
386 {
387 NMTREEVIEWW* ptv = reinterpret_cast<NMTREEVIEWW*>(lParam);
388 ::PostThreadMessageW(vdwDisplayThreadId, WM_THMVWR_SHOWPAGE, SW_HIDE, ptv->itemOld.lParam);
389 ::PostThreadMessageW(vdwDisplayThreadId, WM_THMVWR_SHOWPAGE, SW_SHOW, ptv->itemNew.lParam);
390 }
391 break;
392
393 //case NM_DBLCLK:
394 // TVITEM item = { };
395 // item.mask = TVIF_PARAM;
396 // item.hItem = TreeView_GetSelection(pnmhdr->hwndFrom);
397 // TreeView_GetItem(pnmhdr->hwndFrom, &item);
398 // ::PostThreadMessageW(vdwDisplayThreadId, WM_THMVWR_SHOWPAGE, SW_SHOW, item.lParam);
399 // return 1;
400 }
401 }
402 break;
403
404 case WM_THMUTIL_LOADING_CONTROL: 384 case WM_THMUTIL_LOADING_CONTROL:
405 return OnThemeLoadingControl(reinterpret_cast<THEME_LOADINGCONTROL_ARGS*>(wParam), reinterpret_cast<THEME_LOADINGCONTROL_RESULTS*>(lParam)); 385 return OnThemeLoadingControl(reinterpret_cast<THEME_LOADINGCONTROL_ARGS*>(wParam), reinterpret_cast<THEME_LOADINGCONTROL_RESULTS*>(lParam));
386
387 case WM_THMUTIL_CONTROL_WM_NOTIFY:
388 return OnThemeControlWmNotify(reinterpret_cast<THEME_CONTROLWMNOTIFY_ARGS*>(wParam), reinterpret_cast<THEME_CONTROLWMNOTIFY_RESULTS*>(lParam));
406 } 389 }
407 390
408 return ThemeDefWindowProc(vpTheme, hWnd, uMsg, wParam, lParam); 391 return ThemeDefWindowProc(vpTheme, hWnd, uMsg, wParam, lParam);
@@ -558,3 +541,29 @@ static BOOL OnThemeLoadingControl(
558 pResults->hr = S_OK; 541 pResults->hr = S_OK;
559 return TRUE; 542 return TRUE;
560} 543}
544
545static BOOL OnThemeControlWmNotify(
546 __in const THEME_CONTROLWMNOTIFY_ARGS* pArgs,
547 __in THEME_CONTROLWMNOTIFY_RESULTS* /*pResults*/
548 )
549{
550 BOOL fProcessed = FALSE;
551
552 switch (pArgs->lParam->code)
553 {
554 case TVN_SELCHANGEDW:
555 switch (pArgs->pThemeControl->wId)
556 {
557 case THMVWR_CONTROL_TREE:
558 NMTREEVIEWW* ptv = reinterpret_cast<NMTREEVIEWW*>(pArgs->lParam);
559 ::PostThreadMessageW(vdwDisplayThreadId, WM_THMVWR_SHOWPAGE, SW_HIDE, ptv->itemOld.lParam);
560 ::PostThreadMessageW(vdwDisplayThreadId, WM_THMVWR_SHOWPAGE, SW_SHOW, ptv->itemNew.lParam);
561
562 fProcessed = TRUE;
563 break;
564 }
565 break;
566 }
567
568 return fProcessed;
569}
diff --git a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp
index b35b4e02..a5bcba3e 100644
--- a/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp
+++ b/src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp
@@ -43,62 +43,48 @@ static void CALLBACK BafThmUtilTestingTraceError(
43class CBafThmUtilTesting : public CBalBaseBAFunctions 43class CBafThmUtilTesting : public CBalBaseBAFunctions
44{ 44{
45public: // IBAFunctions 45public: // IBAFunctions
46 /*virtual STDMETHODIMP OnThemeLoaded( 46 virtual STDMETHODIMP OnThemeControlLoading(
47 THEME* pTheme, 47 __in LPCWSTR wzName,
48 WIX_LOCALIZATION* pWixLoc 48 __inout BOOL* pfProcessed,
49 __inout WORD* pwId
49 ) 50 )
50 { 51 {
51 HRESULT hr = S_OK; 52 if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzName, -1, L"InstallTestButton", -1))
52 53 {
53 hr = __super::OnThemeLoaded(pTheme, pWixLoc); 54 *pfProcessed = TRUE;
55 *pwId = BAF_CONTROL_INSTALL_TEST_BUTTON;
56 }
54 57
55 return hr; 58 return S_OK;
56 }*/ 59 }
57 60
58 virtual STDMETHODIMP WndProc( 61 virtual STDMETHODIMP OnThemeControlWmCommand(
59 __in THEME* pTheme,
60 __in HWND hWnd,
61 __in UINT uMsg,
62 __in WPARAM wParam, 62 __in WPARAM wParam,
63 __in LPARAM lParam, 63 __in LPCWSTR /*wzName*/,
64 __inout LRESULT* plRes 64 __in WORD wId,
65 __in HWND /*hWnd*/,
66 __inout BOOL* pfProcessed,
67 __inout LRESULT* plResult
65 ) 68 )
66 { 69 {
67 switch (uMsg) 70 HRESULT hr = S_OK;
71
72 switch (HIWORD(wParam))
68 { 73 {
69 case WM_COMMAND: 74 case BN_CLICKED:
70 switch (HIWORD(wParam)) 75 switch (wId)
71 { 76 {
72 case BN_CLICKED: 77 case BAF_CONTROL_INSTALL_TEST_BUTTON:
73 switch (LOWORD(wParam)) 78 OnShowTheme();
74 { 79 *pfProcessed = TRUE;
75 case BAF_CONTROL_INSTALL_TEST_BUTTON: 80 *plResult = 0;
76 OnShowTheme();
77 *plRes = 0;
78 return S_OK;
79 }
80
81 break; 81 break;
82 } 82 }
83 break;
84 }
85
86 return __super::WndProc(pTheme, hWnd, uMsg, wParam, lParam, plRes);
87 }
88 83
89 virtual STDMETHODIMP OnThemeControlLoading( 84 break;
90 __in LPCWSTR wzName,
91 __inout BOOL* pfProcessed,
92 __inout WORD* pwId
93 )
94 {
95 if (CSTR_EQUAL == ::CompareStringW(LOCALE_NEUTRAL, 0, wzName, -1, L"InstallTestButton", -1))
96 {
97 *pfProcessed = TRUE;
98 *pwId = BAF_CONTROL_INSTALL_TEST_BUTTON;
99 } 85 }
100 86
101 return S_OK; 87 return hr;
102 } 88 }
103 89
104private: 90private: