--- np2/generic/softkbd.c 2004/03/25 15:22:42 1.3 +++ np2/generic/softkbd.c 2004/04/07 14:55:46 1.9 @@ -6,73 +6,110 @@ #include "softkbd.h" #include "keystat.h" + #define SOFTKEY_MENU 0xfe #define SOFTKEY_NC 0xff -#include "softkbd.res" typedef struct { - BYTE *bmp; - UINT width; - UINT height; UINT8 key; + UINT8 key2; + UINT8 led; + UINT8 flag; + void *ptr; + CMNBMP bmp; + CMNPAL pal[16]; } SOFTKBD; static SOFTKBD softkbd; +#if (SUPPORT_SOFTKBD == 1) +#include "softkbd1.res" +#elif (SUPPORT_SOFTKBD == 2) +#include "softkbd2.res" +#elif (SUPPORT_SOFTKBD == 3) +#include "softkbd3.res" +#else +#include "softkbd.res" +#endif -void softkbd_initialize(void) { - BMPFILE *bf; - BMPDATA inf; +static void loadbmp(const char *filename) { - softkbd.bmp = NULL; - softkbd.width = 0; - softkbd.height = 0; - softkbd.key = SOFTKEY_NC; - bf = (BMPFILE *)bmpdata_solvedata(np2kbd_bmp); - if (bf != NULL) { - if ((bf->bfType[0] == 'B') && (bf->bfType[1] == 'M') && - (bmpdata_getinfo((BMPINFO *)(bf + 1), &inf) == SUCCESS) && - (inf.bpp == 4)) { - softkbd.bmp = (BYTE *)bf; - softkbd.width = inf.width; - softkbd.height = inf.height; + 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(bf); + _MFREE(ptr); } } + softkbd.flag |= SOFTKEY_FLAGREDRAW; +} + +void softkbd_initialize(void) { + + softkbd.key = SOFTKEY_NC; + softkbd.led = 0; + loadbmp(NULL); } void softkbd_deinitialize(void) { - BYTE *bmp; + void *ptr; - bmp = softkbd.bmp; - softkbd.bmp = NULL; - if (bmp) { - _MFREE(bmp); + ptr = softkbd.ptr; + softkbd.ptr = NULL; + if (ptr) { + _MFREE(ptr); } } BOOL softkbd_getsize(int *width, int *height) { - if (softkbd.bmp == NULL) { + if (softkbd.ptr == NULL) { return(FAILURE); } if (width) { - *width = softkbd.width; + *width = softkbd.bmp.width; } if (height) { - *height = softkbd.height; + *height = softkbd.bmp.height; } return(SUCCESS); } -void softkbd_paint(CMNVRAM *vram, CMNPALCNV cnv) { +REG8 softkbd_process(void) { - cmddraw_bmp16(vram, softkbd.bmp, cnv, CMNBMP_LEFT | CMNBMP_TOP); + 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(ret); } BOOL softkbd_down(int x, int y) { @@ -85,7 +122,7 @@ BOOL softkbd_down(int x, int y) { return(TRUE); } else if (key != SOFTKEY_NC) { - keystat_senddata((UINT8)key); + keystat_down(&key, 1, NKEYREF_SOFTKBD); softkbd.key = key; } return(FALSE); @@ -94,9 +131,18 @@ BOOL softkbd_down(int x, int y) { void softkbd_up(void) { if (softkbd.key != SOFTKEY_NC) { - keystat_senddata((REG8)(softkbd.key | 0x80)); + 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