--- np2/macos9/mackbd.cpp 2003/11/13 07:47:17 1.3 +++ np2/macos9/mackbd.cpp 2003/11/14 10:04:56 1.5 @@ -12,8 +12,17 @@ #if TARGET_API_MAC_CARBON -static BYTE keymap[16]; -static UINT32 shiftchktick = 0; +typedef struct { + UINT32 tick; + BYTE keymap[16]; + BOOL active; + UINT32 repbase; + UINT32 reptick; + BYTE repkey; +} MACKBD; + +static MACKBD mackbd; + static const BYTE keymac[128] = { // £Á, £Ó, £Ä, £Æ, £È, £Ç, £Ú, £Ø ; 0x00 @@ -49,10 +58,17 @@ static const BYTE keymac[128] = { // F2, rd, F1, ¢«, ¢ª, ¢­, ¢¬, ; 0x78 0x63,0x36,0x62,0x3b,0x3c,0x3d,0x3a, NC}; +static const BYTE repkey[16] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, + 0xff, 0xff, 0xc1, 0xff, 0xc0, 0x0f, 0x07, 0x07}; + + void mackbd_initialize(void) { - shiftchktick = GETTICK(); - ZeroMemory(&keymap, sizeof(keymap)); + mackbd.tick = GETTICK(); + ZeroMemory(&mackbd.keymap, sizeof(mackbd.keymap)); + mackbd.active = TRUE; + mackbd.repkey = NC; } void mackbd_callback(void) { @@ -64,29 +80,41 @@ void mackbd_callback(void) { UINT j; BYTE keycode; + if (!mackbd.active) { + return; + } + tick = GETTICK(); - if (shiftchktick == tick) { + if (mackbd.tick == tick) { return; } - shiftchktick = tick; + mackbd.tick = tick; #if TARGET_API_MAC_CARBON GetKeys((long *)key); #else GetKeys((unsigned long *)key); #endif for (i=0; i<16; i++) { - update = keymap[i] ^ key[i]; + update = mackbd.keymap[i] ^ key[i]; if (update) { - keymap[i] = key[i]; + mackbd.keymap[i] = key[i]; for (j=0; j<8; j++) { if (update & (1 << j)) { -TRACEOUT(("key %x %d", i * 8 + j, (key[i] & (1 << j))?1:0)); keycode = keymac[i * 8 + j]; if (keycode != NC) { if (key[i] & (1 << j)) { keystat_senddata(keycode); + if ((repkey[keycode >> 3] << (keycode & 7)) + & 0x80) { + mackbd.repkey = keycode; + mackbd.repbase = tick; + mackbd.reptick = 500; + } } else { + if (mackbd.repkey == keycode) { + mackbd.repkey = NC; + } keystat_senddata(keycode + 0x80); } } @@ -94,6 +122,15 @@ TRACEOUT(("key %x %d", i * 8 + j, (key[i } } } + + // ¥­¡¼¥ê¥Ô¡¼¥È½èÍý + if (mackbd.repkey != NC) { + if ((tick - mackbd.repbase) >= mackbd.reptick) { + keystat_senddata(mackbd.repkey); // keystat¦¤Çbreak¤¹¤ë + mackbd.repbase = tick; + mackbd.reptick = 40; + } + } } BOOL mackbd_keydown(int keycode) { @@ -126,6 +163,17 @@ BOOL mackbd_keyup(int keycode) { return(FALSE); } +void mackbd_activate(BOOL active) { + + if (mackbd.active != active) { + mackbd.active = active; + if (!active) { + ZeroMemory(&mackbd.keymap, sizeof(mackbd.keymap)); + keystat_allrelease(); + } + } +} + #else enum { @@ -187,6 +235,7 @@ static const BYTE keymac[128] = { typedef struct { UINT32 tick; UINT16 shift; + BOOL active; } MACKBD; static MACKBD mackbd; @@ -194,6 +243,7 @@ static MACKBD mackbd; void mackbd_initialize(void) { ZeroMemory(&mackbd, sizeof(mackbd)); + mackbd.active = TRUE; } void mackbd_callback(void) { @@ -204,6 +254,10 @@ void mackbd_callback(void) { UINT16 shiftchg; UINT i; + if (!mackbd.active) { + return; + } + tick = GETTICK(); if (mackbd.tick != tick) { mackbd.tick = tick; @@ -274,6 +328,16 @@ BOOL mackbd_keyup(int keycode) { } } +void mackbd_activate(BOOL active) { + + if (mackbd.active != active) { + mackbd.active = active; + if (!active) { + keystat_allrelease(); + } + } +} + #endif