#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;
void
global_ime_init(ATOM atom, HWND hWnd)
{
IUnknown *pI;
HRESULT hr;
if (pIApp != NULL || pIMsg != NULL)
return;
OleInitialize(NULL);
hr = CoCreateInstance(CLSID_CActiveIMM, NULL, CLSCTX_SERVER,
IID_IUnknown, (void**)&pI);
if (FAILED(hr) || !pI)
return;
hr = pI->QueryInterface(IID_IActiveIMMApp, (void**)&pIApp);
if (FAILED(hr))
pIApp = NULL;
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;
}
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();
}
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;
}
BOOL WINAPI
global_ime_TranslateMessage(CONST MSG *lpMsg)
{
if (pIMsg == NULL || pIMsg->OnTranslateMessage(lpMsg) == S_FALSE)
return TranslateMessage(lpMsg);
return TRUE;
}
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);
}
}
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
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);
}
}
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