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

📄 afce_zi.c

📁 用于嵌入式系统的输入法程序 里面有完整的系统实现原码
💻 C
📖 第 1 页 / 共 5 页
字号:
  /***************************************************************************
 *
 *                    TPL GSM Phase 2 Application Layer
 *
 *                      Copyright (c) 1999 ZTE
 *
 ***************************************************************************
 *
 *  $Workfile:   afCE_zi.c
 *  $Revision:
 *      $Date:   June 2000
 *
 ***************************************************************************
 *
 *  Designed by    :
 *  Coded by       : wangtianhong
 *  Tested by      :
 *
 ***************************************************************************
 *
 * File Description
 * ----------------
 * Application Layer Foreground ChineseInput- edit handler
 *
 *
 *V2.0   林涛 2003-8-7 11:16 每页显示8个,输入下一个时不退出
  v3.0   林涛 2003-8-28 12:50 代码重新整理
  AFCE_ZI000   林涛 2003-9-24 15:02 设置一个标志位,只有处理完一个按键信号以后,才去真正处理下一个按键信号。
                                    如果没有处理完上一个按键信号就收到下一个就直接返回。
                                    同时在dlpad.c中让L1不要发送按键信号。双保险。
                          原因:由于ZI取字的函数比较耗时,如果在笔画输入时连续按9键,
                          每次取字的时间较长(尤其时输入9的长度大于17以后),其他的按键信号就
                          可能一直排在队列里等待处理,就可能溢出导致死机。
  AFCE_ZI001   林涛 2003-9-25 10:02 E输入法下,一键也有内容,可以输入.com,.edu等。
  AFCE_ZI002   林涛  2003-9-28 9:23 优化代码,由于字源取字的速度比较慢,应该减少字源取字的频率。
  AFCE_ZI003   林涛  2003-10-8 10:23 maxPyCountInThisPage函数修改,有一个BUG。
  AFCE_ZI004   林涛  2003-10-10 10:23 对于按键输入错误的处理方式修改,使得ZI取字更少,而且REFRESH更加保证正确
  AFCE_ZI005   林涛  2004-3-3 9:24  智能英语输入的时候,如果输入一个字符,会显示*,按照徐颖的修改解决这一问题
  AFCE_ZI006   林涛  2004-3-23 16:46  更新为V6以后,发现ZI的返回有些问题,按照徐颖的修改解决打些补丁
 ****************************************************************************/



/***************************************************************************
 * Include Files
 ***************************************************************************/

#if !defined(APPLAYER_H)
#   include "applayer.h"
#endif
#if !defined(AFSIGNAL_H)
#   include "afsignal.h"
#endif
#if !defined(AFSH_FNC_H)
#   include "afsh_fnc.h"
#endif
#if !defined(AFGL_FNC_H)
#   include "afgl_fnc.h"
#endif
#if !defined(AFLC_FNC_H)
#   include"aflc_fnc.h"
#endif
#if !defined(AFCE_LCL_H)
#   include "afce_lcl.h"
#endif
#if !defined (AGDM_FNC_H)
#include "agdm_fnc.h"
#endif
#if !defined (AGCS_LCL_H)
#include "agcs_lcl.h"
#endif
#if !defined (ENTER_M_H)
#include "enter_m.h"
#endif
#if !defined (UT_UCS2_H)
#include "ut_ucs2.h"
#endif
#if !defined (AGSH_FNC_H)
#include "agsh_fnc.h"
#endif
#if !defined(AGIMELEM_H)
#  include "agimelem.h"
#endif

#if !defined (AFTL_LCL_H)
#include "aftl_lcl.h"
#endif
#if defined (UPGRADE_AUDIO_MANAGER)
  #if !defined (AGAU_FNC_H)
    # include "agau_fnc.h"
  #endif
#endif
#include <stdio.h>
#include <string.h>

#include <stdlib.h>

/* Zi provided include files */
#include "zi8api.h"

#if !defined(GDDI2FNC_H)
#  include "gddi2fnc.h"
#endif

#include "afsh_sig.h"

/******************************************************************************
* macro
*******************************************************************************/

#define ZI8_BASE_ALPHA    0x00f0
#define ZI8_ALPHA_KEY1    1
#define ZI8_ALPHA_KEY2    2
#define ZI8_ALPHA_KEY3    3
#define ZI8_ALPHA_KEY4    4
#define ZI8_ALPHA_KEY5    5
#define ZI8_ALPHA_KEY6    6
#define ZI8_ALPHA_KEY7    7
#define ZI8_ALPHA_KEY8    8
#define ZI8_ALPHA_KEY9    9
#define ZI8_ALPHA_KEYSTAR 10
#define ZI8_ALPHA_KEY0    11
#define ZI8_ALPHA_KEYHASH 12

#define MAX_PY_PAGE_NUM   20      /*最多支持20页拼音和SE*/
#define MAX_PY_PAGE_SIZE  5      /*每页显示的最多5个拼音*/
#define MAX_HZ_PAGE_SIZE  8      /*每页最多显示8个汉字*/



//#define MAX_CANDIDATES_BUFFER_SIZE      8     /*得到的候选字最大个数*/
//#define MAX_PINYIN_CANDIDATES_BUFFE_SIZE  4  /*ONLY DISPLAY 4 PINYIN IN PINYIN DISPLAY AREA*/
#define MAX_WORD_LENGTH_SIZE            16 /*最多16级联想,这个现在没有做,只支持单字联想*/

#define MAX_ELEMENT_BUFFER_SIZE         24 
/*根据谢震春和ZI商议的结果,这个值取64,因为这个BUFFER被ZI的库用做别的用途了*/
#define MAX_CANDIDATES_BUFFER_SIZE      64
/*#define SCRATCH_SIZE 250*/

extern GddiRgb gddiDefaultForegroundCol;




/******************************************************************************
* types
*******************************************************************************/
typedef enum ImeStateTag
{
    IME_STATE_PY_INPUT,              /*拼音输入状态*/
    IME_STATE_PY_HZ_SELECT,          /*拼音输入后汉字选择状态*/
    IME_STATE_BISHUN_INPUT,          /*笔顺输入状态,和汉字选择状态在一起*/
    IME_STATE_COMPONENT_INPUT,       /*部件输入状态,和汉字选择状态在一起*/
    IME_STATE_SE_INPUT,              /*智能英语状态*/
    IME_STATE_ASSOCIATION_SELECT,    /*选字以后的联想状态*/    
    NUMBER_OF_IME_STATE  
}ImeState;


typedef struct PyOrSEGroupInfoTag  /* 当前的一组拼音信息*/
{
    Int16    firstPosInLib;   /*这组的第一个拼音是LIB中的第几个*/
    Int16    lastPosInLib;    /*这组的最后一个拼音是LIB中的第几个*/
    Int16    currentPosInLib; /*当前选中拼音是LIB中的第几个*/  
    /*从ZI库里取出的一组拼音或SE,保存在全局变量里,这样在左右键选下一个拼音或SE的时候就不用再取值了,
    最多的英文字母是32个吧*/
    ZI8WCHAR groupData[MAX_PY_PAGE_SIZE+1][33];  
    Boolean  noNextPage;        /*判断一下后面还有没有拼音了,用来显示上下箭头*/
}PyOrSEGroupInfo;


typedef struct HzGroupInfoTag          /*根据拼音取得的一组汉字信息*/
{
    Int16        beginHzInLib;           /*这组的第一个汉字是LIB中的第几个*/
    Int16        currentHzIndex;         /*这组的最后一个汉字是LIB中的第几个*/
    Int16        endHzInLib;           /*这组的最后一个汉字是LIB中的第几个*/ 
    Int8         pageNo;                /*当前这一组是第几页*/
    AgCharCode   currentSelHz[MAX_HZ_PAGE_SIZE+1];   /*将当前一组汉字全都保存在这里,用于显示*/  
    
    Boolean      bNoNextPage;        /*判断一下后面还有没有汉字了,用来决定按向下箭头是否还要取字*/
}HzGroupInfo;

/* ChineseInput Handler's local data structure */
typedef struct chiEditContextTag
{
    HandlerId                 myHandlerId;      /* own handler Id */
    HandlerId                 parentHandlerId;  /* parent handler Id */
    HandlerId                 childHandlerId;   /* child handler Id */
    HandlerId                 signinputHandlerId;/*符号输入*/
    
    AfChineseInputMethod      chineseInputMethod;/*输入法*/  
    AfChineseInputSigBody     dataFromParent;/*从编辑HANDLER传来的东西,其实就是一个KEY EVENT*/
    
    
    Int8                      inputSerial;          /*输入了几个符号?????????*/
    Int8                      inputValue[31];    /*用户输入的东西保存在这里*/  
    AgCharCode                currentPyBsh[43];  /*显示在屏幕上的py或笔顺*/
    HzGroupInfo               currentHzGroupInfo;   /*根据拼音取得的一组汉字信息*/
    
    PyOrSEGroupInfo           currentPyOrSEGroupInfo;         /* 当前的一组拼音信息*/    
    ImeState                  imeState;           /*当前的输入状态*/
/*WJ 2001/5/30 add*/
 /*AFCE_ZI002,将非法的按键组合保存在这里,以后就可以直接在这个里面比较,而不用总去库里比较了*/
    Int8                      invalidSEkeyTable[10];      
/*WJ 2001/5/30 end*/  
    Int8                      pyOrSEgroupNumTable[MAX_PY_PAGE_NUM]; /*记录了每一组显示的拼音和SE有多少个*/
    Int8                      pyOrSEcurrentPageNo;  /*记录当前的拼音或SE是第几页*/
    
    
    AgElementId     arrowicon;/*上下箭头的hole*/
    /*判断是否选择了汉字,这是为了通知EDITOR那边刷新编辑区,将我们选择的hz显示在屏幕上*/
    AgCharCode      prompString[31];/*显示在屏幕上的py或笔顺*/
    Boolean         keyValid;
    Boolean         updateCompleted;/*刷新完成的标志位。然后才可以再响应按键*/
    
}
chiEditContext;
static Boolean         ziGetCompleted= TRUE;/*字源取字完成的标志位。然后才可以再响应按键*/

static AfHzExitDataBody  hzExitDataBody;

/***********************************************************************
* global variable
************************************************************************/
extern EnterMethod currentEnterMethod;
/* static variables */
ZI8GETPARAM zi8param;   /* structure that controls the candidate selection
                           process */
/* roughly decide the size */
ZI8WCHAR candidatesBuffer[MAX_CANDIDATES_BUFFER_SIZE];/*64*/   
ZI8WCHAR wordBuffer[MAX_WORD_LENGTH_SIZE];/*这个值有问题????????*/
ZI8WCHAR elementBuffer[MAX_ELEMENT_BUFFER_SIZE]; /*24*/
ZI8UCHAR SelectedLanguage;
ZI8UCHAR SelectedSubLanguage;
ZI8UCHAR SelectedInputMethod;


/*************************************************************************
*  function prototypes
**************************************************************************/
PRIVATE void
afHandlerIme (SignalBuffer  *signalBuffer_p,
                       HandlerId     handlerId,
                       HandlerMemoryRecord *handlerMemoryRecord_p);
                       
static void
afImeRefresh (chiEditContext   *chiContext_p);

static void
afImeEvents ( chiEditContext   *chiContext_p,
                      SignalBuffer  *signalBuffer_p);


static Boolean  
afImeInputEvents      ( chiEditContext   *chiContext_p,
                        AgshEventInd      *eventInd_p);

static Int8 maxPyCountInThisPage(chiEditContext *chiContext_p);/*计算可以返回几个拼音或SE*/
static Boolean afGetPyGroup(chiEditContext  *chiContext_p);  /*取一组拼音*/
static Boolean afGetPyHzGroup(chiEditContext  *chiContext_p);/*根据当前选择的拼音取汉字*/
static Boolean afGetBhHzInfo(chiEditContext  *chiContext_p);
static Boolean afGetStrokeHzInfo(chiEditContext  *chiContext_p);
static Boolean afGetSmartEnGroup(chiEditContext  *chiContext_p);
static Boolean  
afImeClearEvent      ( chiEditContext   *chiContext_p,SignalBuffer  *signalBuffer_p);
static Boolean
afImeSelectEvent     ( chiEditContext   *chiContext_p,SignalBuffer  *signalBuffer_p);
static Boolean 
afImeScrollUpEvent   ( chiEditContext   *chiContext_p, SignalBuffer  *signalBuffer_p);
static Boolean 
afImeScrollDownEvent ( chiEditContext   *chiContext_p, SignalBuffer  *signalBuffer_p);
static Boolean 
afImeScrollRightEvent( chiEditContext   *chiContext_p, SignalBuffer  *signalBuffer_p);
static Boolean 
afImeScrollLeftEvent( chiEditContext   *chiContext_p, SignalBuffer  *signalBuffer_p);
                       

static void afConvertWmToPy(chiEditContext  *chiContext_p);
static void afConvertWmToBh(chiEditContext  *chiContext_p);
static void afConvertWmToEn(chiEditContext *chiContext_p);
static void afSelHz(chiEditContext  *chiContext_p);
static Boolean afClearInput(chiEditContext *chiContext_p);
static void afInitContext(chiEditContext   *chiContext_p);

ZI8UCHAR Zi8GetCandidates(PZI8GETPARAM pGetParam);
/*ZI8BOOL Zi8SetMaxLength(ZI8UCHAR length);*/
ZI8BOOL Zi8IsComponent(ZI8WCHAR Character);
void Zi8GetAlphaWord(ZI8UCHAR language, ZI8WCHAR wc,
							PZI8UCHAR szString, ZI8UCHAR size);

ZI8FUNCTION ZI8BOOL  Zi8SetMaxNamesInUse  ( ZI8USHORT usMaxSize );/*wth 2001-03-14*/	

void afUpdateEnterMethod(AfHanziInputState * afHanziInputState_p); 	
Boolean afglExtendedAddUniCodeEvents(Int16            charUniCode,
                                  AfglDisplayDesc  *displayDesc_p);					

static  Int8 GetGlyphWidth(AgCharCode agchar);
/**************************************************************************
* Chinese Input Screen refresh
***************************************************************************/
static void
afImeRefresh (chiEditContext   *chiContext_p)
{
     
    GddiRect        clipRect;
    AgElementLabel  elementLabel = nullElementLabel;
    Int8            index;     
    GddiCoOrd       abs,abs2;  /*绝对坐标*/
    GddiRgb         savedFgColour,savedBgColour;  /*原来前景,背景颜色都是全局变量*/
    AgfoGlyphInfo   *glyph_p;  
    int i ,blankcount,xInvertPos;
    Int8 refreshFlag;
    /*按键有效才会刷新屏幕,否则不变*/
    /* AFCE_ZI004,如果按键错误干脆不发刷新信号*/
    //if (chiContext_p->keyValid == TRUE)
    {
         agdmSetDoUpdate (FALSE);
        /* Stop physical updates to prevent flickering */
         
        /*显示拼音、笔划、英语*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -