mirror of
https://github.com/vim/vim
synced 2025-07-16 01:01:58 +00:00
patch 8.2.4153: MS-Windows: Global IME is no longer supported
Problem: MS-Windows: Global IME is no longer supported. Solution: Remove the Global IME implementation. (Ken Takata, closes #9562)
This commit is contained in:
3
Filelist
3
Filelist
@ -549,12 +549,9 @@ SRC_DOS = \
|
||||
src/msvc2015.bat \
|
||||
src/msys32.bat \
|
||||
src/msys64.bat \
|
||||
src/dimm.idl \
|
||||
src/dlldata.c \
|
||||
src/dosinst.c \
|
||||
src/dosinst.h \
|
||||
src/glbl_ime.cpp \
|
||||
src/glbl_ime.h \
|
||||
src/gui_dwrite.cpp \
|
||||
src/gui_dwrite.h \
|
||||
src/gui_w32.c \
|
||||
|
@ -955,32 +955,11 @@ replace mode.
|
||||
The options 'iminsert', 'imsearch' and 'imcmdline' can be used to choose
|
||||
the different input methods or disable them temporarily.
|
||||
|
||||
WHAT IS IME
|
||||
IME is a part of East asian version Windows. That helps you to input
|
||||
multibyte character. English and other language version Windows does not
|
||||
have any IME. (Also there is no need usually.) But there is one that
|
||||
called Microsoft Global IME. Global IME is a part of Internet Explorer
|
||||
4.0 or above. You can get more information about Global IME, at below
|
||||
URL.
|
||||
|
||||
WHAT IS GLOBAL IME *global-ime*
|
||||
Global IME makes capability to input Chinese, Japanese, and Korean text
|
||||
into Vim buffer on any language version of Windows 98, Windows 95, and
|
||||
Windows NT 4.0.
|
||||
On Windows 2000 and XP it should work as well (without downloading). On
|
||||
Windows 2000 Professional, Global IME is built in, and the Input Locales
|
||||
can be added through Control Panel/Regional Options/Input Locales.
|
||||
Please see below URL for detail of Global IME. You can also find various
|
||||
language version of Global IME at same place.
|
||||
|
||||
- Global IME detailed information.
|
||||
http://search.microsoft.com/results.aspx?q=global+ime
|
||||
|
||||
- Active Input Method Manager (Global IME)
|
||||
On Windows 9x and Windows NT 4.0 there was *global-ime* , but this is no
|
||||
longer supported. You can still find documentation for Active Input Method
|
||||
Manager (Global IME) here:
|
||||
http://msdn.microsoft.com/en-us/library/aa741221(v=VS.85).aspx
|
||||
|
||||
Support for Global IME is an experimental feature.
|
||||
|
||||
NOTE: For IME to work you must make sure the input locales of your language
|
||||
are added to your system. The exact location of this depends on the version
|
||||
of Windows you use. For example, on my Windows 2000 box:
|
||||
|
@ -34,7 +34,6 @@
|
||||
# IME support: IME=yes (default is yes)
|
||||
# DYNAMIC_IME=[yes or no] (to load the imm32.dll dynamically, default
|
||||
# is yes)
|
||||
# Global IME support: GIME=yes (requires GUI=yes)
|
||||
#
|
||||
# Terminal support: TERMINAL=yes (default is yes if FEATURES is HUGE)
|
||||
# Will also enable CHANNEL
|
||||
@ -898,11 +897,6 @@ IME_LIB = imm32.lib
|
||||
! endif
|
||||
!endif
|
||||
|
||||
!if "$(GIME)" == "yes"
|
||||
CFLAGS = $(CFLAGS) -DGLOBAL_IME
|
||||
OBJ = $(OBJ) $(OUTDIR)\dimm_i.obj $(OUTDIR)\glbl_ime.obj
|
||||
!endif
|
||||
|
||||
!if "$(GUI)" == "yes"
|
||||
SUBSYSTEM = windows
|
||||
CFLAGS = $(CFLAGS) -DFEAT_GUI_MSWIN
|
||||
@ -1475,9 +1469,6 @@ clean: testclean
|
||||
- if exist uninstall.exe del uninstall.exe
|
||||
- if exist if_perl.c del if_perl.c
|
||||
- if exist auto\if_perl.c del auto\if_perl.c
|
||||
- if exist dimm.h del dimm.h
|
||||
- if exist dimm_i.c del dimm_i.c
|
||||
- if exist dimm.tlb del dimm.tlb
|
||||
- if exist dosinst.exe del dosinst.exe
|
||||
cd xxd
|
||||
$(MAKE) /NOLOGO -f Make_mvc.mak clean
|
||||
@ -1893,13 +1884,6 @@ iid_ole.c if_ole.h vim.tlb: if_ole.idl
|
||||
midl /nologo /error none /proxy nul /iid iid_ole.c /tlb vim.tlb \
|
||||
/header if_ole.h if_ole.idl
|
||||
|
||||
dimm.h dimm_i.c: dimm.idl
|
||||
midl /nologo /error none /proxy nul dimm.idl
|
||||
|
||||
$(OUTDIR)/dimm_i.obj: $(OUTDIR) dimm_i.c $(INCL)
|
||||
|
||||
$(OUTDIR)/glbl_ime.obj: $(OUTDIR) glbl_ime.cpp dimm.h $(INCL)
|
||||
|
||||
|
||||
CCCTERM = $(CC) $(CFLAGS) -Ilibvterm/include -DINLINE="" \
|
||||
-DVSNPRINTF=vim_vsnprintf \
|
||||
|
544
src/dimm.idl
544
src/dimm.idl
@ -1,544 +0,0 @@
|
||||
//+-------------------------------------------------------------------------
|
||||
//
|
||||
// Microsoft Windows
|
||||
// Copyright (C) Microsoft Corporation, 1992-2000.
|
||||
//
|
||||
// File: dimm.idl
|
||||
//
|
||||
// Contents: ActiveIMM interface definitions
|
||||
//
|
||||
//
|
||||
//--------------------------------------------------------------------------
|
||||
|
||||
cpp_quote("//=--------------------------------------------------------------------------=")
|
||||
cpp_quote("// dimm.h")
|
||||
cpp_quote("//=--------------------------------------------------------------------------=")
|
||||
cpp_quote("// (C) Copyright 1995-1998 Microsoft Corporation. All Rights Reserved.")
|
||||
cpp_quote("//")
|
||||
cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
|
||||
cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
|
||||
cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
|
||||
cpp_quote("// PARTICULAR PURPOSE.")
|
||||
cpp_quote("//=--------------------------------------------------------------------------=")
|
||||
cpp_quote("")
|
||||
cpp_quote("#pragma comment(lib,\"uuid.lib\")")
|
||||
cpp_quote("")
|
||||
cpp_quote("//--------------------------------------------------------------------------")
|
||||
cpp_quote("// IActiveIMM Interfaces.")
|
||||
cpp_quote("")
|
||||
|
||||
/*
|
||||
Disable a warning about lack of polymorphic type support for the following reasons
|
||||
- the only reason to have library block in the file is to make midl accept coclass
|
||||
statement and generate CLSID for CActiveIMM.
|
||||
- the generated dimm_i.c has the clsid and that file is used to have clsid available
|
||||
- the dimm.tlb is not used at all
|
||||
- on top of it, there is no plans to port the app using dimm.idl to 64b platform.
|
||||
*/
|
||||
/*
|
||||
* midl_pragma is unsupported in midl version 3.01 shipped with VC5.0.
|
||||
* It is supported in midl version 5.01 shipped with VC6.0
|
||||
* I could not produce message 2395. Is this needed? W.Briscoe 2001-08-14
|
||||
*/
|
||||
#if (__midl >= 501)
|
||||
midl_pragma warning( disable: 2395) // polymorphic types not supported in the TLB
|
||||
#endif
|
||||
|
||||
#ifndef DO_NO_IMPORTS
|
||||
import "unknwn.idl";
|
||||
#endif
|
||||
|
||||
[
|
||||
uuid(4955DD30-B159-11d0-8FCF-00AA006BCC59),
|
||||
helpstring("ActiveIMM"),
|
||||
lcid(0x0000),
|
||||
version(0.1)
|
||||
]
|
||||
library ActiveIMM
|
||||
{
|
||||
importlib("stdole2.tlb");
|
||||
|
||||
cpp_quote("#include <imm.h>")
|
||||
|
||||
cpp_quote("#if 0")
|
||||
|
||||
typedef WORD LANGID;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
LPSTR lpReading;
|
||||
LPSTR lpWord;
|
||||
} REGISTERWORDA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
LPWSTR lpReading;
|
||||
LPWSTR lpWord;
|
||||
} REGISTERWORDW;
|
||||
|
||||
#define LF_FACESIZE 32
|
||||
|
||||
typedef struct
|
||||
{
|
||||
LONG lfHeight;
|
||||
LONG lfWidth;
|
||||
LONG lfEscapement;
|
||||
LONG lfOrientation;
|
||||
LONG lfWeight;
|
||||
BYTE lfItalic;
|
||||
BYTE lfUnderline;
|
||||
BYTE lfStrikeOut;
|
||||
BYTE lfCharSet;
|
||||
BYTE lfOutPrecision;
|
||||
BYTE lfClipPrecision;
|
||||
BYTE lfQuality;
|
||||
BYTE lfPitchAndFamily;
|
||||
CHAR lfFaceName[LF_FACESIZE];
|
||||
} LOGFONTA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
LONG lfHeight;
|
||||
LONG lfWidth;
|
||||
LONG lfEscapement;
|
||||
LONG lfOrientation;
|
||||
LONG lfWeight;
|
||||
BYTE lfItalic;
|
||||
BYTE lfUnderline;
|
||||
BYTE lfStrikeOut;
|
||||
BYTE lfCharSet;
|
||||
BYTE lfOutPrecision;
|
||||
BYTE lfClipPrecision;
|
||||
BYTE lfQuality;
|
||||
BYTE lfPitchAndFamily;
|
||||
WCHAR lfFaceName[LF_FACESIZE];
|
||||
} LOGFONTW;
|
||||
|
||||
typedef DWORD HIMC;
|
||||
typedef DWORD HIMCC;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwIndex;
|
||||
DWORD dwStyle;
|
||||
POINT ptCurrentPos;
|
||||
RECT rcArea;
|
||||
} CANDIDATEFORM;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwStyle;
|
||||
POINT ptCurrentPos;
|
||||
RECT rcArea;
|
||||
} COMPOSITIONFORM;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwSize;
|
||||
DWORD dwStyle;
|
||||
DWORD dwCount;
|
||||
DWORD dwSelection;
|
||||
DWORD dwPageStart;
|
||||
DWORD dwPageSize;
|
||||
DWORD dwOffset[1];
|
||||
} CANDIDATELIST;
|
||||
|
||||
#define STYLE_DESCRIPTION_SIZE 32
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwStyle;
|
||||
CHAR szDescription[STYLE_DESCRIPTION_SIZE];
|
||||
} STYLEBUFA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwStyle;
|
||||
WCHAR szDescription[STYLE_DESCRIPTION_SIZE];
|
||||
} STYLEBUFW;
|
||||
|
||||
typedef WORD ATOM;
|
||||
|
||||
cpp_quote("#endif")
|
||||
|
||||
cpp_quote("#if (WINVER < 0x040A)")
|
||||
|
||||
#define IMEMENUITEM_STRING_SIZE 80
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT cbSize;
|
||||
UINT fType;
|
||||
UINT fState;
|
||||
UINT wID;
|
||||
HBITMAP hbmpChecked;
|
||||
HBITMAP hbmpUnchecked;
|
||||
DWORD dwItemData;
|
||||
CHAR szString[IMEMENUITEM_STRING_SIZE];
|
||||
HBITMAP hbmpItem;
|
||||
} IMEMENUITEMINFOA;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT cbSize;
|
||||
UINT fType;
|
||||
UINT fState;
|
||||
UINT wID;
|
||||
HBITMAP hbmpChecked;
|
||||
HBITMAP hbmpUnchecked;
|
||||
DWORD dwItemData;
|
||||
WCHAR szString[IMEMENUITEM_STRING_SIZE];
|
||||
HBITMAP hbmpItem;
|
||||
} IMEMENUITEMINFOW;
|
||||
|
||||
cpp_quote("#endif")
|
||||
|
||||
cpp_quote("#ifndef _DDKIMM_H_")
|
||||
|
||||
typedef struct
|
||||
{
|
||||
HWND hWnd;
|
||||
BOOL fOpen;
|
||||
POINT ptStatusWndPos;
|
||||
POINT ptSoftKbdPos;
|
||||
DWORD fdwConversion;
|
||||
DWORD fdwSentence;
|
||||
union
|
||||
{
|
||||
LOGFONTA A;
|
||||
LOGFONTW W;
|
||||
} lfFont;
|
||||
COMPOSITIONFORM cfCompForm;
|
||||
CANDIDATEFORM cfCandForm[4];
|
||||
HIMCC hCompStr;
|
||||
HIMCC hCandInfo;
|
||||
HIMCC hGuideLine;
|
||||
HIMCC hPrivate;
|
||||
DWORD dwNumMsgBuf;
|
||||
HIMCC hMsgBuf;
|
||||
DWORD fdwInit;
|
||||
DWORD dwReserve[3];
|
||||
} INPUTCONTEXT;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
DWORD dwPrivateDataSize;
|
||||
DWORD fdwProperty;
|
||||
DWORD fdwConversionCaps;
|
||||
DWORD fdwSentenceCaps;
|
||||
DWORD fdwUICaps;
|
||||
DWORD fdwSCSCaps;
|
||||
DWORD fdwSelectCaps;
|
||||
} IMEINFO;
|
||||
|
||||
cpp_quote("#endif")
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(08C03412-F96B-11d0-A475-00AA006BCC59),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IEnumRegisterWordA : IUnknown
|
||||
{
|
||||
HRESULT Clone([out] IEnumRegisterWordA **ppEnum);
|
||||
HRESULT Next([in] ULONG ulCount, [out] REGISTERWORDA *rgRegisterWord, [out] ULONG *pcFetched);
|
||||
HRESULT Reset();
|
||||
HRESULT Skip([in] ULONG ulCount);
|
||||
};
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(4955DD31-B159-11d0-8FCF-00AA006BCC59),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IEnumRegisterWordW : IUnknown
|
||||
{
|
||||
HRESULT Clone([out] IEnumRegisterWordW **ppEnum);
|
||||
HRESULT Next([in] ULONG ulCount, [out] REGISTERWORDW *rgRegisterWord, [out] ULONG *pcFetched);
|
||||
HRESULT Reset();
|
||||
HRESULT Skip([in] ULONG ulCount);
|
||||
};
|
||||
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(09b5eab0-f997-11d1-93d4-0060b067b86e),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IEnumInputContext : IUnknown
|
||||
{
|
||||
HRESULT Clone([out] IEnumInputContext **ppEnum);
|
||||
HRESULT Next([in] ULONG ulCount, [out] HIMC *rgInputContext, [out] ULONG *pcFetched);
|
||||
HRESULT Reset();
|
||||
HRESULT Skip([in] ULONG ulCount);
|
||||
};
|
||||
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(b3458082-bd00-11d1-939b-0060b067b86e),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IActiveIMMRegistrar : IUnknown
|
||||
{
|
||||
HRESULT RegisterIME([in] REFCLSID rclsid, [in] LANGID lgid, [in] LPCWSTR pszIconFile, [in] LPCWSTR pszDesc);
|
||||
HRESULT UnregisterIME([in] REFCLSID rclsid);
|
||||
};
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(b5cf2cfa-8aeb-11d1-9364-0060b067b86e),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IActiveIMMMessagePumpOwner : IUnknown
|
||||
{
|
||||
HRESULT Start();
|
||||
HRESULT End();
|
||||
HRESULT OnTranslateMessage([in] const MSG *pMsg);
|
||||
HRESULT Pause([out] DWORD *pdwCookie);
|
||||
HRESULT Resume([in] DWORD dwCookie);
|
||||
}
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(08c0e040-62d1-11d1-9326-0060b067b86e),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IActiveIMMApp : IUnknown
|
||||
{
|
||||
HRESULT AssociateContext([in] HWND hWnd, [in] HIMC hIME, [out] HIMC *phPrev);
|
||||
HRESULT ConfigureIMEA([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDA *pData);
|
||||
HRESULT ConfigureIMEW([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDW *pData);
|
||||
HRESULT CreateContext([out] HIMC *phIMC);
|
||||
HRESULT DestroyContext([in] HIMC hIME);
|
||||
HRESULT EnumRegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordA **pEnum);
|
||||
HRESULT EnumRegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordW **pEnum);
|
||||
HRESULT EscapeA([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
|
||||
HRESULT EscapeW([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
|
||||
HRESULT GetCandidateListA([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
|
||||
HRESULT GetCandidateListW([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
|
||||
HRESULT GetCandidateListCountA([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
|
||||
HRESULT GetCandidateListCountW([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
|
||||
HRESULT GetCandidateWindow([in] HIMC hIMC, [in] DWORD dwIndex, [out] CANDIDATEFORM *pCandidate);
|
||||
HRESULT GetCompositionFontA([in] HIMC hIMC, [out] LOGFONTA *plf);
|
||||
HRESULT GetCompositionFontW([in] HIMC hIMC, [out] LOGFONTW *plf);
|
||||
HRESULT GetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
|
||||
HRESULT GetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
|
||||
HRESULT GetCompositionWindow([in] HIMC hIMC, [out] COMPOSITIONFORM *pCompForm);
|
||||
HRESULT GetContext([in] HWND hWnd, [out] HIMC *phIMC);
|
||||
HRESULT GetConversionListA([in] HKL hKL, [in] HIMC hIMC, [in] LPSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
|
||||
HRESULT GetConversionListW([in] HKL hKL, [in] HIMC hIMC, [in] LPWSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
|
||||
HRESULT GetConversionStatus([in] HIMC hIMC, [out] DWORD *pfdwConversion, [out] DWORD *pfdwSentence);
|
||||
HRESULT GetDefaultIMEWnd([in] HWND hWnd, [out] HWND *phDefWnd);
|
||||
HRESULT GetDescriptionA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szDescription, [out] UINT *puCopied);
|
||||
HRESULT GetDescriptionW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szDescription, [out] UINT *puCopied);
|
||||
HRESULT GetGuideLineA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPSTR pBuf, [out] DWORD *pdwResult);
|
||||
HRESULT GetGuideLineW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPWSTR pBuf, [out] DWORD *pdwResult);
|
||||
HRESULT GetIMEFileNameA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szFileName, [out] UINT *puCopied);
|
||||
HRESULT GetIMEFileNameW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szFileName, [out] UINT *puCopied);
|
||||
HRESULT GetOpenStatus([in] HIMC hIMC);
|
||||
HRESULT GetProperty([in] HKL hKL, [in] DWORD fdwIndex, [out] DWORD *pdwProperty);
|
||||
HRESULT GetRegisterWordStyleA([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFA *pStyleBuf, [out] UINT *puCopied);
|
||||
HRESULT GetRegisterWordStyleW([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFW *pStyleBuf, [out] UINT *puCopied);
|
||||
HRESULT GetStatusWindowPos([in] HIMC hIMC, [out] POINT *pptPos);
|
||||
HRESULT GetVirtualKey([in] HWND hWnd, [out] UINT *puVirtualKey);
|
||||
HRESULT InstallIMEA([in] LPSTR szIMEFileName, [in] LPSTR szLayoutText, [out] HKL *phKL);
|
||||
HRESULT InstallIMEW([in] LPWSTR szIMEFileName, [in] LPWSTR szLayoutText, [out] HKL *phKL);
|
||||
HRESULT IsIME([in] HKL hKL);
|
||||
HRESULT IsUIMessageA([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
|
||||
HRESULT IsUIMessageW([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
|
||||
HRESULT NotifyIME([in] HIMC hIMC, [in] DWORD dwAction, [in] DWORD dwIndex, [in] DWORD dwValue);
|
||||
HRESULT RegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister);
|
||||
HRESULT RegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister);
|
||||
HRESULT ReleaseContext([in] HWND hWnd, [in] HIMC hIMC);
|
||||
HRESULT SetCandidateWindow([in] HIMC hIMC, [in] CANDIDATEFORM *pCandidate);
|
||||
HRESULT SetCompositionFontA([in] HIMC hIMC, [in] LOGFONTA *plf);
|
||||
HRESULT SetCompositionFontW([in] HIMC hIMC, [in] LOGFONTW *plf);
|
||||
HRESULT SetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
|
||||
HRESULT SetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
|
||||
HRESULT SetCompositionWindow([in] HIMC hIMC, [in] COMPOSITIONFORM *pCompForm);
|
||||
HRESULT SetConversionStatus([in] HIMC hIMC, [in] DWORD fdwConversion, [in] DWORD fdwSentence);
|
||||
HRESULT SetOpenStatus([in] HIMC hIMC, [in] BOOL fOpen);
|
||||
HRESULT SetStatusWindowPos([in] HIMC hIMC, [in] POINT *pptPos);
|
||||
HRESULT SimulateHotKey([in] HWND hWnd, [in] DWORD dwHotKeyID);
|
||||
HRESULT UnregisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szUnregister);
|
||||
HRESULT UnregisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szUnregister);
|
||||
|
||||
HRESULT Activate([in] BOOL fRestoreLayout);
|
||||
HRESULT Deactivate();
|
||||
|
||||
HRESULT OnDefWindowProc([in] HWND hWnd, [in] UINT Msg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
|
||||
|
||||
HRESULT FilterClientWindows([in] ATOM *aaClassList, [in] UINT uSize);
|
||||
|
||||
HRESULT GetCodePageA([in] HKL hKL, [out] UINT *uCodePage);
|
||||
HRESULT GetLangId([in] HKL hKL, [out] LANGID *plid);
|
||||
|
||||
// win98/nt5 apis
|
||||
HRESULT AssociateContextEx([in] HWND hWnd, [in] HIMC hIMC, [in] DWORD dwFlags);
|
||||
HRESULT DisableIME([in] DWORD idThread);
|
||||
HRESULT GetImeMenuItemsA([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOA *pImeParentMenu, [out] IMEMENUITEMINFOA *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
|
||||
HRESULT GetImeMenuItemsW([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOW *pImeParentMenu, [out] IMEMENUITEMINFOW *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
|
||||
HRESULT EnumInputContext([in] DWORD idThread, [out] IEnumInputContext **ppEnum);
|
||||
};
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(08C03411-F96B-11d0-A475-00AA006BCC59),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IActiveIMMIME : IUnknown
|
||||
{
|
||||
HRESULT AssociateContext([in] HWND hWnd, [in] HIMC hIME, [out] HIMC *phPrev);
|
||||
HRESULT ConfigureIMEA([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDA *pData);
|
||||
HRESULT ConfigureIMEW([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDW *pData);
|
||||
HRESULT CreateContext([out] HIMC *phIMC);
|
||||
HRESULT DestroyContext([in] HIMC hIME);
|
||||
HRESULT EnumRegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordA **pEnum);
|
||||
HRESULT EnumRegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordW **pEnum);
|
||||
HRESULT EscapeA([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
|
||||
HRESULT EscapeW([in] HKL hKL, [in] HIMC hIMC, [in] UINT uEscape, [in, out] LPVOID pData, [out] LRESULT *plResult);
|
||||
HRESULT GetCandidateListA([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
|
||||
HRESULT GetCandidateListW([in] HIMC hIMC, [in] DWORD dwIndex, [in] UINT uBufLen, [out] CANDIDATELIST *pCandList, [out] UINT *puCopied);
|
||||
HRESULT GetCandidateListCountA([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
|
||||
HRESULT GetCandidateListCountW([in] HIMC hIMC, [out] DWORD *pdwListSize, [out] DWORD *pdwBufLen);
|
||||
HRESULT GetCandidateWindow([in] HIMC hIMC, [in] DWORD dwIndex, [out] CANDIDATEFORM *pCandidate);
|
||||
HRESULT GetCompositionFontA([in] HIMC hIMC, [out] LOGFONTA *plf);
|
||||
HRESULT GetCompositionFontW([in] HIMC hIMC, [out] LOGFONTW *plf);
|
||||
HRESULT GetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
|
||||
HRESULT GetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LONG *plCopied, [out] LPVOID pBuf);
|
||||
HRESULT GetCompositionWindow([in] HIMC hIMC, [out] COMPOSITIONFORM *pCompForm);
|
||||
HRESULT GetContext([in] HWND hWnd, [out] HIMC *phIMC);
|
||||
HRESULT GetConversionListA([in] HKL hKL, [in] HIMC hIMC, [in] LPSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
|
||||
HRESULT GetConversionListW([in] HKL hKL, [in] HIMC hIMC, [in] LPWSTR pSrc, [in] UINT uBufLen, [in] UINT uFlag, [out] CANDIDATELIST *pDst, [out] UINT *puCopied);
|
||||
HRESULT GetConversionStatus([in] HIMC hIMC, [out] DWORD *pfdwConversion, [out] DWORD *pfdwSentence);
|
||||
HRESULT GetDefaultIMEWnd([in] HWND hWnd, [out] HWND *phDefWnd);
|
||||
HRESULT GetDescriptionA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szDescription, [out] UINT *puCopied);
|
||||
HRESULT GetDescriptionW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szDescription, [out] UINT *puCopied);
|
||||
HRESULT GetGuideLineA([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPSTR pBuf, [out] DWORD *pdwResult);
|
||||
HRESULT GetGuideLineW([in] HIMC hIMC, [in] DWORD dwIndex, [in] DWORD dwBufLen, [out] LPWSTR pBuf, [out] DWORD *pdwResult);
|
||||
HRESULT GetIMEFileNameA([in] HKL hKL, [in] UINT uBufLen, [out] LPSTR szFileName, [out] UINT *puCopied);
|
||||
HRESULT GetIMEFileNameW([in] HKL hKL, [in] UINT uBufLen, [out] LPWSTR szFileName, [out] UINT *puCopied);
|
||||
HRESULT GetOpenStatus([in] HIMC hIMC);
|
||||
HRESULT GetProperty([in] HKL hKL, [in] DWORD fdwIndex, [out] DWORD *pdwProperty);
|
||||
HRESULT GetRegisterWordStyleA([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFA *pStyleBuf, [out] UINT *puCopied);
|
||||
HRESULT GetRegisterWordStyleW([in] HKL hKL, [in] UINT nItem, [out] STYLEBUFW *pStyleBuf, [out] UINT *puCopied);
|
||||
HRESULT GetStatusWindowPos([in] HIMC hIMC, [out] POINT *pptPos);
|
||||
HRESULT GetVirtualKey([in] HWND hWnd, [out] UINT *puVirtualKey);
|
||||
HRESULT InstallIMEA([in] LPSTR szIMEFileName, [in] LPSTR szLayoutText, [out] HKL *phKL);
|
||||
HRESULT InstallIMEW([in] LPWSTR szIMEFileName, [in] LPWSTR szLayoutText, [out] HKL *phKL);
|
||||
HRESULT IsIME([in] HKL hKL);
|
||||
HRESULT IsUIMessageA([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
|
||||
HRESULT IsUIMessageW([in] HWND hWndIME, [in] UINT msg, [in] WPARAM wParam, [in] LPARAM lParam);
|
||||
HRESULT NotifyIME([in] HIMC hIMC, [in] DWORD dwAction, [in] DWORD dwIndex, [in] DWORD dwValue);
|
||||
HRESULT RegisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szRegister);
|
||||
HRESULT RegisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister);
|
||||
HRESULT ReleaseContext([in] HWND hWnd, [in] HIMC hIMC);
|
||||
HRESULT SetCandidateWindow([in] HIMC hIMC, [in] CANDIDATEFORM *pCandidate);
|
||||
HRESULT SetCompositionFontA([in] HIMC hIMC, [in] LOGFONTA *plf);
|
||||
HRESULT SetCompositionFontW([in] HIMC hIMC, [in] LOGFONTW *plf);
|
||||
HRESULT SetCompositionStringA([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
|
||||
HRESULT SetCompositionStringW([in] HIMC hIMC, [in] DWORD dwIndex, [in] LPVOID pComp, [in] DWORD dwCompLen, [in] LPVOID pRead, [in] DWORD dwReadLen);
|
||||
HRESULT SetCompositionWindow([in] HIMC hIMC, [in] COMPOSITIONFORM *pCompForm);
|
||||
HRESULT SetConversionStatus([in] HIMC hIMC, [in] DWORD fdwConversion, [in] DWORD fdwSentence);
|
||||
HRESULT SetOpenStatus([in] HIMC hIMC, [in] BOOL fOpen);
|
||||
HRESULT SetStatusWindowPos([in] HIMC hIMC, [in] POINT *pptPos);
|
||||
HRESULT SimulateHotKey([in] HWND hWnd, [in] DWORD dwHotKeyID);
|
||||
HRESULT UnregisterWordA([in] HKL hKL, [in] LPSTR szReading, [in] DWORD dwStyle, [in] LPSTR szUnregister);
|
||||
HRESULT UnregisterWordW([in] HKL hKL, [in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szUnregister);
|
||||
|
||||
// ime helper methods
|
||||
HRESULT GenerateMessage([in] HIMC hIMC);
|
||||
|
||||
// HIMC and HIMCC management api's
|
||||
HRESULT LockIMC([in] HIMC hIMC, [out] INPUTCONTEXT **ppIMC);
|
||||
HRESULT UnlockIMC([in] HIMC hIMC);
|
||||
HRESULT GetIMCLockCount([in] HIMC hIMC, [out] DWORD *pdwLockCount);
|
||||
HRESULT CreateIMCC([in] DWORD dwSize, [out] HIMCC *phIMCC);
|
||||
HRESULT DestroyIMCC([in] HIMCC hIMCC);
|
||||
HRESULT LockIMCC([in] HIMCC hIMCC, [out] void **ppv);
|
||||
HRESULT UnlockIMCC([in] HIMCC hIMCC);
|
||||
HRESULT ReSizeIMCC([in] HIMCC hIMCC, [in] DWORD dwSize, [out] HIMCC *phIMCC);
|
||||
HRESULT GetIMCCSize([in] HIMCC hIMCC, [out] DWORD *pdwSize);
|
||||
HRESULT GetIMCCLockCount([in] HIMCC hIMCC, [out] DWORD *pdwLockCount);
|
||||
|
||||
// hot key manipulation api's
|
||||
HRESULT GetHotKey([in] DWORD dwHotKeyID, [out] UINT *puModifiers, [out] UINT *puVKey, [out] HKL *phKL);
|
||||
HRESULT SetHotKey([in] DWORD dwHotKeyID, [in] UINT uModifiers, [in] UINT uVKey, [in] HKL hKL);
|
||||
|
||||
// soft keyboard api's
|
||||
HRESULT CreateSoftKeyboard([in] UINT uType, [in] HWND hOwner, [in] int x, [in] int y, [out] HWND *phSoftKbdWnd);
|
||||
HRESULT DestroySoftKeyboard([in] HWND hSoftKbdWnd);
|
||||
HRESULT ShowSoftKeyboard([in] HWND hSoftKbdWnd, [in] int nCmdShow);
|
||||
|
||||
HRESULT GetCodePageA([in] HKL hKL, [out] UINT *uCodePage);
|
||||
HRESULT GetLangId([in] HKL hKL, [out] LANGID *plid);
|
||||
|
||||
HRESULT KeybdEvent([in] LANGID lgidIME, [in] BYTE bVk, [in] BYTE bScan, [in] DWORD dwFlags, [in] DWORD dwExtraInfo);
|
||||
|
||||
HRESULT LockModal();
|
||||
HRESULT UnlockModal();
|
||||
|
||||
// win98/nt5 apis
|
||||
HRESULT AssociateContextEx([in] HWND hWnd, [in] HIMC hIMC, [in] DWORD dwFlags);
|
||||
HRESULT DisableIME([in] DWORD idThread);
|
||||
HRESULT GetImeMenuItemsA([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOA *pImeParentMenu, [out] IMEMENUITEMINFOA *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
|
||||
HRESULT GetImeMenuItemsW([in] HIMC hIMC, [in] DWORD dwFlags, [in] DWORD dwType, [in] IMEMENUITEMINFOW *pImeParentMenu, [out] IMEMENUITEMINFOW *pImeMenu, [in] DWORD dwSize, [out] DWORD *pdwResult);
|
||||
HRESULT EnumInputContext([in] DWORD idThread, [out] IEnumInputContext **ppEnum);
|
||||
HRESULT RequestMessageA([in] HIMC hIMC, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
|
||||
HRESULT RequestMessageW([in] HIMC hIMC, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
|
||||
|
||||
HRESULT SendIMCA([in] HWND hWnd, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
|
||||
HRESULT SendIMCW([in] HWND hWnd, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam, [out] LRESULT *plResult);
|
||||
|
||||
HRESULT IsSleeping();
|
||||
};
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(6FE20962-D077-11d0-8FE7-00AA006BCC59),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IActiveIME : IUnknown
|
||||
{
|
||||
HRESULT Inquire([in] DWORD dwSystemInfoFlags, [out] IMEINFO *pIMEInfo, [out] LPWSTR szWndClass, [out] DWORD *pdwPrivate);
|
||||
HRESULT ConversionList([in] HIMC hIMC, [in] LPWSTR szSource, [in] UINT uFlag, [in] UINT uBufLen, [out] CANDIDATELIST *pDest, [out] UINT *puCopied);
|
||||
HRESULT Configure([in] HKL hKL, [in] HWND hWnd, [in] DWORD dwMode, [in] REGISTERWORDW *pRegisterWord);
|
||||
HRESULT Destroy([in] UINT uReserved);
|
||||
HRESULT Escape([in] HIMC hIMC, [in] UINT uEscape, [in, out] void *pData, [out] LRESULT *plResult);
|
||||
HRESULT SetActiveContext([in] HIMC hIMC, [in] BOOL fFlag);
|
||||
HRESULT ProcessKey([in] HIMC hIMC, [in] UINT uVirKey, [in] DWORD lParam, [in] BYTE *pbKeyState);
|
||||
HRESULT Notify([in] HIMC hIMC, [in] DWORD dwAction, [in] DWORD dwIndex, [in] DWORD dwValue);
|
||||
HRESULT Select([in] HIMC hIMC, [in] BOOL fSelect);
|
||||
HRESULT SetCompositionString([in] HIMC hIMC, [in] DWORD dwIndex, [in] void *pComp, [in] DWORD dwCompLen, [in] void *pRead, [in] DWORD dwReadLen);
|
||||
HRESULT ToAsciiEx([in] UINT uVirKey, [in] UINT uScanCode, [in] BYTE *pbKeyState, [in] UINT fuState, [in] HIMC hIMC, [out] DWORD *pdwTransBuf, [out] UINT *puSize);
|
||||
HRESULT RegisterWord([in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szString);
|
||||
HRESULT UnregisterWord([in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szString);
|
||||
HRESULT GetRegisterWordStyle([in] UINT nItem, [out] STYLEBUFW *pStyleBuf, [out] UINT *puBufSize);
|
||||
HRESULT EnumRegisterWord([in] LPWSTR szReading, [in] DWORD dwStyle, [in] LPWSTR szRegister, [in] LPVOID pData, [out] IEnumRegisterWordW **ppEnum);
|
||||
HRESULT GetCodePageA([out] UINT *uCodePage);
|
||||
HRESULT GetLangId([out] LANGID *plid);
|
||||
};
|
||||
|
||||
[
|
||||
object,
|
||||
uuid(e1c4bf0e-2d53-11d2-93e1-0060b067b86e),
|
||||
pointer_default(unique)
|
||||
]
|
||||
interface IActiveIME2 : IActiveIME
|
||||
{
|
||||
HRESULT Sleep();
|
||||
HRESULT Unsleep([in] BOOL fDead);
|
||||
};
|
||||
|
||||
[
|
||||
uuid(4955DD33-B159-11d0-8FCF-00AA006BCC59),
|
||||
]
|
||||
coclass CActiveIMM
|
||||
{
|
||||
[default] interface IActiveIMMApp;
|
||||
interface IActiveIMMIME;
|
||||
interface IActiveIMMRegistrar;
|
||||
interface IActiveIMMMessagePumpOwner;
|
||||
};
|
||||
}
|
256
src/glbl_ime.cpp
256
src/glbl_ime.cpp
@ -1,256 +0,0 @@
|
||||
/* vi:set ts=8 sts=4 sw=4 noet:
|
||||
*
|
||||
* VIM - Vi IMproved by Bram Moolenaar
|
||||
*
|
||||
* Do ":help uganda" in Vim to read copying and usage conditions.
|
||||
* Do ":help credits" in Vim to see a list of people who contributed.
|
||||
*/
|
||||
|
||||
/*
|
||||
* DESCRIPTION:
|
||||
* This module produces Global IME for Vim, on Windows with Internet
|
||||
* Explorer 5.01 or higher. You need three files "dimm.idl", "dimm.h", and
|
||||
* "dimm_i.c" when compile this module at your self. "dimm.h", and
|
||||
* "dimm_i.c" are generated from "dimm.idl" by using MIDL.EXE as like
|
||||
* "if_ole.h". You can get "dimm.idl" in MSDN web site. I got it below
|
||||
* URL.
|
||||
*
|
||||
* WHAT IS THE GLOBAL IME?:
|
||||
* Global IME makes capability input Chinese, Japanese, and Korean text into
|
||||
* Vim buffer on any language version of Windows 98, Windows 95, and Windows
|
||||
* NT 4.0. See below URL for detail of Global IME. You can also find
|
||||
* various language version of Global IME at same place.
|
||||
*
|
||||
* RUNTIME REQUIREMENTS:
|
||||
* - Internet Explorer 5.01 or higher.
|
||||
* - Global IME (with language pack?).
|
||||
* - Of course Vim for Windows.
|
||||
*
|
||||
* URLS:
|
||||
* - Where you can probably get "dimm.idl".
|
||||
* http://msdn.microsoft.com/downloads/samples/internet/libraries/ie5_lib/sample.asp
|
||||
* - Global IME detailed information.
|
||||
* http://www.microsoft.com/windows/ie/features/ime.asp
|
||||
*/
|
||||
|
||||
#ifdef GLOBAL_IME
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <objbase.h>
|
||||
extern "C" {
|
||||
#include "vim.h"
|
||||
}
|
||||
#include "dimm.h"
|
||||
#include "glbl_ime.h"
|
||||
|
||||
static IActiveIMMApp *pIApp = NULL;
|
||||
static IActiveIMMMessagePumpOwner *pIMsg = NULL;
|
||||
static HWND s_hWnd = NULL;
|
||||
static BOOL s_bStatus = FALSE; /* for evacuate */
|
||||
|
||||
/*
|
||||
* Initialize Global IME.
|
||||
* "atom" must be return value of RegisterClass(Ex).
|
||||
*/
|
||||
void
|
||||
global_ime_init(ATOM atom, HWND hWnd)
|
||||
{
|
||||
IUnknown *pI;
|
||||
HRESULT hr;
|
||||
|
||||
if (pIApp != NULL || pIMsg != NULL)
|
||||
return;
|
||||
OleInitialize(NULL);
|
||||
|
||||
/*
|
||||
* Get interface IUnknown
|
||||
*/
|
||||
hr = CoCreateInstance(CLSID_CActiveIMM, NULL, CLSCTX_SERVER,
|
||||
IID_IUnknown, (void**)&pI);
|
||||
if (FAILED(hr) || !pI)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Get interface IActiveIMMApp
|
||||
*/
|
||||
hr = pI->QueryInterface(IID_IActiveIMMApp, (void**)&pIApp);
|
||||
if (FAILED(hr))
|
||||
pIApp = NULL;
|
||||
|
||||
/*
|
||||
* Get interface IActiveIMMMessagePumpOwner
|
||||
*/
|
||||
hr = pI->QueryInterface(IID_IActiveIMMMessagePumpOwner, (void**)&pIMsg);
|
||||
if (FAILED(hr))
|
||||
pIMsg = NULL;
|
||||
|
||||
if (pIApp != NULL)
|
||||
{
|
||||
pIApp->Activate(TRUE);
|
||||
pIApp->FilterClientWindows(&atom, 1);
|
||||
}
|
||||
if (pIMsg != NULL)
|
||||
pIMsg->Start();
|
||||
|
||||
pI->Release();
|
||||
s_hWnd = hWnd;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset and clear Global IME.
|
||||
*/
|
||||
void
|
||||
global_ime_end()
|
||||
{
|
||||
if (pIApp != NULL)
|
||||
{
|
||||
IActiveIMMApp *p = pIApp;
|
||||
|
||||
pIApp = NULL;
|
||||
p->FilterClientWindows(NULL, 0);
|
||||
p->Deactivate();
|
||||
p->Release();
|
||||
}
|
||||
if (pIMsg != NULL)
|
||||
{
|
||||
IActiveIMMMessagePumpOwner *p = pIMsg;
|
||||
|
||||
pIMsg = NULL;
|
||||
p->End();
|
||||
p->Release();
|
||||
}
|
||||
OleUninitialize();
|
||||
}
|
||||
|
||||
/*
|
||||
* Replacement for DefWindowProc().
|
||||
*/
|
||||
LRESULT WINAPI
|
||||
global_ime_DefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
LRESULT lResult;
|
||||
|
||||
if (pIApp == NULL || pIApp->OnDefWindowProc(hWnd, Msg,
|
||||
wParam, lParam, &lResult) != S_OK)
|
||||
lResult = DefWindowProcW(hWnd, Msg, wParam, lParam);
|
||||
return lResult;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace with TranslateMessage()
|
||||
*/
|
||||
BOOL WINAPI
|
||||
global_ime_TranslateMessage(CONST MSG *lpMsg)
|
||||
{
|
||||
if (pIMsg == NULL || pIMsg->OnTranslateMessage(lpMsg) == S_FALSE)
|
||||
return TranslateMessage(lpMsg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set position of IME composition window.
|
||||
*
|
||||
* You have to call this before starting composition. If once composition
|
||||
* started, this can take no effect until that composition have finished. So
|
||||
* you should handle WM_IME_STARTCOMPOSITION and call this function.
|
||||
*/
|
||||
void WINAPI
|
||||
global_ime_set_position(POINT *pPoint)
|
||||
{
|
||||
HIMC hImc = NULL;
|
||||
|
||||
if (pIApp == NULL || pPoint == NULL)
|
||||
return;
|
||||
|
||||
if (SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
|
||||
{
|
||||
COMPOSITIONFORM CompForm;
|
||||
|
||||
CompForm.dwStyle = CFS_POINT;
|
||||
CompForm.ptCurrentPos = *pPoint;
|
||||
pIApp->SetCompositionWindow(hImc, &CompForm);
|
||||
pIApp->ReleaseContext(s_hWnd, hImc);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set font to Global IME
|
||||
*/
|
||||
/* GIME_TEST */
|
||||
void WINAPI
|
||||
global_ime_set_font(LOGFONT *pFont)
|
||||
{
|
||||
HIMC hImc = NULL;
|
||||
|
||||
if (pIApp == NULL || pFont == NULL)
|
||||
return;
|
||||
|
||||
if (SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
|
||||
{
|
||||
pIApp->SetCompositionFontA(hImc, pFont);
|
||||
pIApp->ReleaseContext(s_hWnd, hImc);
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* for IME control. Save current status of IME, and set force new-status to
|
||||
* English (turn off).
|
||||
*/
|
||||
void WINAPI
|
||||
global_ime_status_evacuate()
|
||||
{
|
||||
HIMC hImc;
|
||||
|
||||
if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
|
||||
{
|
||||
s_bStatus = (pIApp->GetOpenStatus(hImc) == 0) ? TRUE : FALSE;
|
||||
pIApp->SetOpenStatus(hImc, FALSE);
|
||||
pIApp->ReleaseContext(s_hWnd, hImc);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* for IME control. Change IME status to last saved one.
|
||||
*/
|
||||
void WINAPI
|
||||
global_ime_status_restore()
|
||||
{
|
||||
HIMC hImc;
|
||||
|
||||
if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
|
||||
{
|
||||
pIApp->SetOpenStatus(hImc, s_bStatus);
|
||||
pIApp->ReleaseContext(s_hWnd, hImc);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void WINAPI
|
||||
global_ime_set_status(int status)
|
||||
{
|
||||
HIMC hImc;
|
||||
|
||||
if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
|
||||
{
|
||||
pIApp->SetOpenStatus(hImc, status ? TRUE : FALSE);
|
||||
pIApp->ReleaseContext(s_hWnd, hImc);
|
||||
}
|
||||
}
|
||||
|
||||
int WINAPI
|
||||
global_ime_get_status()
|
||||
{
|
||||
int status = 0;
|
||||
HIMC hImc;
|
||||
|
||||
if (pIApp != NULL && SUCCEEDED(pIApp->GetContext(s_hWnd, &hImc)))
|
||||
{
|
||||
status = pIApp->GetOpenStatus(hImc) ? 1 : 0;
|
||||
pIApp->ReleaseContext(s_hWnd, hImc);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
#endif /* GLOBAL_IME */
|
@ -1,33 +0,0 @@
|
||||
/* vi:set ts=8 sts=4 sw=4 noet:
|
||||
*
|
||||
* VIM - Vi IMproved by Bram Moolenaar
|
||||
*
|
||||
* Do ":help uganda" in Vim to read copying and usage conditions.
|
||||
* Do ":help credits" in Vim to see a list of people who contributed.
|
||||
*/
|
||||
|
||||
#ifdef GLOBAL_IME
|
||||
# ifndef _INC_GLOBAL_IME
|
||||
# define _INC_GLOBAL_IME
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif
|
||||
void global_ime_init(ATOM, HWND);
|
||||
void global_ime_end(void);
|
||||
LRESULT WINAPI global_ime_DefWindowProc(HWND, UINT, WPARAM, LPARAM);
|
||||
BOOL WINAPI global_ime_TranslateMessage(CONST MSG *);
|
||||
void WINAPI global_ime_set_position(POINT*);
|
||||
void WINAPI global_ime_set_font(LOGFONT*);
|
||||
# if 0
|
||||
void WINAPI global_ime_status_evacuate(void);
|
||||
void WINAPI global_ime_status_restore(void);
|
||||
# endif
|
||||
void WINAPI global_ime_set_status(int status);
|
||||
int WINAPI global_ime_get_status(void);
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
||||
# endif // _INC_GLOBAL_IME
|
||||
#endif // GLOBAL_IME
|
140
src/gui_w32.c
140
src/gui_w32.c
@ -197,10 +197,6 @@ gui_mch_set_rendering_options(char_u *s)
|
||||
# endif
|
||||
# include <windowsx.h>
|
||||
|
||||
# ifdef GLOBAL_IME
|
||||
# include "glbl_ime.h"
|
||||
# endif
|
||||
|
||||
#endif // PROTO
|
||||
|
||||
#ifdef FEAT_MENU
|
||||
@ -358,12 +354,6 @@ static int s_need_activate = FALSE;
|
||||
// problems (e.g., while ":s" is working).
|
||||
static int allow_scrollbar = FALSE;
|
||||
|
||||
#ifdef GLOBAL_IME
|
||||
# define MyTranslateMessage(x) global_ime_TranslateMessage(x)
|
||||
#else
|
||||
# define MyTranslateMessage(x) TranslateMessage(x)
|
||||
#endif
|
||||
|
||||
#ifndef _DPI_AWARENESS_CONTEXTS_
|
||||
typedef HANDLE DPI_AWARENESS_CONTEXT;
|
||||
|
||||
@ -449,9 +439,6 @@ directx_binddc(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
// use of WindowProc depends on Global IME
|
||||
static LRESULT WINAPI MyWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
extern int current_font_height; // this is in os_mswin.c
|
||||
|
||||
static struct
|
||||
@ -561,11 +548,9 @@ static void TrackUserActivity(UINT uMsg);
|
||||
*
|
||||
* These LOGFONTW used for IME.
|
||||
*/
|
||||
#if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
// holds LOGFONTW for 'guifontwide' if available, otherwise 'guifont'
|
||||
static LOGFONTW norm_logfont;
|
||||
#endif
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
// holds LOGFONTW for 'guifont' always.
|
||||
static LOGFONTW sub_logfont;
|
||||
#endif
|
||||
@ -1315,20 +1300,10 @@ _TextAreaWndProc(
|
||||
return TRUE;
|
||||
#endif
|
||||
default:
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
static LRESULT WINAPI
|
||||
MyWindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
#ifdef GLOBAL_IME
|
||||
return global_ime_DefWindowProc(hwnd, message, wParam, lParam);
|
||||
#else
|
||||
return DefWindowProcW(hwnd, message, wParam, lParam);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Called when the foreground or background color has been changed.
|
||||
*/
|
||||
@ -1844,7 +1819,7 @@ outputDeadKey_rePost(MSG originalMsg)
|
||||
deadCharExpel.hwnd = originalMsg.hwnd;
|
||||
deadCharExpel.wParam = VK_SPACE;
|
||||
|
||||
MyTranslateMessage(&deadCharExpel);
|
||||
TranslateMessage(&deadCharExpel);
|
||||
|
||||
// re-generate the current character free of the dead char influence
|
||||
PostMessage(originalMsg.hwnd, originalMsg.message, originalMsg.wParam,
|
||||
@ -1919,7 +1894,7 @@ process_message(void)
|
||||
*
|
||||
* - Before doing something special such as regenerating keypresses to
|
||||
* expel the dead character as this could trigger an infinite loop if
|
||||
* for some reason MyTranslateMessage() do not trigger a call
|
||||
* for some reason TranslateMessage() do not trigger a call
|
||||
* immediately to _OnChar() (or _OnSysChar()).
|
||||
*/
|
||||
if (dead_key)
|
||||
@ -1939,7 +1914,7 @@ process_message(void)
|
||||
if ((vk == VK_SPACE || vk == VK_BACK || vk == VK_ESCAPE))
|
||||
{
|
||||
dead_key = 0;
|
||||
MyTranslateMessage(&msg);
|
||||
TranslateMessage(&msg);
|
||||
return;
|
||||
}
|
||||
// In modes where we are not typing, dead keys should behave
|
||||
@ -2069,10 +2044,10 @@ process_message(void)
|
||||
add_to_input_buf(string, 1);
|
||||
}
|
||||
else
|
||||
MyTranslateMessage(&msg);
|
||||
TranslateMessage(&msg);
|
||||
}
|
||||
else
|
||||
MyTranslateMessage(&msg);
|
||||
TranslateMessage(&msg);
|
||||
}
|
||||
}
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
@ -2080,20 +2055,7 @@ process_message(void)
|
||||
_OnImeNotify(msg.hwnd, (DWORD)msg.wParam, (DWORD)msg.lParam);
|
||||
else if (msg.message == WM_KEYUP && im_get_status())
|
||||
// added for non-MS IME (Yasuhiro Matsumoto)
|
||||
MyTranslateMessage(&msg);
|
||||
#endif
|
||||
#if !defined(FEAT_MBYTE_IME) && defined(GLOBAL_IME)
|
||||
// GIME_TEST
|
||||
else if (msg.message == WM_IME_STARTCOMPOSITION)
|
||||
{
|
||||
POINT point;
|
||||
|
||||
global_ime_set_font(&norm_logfont);
|
||||
point.x = FILL_X(gui.col);
|
||||
point.y = FILL_Y(gui.row);
|
||||
MapWindowPoints(s_textArea, s_hwnd, &point, 1);
|
||||
global_ime_set_position(&point);
|
||||
}
|
||||
TranslateMessage(&msg);
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_MENU
|
||||
@ -2947,7 +2909,7 @@ _OnSetFocus(
|
||||
{
|
||||
gui_focus_change(TRUE);
|
||||
s_getting_focus = TRUE;
|
||||
(void)MyWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0);
|
||||
(void)DefWindowProcW(hwnd, WM_SETFOCUS, (WPARAM)hwndOldFocus, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -2957,7 +2919,7 @@ _OnKillFocus(
|
||||
{
|
||||
gui_focus_change(FALSE);
|
||||
s_getting_focus = FALSE;
|
||||
(void)MyWindowProc(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0);
|
||||
(void)DefWindowProcW(hwnd, WM_KILLFOCUS, (WPARAM)hwndNewFocus, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2971,7 +2933,7 @@ _OnActivateApp(
|
||||
{
|
||||
// we call gui_focus_change() in _OnSetFocus()
|
||||
// gui_focus_change((int)fActivate);
|
||||
return MyWindowProc(hwnd, WM_ACTIVATEAPP, fActivate, (DWORD)dwThreadId);
|
||||
return DefWindowProcW(hwnd, WM_ACTIVATEAPP, fActivate, (DWORD)dwThreadId);
|
||||
}
|
||||
|
||||
void
|
||||
@ -3244,10 +3206,6 @@ gui_mch_exit(int rc UNUSED)
|
||||
destroying = TRUE; // ignore WM_DESTROY message now
|
||||
DestroyWindow(s_hwnd);
|
||||
}
|
||||
|
||||
#ifdef GLOBAL_IME
|
||||
global_ime_end();
|
||||
#endif
|
||||
}
|
||||
|
||||
static char_u *
|
||||
@ -3399,13 +3357,9 @@ gui_mch_init_font(char_u *font_name, int fontset UNUSED)
|
||||
|
||||
if (font_name == NULL)
|
||||
font_name = (char_u *)lf.lfFaceName;
|
||||
#if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
norm_logfont = lf;
|
||||
#endif
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
sub_logfont = lf;
|
||||
#endif
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
if (!s_in_dpichanged)
|
||||
update_im_font();
|
||||
#endif
|
||||
@ -4550,7 +4504,7 @@ _OnWindowPosChanged(
|
||||
netbeans_frame_moved(x, y);
|
||||
}
|
||||
// Allow to send WM_SIZE and WM_MOVE
|
||||
FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, MyWindowProc);
|
||||
FORWARD_WM_WINDOWPOSCHANGED(hwnd, lpwpos, DefWindowProcW);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -4716,7 +4670,7 @@ _WndProc(
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
case WM_LBUTTONDBLCLK:
|
||||
{
|
||||
@ -4733,7 +4687,7 @@ _WndProc(
|
||||
if (pt.y < rect.top)
|
||||
send_tabline_menu_event(0, TABLINE_MENU_NEW);
|
||||
}
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -4773,7 +4727,7 @@ _WndProc(
|
||||
}
|
||||
#ifdef FEAT_MENU
|
||||
else
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
#endif
|
||||
|
||||
case WM_SYSKEYUP:
|
||||
@ -4782,7 +4736,7 @@ _WndProc(
|
||||
// that. But that caused problems when menu is disabled and using
|
||||
// Alt-Tab-Esc: get into a strange state where no mouse-moved events
|
||||
// are received, mouse pointer remains hidden.
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
#else
|
||||
return 0L;
|
||||
#endif
|
||||
@ -4923,7 +4877,7 @@ _WndProc(
|
||||
# ifdef FEAT_GUI_TABLINE
|
||||
if (gui_mch_showing_tabline()
|
||||
&& ((LPNMHDR)lParam)->hwndFrom == s_tabhwnd)
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
# endif
|
||||
break;
|
||||
}
|
||||
@ -4970,7 +4924,7 @@ _WndProc(
|
||||
int x, y;
|
||||
int xPos = GET_X_LPARAM(lParam);
|
||||
|
||||
result = MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
result = DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
if (result == HTCLIENT)
|
||||
{
|
||||
#ifdef FEAT_GUI_TABLINE
|
||||
@ -5002,12 +4956,12 @@ _WndProc(
|
||||
#ifdef FEAT_MBYTE_IME
|
||||
case WM_IME_NOTIFY:
|
||||
if (!_OnImeNotify(hwnd, (DWORD)wParam, (DWORD)lParam))
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
return 1L;
|
||||
|
||||
case WM_IME_COMPOSITION:
|
||||
if (!_OnImeComposition(hwnd, wParam, lParam))
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
return 1L;
|
||||
#endif
|
||||
case WM_DPICHANGED:
|
||||
@ -5019,10 +4973,10 @@ _WndProc(
|
||||
if (uMsg == s_findrep_msg && s_findrep_msg != 0)
|
||||
_OnFindRepl();
|
||||
#endif
|
||||
return MyWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -5366,9 +5320,6 @@ gui_mch_init(void)
|
||||
const WCHAR szVimWndClassW[] = VIM_CLASSW;
|
||||
const WCHAR szTextAreaClassW[] = L"VimTextArea";
|
||||
WNDCLASSW wndclassw;
|
||||
#ifdef GLOBAL_IME
|
||||
ATOM atom;
|
||||
#endif
|
||||
|
||||
// Return here if the window was already opened (happens when
|
||||
// gui_mch_dialog() is called early).
|
||||
@ -5412,11 +5363,7 @@ gui_mch_init(void)
|
||||
wndclassw.lpszMenuName = NULL;
|
||||
wndclassw.lpszClassName = szVimWndClassW;
|
||||
|
||||
if ((
|
||||
#ifdef GLOBAL_IME
|
||||
atom =
|
||||
#endif
|
||||
RegisterClassW(&wndclassw)) == 0)
|
||||
if (RegisterClassW(&wndclassw) == 0)
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
@ -5489,9 +5436,6 @@ gui_mch_init(void)
|
||||
//TRACE("System DPI: %d, DPI: %d", pGetDpiForSystem(), s_dpi);
|
||||
}
|
||||
|
||||
#ifdef GLOBAL_IME
|
||||
global_ime_init(atom, s_hwnd);
|
||||
#endif
|
||||
#if defined(FEAT_MBYTE_IME) && defined(DYNAMIC_IME)
|
||||
dyn_imm_load();
|
||||
#endif
|
||||
@ -6062,42 +6006,6 @@ im_get_status(void)
|
||||
|
||||
#endif // FEAT_MBYTE_IME
|
||||
|
||||
#if !defined(FEAT_MBYTE_IME) && defined(GLOBAL_IME)
|
||||
// Win32 with GLOBAL IME
|
||||
|
||||
/*
|
||||
* Notify cursor position to IM.
|
||||
*/
|
||||
void
|
||||
im_set_position(int row, int col)
|
||||
{
|
||||
// Win32 with GLOBAL IME
|
||||
POINT p;
|
||||
|
||||
p.x = FILL_X(col);
|
||||
p.y = FILL_Y(row);
|
||||
MapWindowPoints(s_textArea, s_hwnd, &p, 1);
|
||||
global_ime_set_position(&p);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set IM status on ("active" is TRUE) or off ("active" is FALSE).
|
||||
*/
|
||||
void
|
||||
im_set_active(int active)
|
||||
{
|
||||
global_ime_set_status(active);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get IM status. When IM is on, return not 0. Else return 0.
|
||||
*/
|
||||
int
|
||||
im_get_status(void)
|
||||
{
|
||||
return global_ime_get_status();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Convert latin9 text "text[len]" to ucs-2 in "unicodebuf".
|
||||
|
@ -750,6 +750,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4153,
|
||||
/**/
|
||||
4152,
|
||||
/**/
|
||||
|
@ -2252,17 +2252,15 @@ typedef enum {
|
||||
#endif
|
||||
|
||||
# if defined(FEAT_EVAL) \
|
||||
&& (!defined(FEAT_GUI_MSWIN) \
|
||||
|| !(defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
|
||||
&& (!defined(FEAT_GUI_MSWIN) || !defined(FEAT_MBYTE_IME))
|
||||
// Whether IME is supported by im_get_status() defined in mbyte.c.
|
||||
// For Win32 GUI it's in gui_w32.c when FEAT_MBYTE_IME or GLOBAL_IME is defined.
|
||||
// For Win32 GUI it's in gui_w32.c when FEAT_MBYTE_IME is defined.
|
||||
# define IME_WITHOUT_XIM
|
||||
#endif
|
||||
|
||||
#if defined(FEAT_XIM) \
|
||||
|| defined(IME_WITHOUT_XIM) \
|
||||
|| (defined(FEAT_GUI_MSWIN) \
|
||||
&& (defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)))
|
||||
|| (defined(FEAT_GUI_MSWIN) && defined(FEAT_MBYTE_IME))
|
||||
// im_set_active() is available
|
||||
# define HAVE_INPUT_METHOD
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user