📄 asix_kb.c
字号:
/*************************************************************************
*
* Copyright 2000 National ASIC Center, All right Reserved
*
* FILE NAME: asix_kb.c
* PROGRAMMER: Lingming
* Date of Creation: 2001/02/07
*
* DESCRIPTION: The asix keyboard control implementation. this
* file defines the control related infomation.
*
* NOTE: The asixwin.c MUST include this file
*
*
* FUNCTIONS LIST:
* fun1(arg1,arg2) description of func1
* fun2(arg1,arg2,arg3) description of func2
*
* GLOBAL VARS LIST:
*
*
**************************************************************************
* MODIFICATION HISTORY
*
* 2001/02/07 by Lingming Creation of this file
* 2001/11/27 by Lingming add param checking in kb_msgproc() for msg filtering
*
*************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "asixwin.h"
#include "asixapp.h"
#include "asixwin\disp.h"
#include "resource\bitmap.h"
#include "asixwin\asix_kb.h"
#include "asixwin\kb_data.h"//the map used in this file
#include "asixwin\asix_wn.h"
#include "resource\dialpan.h"//the map used in this file is left right
//#include <hw.h>
#define SOLIVE
/* The input mode */
#define NOINPUT 0x0
#define SHOUXIE 0x01
#define FUHAO 0x02
#define SHUZI 0x04
#define PINYING 0x08
#define YINGWEN_U 0x10
#define YINGWEN_L 0x20
#define BOHAO 0x40
#define ALLINPUT 0x3f /*If use call openinput with allow as ALLINPUT, all keyboard can be opened*/
#ifdef LCD_WIDTH160
/* Each key width and hight*/
#define EKEY_WIDTH 14 /*for U&L case of english keyboard*/
#define EKEY_HEIGHT 15
#define FKEY_WIDTH 14 /*for simbol keyboard*/
#define FKEY_HEIGHT 19
#define NKEY_WIDTH 20 /*for number keyboard*/
#define NKEY_HEIGHT 25
#define CONTROL_ICON_WIDTH 14 /*For control icon*/
#define CONTROL_ICON_HEIGHT 15
#elif LCD_WIDTH240
/* Each key width and hight*/
#define EKEY_WIDTH 20 /*for U&L case of english keyboard*/
#define EKEY_HEIGHT 20
#define FKEY_WIDTH 20 /*for simbol keyboard*/
#define FKEY_HEIGHT 25
#define NKEY_WIDTH 28 /*for number keyboard*/
#define NKEY_HEIGHT 33
#define CONTROL_ICON_WIDTH 20 /*For control icon*/
#define CONTROL_ICON_HEIGHT 20
#endif
/* The keyboard bitmap ,defined in kb_data.c*/
extern const U8 ukb_bitmap[];
extern const U8 lkb_bitmap[];
extern const U8 fkb_bitmap[];
extern const U8 nkb_bitmap[];
extern const U8 hkb_bitmap[];
extern const unsigned char fish9[];
/*The Control icon bitmap,defined in kb_data.c*/
extern const U8 sx_bitmap[];
extern const U8 fh_bitmap[];
extern const U8 sz_bitmap[];
extern const U8 py_bitmap[];
extern const U8 da_bitmap[];
extern const U8 xiao_bitmap[];
/*the dial pad key bitmap, defiend in kb_data.c*/
extern const U8 num_0[];
extern const U8 num_1[];
extern const U8 num_2[];
extern const U8 num_3[];
extern const U8 num_4[];
extern const U8 num_5[];
extern const U8 num_6[];
extern const U8 num_7[];
extern const U8 num_8[];
extern const U8 num_9[];
extern const U8 num_as[]; // *
extern const U8 num_pd[]; // #
//extern U16 HandWriteRecognizeType;
//extern U16 HandWriteRecognizeNum;
struct icon_list {
U8 icon_name;
const P_U8 icon_bmp;
};
static const struct icon_list IconList[]={
SHOUXIE, (const P_U8)sx_bitmap,
FUHAO, (const P_U8)fh_bitmap,
SHUZI, (const P_U8)sz_bitmap,
YINGWEN_U, (const P_U8)da_bitmap,
YINGWEN_L, (const P_U8)xiao_bitmap,
PINYING, (const P_U8)py_bitmap,
};
static const struct icon_list BohaoList[]={
0x31, (const P_U8)zi_num1,
0x32, (const P_U8)zi_num2,
0x33, (const P_U8)zi_num3,
0x34, (const P_U8)zi_num4,
0x35, (const P_U8)zi_num5,
0x36, (const P_U8)zi_num6,
0x37, (const P_U8)zi_num7,
0x38, (const P_U8)zi_num8,
0x39, (const P_U8)zi_num9,
0x2a, (const P_U8)zi_asterisk, // *
0x30, (const P_U8)zi_num0,
0x23, (const P_U8)zi_well, // #
};
#ifdef SANBAO
const U16 HW_NumReturnVal[]={
0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x0030,0x003a,0x0028,0x0029
};
#endif
static U8 openinput(U16 y,U8 mode, U8 allow, struct kbd_ctrl *kbctrl);
static void closeinput(struct kbd_ctrl *kbctrl);
//static STATUS AsixOpenInputPad(U16 xPos, U16 yPos, U16 numRow, U16 numCol,
// U16 areaWidth, U16 areaHeight, U16 echoCol, U16 echoWidth,
// U32 timeOut, U16 samplingRate, U8 areaClean, U16 stackSize);
//static STATUS AsixRecoverInputPad();
STATUS SysOpenSoftKey(U32 pGC,P_U32 areaId,U16 xPos,U16 yPos,U16 keyWidth,U16 keyHeight,U16 numCol,U16 numRow,P_U16 keyMap,P_U8 bitMap);
STATUS SysCloseSoftKey ( DWORD areaId );
PUBLIC STATUS kbd_repaint( void *ctrl_str, U32 lparam);
extern char *py_ime( char *strInput_py_str, unsigned char *num );
static U8 openinput(U16 y,U8 mode, U8 allow, struct kbd_ctrl *kbctrl) {
register U16 xSrc,ySrc;
register U8 i,j;
register U16 position_temp=0;
U16 xSrc1;
WORD Len1;
U16 rv;
ASIX_WINDOW *CurWindow; //add by dsa 2002/04/17
DWORD bmp;
CurWindow =(ASIX_WINDOW *)GetCurWindow();//add by dsa 2002/04/17
if (kbctrl == NULL) return NOINPUT;
kbctrl->allowed_btm = allow;
kbctrl->cur_y = y;
if ((mode & kbctrl->allowed_btm) == 0) {
return kbctrl->cur_mode;
}
if (kbctrl->cur_mode!=NOINPUT) closeinput(kbctrl);
if ( mode == BOHAO ) {
// if ( (mode == BOHAO) && (y > LCD_HEIGHT - 180) ) {
//kbctrl->cur_y = LCD_HEIGHT-180;
} else if (y > LCD_HEIGHT-76) {
kbctrl->cur_y = LCD_HEIGHT-76;//here from 75 to 76,modified by dsa 2002/04/25
}
ySrc = kbctrl->cur_y;
//if (mode==SHOUXIE)
// kbctrl->cur_x=1+3*CONTROL_ICON_WIDTH;
//else if( mode != BOHAO )
#ifdef LCD_WIDTH160
kbctrl->cur_x=(LCD_WIDTH-154)/2;
#elif LCD_WIDTH240
kbctrl->cur_x=(LCD_WIDTH-214)/2;
#endif
xSrc = kbctrl->cur_x;
for(i=0;(i<5) && (mode != BOHAO) ;i++) {
for(j=0;j<6;j++) {
if (mode!=IconList[j].icon_name && kbctrl->icon_select_map[j]==UNSELECTED) {
kbctrl->CtrlIcon[i].icon_name=IconList[j].icon_name;
if ( (kbctrl->CtrlIcon[i].icon_name & kbctrl->allowed_btm)!=0 ){
position_temp=ySrc+i*CONTROL_ICON_HEIGHT;
ActiveAreaEnable( (P_U32)&( kbctrl->CtrlIcon[i].icon_id ), ICON_AREA,\
CONTINUOUS_MODE, xSrc, position_temp, xSrc+CONTROL_ICON_WIDTH,\
position_temp+CONTROL_ICON_HEIGHT,kbctrl->wndid );
//modified by dsa 2002/04/17
// switchonetotwo(IconList[j].icon_bmp, xSrc, position_temp,\
// CONTROL_ICON_WIDTH, CONTROL_ICON_HEIGHT);
// SysDrawMonoImage(kbctrl->pGC,IconList[j].icon_bmp,xSrc,position_temp,\
// CONTROL_ICON_WIDTH,CONTROL_ICON_HEIGHT,GPC_BLACK,GPC_WHITE);
bmp=LoadBitmap(IconList[j].icon_bmp, NULL );
DisplayBMP(kbctrl->pGC,xSrc, position_temp,bmp);
FreeBitmap(bmp);
} else {
//modified by dsa 2002/04/17
// Advswitchonetotwo(IconList[j].icon_bmp, xSrc, ySrc+i*CONTROL_ICON_HEIGHT,\
// CONTROL_ICON_WIDTH, CONTROL_ICON_HEIGHT, BLACK_TO_DARKGREY, WHITE_TO_WHITE);
// SysDrawMonoImage(kbctrl->pGC,IconList[j].icon_bmp,xSrc,ySrc+i*CONTROL_ICON_HEIGHT,\
// CONTROL_ICON_WIDTH,CONTROL_ICON_HEIGHT,GPC_WHITE,GPC_BLACK);
bmp=LoadBitmap(IconList[j].icon_bmp, NULL );
DisplayBMP(kbctrl->pGC,xSrc,ySrc+i*CONTROL_ICON_HEIGHT,bmp);
FreeBitmap(bmp);
}
kbctrl->icon_select_map[j] = BEENSELECTED;
break;
}
}
}
for (i=0; (i<5) && (mode != BOHAO) ;i++) {
position_temp = ySrc+(i+1)*CONTROL_ICON_HEIGHT;
DrawLine(kbctrl->pGC,WHITE,xSrc,position_temp,xSrc+CONTROL_ICON_WIDTH,\
position_temp, GPC_SOLID_LINE,REPLACE_STYLE);//modified 0 with GPC_SOLID_LINE
}
if( mode != BOHAO )
xSrc += CONTROL_ICON_WIDTH;
switch (mode)
{
case YINGWEN_L:
if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,EKEY_WIDTH,EKEY_HEIGHT,10,5,(const P_U16)l_keyboard,(const P_U8)lkb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
else{
kbctrl->cur_mode=YINGWEN_L;
}
break;
case YINGWEN_U:
if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,EKEY_WIDTH,EKEY_HEIGHT,10,5,(const P_U16)u_keyboard,(const P_U8)ukb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
else{
kbctrl->cur_mode=YINGWEN_U;
}
break;
case SHUZI:
if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,NKEY_WIDTH,NKEY_HEIGHT,7,3,(const P_U16)n_keyboard,(const P_U8)nkb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
else{
kbctrl->cur_mode=SHUZI;
}
break;
case FUHAO:
if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,FKEY_WIDTH,FKEY_HEIGHT,10,4,(const P_U16)f_keyboard,(const P_U8)fkb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
else kbctrl->cur_mode=FUHAO;
break;
case PINYING:
kbctrl->cur_mode=PINYING;
kbctrl->Pycb = (struct py_control_block *)Lcalloc( sizeof(struct py_control_block) );
if ( kbctrl->Pycb == NULL)
{
kbctrl->cur_mode=NOINPUT;
break;
}
if (( kbctrl->PY_Icon = Lcalloc( 7*sizeof(struct data_icon)))==NULL)
{
kbctrl->cur_mode=NOINPUT;
break;
}
if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,EKEY_WIDTH,EKEY_HEIGHT,10,5,(const P_U16)l_keyboard,(const P_U8)lkb_bitmap)!=PPSM_OK){
kbctrl->cur_mode=NOINPUT;
break;
}
for (i=0;i<7;i++) {
position_temp = (LCD_WIDTH-CHAR_WIDTH*7)/2+i*CHAR_WIDTH;
if ( ActiveAreaEnable((P_U32)&(kbctrl->PY_Icon[i].icon_id),ICON_AREA,CONTINUOUS_MODE,\
position_temp, ySrc-CHAR_WIDTH-1,position_temp+CHAR_WIDTH-1,ySrc-2,kbctrl->wndid) !=PPSM_OK) {
kbctrl->cur_mode=NOINPUT;
break;
}
else
ActiveAreaSuspend(kbctrl->PY_Icon[i].icon_id,AREA_SUSPEND);
}
DrawRec(kbctrl->pGC,GPC_BLACK,(LCD_WIDTH-CHAR_WIDTH*7)/2-1,ySrc-CHAR_WIDTH-2,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7,ySrc-1,GPC_SOLID_LINE,GPC_REPLACE_STYLE);
// DrawRec(kbctrl->pGC,GPC_BLACK,24,ySrc-18,136,ySrc,GPC_SOLID_LINE,GPC_XOR_STYLE);
if( ActiveAreaEnable((P_U32)&(kbctrl->PY_LeftButtonId),ICON_AREA,CONTINUOUS_MODE,
(LCD_WIDTH-CHAR_WIDTH*7)/2-10, ySrc-CHAR_WIDTH-2,(LCD_WIDTH-CHAR_WIDTH*7)/2-3,ySrc-1,kbctrl->wndid) != PPSM_OK)
{
kbctrl->cur_mode=NOINPUT;
break;
}
else
{
ActiveAreaSuspend(kbctrl->PY_LeftButtonId,AREA_SUSPEND);
}
if( ActiveAreaEnable((P_U32)&(kbctrl->PY_RightButtonId),ICON_AREA,CONTINUOUS_MODE,
(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+2, ySrc-CHAR_WIDTH-2,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+9,ySrc-1,kbctrl->wndid) !=PPSM_OK)
{
kbctrl->cur_mode=NOINPUT;
break;
}
else
{
ActiveAreaSuspend(kbctrl->PY_RightButtonId,AREA_SUSPEND);
}
// PutRec(kbctrl->pGC,left,(LCD_WIDTH-CHAR_WIDTH*7)/2-10, ySrc-CHAR_WIDTH-2,CHAR_WIDTH/2+2,CHAR_WIDTH+2,GPC_REPLACE_STYLE,0);
// PutRec(kbctrl->pGC,right,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+2, ySrc-CHAR_WIDTH-2,CHAR_WIDTH/2+2,CHAR_WIDTH+2,GPC_REPLACE_STYLE,0);
{
U32 palette[] = { GPC_BLACK,GPC_WHITE};
bmp=LoadBitmap(left, palette);
// SetBMPPalette( bmp, palette, NULL );
DisplayBMP(kbctrl->pGC,(LCD_WIDTH-CHAR_WIDTH*7)/2-10,ySrc-CHAR_WIDTH-2,bmp);
FreeBitmap(bmp);
bmp=LoadBitmap(right, palette);
// SetBMPPalette( bmp, palette, NULL );
DisplayBMP(kbctrl->pGC,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+2,ySrc-CHAR_WIDTH-2,bmp);
FreeBitmap(bmp);
}
break;
case SHOUXIE:
kbctrl->cur_mode=SHOUXIE;
#ifdef SOLIVE
// HandWriteRecognizeNum = 7;
// HandWriteRecognizeType = ALC_CHINESE_COMMON | ALC_CHINESE_RARE;
if (( kbctrl->HW_Icon1 = Lcalloc( 10*sizeof(struct data_icon)))==NULL)
{
kbctrl->cur_mode=NOINPUT;
break;
}
// if (( kbctrl->HW_Icon2 = Lcalloc( 9*sizeof(struct data_icon)))==NULL)
// {
// kbctrl->cur_mode=NOINPUT;
// break;
// }
#endif
#ifdef LCD_WIDTH160
xSrc1 = xSrc + 125;
Len1 = 130;
#elif LCD_WIDTH240
xSrc1 = xSrc + 180;
Len1 = 190;
#endif
if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc1,ySrc,EKEY_WIDTH,EKEY_HEIGHT,1,5,(const P_U16)h_keyboard,(const P_U8)hkb_bitmap)!=PPSM_OK)
{
kbctrl->cur_mode=NOINPUT;
break;
}
//AppSwap(TRUE);
//modified by dsa 2002/04.18
// rv = AdvOpenInputPad(xSrc,ySrc,1,2,65,75,BLACK,2,800, 50,1,2048);
rv = SysAdvOpenInputPad( &( kbctrl->areaId1 ),kbctrl->wndid,xSrc,ySrc,1,1,Len1,75,GPC_WHITE,GPC_NORM_WIDTH);
if ( rv != PPSM_OK )
{
#ifdef ASIX_DEBUG
Disp16String("Error@",1,1);
#endif
kbctrl->cur_mode=NOINPUT;
break;
}
kbctrl->inputpad_x = xSrc;
kbctrl->inputpad_y = ySrc;
/* we set the status bit in the parent win*/
CurWindow->status |= WST_HANDWRITE;
/* the inputpad can not overlap other activearea, so we must suspent the
parent window's client area */
ActiveAreaSuspend( ( (struct wn_ctrl *)CurWindow->ctrl_str )->clientid, AREA_SUSPEND);
//ActiveAreaPosition( ((struct wn_ctrl *)CurWindow->ctrl_str)->clientid, );
#ifdef SOLIVE
for (i=0;i<10;i++){
position_temp = (LCD_WIDTH-CHAR_WIDTH*10)/2+i*CHAR_WIDTH;
if ( ActiveAreaEnable((P_U32)&(kbctrl->HW_Icon1[i].icon_id), ICON_AREA, CONTINUOUS_MODE,\
position_temp, ySrc-CHAR_WIDTH-1, position_temp+CHAR_WIDTH-1, ySrc-2,kbctrl->wndid) !=PPSM_OK) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -