diff options
Diffstat (limited to 'engines/cge/events.cpp')
-rw-r--r-- | engines/cge/events.cpp | 109 |
1 files changed, 58 insertions, 51 deletions
diff --git a/engines/cge/events.cpp b/engines/cge/events.cpp index dc6e65722d..50544255a8 100644 --- a/engines/cge/events.cpp +++ b/engines/cge/events.cpp @@ -33,10 +33,6 @@ namespace CGE { -CGEEvent Evt[EVT_MAX]; - -uint16 EvtHead = 0, EvtTail = 0; - /*----------------- KEYBOARD interface -----------------*/ const uint16 Keyboard::_code[0x60] = { @@ -85,8 +81,7 @@ const uint16 Keyboard::_scummVmCodes[0x60] = { 0 }; -Keyboard::Keyboard() { - _client = NULL; +Keyboard::Keyboard() : _client(NULL) { Common::set_to(&_key[0], &_key[0x60], false); _current = 0; } @@ -99,9 +94,14 @@ Sprite *Keyboard::setClient(Sprite *spr) { return spr; } -bool Keyboard::getKey(uint16 keycode, int &cgeCode) { +bool Keyboard::getKey(Common::Event &event, int &cgeCode) { + Common::KeyCode keycode = event.kbd.keycode; if ((keycode == Common::KEYCODE_LCTRL) || (keycode == Common::KEYCODE_RCTRL)) { - cgeCode = 29; + cgeCode = kKeyCtrl; + return true; + } + if ((keycode == Common::KEYCODE_LALT) || (keycode == Common::KEYCODE_RALT)) { + cgeCode = kKeyAlt; return true; } if (keycode == Common::KEYCODE_KP_ENTER) { @@ -110,8 +110,8 @@ bool Keyboard::getKey(uint16 keycode, int &cgeCode) { } // Scan through the ScummVM mapping list - for (int idx = 0; idx < 0x60; ++idx) { - if (_scummVmCodes[idx] == keycode) { + for (int idx = 0; idx < 0x60; idx++) { + if (_scummVmCodes[idx] == event.kbd.ascii) { cgeCode = idx; return true; } @@ -122,7 +122,7 @@ bool Keyboard::getKey(uint16 keycode, int &cgeCode) { void Keyboard::newKeyboard(Common::Event &event) { int keycode; - if (!getKey(event.kbd.keycode, keycode)) + if (!getKey(event, keycode)) return; if (event.type == Common::EVENT_KEYUP) { @@ -134,15 +134,20 @@ void Keyboard::newKeyboard(Common::Event &event) { _current = Keyboard::_code[keycode]; if (_client) { - CGEEvent &evt = Evt[EvtHead]; - EvtHead = (EvtHead + 1) % EVT_MAX; + CGEEvent &evt = _eventManager->getNextEvent(); evt._x = _current; // Keycode - evt._msk = KEYB; // Event mask - evt._ptr = _client; // Sprite pointer + evt._mask = kEventKeyb; // Event mask + evt._spritePtr = _client; // Sprite pointer } } } +uint16 Keyboard::lastKey() { + uint16 cur = _current; + _current = 0; + return cur; +} + /*----------------- MOUSE interface -----------------*/ Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0), _vm(vm) { @@ -163,13 +168,13 @@ Mouse::Mouse(CGEEngine *vm) : Sprite(vm, NULL), _busy(NULL), _hold(NULL), _hx(0) Common::copy(ms, ms + 2, seq); setSeq(seq); - BMP_PTR *MC = new BMP_PTR[3]; + BitmapPtr *MC = new BitmapPtr[3]; MC[0] = new Bitmap("MOUSE", true); MC[1] = new Bitmap("DUMMY", true); MC[2] = NULL; setShapeList(MC); - gotoxy(kScrWidth/2, kScrHeight/2); + gotoxy(kScrWidth / 2, kScrHeight / 2); _z = 127; step(1); } @@ -180,11 +185,6 @@ Mouse::~Mouse() { } -//void Mouse::setFun() -//{ -//} - - void Mouse::on() { if (_seqPtr && _exist) { _active = true; @@ -211,30 +211,29 @@ void Mouse::newMouse(Common::Event &event) { if (!_active) return; - CGEEvent &evt = Evt[EvtHead]; - EvtHead = (EvtHead + 1) % EVT_MAX; + CGEEvent &evt = _eventManager->getNextEvent(); evt._x = event.mouse.x; evt._y = event.mouse.y; - evt._ptr = spriteAt(evt._x, evt._y); + evt._spritePtr = spriteAt(evt._x, evt._y); switch (event.type) { case Common::EVENT_MOUSEMOVE: - evt._msk = ROLL; + evt._mask = kMouseRoll; break; case Common::EVENT_LBUTTONDOWN: - evt._msk = L_DN; + evt._mask = kMouseLeftDown; _buttons |= 1; break; case Common::EVENT_LBUTTONUP: - evt._msk = L_UP; + evt._mask = kMouseLeftUp; _buttons &= ~1; break; case Common::EVENT_RBUTTONDOWN: - evt._msk = R_DN; + evt._mask = kMouseRightDown; _buttons |= 2; break; case Common::EVENT_RBUTTONUP: - evt._msk = R_UP; + evt._mask = kMouseRightUp; _buttons &= ~2; break; default: @@ -246,6 +245,8 @@ void Mouse::newMouse(Common::Event &event) { EventManager::EventManager() { _quitFlag = false; + _eventQueueHead = 0; + _eventQueueTail = 0; } void EventManager::poll() { @@ -277,27 +278,27 @@ void EventManager::poll() { } void EventManager::handleEvents() { - while (EvtTail != EvtHead) { - CGEEvent e = Evt[EvtTail]; - if (e._msk) { - if (_mouse->_hold && e._ptr != _mouse->_hold) - _mouse->_hold->touch(e._msk | ATTN, e._x - _mouse->_hold->_x, e._y - _mouse->_hold->_y); + while (_eventQueueTail != _eventQueueHead) { + CGEEvent e = _eventQueue[_eventQueueTail]; + if (e._mask) { + if (_mouse->_hold && e._spritePtr != _mouse->_hold) + _mouse->_hold->touch(e._mask | kEventAttn, e._x - _mouse->_hold->_x, e._y - _mouse->_hold->_y); // update mouse cursor position - if (e._msk & ROLL) + if (e._mask & kMouseRoll) _mouse->gotoxy(e._x, e._y); // activate current touched SPRITE - if (e._ptr) { - if (e._msk & KEYB) - e._ptr->touch(e._msk, e._x, e._y); + if (e._spritePtr) { + if (e._mask & kEventKeyb) + e._spritePtr->touch(e._mask, e._x, e._y); else - e._ptr->touch(e._msk, e._x - e._ptr->_x, e._y - e._ptr->_y); + e._spritePtr->touch(e._mask, e._x - e._spritePtr->_x, e._y - e._spritePtr->_y); } else if (_sys) - _sys->touch(e._msk, e._x, e._y); + _sys->touch(e._mask, e._x, e._y); - if (e._msk & L_DN) { - _mouse->_hold = e._ptr; + if (e._mask & kMouseLeftDown) { + _mouse->_hold = e._spritePtr; if (_mouse->_hold) { _mouse->_hold->_flags._hold = true; @@ -308,7 +309,7 @@ void EventManager::handleEvents() { } } - if (e._msk & L_UP) { + if (e._mask & kMouseLeftUp) { if (_mouse->_hold) { _mouse->_hold->_flags._hold = false; _mouse->_hold = NULL; @@ -317,10 +318,10 @@ void EventManager::handleEvents() { ///Touched = e.Ptr; // discard Text if button released - if (e._msk & (L_UP | R_UP)) + if (e._mask & (kMouseLeftUp | kMouseRightUp)) killText(); } - EvtTail = (EvtTail + 1) % EVT_MAX; + _eventQueueTail = (_eventQueueTail + 1) % kEventMax; } if (_mouse->_hold) { if (_mouse->_hold->_flags._drag) @@ -328,14 +329,20 @@ void EventManager::handleEvents() { } } -void EventManager::clrEvt(Sprite *spr) { +void EventManager::clearEvent(Sprite *spr) { if (spr) { uint16 e; - for (e = EvtTail; e != EvtHead; e = (e + 1) % EVT_MAX) - if (Evt[e]._ptr == spr) - Evt[e]._msk = 0; + for (e = _eventQueueTail; e != _eventQueueHead; e = (e + 1) % kEventMax) + if (_eventQueue[e]._spritePtr == spr) + _eventQueue[e]._mask = 0; } else - EvtTail = EvtHead; + _eventQueueTail = _eventQueueHead; } +CGEEvent &EventManager::getNextEvent() { + CGEEvent &evt = _eventQueue[_eventQueueHead]; + _eventQueueHead = (_eventQueueHead + 1) % kEventMax; + + return evt; +} } // End of namespace CGE |