⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hangul.c

📁 手机上的韩文输入法 saenaru20031212.zip
💻 C
📖 第 1 页 / 共 5 页
字号:
            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 + -