📄 subs.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:
SUBS.C
++*/
/**********************************************************************/
#include <windows.h>
#include "immdev.h"
#include "saenaru.h"
/**********************************************************************/
/* */
/* InitCompStr() */
/* */
/**********************************************************************/
void PASCAL InitCompStr(LPCOMPOSITIONSTRING lpCompStr,DWORD dwClrFlag)
{
lpCompStr->dwSize = sizeof(MYCOMPSTR);
if (dwClrFlag & CLR_UNDET)
{
lpCompStr->dwCompReadAttrOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->bCompReadAttr - (LONG_PTR) lpCompStr);
lpCompStr->dwCompReadClauseOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->dwCompReadClause - (LONG_PTR)lpCompStr);
lpCompStr->dwCompReadStrOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->szCompReadStr - (LONG_PTR)lpCompStr);
lpCompStr->dwCompAttrOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->bCompAttr - (LONG_PTR)lpCompStr);
lpCompStr->dwCompClauseOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->dwCompClause - (LONG_PTR)lpCompStr);
lpCompStr->dwCompStrOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->szCompStr - (LONG_PTR)lpCompStr);
lpCompStr->dwCompStrLen = 0;
lpCompStr->dwCompReadStrLen = 0;
lpCompStr->dwCompAttrLen = 0;
lpCompStr->dwCompReadAttrLen = 0;
lpCompStr->dwCompClauseLen = 0;
lpCompStr->dwCompReadClauseLen = 0;
*GETLPCOMPSTR(lpCompStr) = MYTEXT('\0');
*GETLPCOMPREADSTR(lpCompStr) = MYTEXT('\0');
lpCompStr->dwCursorPos = 0;
}
if (dwClrFlag & CLR_RESULT)
{
lpCompStr->dwResultStrOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->szResultStr - (LONG_PTR)lpCompStr);
lpCompStr->dwResultClauseOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->dwResultClause - (LONG_PTR)lpCompStr);
lpCompStr->dwResultReadStrOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->szResultReadStr - (LONG_PTR)lpCompStr);
lpCompStr->dwResultReadClauseOffset =
(DWORD) ((LONG_PTR)((LPMYCOMPSTR)lpCompStr)->dwResultReadClause - (LONG_PTR)lpCompStr);
lpCompStr->dwResultStrLen = 0;
lpCompStr->dwResultClauseLen = 0;
lpCompStr->dwResultReadStrLen = 0;
lpCompStr->dwResultReadClauseLen = 0;
*GETLPRESULTSTR(lpCompStr) = MYTEXT('\0');
*GETLPRESULTREADSTR(lpCompStr) = MYTEXT('\0');
}
}
/**********************************************************************/
/* */
/* ClearCompStr() */
/* */
/**********************************************************************/
void PASCAL ClearCompStr(LPCOMPOSITIONSTRING lpCompStr,DWORD dwClrFlag)
{
lpCompStr->dwSize = sizeof(MYCOMPSTR);
if (dwClrFlag & CLR_UNDET)
{
lpCompStr->dwCompStrOffset = 0;
lpCompStr->dwCompClauseOffset = 0;
lpCompStr->dwCompAttrOffset = 0;
lpCompStr->dwCompReadStrOffset = 0;
lpCompStr->dwCompReadClauseOffset = 0;
lpCompStr->dwCompReadAttrOffset = 0;
lpCompStr->dwCompStrLen = 0;
lpCompStr->dwCompClauseLen = 0;
lpCompStr->dwCompAttrLen = 0;
lpCompStr->dwCompReadStrLen = 0;
lpCompStr->dwCompReadClauseLen = 0;
lpCompStr->dwCompReadAttrLen = 0;
((LPMYCOMPSTR)lpCompStr)->szCompStr[0] = MYTEXT('\0');
((LPMYCOMPSTR)lpCompStr)->szCompReadStr[0] = MYTEXT('\0');
lpCompStr->dwCursorPos = 0;
}
if (dwClrFlag & CLR_RESULT)
{
lpCompStr->dwResultStrOffset = 0;
lpCompStr->dwResultClauseOffset = 0;
lpCompStr->dwResultReadStrOffset = 0;
lpCompStr->dwResultReadClauseOffset = 0;
lpCompStr->dwResultStrLen = 0;
lpCompStr->dwResultClauseLen = 0;
lpCompStr->dwResultReadStrLen = 0;
lpCompStr->dwResultReadClauseLen = 0;
((LPMYCOMPSTR)lpCompStr)->szResultStr[0] = MYTEXT('\0');
((LPMYCOMPSTR)lpCompStr)->szResultReadStr[0] = MYTEXT('\0');
}
}
/**********************************************************************/
/* */
/* ClearCandidate() */
/* */
/**********************************************************************/
void PASCAL ClearCandidate(LPCANDIDATEINFO lpCandInfo)
{
lpCandInfo->dwSize = 0L;
lpCandInfo->dwCount = 0L;
lpCandInfo->dwOffset[0] = 0L;
((LPMYCAND)lpCandInfo)->cl.dwSize =0L;
((LPMYCAND)lpCandInfo)->cl.dwStyle =0L;
((LPMYCAND)lpCandInfo)->cl.dwCount =0L;
((LPMYCAND)lpCandInfo)->cl.dwSelection =0L;
((LPMYCAND)lpCandInfo)->cl.dwPageStart =0L;
((LPMYCAND)lpCandInfo)->cl.dwPageSize =0L;
((LPMYCAND)lpCandInfo)->cl.dwOffset[0] =0L;
}
/**********************************************************************/
/* */
/* ChangeMode() */
/* */
/* return value: fdwConversion */
/* */
/**********************************************************************/
void PASCAL ChangeMode(HIMC hIMC, DWORD dwToMode)
{
LPINPUTCONTEXT lpIMC;
DWORD fdwConversion;
TRANSMSG GnMsg;
BOOL fOpen;
if (!(lpIMC = ImmLockIMC(hIMC)))
return;
fdwConversion = lpIMC->fdwConversion;
switch (dwToMode)
{
case TO_CMODE_ALPHANUMERIC:
fdwConversion = (fdwConversion & ~IME_CMODE_LANGUAGE);
break;
case TO_CMODE_HANGUL:
// XXX turn off FULLSHAPE
if (fdwConversion & IME_CMODE_FULLSHAPE)
fdwConversion &= ~IME_CMODE_FULLSHAPE;
// Toggle CHAR MODE to the HANGUL composition mode
if (fdwConversion & IME_CMODE_HANGUL) {
ImmSetOpenStatus(hIMC,FALSE);
fdwConversion &= ~IME_CMODE_HANGUL;
fdwConversion = (fdwConversion & ~IME_CMODE_LANGUAGE);
} else {
ImmSetOpenStatus(hIMC,TRUE);
fdwConversion &= ~IME_CMODE_LANGUAGE;
fdwConversion |= (IME_CMODE_NATIVE | IME_CMODE_HANGUL);
}
break;
/*
case TO_CMODE_HIRAGANA:
fdwConversion =
((fdwConversion & ~IME_CMODE_LANGUAGE) | IME_CMODE_NATIVE);
fdwConversion |= IME_CMODE_FULLSHAPE;
break;
case TO_CMODE_FULLSHAPE:
if (fdwConversion & IME_CMODE_FULLSHAPE)
{
// To SBCS mode.
fdwConversion &= ~IME_CMODE_FULLSHAPE;
// If hiragana mode, make it katakana mode.
if ((fdwConversion & IME_CMODE_LANGUAGE) == IME_CMODE_NATIVE)
fdwConversion |= (IME_CMODE_NATIVE | IME_CMODE_HANGUL);
}
else
{
// To DBCS mode.
fdwConversion |= IME_CMODE_FULLSHAPE;
}
break;
*/
case TO_CMODE_ROMAN:
if (fdwConversion & IME_CMODE_ROMAN)
fdwConversion &= ~IME_CMODE_ROMAN;
else
fdwConversion |= IME_CMODE_ROMAN;
break;
case TO_CMODE_CHARCODE:
break;
case TO_CMODE_TOOLBAR:
break;
default:
break;
}
if (lpIMC->fdwConversion != fdwConversion)
{
lpIMC->fdwConversion = fdwConversion;
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_SETCONVERSIONMODE;
GnMsg.lParam = 0L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
ImmUnlockIMC(hIMC);
return;
}
/**********************************************************************/
/* */
/* ChangeCompStr() */
/* */
/**********************************************************************/
void PASCAL ChangeCompStr(HIMC hIMC, DWORD dwToMode)
{
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
DWORD fdwConversion;
TRANSMSG GnMsg;
HANDLE hDst;
LPMYSTR lpSrc;
LPMYSTR lpDst;
LPMYSTR lpSrc0;
LPMYSTR lpDst0;
WORD wCode;
BOOL fChange = FALSE;
if (!(lpIMC = ImmLockIMC(hIMC)))
return;
if (!(lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr)))
goto ccs_exit40;
fdwConversion = lpIMC->fdwConversion;
if (!(hDst = GlobalAlloc(GHND,(lpCompStr->dwCompStrLen+1)*sizeof(WCHAR))))
goto ccs_exit30;
if (!(lpDst = GlobalLock(hDst)))
goto ccs_exit20;
switch (dwToMode)
{
case TO_CMODE_ALPHANUMERIC:
break;
case TO_CMODE_HANGUL:
lpSrc = ((LPMYCOMPSTR)lpCompStr)->szCompStr;
lpSrc0 = lpSrc;
lpDst0 = lpDst;
while (*lpSrc)
{
*lpDst++ = *lpSrc; // XXX
lpSrc++;
}
Mylstrcpy (lpSrc0,lpDst0);
lpCompStr->dwCompStrLen = Mylstrlen(lpSrc0);
fChange = TRUE;
break;
/*
lpSrc = ((LPMYCOMPSTR)lpCompStr)->szCompStr;
lpSrc0 = lpSrc;
lpDst0 = lpDst;
while (*lpSrc)
{
*lpDst++ = HiraToKata(*lpSrc);
lpSrc++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -