| | |
| | | /* |
| | | Simple DirectMedia Layer |
| | | Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> |
| | | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
| | | |
| | | This software is provided 'as-is', without any express or implied |
| | | warranty. In no event will the authors be held liable for any damages |
| | |
| | | |
| | | #else |
| | | |
| | | #ifdef _SDL_msctf_h |
| | | #ifdef SDL_msctf_h_ |
| | | #define USE_INIT_GUID |
| | | #elif defined(__GNUC__) |
| | | #define USE_INIT_GUID |
| | |
| | | #define IMEID_VER(id) ((id) & 0xffff0000) |
| | | #define IMEID_LANG(id) ((id) & 0x0000ffff) |
| | | |
| | | #define CHT_HKL_DAYI ((HKL)0xE0060404) |
| | | #define CHT_HKL_NEW_PHONETIC ((HKL)0xE0080404) |
| | | #define CHT_HKL_NEW_CHANG_JIE ((HKL)0xE0090404) |
| | | #define CHT_HKL_NEW_QUICK ((HKL)0xE00A0404) |
| | | #define CHT_HKL_HK_CANTONESE ((HKL)0xE00B0404) |
| | | #define CHT_HKL_DAYI ((HKL)(UINT_PTR)0xE0060404) |
| | | #define CHT_HKL_NEW_PHONETIC ((HKL)(UINT_PTR)0xE0080404) |
| | | #define CHT_HKL_NEW_CHANG_JIE ((HKL)(UINT_PTR)0xE0090404) |
| | | #define CHT_HKL_NEW_QUICK ((HKL)(UINT_PTR)0xE00A0404) |
| | | #define CHT_HKL_HK_CANTONESE ((HKL)(UINT_PTR)0xE00B0404) |
| | | #define CHT_IMEFILENAME1 "TINTLGNT.IME" |
| | | #define CHT_IMEFILENAME2 "CINTLGNT.IME" |
| | | #define CHT_IMEFILENAME3 "MSTCIPHA.IME" |
| | |
| | | #define IMEID_CHT_VER60 (LANG_CHT | MAKEIMEVERSION(6, 0)) |
| | | #define IMEID_CHT_VER_VISTA (LANG_CHT | MAKEIMEVERSION(7, 0)) |
| | | |
| | | #define CHS_HKL ((HKL)0xE00E0804) |
| | | #define CHS_HKL ((HKL)(UINT_PTR)0xE00E0804) |
| | | #define CHS_IMEFILENAME1 "PINTLGNT.IME" |
| | | #define CHS_IMEFILENAME2 "MSSCIPYA.IME" |
| | | #define IMEID_CHS_VER41 (LANG_CHS | MAKEIMEVERSION(4, 1)) |
| | |
| | | static DWORD IME_GetId(SDL_VideoData *videodata, UINT uIndex); |
| | | static void IME_SendEditingEvent(SDL_VideoData *videodata); |
| | | static void IME_DestroyTextures(SDL_VideoData *videodata); |
| | | |
| | | #define SDL_IsEqualIID(riid1, riid2) SDL_IsEqualGUID(riid1, riid2) |
| | | #define SDL_IsEqualGUID(rguid1, rguid2) (!SDL_memcmp(rguid1, rguid2, sizeof(GUID))) |
| | | |
| | | static SDL_bool UILess_SetupSinks(SDL_VideoData *videodata); |
| | | static void UILess_ReleaseSinks(SDL_VideoData *videodata); |
| | |
| | | videodata->ime_himm32 = SDL_LoadObject("imm32.dll"); |
| | | if (!videodata->ime_himm32) { |
| | | videodata->ime_available = SDL_FALSE; |
| | | SDL_ClearError(); |
| | | return; |
| | | } |
| | | videodata->ImmLockIMC = (LPINPUTCONTEXT2 (WINAPI *)(HIMC))SDL_LoadFunction(videodata->ime_himm32, "ImmLockIMC"); |
| | |
| | | INT err = 0; |
| | | BOOL vertical = FALSE; |
| | | UINT maxuilen = 0; |
| | | static OSVERSIONINFOA osversion; |
| | | |
| | | if (videodata->ime_uiless) |
| | | return; |
| | | |
| | | videodata->ime_readingstring[0] = 0; |
| | | if (!osversion.dwOSVersionInfoSize) { |
| | | osversion.dwOSVersionInfoSize = sizeof(osversion); |
| | | GetVersionExA(&osversion); |
| | | } |
| | | |
| | | id = IME_GetId(videodata, 0); |
| | | if (!id) |
| | | return; |
| | |
| | | } |
| | | break; |
| | | case IMEID_CHS_VER42: |
| | | if (osversion.dwPlatformId != VER_PLATFORM_WIN32_NT) |
| | | break; |
| | | |
| | | p = *(LPBYTE *)((LPBYTE)videodata->ImmLockIMCC(lpimc->hPrivate) + 1*4 + 1*4 + 6*4); |
| | | if (!p) |
| | | break; |
| | |
| | | videodata->ime_candpgsize = i - page_start; |
| | | } else { |
| | | videodata->ime_candpgsize = SDL_min(cand_list->dwPageSize, MAX_CANDLIST); |
| | | page_start = (cand_list->dwSelection / videodata->ime_candpgsize) * videodata->ime_candpgsize; |
| | | if (videodata->ime_candpgsize > 0) { |
| | | page_start = (cand_list->dwSelection / videodata->ime_candpgsize) * videodata->ime_candpgsize; |
| | | } else { |
| | | page_start = 0; |
| | | } |
| | | } |
| | | SDL_memset(&videodata->ime_candidates, 0, sizeof(videodata->ime_candidates)); |
| | | for (i = page_start, j = 0; (DWORD)i < cand_list->dwCount && j < (int)videodata->ime_candpgsize; i++, j++) { |
| | |
| | | return ++sink->refcount; |
| | | } |
| | | |
| | | STDMETHODIMP_(ULONG)TSFSink_Release(TSFSink *sink) |
| | | STDMETHODIMP_(ULONG) TSFSink_Release(TSFSink *sink) |
| | | { |
| | | --sink->refcount; |
| | | if (sink->refcount == 0) { |
| | |
| | | return E_INVALIDARG; |
| | | |
| | | *ppv = 0; |
| | | if (SDL_IsEqualIID(riid, &IID_IUnknown)) |
| | | if (WIN_IsEqualIID(riid, &IID_IUnknown)) |
| | | *ppv = (IUnknown *)sink; |
| | | else if (SDL_IsEqualIID(riid, &IID_ITfUIElementSink)) |
| | | else if (WIN_IsEqualIID(riid, &IID_ITfUIElementSink)) |
| | | *ppv = (ITfUIElementSink *)sink; |
| | | |
| | | if (*ppv) { |
| | |
| | | return E_INVALIDARG; |
| | | |
| | | *ppv = 0; |
| | | if (SDL_IsEqualIID(riid, &IID_IUnknown)) |
| | | if (WIN_IsEqualIID(riid, &IID_IUnknown)) |
| | | *ppv = (IUnknown *)sink; |
| | | else if (SDL_IsEqualIID(riid, &IID_ITfInputProcessorProfileActivationSink)) |
| | | else if (WIN_IsEqualIID(riid, &IID_ITfInputProcessorProfileActivationSink)) |
| | | *ppv = (ITfInputProcessorProfileActivationSink *)sink; |
| | | |
| | | if (*ppv) { |
| | |
| | | { |
| | | static const GUID TF_PROFILE_DAYI = { 0x037B2C25, 0x480C, 0x4D7F, { 0xB0, 0x27, 0xD6, 0xCA, 0x6B, 0x69, 0x78, 0x8A } }; |
| | | SDL_VideoData *videodata = (SDL_VideoData *)sink->data; |
| | | videodata->ime_candlistindexbase = SDL_IsEqualGUID(&TF_PROFILE_DAYI, guidProfile) ? 0 : 1; |
| | | if (SDL_IsEqualIID(catid, &GUID_TFCAT_TIP_KEYBOARD) && (dwFlags & TF_IPSINK_FLAG_ACTIVE)) |
| | | videodata->ime_candlistindexbase = WIN_IsEqualGUID(&TF_PROFILE_DAYI, guidProfile) ? 0 : 1; |
| | | if (WIN_IsEqualIID(catid, &GUID_TFCAT_TIP_KEYBOARD) && (dwFlags & TF_IPSINK_FLAG_ACTIVE)) |
| | | IME_InputLangChanged((SDL_VideoData *)sink->data); |
| | | |
| | | IME_HideCandidateList(videodata); |