--- np2/generic/softkbd.c 2004/03/25 08:51:24 1.1 +++ np2/generic/softkbd.c 2004/07/15 13:48:39 1.11 @@ -5,150 +5,117 @@ #include "bmpdata.h" #include "softkbd.h" #include "keystat.h" -#include "softkbd.res" + #define SOFTKEY_MENU 0xfe #define SOFTKEY_NC 0xff -typedef struct { - UINT8 left; - UINT8 keys; - UINT8 left1; - UINT8 left2; - UINT8 base; - UINT8 right; -} FULLKEY; typedef struct { - FULLKEY fk[4]; - UINT8 cur0[5]; - UINT8 cur1[5]; - UINT8 ten[20]; -} KEYTBL; + UINT8 key; + UINT8 key2; + UINT8 led; + UINT8 flag; + void *ptr; + CMNBMP bmp; + CMNPAL pal[16]; +} SOFTKBD; + +static SOFTKBD softkbd; + +#if (SUPPORT_SOFTKBD == 1) +#if defined(SIZE_QVGA) +#include "softkbd1.res" +#else +#include "softkbd2.res" +#endif +#elif (SUPPORT_SOFTKBD == 2) +#error not support (SUPPORT_SOFTKBD == 2) +#else +#if !defined(SUPPORT_PC9801_119) +#include "softkbd.res" +#else +#include "softkbd3.res" +#endif +#endif -static const KEYTBL keytbl = { - // fullkey 90 - {{12, 13, 0x00, 0x00, 0x01, 0x0e}, - {16, 12, 0x0f, 0x0f, 0x10, 0x1c}, - {20, 12, 0x74, 0x71, 0x1d, 0x1c}, - {24, 11, 0x70, 0x70, 0x29, 0x70}}, - // 247 - {0x38, 0x36, 0x3a, 0x3b, 0x3d}, - {0x39, 0x37, 0x3a, 0x3c, 0x3d}, +static void loadbmp(const char *filename) { - // 270 - {0x3e, 0x3f, 0x40, 0x41, - 0x42, 0x43, 0x44, 0x45, - 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x4b, 0x4c, 0x4d, - 0x4e, 0x4f, 0x50, 0x1c}}; + void *ptr; + softkbd.ptr = NULL; + ptr = (void *)bmpdata_solvedata(np2kbd_bmp); + if (ptr != NULL) { + if (cmndraw_bmp4inf(&softkbd.bmp, ptr) == SUCCESS) { + softkbd.ptr = ptr; + } + else { + _MFREE(ptr); + } + } + softkbd.flag |= SOFTKEY_FLAGREDRAW; +} -static UINT8 softkey = SOFTKEY_NC; +void softkbd_initialize(void) { + + softkbd.key = SOFTKEY_NC; + softkbd.led = 0; + loadbmp(NULL); +} -void softkbd_paint(CMNVRAM *vram, CMNPALCNV cnv) { +void softkbd_deinitialize(void) { - BYTE *bmp; + void *ptr; - bmp = bmpdata_solvedata(np2kbd_bmp); - if (bmp) { - cmddraw_bmp16(vram, bmp, cnv); - _MFREE(bmp); + ptr = softkbd.ptr; + softkbd.ptr = NULL; + if (ptr) { + _MFREE(ptr); } } -static UINT getsoftkbd(int x, int y) { +BOOL softkbd_getsize(int *width, int *height) { - UINT posy; -const FULLKEY *fk; - - if ((x >= 0) && (x < 32) && (y >= 8) && (y < 40)) { - return(SOFTKEY_MENU); + if (softkbd.ptr == NULL) { + return(FAILURE); } - x -= 40; - posy = y >> 3; - if ((posy >= 5) || (x < 0)) { - return(SOFTKEY_NC); + if (width) { + *width = softkbd.bmp.width; } - if (x < (54 - 40)) { // stop/copy - if ((x < 10) && (posy < 2)) { - return(0x60 + posy); - } - return(SOFTKEY_NC); + if (height) { + *height = softkbd.bmp.height; } - x -= (54 - 40); - if (x < (90 - 54)) { // function - if (x < 15) { - return(0x62 + posy); - } - if ((x >= 17) && (x < 32)) { - return(0x67 + posy); - } - return(SOFTKEY_NC); - } - x -= (90 - 54); - if (x < (247 - 90)) { // fullkey - if (posy < 4) { - if (x < 153) { - fk = keytbl.fk + posy; - x -= fk->left; - if (x < -10) { - return(fk->left1); - } - else if (x < 0) { - return(fk->left2); - } - x = (x * (((1 << 12) / 10) + 1)) >> 12; - if (x < (int)fk->keys) { - return(fk->base + x); - } - return(fk->right); - } - } - else { - x -= 19; - if (x < 0) { - return(SOFTKEY_NC); - } - x -= 10; - if (x < 0) { - return(0x72); - } - x -= 10; - if (x < 0) { - return(0x73); - } - x -= 15; - if (x < 0) { - return(0x51); - } - x -= 66; - if (x < 0) { - return(0x34); - } - if (x < 15) { - return(0x35); - } - } - return(SOFTKEY_NC); - } - x -= (247 - 90); - if (x < (270 - 247)) { // cur - if (x < 10) { - return(keytbl.cur0[posy]); - } - else if (x < 20) { - return(keytbl.cur1[posy]); - } - return(SOFTKEY_NC); - } - x -= (270 - 247); - if (x < (310 - 270)) { // ten key - x = (x * (((1 << 12) / 10) + 1)) >> 12; - return(keytbl.ten[x + posy * 4]); + return(SUCCESS); +} + +REG8 softkbd_process(void) { + + return(softkbd.flag); +} + +BOOL softkbd_paint(CMNVRAM *vram, CMNPALCNV cnv, BOOL redraw) { + + UINT8 flag; + BOOL ret; + + flag = softkbd.flag; + softkbd.flag = 0; + if (redraw) { + flag = SOFTKEY_FLAGREDRAW | SOFTKEY_FLAGDRAW; + } + ret = FALSE; + if ((flag & SOFTKEY_FLAGREDRAW) && (vram) && (cnv)) { + (*cnv)(softkbd.pal, softkbd.bmp.paltbl, softkbd.bmp.pals, vram->bpp); + cmndraw_bmp16(vram, softkbd.ptr, cnv, CMNBMP_LEFT | CMNBMP_TOP); + ret = TRUE; + } + if (flag & SOFTKEY_FLAGDRAW) { + TRACEOUT(("softkbd_paint")); + ledpaint(vram); + ret = TRUE; } - return(SOFTKEY_NC); + return(ret); } BOOL softkbd_down(int x, int y) { @@ -161,19 +128,27 @@ BOOL softkbd_down(int x, int y) { return(TRUE); } else if (key != SOFTKEY_NC) { - keystat_senddata((UINT8)key); - softkey = key; + keystat_down(&key, 1, NKEYREF_SOFTKBD); + softkbd.key = key; } return(FALSE); } void softkbd_up(void) { - if (softkey != SOFTKEY_NC) { - keystat_senddata((REG8)(softkey | 0x80)); - softkey = SOFTKEY_NC; + if (softkbd.key != SOFTKEY_NC) { + keystat_up(&softkbd.key, 1, NKEYREF_SOFTKBD); + softkbd.key = SOFTKEY_NC; } } +void softkbd_led(REG8 led) { + + TRACEOUT(("softkbd_led(%x)", led)); + if (softkbd.led != led) { + softkbd.led = led; + softkbd.flag |= SOFTKEY_FLAGDRAW; + } +} #endif