diff options
author | Sean Hall <r.sean.hall@gmail.com> | 2021-10-27 14:42:32 -0500 |
---|---|---|
committer | Sean Hall <r.sean.hall@gmail.com> | 2021-11-01 16:34:09 -0500 |
commit | bad2e93524f376cfeb76d5231d4b08510bdad033 (patch) | |
tree | b201ec4b1495a0af4805ea6b0bc4fce9f8bde7b7 /src | |
parent | 8fa040da9d0d3826f5ffda6bcbec4f53abd97452 (diff) | |
download | wix-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.h | 34 | ||||
-rw-r--r-- | src/api/burn/balutil/inc/BalBaseBAFunctions.h | 24 | ||||
-rw-r--r-- | src/api/burn/balutil/inc/BalBaseBAFunctionsProc.h | 24 | ||||
-rw-r--r-- | src/api/burn/balutil/inc/IBAFunctions.h | 22 | ||||
-rw-r--r-- | src/ext/Bal/wixstdba/WixStandardBootstrapperApplication.cpp | 210 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/inc/thmutil.h | 34 | ||||
-rw-r--r-- | src/libs/dutil/WixToolset.DUtil/thmutil.cpp | 302 | ||||
-rw-r--r-- | src/samples/thmviewer/thmviewer.cpp | 57 | ||||
-rw-r--r-- | src/test/burn/TestData/Manual/BafThmutilTesting/BafThmUtilTesting.cpp | 70 |
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 | ||
91 | typedef HRESULT(WINAPI *PFN_BA_FUNCTIONS_PROC)( | 93 | typedef 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 | ||
131 | struct BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_ARGS | ||
132 | { | ||
133 | DWORD cbSize; | ||
134 | WPARAM wParam; | ||
135 | LPCWSTR wzName; | ||
136 | WORD wId; | ||
137 | HWND hWnd; | ||
138 | }; | ||
139 | |||
140 | struct BA_FUNCTIONS_ONTHEMECONTROLWMCOMMAND_RESULTS | ||
141 | { | ||
142 | DWORD cbSize; | ||
143 | BOOL fProcessed; | ||
144 | LRESULT lResult; | ||
145 | }; | ||
146 | |||
147 | struct BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_ARGS | ||
148 | { | ||
149 | DWORD cbSize; | ||
150 | LPNMHDR lParam; | ||
151 | LPCWSTR wzName; | ||
152 | WORD wId; | ||
153 | HWND hWnd; | ||
154 | }; | ||
155 | |||
156 | struct BA_FUNCTIONS_ONTHEMECONTROLWMNOTIFY_RESULTS | ||
157 | { | ||
158 | DWORD cbSize; | ||
159 | BOOL fProcessed; | ||
160 | LRESULT lResult; | ||
161 | }; | ||
162 | |||
129 | struct BA_FUNCTIONS_ONTHEMELOADED_ARGS | 163 | struct 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 | |||
853 | protected: | 877 | protected: |
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 | ||
36 | static 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 | |||
45 | static 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 | /******************************************************************* |
37 | BalBaseBAFunctionsProc - requires pvContext to be of type IBAFunctions. | 55 | BalBaseBAFunctionsProc - requires pvContext to be of type IBAFunctions. |
38 | Provides a default mapping between the message based BAFunctions interface and | 56 | Provides 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 | |||
3701 | LExit: | ||
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 | |||
3759 | LExit: | ||
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 | ||
108 | struct THEME_COLUMN | 116 | struct THEME_COLUMN |
@@ -397,6 +405,32 @@ struct THEME | |||
397 | LPVOID pvVariableContext; | 405 | LPVOID pvVariableContext; |
398 | }; | 406 | }; |
399 | 407 | ||
408 | typedef struct _THEME_CONTROLWMCOMMAND_ARGS | ||
409 | { | ||
410 | DWORD cbSize; | ||
411 | WPARAM wParam; | ||
412 | const THEME_CONTROL* pThemeControl; | ||
413 | } THEME_CONTROLWMCOMMAND_ARGS; | ||
414 | |||
415 | typedef struct _THEME_CONTROLWMCOMMAND_RESULTS | ||
416 | { | ||
417 | DWORD cbSize; | ||
418 | LRESULT lResult; | ||
419 | } THEME_CONTROLWMCOMMAND_RESULTS; | ||
420 | |||
421 | typedef struct _THEME_CONTROLWMNOTIFY_ARGS | ||
422 | { | ||
423 | DWORD cbSize; | ||
424 | LPNMHDR lParam; | ||
425 | const THEME_CONTROL* pThemeControl; | ||
426 | } THEME_CONTROLWMNOTIFY_ARGS; | ||
427 | |||
428 | typedef struct _THEME_CONTROLWMNOTIFY_RESULTS | ||
429 | { | ||
430 | DWORD cbSize; | ||
431 | LRESULT lResult; | ||
432 | } THEME_CONTROLWMNOTIFY_RESULTS; | ||
433 | |||
400 | typedef struct _THEME_LOADINGCONTROL_ARGS | 434 | typedef 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 | ); |
422 | static void OnBrowseDirectory( | 422 | static 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 | ); |
427 | static BOOL OnButtonClicked( | 426 | static 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 | ); |
432 | static BOOL OnDpiChanged( | 430 | static 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 | ); |
435 | static BOOL OnHypertextClicked( | ||
436 | __in THEME* pTheme, | ||
437 | __in const THEME_CONTROL* pThemeControl, | ||
438 | __in PNMLINK pnmlink | ||
439 | ); | ||
437 | static void OnNcCreate( | 440 | static 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 | ); |
442 | static HRESULT OnRichEditEnLink( | 445 | static 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 | ); |
447 | static BOOL ControlIsType( | 450 | static 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 | ); | ||
455 | static BOOL OnWmCommand( | ||
456 | __in THEME* pTheme, | ||
457 | __in WPARAM wParam, | ||
458 | __in const THEME_CONTROL* pThemeControl, | ||
459 | __inout LRESULT* plResult | ||
460 | ); | ||
461 | static BOOL OnWmNotify( | ||
462 | __in THEME* pTheme, | ||
463 | __in LPNMHDR lParam, | ||
464 | __in const THEME_CONTROL* pThemeControl, | ||
465 | __inout LRESULT* plResult | ||
451 | ); | 466 | ); |
452 | static const THEME_CONTROL* FindControlFromHWnd( | 467 | static const THEME_CONTROL* FindControlFromHWnd( |
453 | __in const THEME* pTheme, | 468 | __in const THEME* pTheme, |
@@ -5089,7 +5104,6 @@ static void CALLBACK OnBillboardTimer( | |||
5089 | 5104 | ||
5090 | static void OnBrowseDirectory( | 5105 | static 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 | ||
5149 | static BOOL OnButtonClicked( | 5163 | static 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 | ||
5288 | static 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 | |||
5303 | LExit: | ||
5304 | return fProcessed; | ||
5305 | } | ||
5306 | |||
5275 | static void OnNcCreate( | 5307 | static 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 | ||
5294 | static HRESULT OnRichEditEnLink( | 5326 | static 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 | |
5368 | LExit: | ||
5369 | ReleaseStr(sczLink); | ||
5370 | |||
5371 | return fProcessed; | ||
5372 | } | ||
5373 | |||
5374 | static 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: | 5403 | static 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 | ||
5330 | LExit: | 5440 | LExit: |
5331 | ReleaseStr(sczLink); | 5441 | return fProcessed; |
5332 | |||
5333 | return hr; | ||
5334 | } | 5442 | } |
5335 | 5443 | ||
5336 | static BOOL ControlIsType( | 5444 | static 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 | |||
5503 | LExit: | ||
5504 | return fProcessed; | ||
5351 | } | 5505 | } |
5352 | 5506 | ||
5353 | static const THEME_CONTROL* FindControlFromHWnd( | 5507 | static 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 | ); |
55 | static BOOL OnThemeControlWmNotify( | ||
56 | __in const THEME_CONTROLWMNOTIFY_ARGS* pArgs, | ||
57 | __in THEME_CONTROLWMNOTIFY_RESULTS* pResults | ||
58 | ); | ||
55 | static void CALLBACK ThmviewerTraceError( | 59 | static 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 | |||
545 | static 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( | |||
43 | class CBafThmUtilTesting : public CBalBaseBAFunctions | 43 | class CBafThmUtilTesting : public CBalBaseBAFunctions |
44 | { | 44 | { |
45 | public: // IBAFunctions | 45 | public: // 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 | ||
104 | private: | 90 | private: |