From 61fb4db34c6cb8d97ab65feab8fb264e59079bc1 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Fri, 10 Apr 2026 08:30:56 +0900 Subject: [PATCH] [SDK][IMM32][NTUSER] Delete and use instead (#8847) Follow-up of #8846. Now is useless. Minor refactoring and standardation. JIRA issue: CORE-19268 - Replace usage with and fix VK_DBE_ENTERIMECONFIGMODE naming. - Remove duplicated WM_IME_REPORT/IR_* and UNDETERMINESTRUCT definitions now provided by wine/ime.h. - Introduce win3send.c half- implementing ImmSendIMEMessageExA/W. - Add CMake option IMM_WIN3_SUPPORT (default: ON). --- sdk/include/ddk/immdev.h | 18 ------- sdk/include/reactos/imm32_undoc.h | 23 +-------- sdk/include/reactos/jpnvkeys.h | 27 ---------- win32ss/user/imm32/CMakeLists.txt | 6 +++ win32ss/user/imm32/ime.c | 3 +- win32ss/user/imm32/keymsg.c | 4 +- win32ss/user/imm32/precomp.h | 3 ++ win32ss/user/imm32/win3.c | 36 ++++---------- win32ss/user/imm32/win3send.c | 82 +++++++++++++++++++++++++++++++ win32ss/user/ntuser/ime.c | 4 +- 10 files changed, 108 insertions(+), 98 deletions(-) delete mode 100644 sdk/include/reactos/jpnvkeys.h create mode 100644 win32ss/user/imm32/win3send.c diff --git a/sdk/include/ddk/immdev.h b/sdk/include/ddk/immdev.h index 3f2e822e4c5..8435db4a86f 100644 --- a/sdk/include/ddk/immdev.h +++ b/sdk/include/ddk/immdev.h @@ -162,24 +162,6 @@ C_ASSERT(sizeof(INPUTCONTEXT) == 0x140); #define INPUTCONTEXTDX_CHANGE_SENTENCE 0x4 #define INPUTCONTEXTDX_CHANGE_FORCE_OPEN 0x100 -#ifndef WM_IME_REPORT - #define WM_IME_REPORT 0x280 -#endif - -/* WM_IME_REPORT wParam */ -#define IR_STRINGSTART 0x100 -#define IR_STRINGEND 0x101 -#define IR_OPENCONVERT 0x120 -#define IR_CHANGECONVERT 0x121 -#define IR_CLOSECONVERT 0x122 -#define IR_FULLCONVERT 0x123 -#define IR_IMESELECT 0x130 -#define IR_STRING 0x140 -#define IR_DBCSCHAR 0x160 -#define IR_UNDETERMINE 0x170 -#define IR_STRINGEX 0x180 -#define IR_MODEINFO 0x190 - /* IMC */ LPINPUTCONTEXT WINAPI ImmLockIMC(_In_ HIMC hIMC); diff --git a/sdk/include/reactos/imm32_undoc.h b/sdk/include/reactos/imm32_undoc.h index 8b1d1a12b78..ed57c551728 100644 --- a/sdk/include/reactos/imm32_undoc.h +++ b/sdk/include/reactos/imm32_undoc.h @@ -236,25 +236,6 @@ typedef struct IME_STATE C_ASSERT(sizeof(IME_STATE) == 0x18); #endif -/* for WM_IME_REPORT IR_UNDETERMINE */ -typedef struct tagUNDETERMINESTRUCT -{ - DWORD dwSize; - UINT uDefIMESize; - UINT uDefIMEPos; - UINT uUndetTextLen; - UINT uUndetTextPos; - UINT uUndetAttrPos; - UINT uCursorPos; - UINT uDeltaStart; - UINT uDetermineTextLen; - UINT uDetermineTextPos; - UINT uDetermineDelimPos; - UINT uYomiTextLen; - UINT uYomiTextPos; - UINT uYomiDelimPos; -} UNDETERMINESTRUCT, *PUNDETERMINESTRUCT, *LPUNDETERMINESTRUCT; - UINT WINAPI GetKeyboardLayoutCP(_In_ LANGID wLangId); BOOL WINAPI @@ -316,12 +297,12 @@ BOOL WINAPI ImmIMPQueryIMEW(_Inout_ LPIMEPROW pImePro); BOOL WINAPI ImmIMPSetIMEA(_In_opt_ HWND hWnd, _Inout_ LPIMEPROA pImePro); BOOL WINAPI ImmIMPSetIMEW(_In_opt_ HWND hWnd, _Inout_ LPIMEPROW pImePro); -WORD WINAPI +LRESULT WINAPI ImmSendIMEMessageExA( _In_ HWND hWnd, _In_ LPARAM lParam); -WORD WINAPI +LRESULT WINAPI ImmSendIMEMessageExW( _In_ HWND hWnd, _In_ LPARAM lParam); diff --git a/sdk/include/reactos/jpnvkeys.h b/sdk/include/reactos/jpnvkeys.h deleted file mode 100644 index 1f71f04e67b..00000000000 --- a/sdk/include/reactos/jpnvkeys.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * PROJECT: ReactOS header - * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) - * PURPOSE: The special virtual keys for Japanese - * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ - */ - -#pragma once - -/* - * The special virtual keys for Japanese: Used for key states. - * https://www.kthree.co.jp/kihelp/index.html?page=app/vkey&type=html - */ -#define VK_DBE_ALPHANUMERIC 0xF0 -#define VK_DBE_KATAKANA 0xF1 -#define VK_DBE_HIRAGANA 0xF2 -#define VK_DBE_SBCSCHAR 0xF3 -#define VK_DBE_DBCSCHAR 0xF4 -#define VK_DBE_ROMAN 0xF5 -#define VK_DBE_NOROMAN 0xF6 -#define VK_DBE_ENTERWORDREGISTERMODE 0xF7 -#define VK_DBE_ENTERCONFIGMODE 0xF8 -#define VK_DBE_FLUSHSTRING 0xF9 -#define VK_DBE_CODEINPUT 0xFA -#define VK_DBE_NOCODEINPUT 0xFB -#define VK_DBE_DETERINESTRING 0xFC -#define VK_DBE_ENTERDLGCONVERSIONMODE 0xFD diff --git a/win32ss/user/imm32/CMakeLists.txt b/win32ss/user/imm32/CMakeLists.txt index bd52ed0e6fe..6f2bc503e4d 100644 --- a/win32ss/user/imm32/CMakeLists.txt +++ b/win32ss/user/imm32/CMakeLists.txt @@ -20,6 +20,7 @@ list(APPEND SOURCE softkbd.c utils.c win3.c + win3send.c ${CMAKE_CURRENT_BINARY_DIR}/imm32_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/imm32.def) @@ -31,3 +32,8 @@ set_module_type(imm32 win32dll UNICODE ENTRYPOINT ImmDllInitialize 12) target_link_libraries(imm32 wine win32ksys uuid) add_importlibs(imm32 advapi32 user32 gdi32 kernel32 ntdll) add_cd_file(TARGET imm32 DESTINATION reactos/system32 FOR all) + +option(IMM_WIN3_SUPPORT "IMM Win 3.x support" ON) +if(IMM_WIN3_SUPPORT) + target_compile_definitions(imm32 PRIVATE IMM_WIN3_SUPPORT) +endif() diff --git a/win32ss/user/imm32/ime.c b/win32ss/user/imm32/ime.c index 7b7271de2ba..6cd6cc246d4 100644 --- a/win32ss/user/imm32/ime.c +++ b/win32ss/user/imm32/ime.c @@ -6,10 +6,11 @@ * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart * Copyright 2017 James Tabor * Copyright 2018 Amine Khaldi - * Copyright 2020-2025 Katayama Hirofumi MZ + * Copyright 2020-2026 Katayama Hirofumi MZ */ #include "precomp.h" +#include WINE_DEFAULT_DEBUG_CHANNEL(imm); diff --git a/win32ss/user/imm32/keymsg.c b/win32ss/user/imm32/keymsg.c index d0e23c15630..69c9de60467 100644 --- a/win32ss/user/imm32/keymsg.c +++ b/win32ss/user/imm32/keymsg.c @@ -10,7 +10,7 @@ */ #include "precomp.h" -#include +#include WINE_DEFAULT_DEBUG_CHANNEL(imm); @@ -1245,7 +1245,7 @@ ImmCallImeConsoleIME( case VK_DBE_CODEINPUT: case VK_DBE_NOCODEINPUT: case VK_DBE_ENTERWORDREGISTERMODE: - case VK_DBE_ENTERCONFIGMODE: + case VK_DBE_ENTERIMECONFIGMODE: break; default: diff --git a/win32ss/user/imm32/precomp.h b/win32ss/user/imm32/precomp.h index 09fc92f8521..a16685c42d6 100644 --- a/win32ss/user/imm32/precomp.h +++ b/win32ss/user/imm32/precomp.h @@ -187,3 +187,6 @@ LRESULT CtfImmSetLangBand( _In_ HWND hWnd, _In_ BOOL fSet); + +DWORD +WINNLSTranslateMessage(DWORD dwCount, LPTRANSMSG pEntries, HIMC hIMC, BOOL bAnsi, WORD wLang); diff --git a/win32ss/user/imm32/win3.c b/win32ss/user/imm32/win3.c index 970979b5da9..ecb99cc5616 100644 --- a/win32ss/user/imm32/win3.c +++ b/win32ss/user/imm32/win3.c @@ -2,10 +2,11 @@ * PROJECT: ReactOS IMM32 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * PURPOSE: Implementing IMM32 Win3.x compatibility - * COPYRIGHT: Copyright 2020-2021 Katayama Hirofumi MZ + * COPYRIGHT: Copyright 2020-2026 Katayama Hirofumi MZ */ #include "precomp.h" +#include WINE_DEFAULT_DEBUG_CHANNEL(imm); @@ -178,10 +179,14 @@ WINNLSTranslateMessageK(DWORD dwCount, LPTRANSMSG pEntries, LPINPUTCONTEXTDX pIC return dwCount; } +#endif /* def IMM_WIN3_SUPPORT */ + +/* This function is used in ImmGenerateMessage and ImmTranslateMessage */ DWORD WINNLSTranslateMessage(DWORD dwCount, LPTRANSMSG pEntries, HIMC hIMC, BOOL bAnsi, WORD wLang) { - BOOL ret = FALSE; +#ifdef IMM_WIN3_SUPPORT + DWORD ret = 0; LPINPUTCONTEXTDX pIC; LPCOMPOSITIONSTRING pCS; @@ -204,30 +209,7 @@ WINNLSTranslateMessage(DWORD dwCount, LPTRANSMSG pEntries, HIMC hIMC, BOOL bAnsi ImmUnlockIMCC(pIC->hCompStr); ImmUnlockIMC(hIMC); return ret; -} - -#endif /* IMM_WIN3_SUPPORT */ - -/*********************************************************************** - * ImmSendIMEMessageExA(IMM32.@) - */ -WORD WINAPI -ImmSendIMEMessageExA( - _In_ HWND hWnd, - _In_ LPARAM lParam) -{ - FIXME("(%p, %p)\n", hWnd, lParam); - return 0; -} - -/*********************************************************************** - * ImmSendIMEMessageExW(IMM32.@) - */ -WORD WINAPI -ImmSendIMEMessageExW( - _In_ HWND hWnd, - _In_ LPARAM lParam) -{ - FIXME("(%p, %p)\n", hWnd, lParam); +#else return 0; +#endif } diff --git a/win32ss/user/imm32/win3send.c b/win32ss/user/imm32/win3send.c new file mode 100644 index 00000000000..9a978a5fd01 --- /dev/null +++ b/win32ss/user/imm32/win3send.c @@ -0,0 +1,82 @@ +/* + * PROJECT: ReactOS IMM32 + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Implementing ImmSendIMEMessageExA/W + * COPYRIGHT: Copyright 2020-2026 Katayama Hirofumi MZ + */ + +#include "precomp.h" +#include + +WINE_DEFAULT_DEBUG_CHANNEL(imm); + +#ifdef IMM_WIN3_SUPPORT /* 3.x support */ + +static DWORD Imm32TranslateIMESubFunctions(HWND hWnd, PIMESTRUCT pIme, BOOL bAnsi) +{ + FIXME("(%p, %p, %d)\n", hWnd, pIme, bAnsi); + return 0; +} + +static LRESULT Imm32SendIMEMessageExAW(HWND hWnd, HGLOBAL hIME, BOOL bAnsi) +{ + PIMESTRUCT pIme = GlobalLock(hIME); + if (!pIme) + return 0; + + LRESULT ret; + HKL hKL = GetKeyboardLayout(0); + if (Imm32IsSystemJapaneseOrKorean() && ImmIsIME(hKL)) + { + HWND hwndIme = ImmGetDefaultIMEWnd(hWnd); + if (IsWindow(hwndIme)) + { + HWND hTargetWnd = IsWindow(hWnd) ? hWnd : GetFocus(); + ret = Imm32TranslateIMESubFunctions(hTargetWnd, pIme, bAnsi); + } + else + { + ret = (pIme->fnc == IME_GETVERSION) ? IME_RS_INVALID : IME_RS_ERROR; + } + } + else + { + pIme->wParam = IME_RS_INVALID; + ret = 0; + } + + GlobalUnlock(hIME); + return ret; +} + +#endif /* def IMM_WIN3_SUPPORT */ + +/*********************************************************************** + * ImmSendIMEMessageExA(IMM32.@) + */ +LRESULT WINAPI +ImmSendIMEMessageExA( + _In_ HWND hWnd, + _In_ LPARAM lParam) +{ +#ifdef IMM_WIN3_SUPPORT + return Imm32SendIMEMessageExAW(hWnd, (HGLOBAL)lParam, TRUE); +#else + return 0; +#endif +} + +/*********************************************************************** + * ImmSendIMEMessageExW(IMM32.@) + */ +LRESULT WINAPI +ImmSendIMEMessageExW( + _In_ HWND hWnd, + _In_ LPARAM lParam) +{ +#ifdef IMM_WIN3_SUPPORT + return Imm32SendIMEMessageExAW(hWnd, (HGLOBAL)lParam, FALSE); +#else + return 0; +#endif +} diff --git a/win32ss/user/ntuser/ime.c b/win32ss/user/ntuser/ime.c index b8285a5ed09..94479944a6d 100644 --- a/win32ss/user/ntuser/ime.c +++ b/win32ss/user/ntuser/ime.c @@ -8,7 +8,7 @@ */ #include -#include +#include #include DBG_DEFAULT_CHANNEL(UserMisc); @@ -690,7 +690,7 @@ IntImmProcessKey( switch (uVirtualKey) { case VK_DBE_CODEINPUT: - case VK_DBE_ENTERCONFIGMODE: + case VK_DBE_ENTERIMECONFIGMODE: case VK_DBE_ENTERWORDREGISTERMODE: case VK_DBE_HIRAGANA: case VK_DBE_KATAKANA: