* feat(windows): add opt-in per-app Vim Escape mode * fix(windows): 改用 config.toml 的 vim_mode_apps 并移除 yaml-cpp TSF DLL 会注入所有宿主进程,约定保持 /Zc:threadSafeInit- 且不加全局构造器; yaml-cpp 带命名空间级 std::string 数组和线程安全局部静态,违背这一约定。 配置改为 [input] vim_mode_apps = [...],由 DLL 内的小型解析器读取, 沿用 config.toml 的时间戳缓存;键写入出厂模板与工作配置,升级合并保留用户值。 --------- Co-authored-by: fanlusky <1730976608@qq.com>
201 lines
7.1 KiB
CMake
201 lines
7.1 KiB
CMake
cmake_minimum_required(VERSION 3.25.0)
|
|
if(POLICY CMP0141)
|
|
cmake_policy(SET CMP0141 NEW)
|
|
endif()
|
|
|
|
# TSF tip loads into host processes (QQ/Chrome/...). Static CRT avoids
|
|
# colliding with the host's MSVCP140/VCRUNTIME140 (common QQ crash signature).
|
|
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
|
|
set(PROJECT_NAME MetasequoiaImeTsf)
|
|
project(${PROJECT_NAME} LANGUAGES CXX C)
|
|
|
|
# Release binaries need usable symbols for crash diagnosis. Keep the PDB beside the DLL so the
|
|
# release job can validate and publish it without changing the binary's install layout.
|
|
if(MSVC)
|
|
# Sources are UTF-8 without a BOM and hold wide punctuation literals (L"“" and the like). /utf-8
|
|
# used to arrive only through fmt's interface options, which the tests below never link.
|
|
add_compile_options(/utf-8)
|
|
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "ProgramDatabase")
|
|
add_compile_options("$<$<CONFIG:Release>:/Zi>")
|
|
add_link_options("$<$<CONFIG:Release>:/DEBUG>")
|
|
endif()
|
|
|
|
include(CTest)
|
|
if(BUILD_TESTING)
|
|
add_executable(test_windows_ipc_contract
|
|
../engine/contracts/tests/windows_ipc_contract.cpp)
|
|
target_compile_features(test_windows_ipc_contract PRIVATE cxx_std_17)
|
|
add_test(NAME windows_ipc_contract COMMAND test_windows_ipc_contract)
|
|
add_subdirectory(tests)
|
|
endif()
|
|
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
|
|
add_definitions(
|
|
/D_UNICODE=1
|
|
/DUNICODE=1
|
|
)
|
|
|
|
# For utf8cpp, make it use C++11 and later
|
|
add_compile_options(/Zc:__cplusplus)
|
|
# Match WeaselTSF: avoid dynamic TLS init guards in in-proc tip DLLs
|
|
add_compile_options(/Zc:threadSafeInit-)
|
|
|
|
# This DLL is loaded into Chrome, QQ, Office and every other host the user types into, and it parses
|
|
# what those hosts hand it -- yet it was building at the default /W3 while ui/ and server/ already
|
|
# use /W4 on their own targets. /WX is deliberately not set yet: the existing warnings have to be
|
|
# read and cleared on Windows first, and turning them into errors before that would only mean
|
|
# reaching for /wd suppressions. /permissive- is likewise left for a follow-up that can build here.
|
|
add_compile_options(/W4)
|
|
|
|
# add_definitions(
|
|
# /DFANY_DEBUG=1
|
|
# /DFANY_IPC_DEBUG=1
|
|
# )
|
|
|
|
# fmt
|
|
find_package(fmt CONFIG REQUIRED)
|
|
|
|
# For pure-header libs installed by vcpkg like utf8cpp
|
|
if(DEFINED VCPKG_TARGET_TRIPLET)
|
|
include_directories("${CMAKE_BINARY_DIR}/vcpkg_installed/${VCPKG_TARGET_TRIPLET}/include")
|
|
endif()
|
|
|
|
include_directories("./src")
|
|
include_directories("./src/Candidate")
|
|
include_directories("./src/Compartment")
|
|
include_directories("./src/Composition")
|
|
include_directories("./src/DisplayAttribute")
|
|
include_directories("./src/Edit")
|
|
include_directories("./src/FanyLog")
|
|
include_directories("./src/Global")
|
|
include_directories("./src/Header")
|
|
include_directories("./src/IME")
|
|
include_directories("./src/IPC")
|
|
include_directories("./src/Key")
|
|
include_directories("./src/LanguageBar")
|
|
include_directories("./src/Register")
|
|
include_directories("./src/Statistics")
|
|
include_directories("./src/Tf")
|
|
include_directories("./src/Thread")
|
|
include_directories("./src/UI")
|
|
include_directories("./src/Utils")
|
|
|
|
add_library(${PROJECT_NAME} SHARED
|
|
# Candidate
|
|
"./src/Candidate/EnumTfCandidates.cpp"
|
|
"./src/Candidate/EnumTfCandidates.h"
|
|
"./src/Candidate/SearchCandidateProvider.cpp"
|
|
"./src/Candidate/SearchCandidateProvider.h"
|
|
"./src/Candidate/TipCandidateList.cpp"
|
|
"./src/Candidate/TipCandidateList.h"
|
|
"./src/Candidate/TipCandidateString.cpp"
|
|
"./src/Candidate/TipCandidateString.h"
|
|
# Compartment
|
|
"./src/Compartment/Compartment.cpp"
|
|
"./src/Compartment/Compartment.h"
|
|
# Composition
|
|
"./src/Composition/Composition.cpp"
|
|
"./src/Composition/CompositionProcessorEngine.cpp"
|
|
"./src/Composition/CompositionProcessorEngine.h"
|
|
"./src/Composition/CompositionProcessorEngine_KeyClassify.cpp"
|
|
"./src/Composition/CompositionProcessorEngine_Modes.cpp"
|
|
"./src/Composition/CompositionProcessorEngine_PreservedKeys.cpp"
|
|
"./src/Composition/EndComposition.cpp"
|
|
"./src/Composition/StartComposition.cpp"
|
|
# DisplayAttribute
|
|
"./src/DisplayAttribute/DisplayAttribute.cpp"
|
|
"./src/DisplayAttribute/DisplayAttributeInfo.cpp"
|
|
"./src/DisplayAttribute/DisplayAttributeInfo.h"
|
|
"./src/DisplayAttribute/DisplayAttributeProvider.cpp"
|
|
"./src/DisplayAttribute/EnumDisplayAttributeInfo.cpp"
|
|
"./src/DisplayAttribute/EnumDisplayAttributeInfo.h"
|
|
# Edit
|
|
"./src/Edit/EditSession.cpp"
|
|
"./src/Edit/EditSession.h"
|
|
"./src/Edit/GetTextExtentEditSession.cpp"
|
|
"./src/Edit/GetTextExtentEditSession.h"
|
|
"./src/Edit/TextEditSink.cpp"
|
|
# Global
|
|
"./src/Global/FanyDefines.h"
|
|
"./src/Global/Globals.cpp"
|
|
"./src/Global/Globals.h"
|
|
# Header
|
|
"./src/Header/Define.h"
|
|
"./src/Header/Private.h"
|
|
"./src/Header/resource.h"
|
|
"./src/Header/stdafx.h"
|
|
# IME
|
|
"./src/IME/ActiveLanguageProfileNotifySink.cpp"
|
|
"./src/IME/FunctionProviderSink.cpp"
|
|
"./src/IME/MetasequoiaIME.cpp"
|
|
"./src/IME/MetasequoiaIME.def"
|
|
"./src/IME/MetasequoiaIME.h"
|
|
"./src/IME/MetasequoiaIME.rc"
|
|
"./src/IME/MetasequoiaIME_AsyncRequests.cpp"
|
|
"./src/IME/MetasequoiaIME_IpcWorker.cpp"
|
|
"./src/IME/MetasequoiaIME_WindowProc.cpp"
|
|
"./src/IME/MetasequoiaIMEBaseStructure.cpp"
|
|
"./src/IME/MetasequoiaIMEBaseStructure.h"
|
|
"./src/IME/MetasequoiaIMEInternal.h"
|
|
"./src/IME/MetasequoiaIMEStructureArray.h"
|
|
# IPC
|
|
"./src/IPC/Ipc.cpp"
|
|
"./src/IPC/Ipc.h"
|
|
"./src/IPC/VoiceCompositionPipe.h"
|
|
# Key
|
|
"./src/Key/DeferredKeyFailurePolicy.h"
|
|
"./src/Key/KeyEventSink.cpp"
|
|
"./src/Key/VimMode.cpp"
|
|
"./src/Key/VimMode.h"
|
|
"./src/Key/KeyEventSink_DeferredKeys.cpp"
|
|
"./src/Key/KeyEventSink_Hotkeys.cpp"
|
|
"./src/Key/KeyEventSinkInternal.h"
|
|
"./src/Key/KeyHandler.cpp"
|
|
"./src/Key/KeyHandlerEditSession.cpp"
|
|
"./src/Key/KeyHandlerEditSession.h"
|
|
"./src/Key/KeyStateCategory.cpp"
|
|
"./src/Key/KeyStateCategory.h"
|
|
# LanguageBar
|
|
"./src/LanguageBar/LanguageBar.cpp"
|
|
"./src/LanguageBar/LanguageBar.h"
|
|
# Register
|
|
"./src/Register/Register.cpp"
|
|
"./src/Register/RegKey.cpp"
|
|
"./src/Register/RegKey.h"
|
|
# Statistics
|
|
"./src/Statistics/char_classify.cpp"
|
|
"./src/Statistics/char_classify.h"
|
|
"./src/Statistics/stats_collector.cpp"
|
|
"./src/Statistics/stats_collector.h"
|
|
"./src/Statistics/stats_passthrough.h"
|
|
# Tf
|
|
"./src/Tf/TfInputProcessorProfile.cpp"
|
|
"./src/Tf/TfInputProcessorProfile.h"
|
|
"./src/Tf/TfTextLayoutSink.cpp"
|
|
"./src/Tf/TfTextLayoutSink.h"
|
|
# Thread
|
|
"./src/Thread/ThreadFocusSink.cpp"
|
|
"./src/Thread/ThreadMgrEventSink.cpp"
|
|
# UI
|
|
"./src/UI/CandidateSessionState.cpp"
|
|
"./src/UI/CandidateSessionState.h"
|
|
"./src/UI/CandidateListUIPresenter.cpp"
|
|
"./src/UI/CandidateListUIPresenter.h"
|
|
# Utils
|
|
"./src/Utils/CommonUtils.cpp"
|
|
"./src/Utils/CommonUtils.h"
|
|
"./src/Utils/FanyUtils.cpp"
|
|
"./src/Utils/FanyUtils.h"
|
|
# Main
|
|
"./src/DllMain.cpp"
|
|
"./src/Server.cpp"
|
|
)
|
|
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE fmt::fmt-header-only)
|
|
|
|
set_property(TARGET ${PROJECT_NAME} PROPERTY
|
|
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|