https://git.reactos.org/?p=reactos.git;a=commitdiff;h=77c5aea41fcd0ebcaa9783df08785116386e2e3f
commit 77c5aea41fcd0ebcaa9783df08785116386e2e3f Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Thu Jan 4 17:32:43 2024 +0900 Commit: GitHub <nore...@github.com> CommitDate: Thu Jan 4 17:32:43 2024 +0900 [MSCTFIME][SDK] Add <cicero/cicuif.h> (#6291) Supporting TIPs... JIRA issue: CORE-19360 - Add cicGetFN helper function in <cicero/cicbase.h>. - Add <cicero/cicuif.h>. - Add CUIFTheme class in <cicero/cicuif.h>. --- dll/ime/msctfime/msctfime.h | 1 + sdk/include/reactos/cicero/cicbase.h | 14 +++ sdk/include/reactos/cicero/cicuif.h | 214 +++++++++++++++++++++++++++++++++++ 3 files changed, 229 insertions(+) diff --git a/dll/ime/msctfime/msctfime.h b/dll/ime/msctfime/msctfime.h index 4ffbc4195d5..5e677abef8f 100644 --- a/dll/ime/msctfime/msctfime.h +++ b/dll/ime/msctfime/msctfime.h @@ -28,6 +28,7 @@ #include <cicero/cicimc.h> #include <cicero/cictf.h> #include <cicero/ciccaret.h> +#include <cicero/cicuif.h> #include <wine/debug.h> diff --git a/sdk/include/reactos/cicero/cicbase.h b/sdk/include/reactos/cicero/cicbase.h index d1c76a09957..a85be273a99 100644 --- a/sdk/include/reactos/cicero/cicbase.h +++ b/sdk/include/reactos/cicero/cicbase.h @@ -62,6 +62,20 @@ inline void operator delete[](void* ptr, size_t size) noexcept cicMemFree(ptr); } +template <typename T_FN> +static inline BOOL +cicGetFN(HINSTANCE& hinstDLL, T_FN& fn, LPCTSTR pszDllName, LPCSTR pszFuncName) +{ + if (fn) + return TRUE; + if (!hinstDLL) + hinstDLL = LoadLibrary(pszDllName); + if (!hinstDLL) + return FALSE; + fn = reinterpret_cast<T_FN>(GetProcAddress(hinstDLL, pszFuncName)); + return !!fn; +} + typedef struct CIC_LIBTHREAD { IUnknown *m_pUnknown1; diff --git a/sdk/include/reactos/cicero/cicuif.h b/sdk/include/reactos/cicero/cicuif.h new file mode 100644 index 00000000000..55854b57cba --- /dev/null +++ b/sdk/include/reactos/cicero/cicuif.h @@ -0,0 +1,214 @@ +/* + * PROJECT: ReactOS Cicero + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Cicero UI interface + * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> + */ + +#pragma once + +#include "cicbase.h" + +///////////////////////////////////////////////////////////////////////////// + +#include <uxtheme.h> + +// uxtheme.dll +using FN_DrawThemeBackground = decltype(&DrawThemeBackground); +using FN_DrawThemeParentBackground = decltype(&DrawThemeParentBackground); +using FN_DrawThemeText = decltype(&DrawThemeText); +using FN_DrawThemeIcon = decltype(&DrawThemeIcon); +using FN_GetThemeBackgroundExtent = decltype(&GetThemeBackgroundExtent); +using FN_GetThemeBackgroundContentRect = decltype(&GetThemeBackgroundContentRect); +using FN_GetThemeTextExtent = decltype(&GetThemeTextExtent); +using FN_GetThemePartSize = decltype(&GetThemePartSize); +using FN_DrawThemeEdge = decltype(&DrawThemeEdge); +using FN_GetThemeColor = decltype(&GetThemeColor); +using FN_GetThemeMargins = decltype(&GetThemeMargins); +using FN_GetThemeFont = decltype(&GetThemeFont); +using FN_GetThemeSysColor = decltype(&GetThemeSysColor); +using FN_GetThemeSysSize = decltype(&GetThemeSysSize); + +///////////////////////////////////////////////////////////////////////////// + +struct CUIFTheme +{ +protected: + LPCWSTR m_pszClassList; + INT m_iPartId; + DWORD m_dwUnknown2; + HTHEME m_hTheme; + static HINSTANCE s_hUXTHEME; + static FN_DrawThemeBackground s_fnDrawThemeBackground; + static FN_DrawThemeParentBackground s_fnDrawThemeParentBackground; + static FN_DrawThemeText s_fnDrawThemeText; + static FN_DrawThemeIcon s_fnDrawThemeIcon; + static FN_GetThemeBackgroundExtent s_fnGetThemeBackgroundExtent; + static FN_GetThemeBackgroundContentRect s_fnGetThemeBackgroundContentRect; + static FN_GetThemeTextExtent s_fnGetThemeTextExtent; + static FN_GetThemePartSize s_fnGetThemePartSize; + static FN_DrawThemeEdge s_fnDrawThemeEdge; + static FN_GetThemeColor s_fnGetThemeColor; + static FN_GetThemeMargins s_fnGetThemeMargins; + static FN_GetThemeFont s_fnGetThemeFont; + static FN_GetThemeSysColor s_fnGetThemeSysColor; + static FN_GetThemeSysSize s_fnGetThemeSysSize; + +public: + STDMETHOD(DrawThemeBackground)(HDC hDC, int iStateId, LPCRECT pRect, LPCRECT pClipRect); + STDMETHOD(DrawThemeParentBackground)(HWND hwnd, HDC hDC, LPRECT prc); + STDMETHOD(DrawThemeText)(HDC hDC, int iStateId, LPCWSTR pszText, int cchText, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect); + STDMETHOD(DrawThemeIcon)(HDC hDC, int iStateId, LPCRECT pRect, HIMAGELIST himl, int iImageIndex); + STDMETHOD(GetThemeBackgroundExtent)(HDC hDC, int iStateId, LPCRECT pContentRect, LPRECT pExtentRect); + STDMETHOD(GetThemeBackgroundContentRect)(HDC hDC, int iStateId, LPCRECT pBoundingRect, LPRECT pContentRect); + STDMETHOD(GetThemeTextExtent)(HDC hDC, int iStateId, LPCWSTR pszText, int cchCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect); + STDMETHOD(GetThemePartSize)(HDC hDC, int iStateId, LPRECT prc, THEMESIZE eSize, SIZE *psz); + STDMETHOD(DrawThemeEdge)(HDC hDC, int iStateId, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect); + STDMETHOD(GetThemeColor)(int iStateId, int iPropId, COLORREF *pColor); + STDMETHOD(GetThemeMargins)(HDC hDC, int iStateId, int iPropId, LPRECT prc, MARGINS *pMargins); + STDMETHOD(GetThemeFont)(HDC hDC, int iStateId, int iPropId, LOGFONTW *pFont); + STDMETHOD_(COLORREF, GetThemeSysColor)(INT iColorId); + STDMETHOD_(int, GetThemeSysSize)(int iSizeId); + STDMETHOD_(void, SetActiveTheme)(LPCWSTR pszClassList, INT iPartId, DWORD dwUnknown2); +}; + +///////////////////////////////////////////////////////////////////////////// + +// static members +DECLSPEC_SELECTANY HINSTANCE CUIFTheme::s_hUXTHEME = NULL; +DECLSPEC_SELECTANY FN_DrawThemeBackground CUIFTheme::s_fnDrawThemeBackground = NULL; +DECLSPEC_SELECTANY FN_DrawThemeParentBackground CUIFTheme::s_fnDrawThemeParentBackground = NULL; +DECLSPEC_SELECTANY FN_DrawThemeText CUIFTheme::s_fnDrawThemeText = NULL; +DECLSPEC_SELECTANY FN_DrawThemeIcon CUIFTheme::s_fnDrawThemeIcon = NULL; +DECLSPEC_SELECTANY FN_GetThemeBackgroundExtent CUIFTheme::s_fnGetThemeBackgroundExtent = NULL; +DECLSPEC_SELECTANY FN_GetThemeBackgroundContentRect CUIFTheme::s_fnGetThemeBackgroundContentRect = NULL; +DECLSPEC_SELECTANY FN_GetThemeTextExtent CUIFTheme::s_fnGetThemeTextExtent = NULL; +DECLSPEC_SELECTANY FN_GetThemePartSize CUIFTheme::s_fnGetThemePartSize = NULL; +DECLSPEC_SELECTANY FN_DrawThemeEdge CUIFTheme::s_fnDrawThemeEdge = NULL; +DECLSPEC_SELECTANY FN_GetThemeColor CUIFTheme::s_fnGetThemeColor = NULL; +DECLSPEC_SELECTANY FN_GetThemeMargins CUIFTheme::s_fnGetThemeMargins = NULL; +DECLSPEC_SELECTANY FN_GetThemeFont CUIFTheme::s_fnGetThemeFont = NULL; +DECLSPEC_SELECTANY FN_GetThemeSysColor CUIFTheme::s_fnGetThemeSysColor = NULL; +DECLSPEC_SELECTANY FN_GetThemeSysSize CUIFTheme::s_fnGetThemeSysSize = NULL; + +///////////////////////////////////////////////////////////////////////////// + +inline STDMETHODIMP +CUIFTheme::DrawThemeBackground(HDC hDC, int iStateId, LPCRECT pRect, LPCRECT pClipRect) +{ + if (!cicGetFN(s_hUXTHEME, s_fnDrawThemeBackground, TEXT("uxtheme.dll"), "DrawThemeBackground")) + return E_FAIL; + return s_fnDrawThemeBackground(m_hTheme, hDC, m_iPartId, iStateId, pRect, pClipRect); +} + +inline STDMETHODIMP +CUIFTheme::DrawThemeParentBackground(HWND hwnd, HDC hDC, LPRECT prc) +{ + if (!cicGetFN(s_hUXTHEME, s_fnDrawThemeParentBackground, TEXT("uxtheme.dll"), "DrawThemeParentBackground")) + return E_FAIL; + return s_fnDrawThemeParentBackground(hwnd, hDC, prc); +} + +inline STDMETHODIMP +CUIFTheme::DrawThemeText(HDC hDC, int iStateId, LPCWSTR pszText, int cchText, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect) +{ + if (!cicGetFN(s_hUXTHEME, s_fnDrawThemeText, TEXT("uxtheme.dll"), "DrawThemeText")) + return E_FAIL; + return s_fnDrawThemeText(m_hTheme, hDC, m_iPartId, iStateId, pszText, cchText, dwTextFlags, dwTextFlags2, pRect); +} + +inline STDMETHODIMP +CUIFTheme::DrawThemeIcon(HDC hDC, int iStateId, LPCRECT pRect, HIMAGELIST himl, int iImageIndex) +{ + if (!cicGetFN(s_hUXTHEME, s_fnDrawThemeIcon, TEXT("uxtheme.dll"), "DrawThemeIcon")) + return E_FAIL; + return s_fnDrawThemeIcon(m_hTheme, hDC, m_iPartId, iStateId, pRect, himl, iImageIndex); +} + +inline STDMETHODIMP +CUIFTheme::GetThemeBackgroundExtent(HDC hDC, int iStateId, LPCRECT pContentRect, LPRECT pExtentRect) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeBackgroundExtent, TEXT("uxtheme.dll"), "GetThemeBackgroundExtent")) + return E_FAIL; + return s_fnGetThemeBackgroundExtent(m_hTheme, hDC, m_iPartId, iStateId, pContentRect, pExtentRect); +} + +inline STDMETHODIMP +CUIFTheme::GetThemeBackgroundContentRect(HDC hDC, int iStateId, LPCRECT pBoundingRect, LPRECT pContentRect) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeBackgroundContentRect, TEXT("uxtheme.dll"), "GetThemeBackgroundContentRect")) + return E_FAIL; + return s_fnGetThemeBackgroundContentRect(m_hTheme, hDC, m_iPartId, iStateId, pBoundingRect, pContentRect); +} + +inline STDMETHODIMP +CUIFTheme::GetThemeTextExtent(HDC hDC, int iStateId, LPCWSTR pszText, int cchCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeTextExtent, TEXT("uxtheme.dll"), "GetThemeTextExtent")) + return E_FAIL; + return s_fnGetThemeTextExtent(m_hTheme, hDC, m_iPartId, iStateId, pszText, cchCharCount, dwTextFlags, pBoundingRect, pExtentRect); +} + +inline STDMETHODIMP +CUIFTheme::GetThemePartSize(HDC hDC, int iStateId, LPRECT prc, THEMESIZE eSize, SIZE *psz) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemePartSize, TEXT("uxtheme.dll"), "GetThemePartSize")) + return E_FAIL; + return s_fnGetThemePartSize(m_hTheme, hDC, m_iPartId, iStateId, prc, eSize, psz); +} + +inline STDMETHODIMP +CUIFTheme::DrawThemeEdge(HDC hDC, int iStateId, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect) +{ + if (!cicGetFN(s_hUXTHEME, s_fnDrawThemeEdge, TEXT("uxtheme.dll"), "DrawThemeEdge")) + return E_FAIL; + return s_fnDrawThemeEdge(m_hTheme, hDC, m_iPartId, iStateId, pDestRect, uEdge, uFlags, pContentRect); +} + +inline STDMETHODIMP +CUIFTheme::GetThemeColor(int iStateId, int iPropId, COLORREF *pColor) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeColor, TEXT("uxtheme.dll"), "GetThemeColor")) + return E_FAIL; + return s_fnGetThemeColor(m_hTheme, m_iPartId, iStateId, iPropId, pColor); +} + +inline STDMETHODIMP +CUIFTheme::GetThemeMargins(HDC hDC, int iStateId, int iPropId, LPRECT prc, MARGINS *pMargins) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeMargins, TEXT("uxtheme.dll"), "GetThemeMargins")) + return E_FAIL; + return s_fnGetThemeMargins(m_hTheme, hDC, m_iPartId, iStateId, iPropId, prc, pMargins); +} + +inline STDMETHODIMP +CUIFTheme::GetThemeFont(HDC hDC, int iStateId, int iPropId, LOGFONTW *pFont) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeFont, TEXT("uxtheme.dll"), "GetThemeFont")) + return E_FAIL; + return s_fnGetThemeFont(m_hTheme, hDC, m_iPartId, iStateId, iPropId, pFont); +} + +inline STDMETHODIMP_(COLORREF) +CUIFTheme::GetThemeSysColor(INT iColorId) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeSysColor, TEXT("uxtheme.dll"), "GetThemeSysColor")) + return RGB(0, 0, 0); + return s_fnGetThemeSysColor(m_hTheme, iColorId); +} + +inline STDMETHODIMP_(int) +CUIFTheme::GetThemeSysSize(int iSizeId) +{ + if (!cicGetFN(s_hUXTHEME, s_fnGetThemeSysSize, TEXT("uxtheme.dll"), "GetThemeSysSize")) + return 0; + return s_fnGetThemeSysSize(m_hTheme, iSizeId); +} + +inline STDMETHODIMP_(void) +CUIFTheme::SetActiveTheme(LPCWSTR pszClassList, INT iPartId, DWORD dwUnknown2) +{ + m_iPartId = iPartId; + m_dwUnknown2 = dwUnknown2; + m_pszClassList = pszClassList; +}