[SDK][IMM32][NTUSER] Delete <jpnvkeys.h> and use <wine/ime.h> instead (#8847)

Follow-up of #8846. Now <jpnvkeys.h>
is useless. Minor refactoring and
standardation.
JIRA issue: CORE-19268
- Replace <jpnvkeys.h> usage with
  <wine/ime.h> 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).
This commit is contained in:
Katayama Hirofumi MZ
2026-04-10 08:30:56 +09:00
committed by GitHub
parent ce73ba4426
commit 61fb4db34c
10 changed files with 108 additions and 98 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 <katayama.hirofumi.mz@gmail.com>
*/
#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

View File

@@ -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()

View File

@@ -6,10 +6,11 @@
* Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
* Copyright 2017 James Tabor <james.tabor@reactos.org>
* Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
* Copyright 2020-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
* Copyright 2020-2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include "precomp.h"
#include <wine/ime.h>
WINE_DEFAULT_DEBUG_CHANNEL(imm);

View File

@@ -10,7 +10,7 @@
*/
#include "precomp.h"
#include <jpnvkeys.h>
#include <wine/ime.h>
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:

View File

@@ -187,3 +187,6 @@ LRESULT
CtfImmSetLangBand(
_In_ HWND hWnd,
_In_ BOOL fSet);
DWORD
WINNLSTranslateMessage(DWORD dwCount, LPTRANSMSG pEntries, HIMC hIMC, BOOL bAnsi, WORD wLang);

View File

@@ -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 <katayama.hirofumi.mz@gmail.com>
* COPYRIGHT: Copyright 2020-2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include "precomp.h"
#include <wine/ime.h>
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
}

View File

@@ -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 <katayama.hirofumi.mz@gmail.com>
*/
#include "precomp.h"
#include <wine/ime.h>
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
}

View File

@@ -8,7 +8,7 @@
*/
#include <win32k.h>
#include <jpnvkeys.h>
#include <wine/ime.h>
#include <cjkcode.h>
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: