📄 hangul.c
字号:
max = mid - 1;
else
return compose_table[mid].code;
}
return 0;
}
static WCHAR *keyboard_table= (WCHAR *)keyboard_table_2;
static WCHAR keyboard_table_user[94];
static int (*hangul_automata)(HangulIC*, WCHAR, WCHAR*)= hangul_automata2;
int PASCAL set_keyboard(UINT type)
{
INT atype;
INT ctype;
switch (type)
{
case LAYOUT_OLD2BUL:
keyboard_table=(WCHAR *)keyboard_table_2;
atype=2;
ctype=0;
break;
case LAYOUT_3FIN:
keyboard_table=(WCHAR *)keyboard_table_3final;
atype=3;
ctype=0;
break;
case LAYOUT_390:
keyboard_table=(WCHAR *)keyboard_table_390;
atype=3;
ctype=0;
break;
case LAYOUT_3SUN:
keyboard_table=(WCHAR *)keyboard_table_3sun;
atype=3;
ctype=0;
break;
case LAYOUT_NEW2BUL:
atype=
load_keyboard_map_from_reg(TEXT("货滴国"),0,keyboard_table_user);
if (atype)
keyboard_table=keyboard_table_user;
ctype=0;
break;
case LAYOUT_NEW3BUL:
atype=
load_keyboard_map_from_reg(TEXT("货技国"),0,keyboard_table_user);
if (atype)
keyboard_table=keyboard_table_user;
ctype=0;
break;
case LAYOUT_AHNMATAE:
atype=
load_keyboard_map_from_reg(TEXT("救付怕"),0,keyboard_table_user);
if (atype)
keyboard_table=keyboard_table_user;
ctype=3;
break;
#if 0
case LAYOUT_3YET:
keyboard_table=(WCHAR *)keyboard_table_3yet;
atype=3;
ctype=0;
break;
#endif
default:
// User defined keyboard
#define USER_DEFINED_KEYBOARD_OFFSET 8
type-=USER_DEFINED_KEYBOARD_OFFSET;
atype=
load_keyboard_map_from_reg(NULL,type,keyboard_table_user);
if (atype)
keyboard_table=keyboard_table_user;
else
keyboard_table=(WCHAR *)keyboard_table_2;
ctype=0;
break;
}
set_automata(atype);
set_compose(ctype);
return 0;
}
int PASCAL set_automata(UINT type)
{
if (type == 0 || type == 1)
return 0;
if (type == 2)
hangul_automata=hangul_automata2;
else if (type == 3)
hangul_automata=hangul_automata3;
else
hangul_automata=hangul_automata2;
return 0;
}
WCHAR PASCAL keyToHangulKey(code)
WORD code;
{
WORD key;
if (code >= MYTEXT('!') && code <= MYTEXT('~'))
{
return keyboard_table[code - MYTEXT('!')];
}
return 0;
}
void PASCAL hangulKeyHandler( hIMC, wParam, lParam, lpbKeyState)
HIMC hIMC;
WPARAM wParam;
LPARAM lParam;
LPBYTE lpbKeyState;
{
WORD code = (WORD) HIWORD(wParam);
LPMYSTR lpchText;
LPMYSTR lpstr, lpread;
LPMYSTR lpprev;
DWORD fdwConversion;
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
DWORD dwStrLen;
DWORD dwSize;
TRANSMSG GnMsg;
DWORD dwGCR = 0L;
DWORD hkey;
WCHAR cs = 0;
register BOOL fModeInit = FALSE;
lpIMC = ImmLockIMC(hIMC);
hkey = keyToHangulKey( code );
#if 1
if ( (!hkey || (hkey >= TEXT('!') && hkey <= TEXT('~')) )
&& !IsCompStr(hIMC)) {
// 捞 版快 付瘤阜 涝仿罐篮 ascii巩磊甫 弊措肺 郴柜绰促.
PostMessage(lpIMC->hWnd,WM_CHAR,hkey,lParam);
ImmUnlockIMC(hIMC);
return;
}
#endif
if (ImmGetIMCCSize(lpIMC->hCompStr) < sizeof (MYCOMPSTR))
{
// Init time.
dwSize = sizeof(MYCOMPSTR);
lpIMC->hCompStr = ImmReSizeIMCC(lpIMC->hCompStr,dwSize);
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
lpCompStr->dwSize = dwSize;
fModeInit=TRUE;
hangul_ic_init(&ic);
}
else
{
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
}
dwStrLen = lpCompStr->dwCompStrLen;
if (!dwStrLen)
{
// 檬扁拳
InitCompStr(lpCompStr,CLR_RESULT_AND_UNDET);
GnMsg.message = WM_IME_STARTCOMPOSITION;
GnMsg.wParam = 0;
GnMsg.lParam = 0;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
hangul_ic_init(&ic);
}
if (IsConvertedCompStr(hIMC))
{
MakeResultString(hIMC,FALSE);
InitCompStr(lpCompStr,CLR_UNDET);
dwGCR = GCS_RESULTALL;
hangul_ic_init(&ic);
}
// Get ConvMode from IMC.
fdwConversion = lpIMC->fdwConversion;
// Init lpstr
lpchText = GETLPCOMPSTR(lpCompStr);
lpstr = lpchText;
if( lpCompStr->dwCursorPos )
lpstr += lpCompStr->dwCursorPos;
lpstr = lpchText + Mylstrlen(lpchText);
lpprev = MyCharPrev( lpchText, lpstr );
if ( hkey )
{
MyDebugPrint((TEXT("hkey: 0x%x -> 0x%x\r\n"), code, hkey));
// MODE_CHARCODE
if( fdwConversion & IME_CMODE_CHARCODE )
{
MyDebugPrint((TEXT("char code: %x\r\n"), hkey));
code = (WORD)(LONG_PTR)AnsiUpper( (LPSTR)(LONG_PTR)code );
if( !( (code >= MYTEXT('0') && code <= MYTEXT('9')) ||
(code >= MYTEXT('A') && code <= MYTEXT('F')) ) || lpCompStr->dwCursorPos >= 4 ){
MessageBeep( 0 );
goto ac_exit;
}
*lpstr++ = (BYTE)code;
lpCompStr->dwCursorPos++;
} else if ( (hkey >= 0x1100 && hkey <= 0x11c2) &&
!(dwOptionFlag & FULL_MULTIJOMO) &&
(fdwConversion & IME_CMODE_NATIVE) )
{
int ret;
MyDebugPrint((TEXT("input jamo: %x\r\n"), hkey));
ret = hangul_automata(&ic, (WCHAR) hkey, &cs);
ic.lastvkey = (UINT)VkKeyScan(code);
if (cs)
{
// not composable. emit hangul syllable
*(lpstr - 1) = cs;
if (dwImeFlag & SAENARU_ONTHESPOT)
{
dwGCR=GCS_RESULTALL;
MakeResultString(hIMC,FALSE);
InitCompStr(lpCompStr,CLR_UNDET);
lpchText = GETLPCOMPSTR(lpCompStr);
lpstr = lpchText;
if( lpCompStr->dwCursorPos )
lpstr += lpCompStr->dwCursorPos;
lpstr = lpchText + Mylstrlen(lpchText);
lpprev = MyCharPrev( lpchText, lpstr );
}
lpstr++;
lpCompStr->dwCursorPos++;
}
if (ret <= 0) {
cs = hangul_ic_get(&ic,0);
*(lpstr - 1) = cs;
} else {
// new hangul composition
cs = hangul_ic_get(&ic,0);
*lpstr++ = cs;
lpCompStr->dwCursorPos++;
}
}
else
{
if (!hkey) hkey = code;
MyDebugPrint((TEXT("ascii code: %x\r\n"), (WORD)hkey));
*lpstr++ = (WORD)hkey;
lpCompStr->dwCursorPos++;
}
*lpstr = MYTEXT('\0');
}
else // Non transtated key as ', . ;' etc.
{
MyDebugPrint((TEXT("RAW code: %x\r\n"), code));
#if 1
hangul_ic_init(&ic);
// if (code == 0xd) code = '\n';
// 捞 规侥栏肺 府畔虐甫 静搁 葛龙扼, vim 殿殿俊辑 葛滴 登菌栏唱,
// 葛龙扼俊辑父 力措肺 登瘤 臼绰 巩力肺 牢窍咯 keybd_event()甫 借促.
*lpstr++ = (BYTE)code;
lpCompStr->dwCursorPos++;
#endif
*lpstr = MYTEXT('\0');
}
// make reading string.
lpstr = GETLPCOMPSTR(lpCompStr);
lpread = GETLPCOMPREADSTR(lpCompStr);
MyDebugPrint((TEXT("CompReadStr %s\n"),lpread));
Mylstrcpy(lpread,lpstr);
// make attribute
// lpCompStr->dwCursorPos = Mylstrlen(lpstr);
lpCompStr->dwDeltaStart =
(DWORD)(MyCharPrev(lpstr, lpstr+Mylstrlen(lpstr)) - lpstr);
//MakeAttrClause(lpCompStr);
lmemset((LPBYTE)GETLPCOMPATTR(lpCompStr),ATTR_INPUT, Mylstrlen(lpstr));
lmemset((LPBYTE)GETLPCOMPREADATTR(lpCompStr),ATTR_INPUT, Mylstrlen(lpread));
// make length
lpCompStr->dwCompStrLen = Mylstrlen(lpstr);
lpCompStr->dwCompReadStrLen = Mylstrlen(lpread);
lpCompStr->dwCompAttrLen = Mylstrlen(lpstr);
lpCompStr->dwCompReadAttrLen = Mylstrlen(lpread);
if (lpCompStr->dwCompReadStrLen > 0)
lpCompStr->dwCompReadStrLen--;
/* R
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -