https://git.reactos.org/?p=reactos.git;a=commitdiff;h=77c5aea41fcd0ebcaa978…
commit 77c5aea41fcd0ebcaa9783df08785116386e2e3f
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Thu Jan 4 17:32:43 2024 +0900
Commit: GitHub <noreply(a)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.mz(a)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;
+}