📄 dic.c
字号:
/*
* This file is part of Saenaru.
*
* Copyright (C) 2003 Hye-Shik Chang. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Perky$
*/
/*++
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
Module Name:
DIC.C
++*/
#include <windows.h>
#include <immdev.h>
#include "saenaru.h"
#include "vksub.h"
#include "immsec.h"
int GetCandidateStringsFromDictionary(LPWSTR lpString, LPWSTR lpBuf, DWORD dwBufLen, LPTSTR szDicFileName);
BOOL GetAnsiPathName(LPCWSTR lpszUniPath,LPSTR lpszAnsiPath,UINT nMaxLen)
{
if (WideCharToMultiByte(CP_ACP,
WC_COMPOSITECHECK,
lpszUniPath,
-1,
lpszAnsiPath,
nMaxLen,
NULL,
NULL) != 0) {
return TRUE;
}
else {
return FALSE;
}
}
/**********************************************************************/
/* */
/* FlushText() */
/* */
/**********************************************************************/
void PASCAL FlushText(HIMC hIMC)
{
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
LPCANDIDATEINFO lpCandInfo;
TRANSMSG GnMsg;
if (!IsCompStr(hIMC))
return;
if (!(lpIMC = ImmLockIMC(hIMC)))
return;
if (IsCandidate(lpIMC))
{
//
// Flush candidate lists.
//
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
ClearCandidate(lpCandInfo);
ImmUnlockIMCC(lpIMC->hCandInfo);
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CLOSECANDIDATE;
GnMsg.lParam = 1;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
{
//
// Flush composition strings.
//
ClearCompStr(lpCompStr,CLR_RESULT_AND_UNDET);
ImmUnlockIMCC(lpIMC->hCompStr);
GnMsg.message = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
GnMsg.message = WM_IME_ENDCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
ImmUnlockIMC(hIMC);
}
/**********************************************************************/
/* */
/* RevertText() */
/* */
/**********************************************************************/
void PASCAL RevertText(HIMC hIMC)
{
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
LPCANDIDATEINFO lpCandInfo;
TRANSMSG GnMsg;
LPMYSTR lpread,lpstr;
if (!IsCompStr(hIMC))
return;
if (!(lpIMC = ImmLockIMC(hIMC)))
return;
if (IsCandidate(lpIMC))
{
//
// Flush candidate lists.
//
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
ClearCandidate(lpCandInfo);
ImmUnlockIMCC(lpIMC->hCandInfo);
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CLOSECANDIDATE;
GnMsg.lParam = 1;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
{
lpstr = GETLPCOMPSTR(lpCompStr);
lpread = GETLPCOMPREADSTR(lpCompStr);
/*
lHanToZen(lpstr,lpread,lpIMC->fdwConversion);
*/
//
// make attribute
//
lpCompStr->dwCursorPos = Mylstrlen(lpstr);
// DeltaStart is 0 at RevertText time.
lpCompStr->dwDeltaStart = 0;
lmemset(GETLPCOMPATTR(lpCompStr),ATTR_INPUT,Mylstrlen(lpstr));
lmemset(GETLPCOMPREADATTR(lpCompStr),ATTR_INPUT,Mylstrlen(lpread));
SetClause(GETLPCOMPCLAUSE(lpCompStr),Mylstrlen(lpstr));
SetClause(GETLPCOMPREADCLAUSE(lpCompStr),Mylstrlen(lpread));
lpCompStr->dwCompClauseLen = 8;
lpCompStr->dwCompReadClauseLen = 8;
//
// make length
//
lpCompStr->dwCompStrLen = Mylstrlen(lpstr);
lpCompStr->dwCompReadStrLen = Mylstrlen(lpread);
lpCompStr->dwCompAttrLen = Mylstrlen(lpstr);
lpCompStr->dwCompReadAttrLen = Mylstrlen(lpread);
//
// Generate messages.
//
GnMsg.message = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPALL | GCS_CURSORPOS | GCS_DELTASTART;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
ImmUnlockIMCC(lpIMC->hCompStr);
}
ImmUnlockIMC(hIMC);
}
/**********************************************************************/
/* */
/* ConvHanja() */
/* */
/* VK_HANJA Key handling function */
/* */
/**********************************************************************/
BOOL PASCAL ConvHanja(HIMC hIMC, int offset, UINT select)
{
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
MYCHAR szBuf[256+2];
int nBufLen;
LPMYSTR lpstr;
TRANSMSG GnMsg;
LPBYTE lpb;
OFSTRUCT ofs;
LPMYSTR lpT, lpT2;
int cnt;
BOOL bRc = FALSE;
WCHAR cs=0;
if ((GetFileAttributes(szDicFileName) == 0xFFFFFFFF) ||
(GetFileAttributes(szDicFileName) == FILE_ATTRIBUTE_DIRECTORY)) {
MakeGuideLine(hIMC,MYGL_NODICTIONARY);
}
if (!IsCompStr(hIMC))
return FALSE;
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (!(lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr)))
goto cvk_exit10;
if (!(lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo)))
goto cvk_exit20;
//
// Since IME handles all string as Unicode, convert the CompReadStr
// from Unicode into multibyte string. Also the dictionary holdsits data
// as Hiragana, so map the string from Katakana to Hiragana.
//
lpT2 = GETLPCOMPREADSTR(lpCompStr);
//
// Get the candidate strings from dic file.
//
szBuf[256] = 0; // Double NULL-terminate
szBuf[257] = 0; // Double NULL-terminate
Mylstrcpy(szBuf,lpT2); // add Hangul
szBuf[Mylstrlen(lpT2)] = 0;
nBufLen = GetCandidateStringsFromDictionary(lpT2, szBuf+Mylstrlen(lpT2)+1, 256, (LPTSTR)szDicFileName);
//
// Check the result of dic. Because my candidate list has only MAXCANDSTRNUM
// candidate strings.
//
lpT = &szBuf[0];
cnt = 0;
while(*lpT)
{
cnt++;
lpT += (Mylstrlen(lpT) + 1);
if (cnt > MAXCANDSTRNUM)
{
//
// The dic is too big....
//
goto cvk_exit40;
}
}
lpb = GETLPCOMPATTR(lpCompStr);
if (nBufLen < 1)
{
if (!*lpb)
{
//
// make attribute
//
lmemset(GETLPCOMPATTR(lpCompStr),ATTR_TARGET_CONVERTED ,
Mylstrlen(GETLPCOMPSTR(lpCompStr)));
lmemset(GETLPCOMPREADATTR(lpCompStr),ATTR_TARGET_CONVERTED,
Mylstrlen(GETLPCOMPREADSTR(lpCompStr)));
GnMsg.message = WM_IME_COMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = GCS_COMPSTR | GCS_CURSORPOS |
GCS_COMPATTR | GCS_COMPREADATTR;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
goto cvk_exit40;
}
lpstr = (LPMYSTR)szBuf;
if (!*lpb)
{
//
// String is not converted yet.
//
while (*lpstr)
{
if (0 != Mylstrcmp(lpstr,GETLPCOMPSTR(lpCompStr)))
{
set_compstr:
//
// Set the composition string to the structure.
//
Mylstrcpy(GETLPCOMPSTR(lpCompStr),lpstr);
if ((dwImeFlag & SAENARU_ONTHESPOT)&& Mylstrlen(lpstr) == 1)
cs = *lpstr;
lpstr = GETLPCOMPSTR(lpCompStr);
//
// Set the length and cursor position to the structure.
//
lpCompStr->dwCompStrLen = Mylstrlen(lpstr);
lpCompStr->dwCursorPos = 0;
// Because SAENARU does not support clause, DeltaStart is 0 anytime.
lpCompStr->dwDeltaStart = 0;
//
// make attribute
//
lmemset((LPBYTE)GETLPCOMPATTR(lpCompStr),
ATTR_TARGET_CONVERTED, Mylstrlen(lpstr));
lmemset((LPBYTE)GETLPCOMPREADATTR(lpCompStr),
ATTR_TARGET_CONVERTED,
Mylstrlen(GETLPCOMPREADSTR(lpCompStr)));
//
// make clause info
//
SetClause(GETLPCOMPCLAUSE(lpCompStr),Mylstrlen(lpstr));
SetClause(GETLPCOMPREADCLAUSE(lpCompStr),Mylstrlen(GETLPCOMPREADSTR(lpCompStr)));
lpCompStr->dwCompClauseLen = 8;
lpCompStr->dwCompReadClauseLen = 8;
//
// Generate messages.
//
GnMsg.message = WM_IME_COMPOSITION;
GnMsg.wParam = cs;
GnMsg.lParam = GCS_COMPALL | GCS_CURSORPOS | GCS_DELTASTART;
if (dwImeFlag & SAENARU_ONTHESPOT)
GnMsg.lParam |= CS_INSERTCHAR | CS_NOMOVECARET;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
bRc = TRUE;
goto cvk_exit40;
}
lpstr += (Mylstrlen(lpstr) + 1);
}
}
else
{
//
// String is converted, so that open candidate.
//
int i = 0;
int pages = 0;
LPDWORD lpdw;
//
// generate WM_IME_NOTFIY IMN_OPENCANDIDATE message.
//
if (!IsCandidate(lpIMC))
{
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_OPENCANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
//
// Make candidate structures.
//
lpCandInfo->dwSize = sizeof(MYCAND);
lpCandInfo->dwCount = 1;
lpCandInfo->dwOffset[0] =
(DWORD)((LPSTR)&((LPMYCAND)lpCandInfo)->cl - (LPSTR)lpCandInfo);
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
lpdw = (LPDWORD)&(lpCandList->dwOffset);
while (*lpstr)
{
lpCandList->dwOffset[i] =
(DWORD)((LPSTR)((LPMYCAND)lpCandInfo)->szCand[i] - (LPSTR)lpCandList);
Mylstrcpy((LPMYSTR)((LPSTR)lpCandList+lpCandList->dwOffset[i]),lpstr);
lpstr += (Mylstrlen(lpstr) + 1);
i++;
}
lpCandList->dwSize = sizeof(CANDIDATELIST) +
(MAXCANDSTRNUM * (sizeof(DWORD) + MAXCANDSTRSIZE));
lpCandList->dwStyle = IME_CAND_READ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -