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;
+}

Reply via email to