https://git.reactos.org/?p=reactos.git;a=commitdiff;h=6cde331a8966845662b673819dc3e11411742489

commit 6cde331a8966845662b673819dc3e11411742489
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Wed Jan 3 13:52:54 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Wed Jan 3 13:52:54 2024 +0900

    [MSCTFIME] Half-implement UIWndProc (#6285)
    
    Supporting TIPs...
    JIRA issue: CORE-19360
    - Add UIComposition and UI classes.
    - Add CIMEUIWindowHandler structure.
    - Half-implement UIWndProc by using them.
---
 dll/ime/msctfime/msctfime.cpp | 343 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 335 insertions(+), 8 deletions(-)

diff --git a/dll/ime/msctfime/msctfime.cpp b/dll/ime/msctfime/msctfime.cpp
index e1c2fd9cd62..319c7de72b6 100644
--- a/dll/ime/msctfime/msctfime.cpp
+++ b/dll/ime/msctfime/msctfime.cpp
@@ -3486,9 +3486,341 @@ CtfImeThreadDetach(VOID)
     return S_OK;
 }
 
+/***********************************************************************
+ *      UIComposition
+ */
+struct UIComposition
+{
+    void OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd);
+    void OnImeCompositionUpdate(CicIMCLock& imcLock);
+    void OnImeEndComposition();
+    void OnImeSetContext(CicIMCLock& imcLock, HWND hUIWnd, WPARAM wParam, 
LPARAM lParam);
+    void OnPaintTheme(WPARAM wParam);
+    void OnDestroy();
+
+    static LRESULT CALLBACK CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, 
LPARAM lParam);
+};
+
+/**
+ * @unimplemented
+ */
+void UIComposition::OnImeStartComposition(CicIMCLock& imcLock, HWND hUIWnd)
+{
+    //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+void UIComposition::OnImeCompositionUpdate(CicIMCLock& imcLock)
+{
+    //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+void UIComposition::OnImeEndComposition()
+{
+    //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+void UIComposition::OnImeSetContext(CicIMCLock& imcLock, HWND hUIWnd, WPARAM 
wParam, LPARAM lParam)
+{
+    //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+void UIComposition::OnPaintTheme(WPARAM wParam)
+{
+    //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+void UIComposition::OnDestroy()
+{
+    //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+LRESULT CALLBACK
+UIComposition::CompWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+    if (uMsg == WM_CREATE)
+        return -1; // FIXME
+    return 0;
+}
+
+/***********************************************************************
+ *      UI
+ */
+struct UI
+{
+    HWND m_hWnd;
+    UIComposition *m_pComp;
+
+    UI(HWND hWnd);
+    virtual ~UI();
+
+    HRESULT _Create();
+    void _Destroy();
+
+    static void OnCreate(HWND hWnd);
+    static void OnDestroy(HWND hWnd);
+    void OnImeSetContext(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam);
+};
+
+// For GetWindowLongPtr/SetWindowLongPtr
+#define UIGWLP_HIMC 0
+#define UIGWLP_UI   sizeof(HIMC)
+#define UIGWLP_SIZE (UIGWLP_UI + sizeof(UI*))
+
+/**
+ * @implemented
+ */
+UI::UI(HWND hWnd) : m_hWnd(hWnd)
+{
+}
+
+/**
+ * @implemented
+ */
+UI::~UI()
+{
+    delete m_pComp;
+}
+
+/**
+ * @unimplemented
+ */
+HRESULT UI::_Create()
+{
+    m_pComp = new UIComposition();
+    if (!m_pComp)
+        return E_OUTOFMEMORY;
+
+    SetWindowLongPtrW(m_hWnd, UIGWLP_UI, (LONG_PTR)this);
+    //FIXME
+    return S_OK;
+}
+
+/**
+ * @implemented
+ */
+void UI::_Destroy()
+{
+    m_pComp->OnDestroy();
+    SetWindowLongPtrW(m_hWnd, UIGWLP_UI, 0);
+}
+
+/**
+ * @implemented
+ */
+void UI::OnCreate(HWND hWnd)
+{
+    UI *pUI = (UI*)GetWindowLongPtrW(hWnd, UIGWLP_UI);
+    if (pUI)
+        return;
+    pUI = new UI(hWnd);
+    if (pUI)
+        pUI->_Create();
+}
+
+/**
+ * @implemented
+ */
+void UI::OnDestroy(HWND hWnd)
+{
+    UI *pUI = (UI*)GetWindowLongPtrW(hWnd, UIGWLP_UI);
+    if (!pUI)
+        return;
+
+    pUI->_Destroy();
+    delete pUI;
+}
+
+/**
+ * @implemented
+ */
+void UI::OnImeSetContext(CicIMCLock& imcLock, WPARAM wParam, LPARAM lParam)
+{
+    m_pComp->OnImeSetContext(imcLock, m_hWnd, wParam, lParam);
+}
+
+/***********************************************************************
+ *      CIMEUIWindowHandler
+ */
+
+struct CIMEUIWindowHandler
+{
+    static LRESULT CALLBACK ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam);
+    static LRESULT CALLBACK ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, 
LPARAM lParam);
+    static LRESULT CALLBACK ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM 
wParam, LPARAM lParam);
+    static LRESULT CALLBACK ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM 
wParam, LPARAM lParam);
+    static LRESULT CALLBACK ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM 
wParam, LPARAM lParam);
+};
+
+/**
+ * @unimplemented
+ */
+LRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIMsImeMouseHandler(HWND hWnd, WPARAM wParam, LPARAM 
lParam)
+{
+    return 0; //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+LRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIMsImeModeBiasHandler(HWND hWnd, WPARAM wParam, 
LPARAM lParam)
+{
+    return 0; //FIXME
+}
+
+/**
+ * @unimplemented
+ */
+LRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIMsImeReconvertRequest(HWND hWnd, WPARAM wParam, 
LPARAM lParam)
+{
+    return 0; //FIXME
+}
+
+/**
+ * @implemented
+ */
+LRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIMsImeHandler(HWND hWnd, UINT uMsg, WPARAM wParam, 
LPARAM lParam)
+{
+    if (uMsg == WM_MSIME_MOUSE)
+        return ImeUIMsImeMouseHandler(hWnd, wParam, lParam);
+    if (uMsg == WM_MSIME_MODEBIAS)
+        return ImeUIMsImeModeBiasHandler(hWnd, wParam, lParam);
+    if (uMsg == WM_MSIME_RECONVERTREQUEST)
+        return ImeUIMsImeReconvertRequest(hWnd, wParam, lParam);
+    if (uMsg == WM_MSIME_SERVICE)
+    {
+        TLS *pTLS = TLS::GetTLS();
+        if (pTLS && pTLS->m_pProfile)
+        {
+            LANGID LangID;
+            pTLS->m_pProfile->GetLangId(&LangID);
+            if (PRIMARYLANGID(LangID) == LANG_KOREAN)
+                return FALSE;
+        }
+        return TRUE;
+    }
+    return 0;
+}
+
 /**
  * @unimplemented
  */
+LRESULT CALLBACK
+CIMEUIWindowHandler::ImeUIWndProcWorker(HWND hWnd, UINT uMsg, WPARAM wParam, 
LPARAM lParam)
+{
+    TLS *pTLS = TLS::GetTLS();
+    if (pTLS && (pTLS->m_dwSystemInfoFlags & IME_SYSINFO_WINLOGON))
+    {
+        if (uMsg == WM_CREATE)
+            return -1;
+        return DefWindowProcW(hWnd, uMsg, wParam, lParam);
+    }
+
+    switch (uMsg)
+    {
+        case WM_CREATE:
+        {
+            UI::OnCreate(hWnd);
+            break;
+        }
+        case WM_DESTROY:
+        case WM_ENDSESSION:
+        {
+            UI::OnDestroy(hWnd);
+            break;
+        }
+        case WM_IME_STARTCOMPOSITION:
+        case WM_IME_COMPOSITION:
+        case WM_IME_ENDCOMPOSITION:
+        case WM_IME_SETCONTEXT:
+        case WM_IME_NOTIFY:
+        case WM_IME_SELECT:
+        case WM_TIMER:
+        {
+            HIMC hIMC = (HIMC)GetWindowLongPtrW(hWnd, UIGWLP_HIMC);
+            UI* pUI = (UI*)GetWindowLongPtrW(hWnd, UIGWLP_UI);
+            CicIMCLock imcLock(hIMC);
+            switch (uMsg)
+            {
+                case WM_IME_STARTCOMPOSITION:
+                {
+                    pUI->m_pComp->OnImeStartComposition(imcLock, pUI->m_hWnd);
+                    break;
+                }
+                case WM_IME_COMPOSITION:
+                {
+                    if (lParam & GCS_COMPSTR)
+                    {
+                        pUI->m_pComp->OnImeCompositionUpdate(imcLock);
+                        ::SetTimer(hWnd, 0, 10, NULL);
+                        //FIXME
+                    }
+                    break;
+                }
+                case WM_IME_ENDCOMPOSITION:
+                {
+                    ::KillTimer(hWnd, 0);
+                    pUI->m_pComp->OnImeEndComposition();
+                    break;
+                }
+                case WM_IME_SETCONTEXT:
+                {
+                    pUI->OnImeSetContext(imcLock, wParam, lParam);
+                    ::KillTimer(hWnd, 1);
+                    ::SetTimer(hWnd, 1, 300, NULL);
+                    break;
+                }
+                case WM_TIMER:
+                {
+                    //FIXME
+                    ::KillTimer(hWnd, wParam);
+                    break;
+                }
+                case WM_IME_NOTIFY:
+                case WM_IME_SELECT:
+                default:
+                {
+                    pUI->m_pComp->OnPaintTheme(wParam);
+                    break;
+                }
+            }
+            break;
+        }
+        default:
+        {
+            if (IsMsImeMessage(uMsg))
+                return CIMEUIWindowHandler::ImeUIMsImeHandler(hWnd, uMsg, 
wParam, lParam);
+            return DefWindowProcW(hWnd, uMsg, wParam, lParam);
+        }
+    }
+
+    return 0;
+}
+
+/**
+ * @implemented
+ */
 EXTERN_C LRESULT CALLBACK
 UIWndProc(
     _In_ HWND hWnd,
@@ -3496,12 +3828,7 @@ UIWndProc(
     _In_ WPARAM wParam,
     _In_ LPARAM lParam)
 {
-    if (uMsg == WM_CREATE)
-    {
-        FIXME("stub\n");
-        return -1;
-    }
-    return 0;
+    return CIMEUIWindowHandler::ImeUIWndProcWorker(hWnd, uMsg, wParam, lParam);
 }
 
 /**
@@ -3515,7 +3842,7 @@ BOOL RegisterImeClass(VOID)
     {
         ZeroMemory(&wcx, sizeof(wcx));
         wcx.cbSize          = sizeof(WNDCLASSEXW);
-        wcx.cbWndExtra      = sizeof(DWORD) * 2;
+        wcx.cbWndExtra      = UIGWLP_SIZE;
         wcx.hIcon           = LoadIconW(0, (LPCWSTR)IDC_ARROW);
         wcx.hInstance       = g_hInst;
         wcx.hCursor         = LoadCursorW(NULL, (LPCWSTR)IDC_ARROW);
@@ -3537,7 +3864,7 @@ BOOL RegisterImeClass(VOID)
         wcx.hCursor         = LoadCursorW(NULL, (LPCWSTR)IDC_IBEAM);
         wcx.hbrBackground   = (HBRUSH)GetStockObject(NULL_BRUSH);
         wcx.style           = CS_IME | CS_HREDRAW | CS_VREDRAW;
-        //wcx.lpfnWndProc     = UIComposition::CompWndProc; // FIXME
+        wcx.lpfnWndProc     = UIComposition::CompWndProc;
         wcx.lpszClassName   = L"MSCTFIME Composition";
         if (!RegisterClassExW(&wcx))
             return FALSE;

Reply via email to