aboutsummaryrefslogtreecommitdiff
path: root/engines/cge/events.cpp
diff options
context:
space:
mode:
authorPaul Gilbert2011-07-02 18:38:25 +1000
committerPaul Gilbert2011-07-02 18:38:25 +1000
commitbb3d61b137aea4cab3e82d4f9f93b1dbea27c54e (patch)
tree0196fda7a01f9de73926ebe3e8139c235451a4cc /engines/cge/events.cpp
parentd55401c2e10276827372f8df29418937cc2daf22 (diff)
downloadscummvm-rg350-bb3d61b137aea4cab3e82d4f9f93b1dbea27c54e.tar.gz
scummvm-rg350-bb3d61b137aea4cab3e82d4f9f93b1dbea27c54e.tar.bz2
scummvm-rg350-bb3d61b137aea4cab3e82d4f9f93b1dbea27c54e.zip
CGE: Created an EventManager class and hooked it up to the Keyboard class
Diffstat (limited to 'engines/cge/events.cpp')
-rw-r--r--engines/cge/events.cpp160
1 files changed, 81 insertions, 79 deletions
diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp
index 49b08e407b..92c356fa5f 100644
--- a/engines/cge/events.cpp
+++ b/engines/cge/events.cpp
@@ -25,6 +25,7 @@
* Copyright (c) 1994-1995 Janus B. Wisniewski and L.K. Avalon
*/
+#include "common/events.h"
#include "cge/events.h"
#include "cge/events.h"
#include "cge/text.h"
@@ -57,103 +58,85 @@ const uint16 Keyboard::_code[0x60] = {
0 * 0x5F
};
+const uint16 Keyboard::_scummVmCodes[0x60] = {
+ 0, Common::KEYCODE_ESCAPE, Common::KEYCODE_1, Common::KEYCODE_2, Common::KEYCODE_3,
+ Common::KEYCODE_4, Common::KEYCODE_5, Common::KEYCODE_6, Common::KEYCODE_7, Common::KEYCODE_8,
+ Common::KEYCODE_9, Common::KEYCODE_0, Common::KEYCODE_MINUS, Common::KEYCODE_PLUS, Common::KEYCODE_BACKSPACE,
+ Common::KEYCODE_TAB, Common::KEYCODE_q, Common::KEYCODE_w, Common::KEYCODE_e, Common::KEYCODE_r,
+ Common::KEYCODE_t, Common::KEYCODE_y, Common::KEYCODE_u, Common::KEYCODE_i, Common::KEYCODE_o,
+ Common::KEYCODE_p, Common::KEYCODE_LEFTBRACKET, Common::KEYCODE_RIGHTBRACKET, Common::KEYCODE_RETURN, 0/*Ctrl*/,
+ Common::KEYCODE_a, Common::KEYCODE_s, Common::KEYCODE_d, Common::KEYCODE_f, Common::KEYCODE_g,
+ Common::KEYCODE_h, Common::KEYCODE_j, Common::KEYCODE_k, Common::KEYCODE_l, Common::KEYCODE_SEMICOLON,
+ Common::KEYCODE_BACKSLASH, Common::KEYCODE_TILDE, Common::KEYCODE_LSHIFT, Common::KEYCODE_BACKSLASH, Common::KEYCODE_z,
+ Common::KEYCODE_x, Common::KEYCODE_c, Common::KEYCODE_v, Common::KEYCODE_b, Common::KEYCODE_n,
+ Common::KEYCODE_m, Common::KEYCODE_COMMA, Common::KEYCODE_PERIOD, Common::KEYCODE_SLASH, Common::KEYCODE_RSHIFT,
+ Common::KEYCODE_KP_MULTIPLY, 0 /*Alt*/, Common::KEYCODE_SPACE, Common::KEYCODE_CAPSLOCK, Common::KEYCODE_F1,
+ Common::KEYCODE_F2, Common::KEYCODE_F3, Common::KEYCODE_F4, Common::KEYCODE_F5, Common::KEYCODE_F6,
+ Common::KEYCODE_F7, Common::KEYCODE_F8, Common::KEYCODE_F9, Common::KEYCODE_F10, Common::KEYCODE_NUMLOCK,
+ Common::KEYCODE_SCROLLOCK, Common::KEYCODE_KP7, Common::KEYCODE_KP8, Common::KEYCODE_KP9, Common::KEYCODE_KP_MINUS,
+ Common::KEYCODE_KP4, Common::KEYCODE_KP5, Common::KEYCODE_KP6, Common::KEYCODE_KP_PLUS, Common::KEYCODE_KP1,
+ Common::KEYCODE_KP2, Common::KEYCODE_KP3, Common::KEYCODE_KP0, Common::KEYCODE_KP_PERIOD, 0,
+ 0, 0, Common::KEYCODE_F11, Common::KEYCODE_F12, 0,
+ 0, 0, 0, 0, 0,
+ 0
+};
Keyboard::Keyboard() {
_client = NULL;
- Common::set_to(&_key[0], &_key[0x60], 0);
+ Common::set_to(&_key[0], &_key[0x60], false);
_current = 0;
-
- // steal keyboard interrupt
- /* TODO replace totally by scummvm handling
- OldKeyboard = getvect(KEYBD_INT);
- setvect(KEYBD_INT, NewKeyboard);
- */
- warning("STUB: Keyboard::Keyboard");
}
-
Keyboard::~Keyboard() {
- // bring back keyboard interrupt
- /* TODO replace totally by scummvm handling
- setvect(KEYBD_INT, OldKeyboard);
- */
- // FIXME: STUB: KEYBOARD::~KEYBOARD
}
-
Sprite *Keyboard::setClient(Sprite *spr) {
Swap(_client, spr);
return spr;
}
+bool Keyboard::getKey(uint16 keycode, int &cgeCode) {
+ if ((keycode == Common::KEYCODE_LCTRL) || (keycode == Common::KEYCODE_RCTRL)) {
+ cgeCode = 29;
+ return true;
+ }
-void Keyboard::NewKeyboard(...) {
- // table address
- /*
- _SI = (uint16) Key;
-
- // take keyboard code
- asm in al,60h
- asm mov bl,al
- asm and bx,007Fh
- asm cmp bl,60h
- asm jae xit
- asm cmp al,bl
- asm je ok // key pressed
-
- // key released...
- asm cmp [si+bx],bh // BH == 0
- asm jne ok
- // ...but not pressed: call the original service
- OldKeyboard();
- return;
-
- ok:
- asm shl ax,1
- asm and ah,1
- asm xor ah,1
- asm mov [si+bx],ah
- asm jz xit // released: exit
-
- // pressed: lock ASCII code
- _SI = (uint16) Code;
- asm add bx,bx // uint16 size
- asm mov ax,[si+bx]
- asm or ax,ax
- asm jz xit // zero means NO KEY
- Current = _AX;
-
- _SI = (uint16) Client;
- asm or si,si
- asm jz xit // if (Client) ...
- //--- fill current event entry with mask, key code and sprite
- asm mov bx,EvtHead // take queue head pointer
- asm inc byte ptr EvtHead // update queue head pointer
- asm shl bx,3 // * 8
- _AX = Current;
- asm mov Evt[bx].(struct EVENT)X,ax // key code
- asm mov ax,KEYB // event mask
- asm mov Evt[bx].(struct EVENT)Msk,ax // event mask
- //asm mov Evt[bx].(struct EVENT)Y,dx // row
- asm mov Evt[bx].(struct EVENT)Ptr,si // SPRITE pointer
-
- xit:
-
- asm in al,61h // kbd control lines
- asm push ax // save it
- asm or al,80h // set the "enable kbd" bit
- asm out 61h,al // and write it out
- asm pop ax // original control port value
- asm out 61h,al // write it back
- asm mov al,20h // send End-Of-Interrupt
- asm out 20h,al // to the 8259 IC
- */
- warning("STUB: Keyboard::NewKeyboard");
+ // Scan through the ScummVM mapping list
+ for (int idx = 0; idx < 0x60; ++idx) {
+ if (_scummVmCodes[idx] == keycode) {
+ cgeCode = idx;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Keyboard::NewKeyboard(Common::Event &event) {
+ int keycode;
+ if (!getKey(event.kbd.keycode, keycode))
+ return;
+
+ if (event.type == Common::EVENT_KEYUP) {
+ // Key release
+ _key[event.kbd.keycode] = false;
+ } else if (event.type == Common::EVENT_KEYDOWN) {
+ // Key press
+ _key[event.kbd.keycode] = true;
+ _current = Keyboard::_code[event.kbd.keycode];
+
+ if (_client) {
+ CGEEvent &evt = Evt[EvtHead++];
+ evt._x = _current; // Keycode
+ evt._msk = KEYB; // Event mask
+ evt._ptr = _client; // Sprite pointer
+ }
+ }
}
/*----------------- MOUSE interface -----------------*/
-Event Evt[EVT_MAX];
+CGEEvent Evt[EVT_MAX];
uint16 EvtHead = 0, EvtTail = 0;
@@ -268,7 +251,7 @@ void MOUSE::ClrEvt(Sprite *spr) {
void MOUSE::Tick(void) {
step();
while (EvtTail != EvtHead) {
- Event e = Evt[EvtTail];
+ CGEEvent e = Evt[EvtTail];
if (e._msk) {
if (Hold && e._ptr != Hold)
Hold->touch(e._msk | ATTN, e._x - Hold->_x, e._y - Hold->_y);
@@ -313,5 +296,24 @@ void MOUSE::Tick(void) {
Hold->gotoxy(_x - hx, _y - hy);
}
+/*----------------- EventManager interface -----------------*/
+
+EventManager::EventManager() {
+ _quitFlag = false;
+}
+
+void EventManager::poll() {
+ while (g_system->getEventManager()->pollEvent(_event)) {
+ switch (_event.type) {
+ case Common::EVENT_QUIT:
+ _quitFlag = true;
+ return;
+ case Common::EVENT_KEYDOWN:
+ case Common::EVENT_KEYUP:
+ _keyboard->NewKeyboard(_event);
+ break;
+ }
+ }
+}
} // End of namespace CGE