port 4-a: text input through CPythonIME (login typed, in-game chat)

- UserInterface/PythonIME(+Module) ported verbatim; ime module stubs removed, initime() after initdbg()
- EterLib/IME.cpp in platform/: 40250 buffer/WMChar bodies, IMM/TSF processors no-op; committed
  multi-byte text via PythonBoot::UIChar emulating GCS_RESULTSTR
- GameApplicationAdapter RunIME* -> CWindowManager; Godot keys -> ui_ime_key/ui_char
- port.login_flow/login_live type the account through the IME; chat CG_CHAT round-trip on the fake server
- python_game_render_test logs in with Godot key events

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
shenlei
2026-09-24 08:35:53 +09:00
co-authored by Claude Opus 5.5
parent 1bda4390d6
commit 6ea0fa9889
21 changed files with 2117 additions and 277 deletions
+1
View File
@@ -540,3 +540,4 @@
{"time": "2026-09-24T16:00:00Z", "event": "port_round", "unit": "batch 3-c: CMapOutdoor + PythonBackground + minimap", "ported": ["GameLib/{Area,AreaTerrain,DungeonBlock,MapBase,MapManager,MapOutdoor*,MapType,MonsterAreaInfo,Property*,Snow*,Terrain*}.cpp", "PRTerrainLib/{Terrain,TextureSet}.cpp", "UserInterface/PythonBackground(+Module).cpp", "EterLib/ColorTransitionHelper.cpp"], "adapted": ["CMapManager::BeginEnvironment: uintptr_t tag cast", "CTerrainImpl::LoadWaterMap: 32-bit long file layout", "EterBase/FileDir, TempFile (platform)", "MapOutdoorCharacterShadow texture create/release (platform file)"], "divergent": ["HTP/STP terrain render + RenderWater no-op (Godot draws terrain)", "BeginRenderCharacterShadowToTexture returns false"], "n_a": ["GameLib/AreaLoaderThread.cpp (dead in 40250)"], "needs_live": [], "tests": ["port.login_flow: IsMapOutdoor, miniMap atlas loaded, GetCurrentMapName", "python_game_render_test: minimap tiles through filter mask (9)", "port.login_live 192.168.21.203 passes", "ctest 19/19", "port_map check 0 errors"], "todo": ["weapon attach draws on the ground (since P3-b)", "default route switch"]}
{"time": "2026-09-24T17:00:00Z", "event": "route_switch", "unit": "client_main default route -> port", "detail": "MT_PORT_PATH unset/port runs python_ui_surface + python_3d_surface (40250 system.py); MT_PORT_PATH=legacy runs AppFlow; smoke/playable test modes stay legacy; unset falls back to legacy when Metin2PythonHost or the 40250 pack is missing", "tests": ["client_main.tscn instantiated per route: default/port -> PythonUISurface+Python3DSurface with UI commands, legacy -> AppFlow+NetTrace"]}
{"time": "2026-09-24T18:00:00Z", "event": "correction", "unit": "batch 3-c todo", "detail": "The sword next to the actor in python_game_render_test is the fake server ground item (GC_ITEM_GROUND_ADD vnum 19, P3-b), not a weapon-attach bug; the fake character has no weapon, AttachWeapon is never called. Todo withdrawn."}
{"time": "2026-09-24T19:00:00Z", "event": "port", "unit": "batch 4-a text input: EterLib/IME.cpp (ADAPTED), UserInterface/PythonIME.cpp, PythonIMEModule.cpp", "detail": "ime module ported; IMM/TSF-free CIME in platform/; Godot key events -> ui_ime_key/ui_char -> CWindowManager RunIME*; login typed through the IME; in-game chat CG_CHAT round-trip", "tests": ["port.login_flow (typed id/password with edits, chat send/echo/close)", "port.login_live", "python_game_render_test (Godot key events)"]}
+712
View File
@@ -0,0 +1,712 @@
{
"reference": "EterLib/IME.cpp",
"reference_sha256": "19a16dd5ac776591a7e2def2564102ea86d7e4a98f67c4bcd585cb8a7376f611",
"priority": "P4",
"contracts": [],
"functions": {
"CIME::CIME": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CIME"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::~CIME": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::~CIME"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::Initialize": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::Initialize"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::Uninitialize": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::Uninitialize"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::UseDefaultIME": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::UseDefaultIME"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::IsIMEEnabled": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::IsIMEEnabled"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::EnableIME": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::EnableIME"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::DisableIME": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::DisableIME"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::EnableCaptureInput": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::EnableCaptureInput"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::DisableCaptureInput": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::DisableCaptureInput"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::IsCaptureEnabled": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::IsCaptureEnabled"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::Clear": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::Clear"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetReading": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetReading"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetReadingError": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetReadingError"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetMax": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetMax"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetUserMax": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetUserMax"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetText": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetText"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetText": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetText"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCodePageText": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCodePageText"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCodePage": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCodePage"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCandidatePageCount": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCandidatePageCount"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCandidateCount": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCandidateCount"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCandidate": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCandidate"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCandidateSelection": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCandidateSelection"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetInputMode": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetInputMode"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetInputMode": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetInputMode"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetNumberMode": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetNumberMode"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetStringMode": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetStringMode"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::AddExceptKey": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::AddExceptKey"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::ClearExceptKey": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::ClearExceptKey"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::__IsWritable": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::__IsWritable"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::EnablePaste": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::EnablePaste"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::PasteTextFromClipBoard": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::PasteTextFromClipBoard"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::FinalizeString": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::FinalizeString"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCompLen": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCompLen"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetULBegin": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetULBegin"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetULEnd": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetULEnd"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CloseCandidateList": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CloseCandidateList"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CloseReadingInformation": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CloseReadingInformation"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::ChangeInputLanguage": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::ChangeInputLanguage"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::ChangeInputLanguageWorker": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::ChangeInputLanguageWorker"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetSupportLevel": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetSupportLevel"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::IncCurPos": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::IncCurPos"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::DecCurPos": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::DecCurPos"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCurPos": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCurPos"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetCurPos": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetCurPos"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::DelCurPos": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::DelCurPos"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::PasteString": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::PasteString"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::InsertString": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::InsertString"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::OnChar": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::OnChar"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetCodePageFromLang": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetCodePageFromLang"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CompositionProcess": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CompositionProcess"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CompositionProcessBuilding": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CompositionProcessBuilding"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::ResultProcess": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::ResultProcess"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::AttributeProcess": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::AttributeProcess"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CandidateProcess": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CandidateProcess"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::ReadingProcess": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::ReadingProcess"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::IsMax": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::IsMax"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetImeId": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetImeId"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::GetReadingWindowOrientation": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::GetReadingWindowOrientation"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::SetupImeApi": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::SetupImeApi"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"_strtoul": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:_strtoul"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CheckInputLocale": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CheckInputLocale"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::CheckToggleState": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::CheckToggleState"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::SetupSinks": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::SetupSinks"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::ReleaseSinks": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::ReleaseSinks"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::CUIElementSink": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::CUIElementSink"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::~CUIElementSink": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::~CUIElementSink"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::QueryInterface": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::QueryInterface"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::BeginUIElement": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::BeginUIElement"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::UpdateUIElement": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::UpdateUIElement"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::EndUIElement": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::EndUIElement"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::UpdateImeState": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::UpdateImeState"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::OnActivated": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::OnActivated"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CUIElementSink::OnChange": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CUIElementSink::OnChange"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::MakeReadingInformationString": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::MakeReadingInformationString"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::MakeCandidateStrings": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::MakeCandidateStrings"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::GetUIElement": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::GetUIElement"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::CurrentInputLocaleIsIme": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::CurrentInputLocaleIsIme"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::EnableUiUpdates": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::EnableUiUpdates"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::GetCompartments": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::GetCompartments"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CTsfUiLessMode::SetupCompartmentSinks": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CTsfUiLessMode::SetupCompartmentSinks"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::WMInputLanguage": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::WMInputLanguage"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::WMStartComposition": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::WMStartComposition"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::WMComposition": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::WMComposition"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::WMEndComposition": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::WMEndComposition"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::WMNotify": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::WMNotify"
],
"note": "no IMM/TSF under Godot: composition arrives as committed text (PythonBoot::UIChar → InsertString + OnUpdate); body is a no-op/constant",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
},
"CIME::WMChar": {
"status": "ADAPTED",
"impl": [
"extension/src/platform/EterLib/IME.cpp:CIME::WMChar"
],
"note": "40250 body verbatim in platform/ (the file also holds the IMM/TSF-free no-ops); DelCurPos uses memmove for the overlapping wcscpy",
"test": "extension/tests/port_login_flow_test.cpp (login id/password typed via UIChar/UIIMEKeyDown incl. LEFT/DELETE/BACK/TAB/RETURN; in-game chat CG_CHAT) + project/python_game_render_test.gd (Godot key events)"
}
}
}
@@ -0,0 +1,122 @@
{
"reference": "UserInterface/PythonIME.cpp",
"reference_sha256": "2fb5fa35249b8a2a9bb1c82d177d36b3ec083a2cafd4957d7cbea85d6be34009",
"priority": "P4",
"contracts": [],
"functions": {
"CPythonIME::CPythonIME": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::CPythonIME"
]
},
"CPythonIME::~CPythonIME": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::~CPythonIME"
]
},
"CPythonIME::Create": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::Create"
]
},
"CPythonIME::MoveLeft": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::MoveLeft"
]
},
"CPythonIME::MoveRight": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::MoveRight"
]
},
"CPythonIME::MoveHome": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::MoveHome"
]
},
"CPythonIME::MoveEnd": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::MoveEnd"
]
},
"CPythonIME::SetCursorPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::SetCursorPosition"
]
},
"CPythonIME::Delete": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::Delete"
]
},
"CPythonIME::OnUpdate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnUpdate"
]
},
"CPythonIME::OnTab": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnTab"
]
},
"CPythonIME::OnReturn": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnReturn"
]
},
"CPythonIME::OnEscape": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnEscape"
]
},
"CPythonIME::OnWM_CHAR": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnWM_CHAR"
]
},
"CPythonIME::OnChangeCodePage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnChangeCodePage"
]
},
"CPythonIME::OnOpenCandidateList": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnOpenCandidateList"
]
},
"CPythonIME::OnCloseCandidateList": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnCloseCandidateList"
]
},
"CPythonIME::OnOpenReadingWnd": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnOpenReadingWnd"
]
},
"CPythonIME::OnCloseReadingWnd": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIME.cpp:CPythonIME::OnCloseReadingWnd"
]
}
}
}
@@ -0,0 +1,212 @@
{
"reference": "UserInterface/PythonIMEModule.cpp",
"reference_sha256": "9d2abae41a270b10f05aceb7e04709f18fe44248ea52a9c2f391c0848d10cc31",
"priority": "P4",
"contracts": [],
"functions": {
"imeEnable": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeEnable"
]
},
"imeDisable": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeDisable"
]
},
"imeEnableCaptureInput": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeEnableCaptureInput"
]
},
"imeDisableCaptureInput": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeDisableCaptureInput"
]
},
"imeSetMax": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetMax"
]
},
"imeSetUserMax": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetUserMax"
]
},
"imeSetText": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetText"
]
},
"imeGetText": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetText"
]
},
"imeGetCodePage": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetCodePage"
]
},
"imeGetCandidateCount": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetCandidateCount"
]
},
"imeGetCandidate": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetCandidate"
]
},
"imeGetCandidateSelection": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetCandidateSelection"
]
},
"imeGetReading": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetReading"
]
},
"imeGetReadingError": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetReadingError"
]
},
"imeEnableIME": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeEnableIME"
]
},
"imeDisableIME": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeDisableIME"
]
},
"imeSetInputMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetInputMode"
]
},
"imeSetNumberMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetNumberMode"
]
},
"imeAddExceptKey": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeAddExceptKey"
]
},
"imeClearExceptKey": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeClearExceptKey"
]
},
"imeSetStringMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetStringMode"
]
},
"imeGetInputMode": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeGetInputMode"
]
},
"imeMoveLeft": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeMoveLeft"
]
},
"imeMoveRight": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeMoveRight"
]
},
"imeMoveHome": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeMoveHome"
]
},
"imeMoveEnd": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeMoveEnd"
]
},
"imeSetCursorPosition": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeSetCursorPosition"
]
},
"imeDelete": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeDelete"
]
},
"imePasteTextFromClipBoard": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imePasteTextFromClipBoard"
]
},
"imeEnablePaste": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imeEnablePaste"
]
},
"imePasteString": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imePasteString"
]
},
"imePasteBackspace": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imePasteBackspace"
]
},
"imePasteReturn": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:imePasteReturn"
]
},
"initime": {
"status": "PORTED",
"impl": [
"extension/src/port/UserInterface/PythonIMEModule.cpp:initime"
]
}
}
}