/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#ifndef SCI_EVENT_H
#define SCI_EVENT_H
#include "common/list.h"
#include "common/rect.h"
namespace Sci {
enum SciEventType {
kSciEventNone = 0,
kSciEventMousePress = 1,
kSciEventMouseRelease = 1 << 1,
kSciEventMouse = kSciEventMousePress | kSciEventMouseRelease,
kSciEventKeyDown = 1 << 2,
kSciEventKeyUp = 1 << 3,
kSciEventKey = kSciEventKeyDown | kSciEventKeyUp,
kSciEventDirection16 = 1 << 6, // SCI16
kSciEventSaid = 1 << 7,
#ifdef ENABLE_SCI32
kSciEventDirection32 = 1 << 4, // SCI32
kSciEventHotRectangle = 1 << 10,
#endif
kSciEventQuit = 1 << 11,
kSciEventPeek = 1 << 15,
kSciEventAny = ~kSciEventPeek
};
inline SciEventType operator|(const SciEventType a, const SciEventType b) {
return static_cast((int)a | (int)b);
}
inline SciEventType &operator|=(SciEventType &a, const SciEventType b) {
return a = static_cast((int)a | (int)b);
}
enum SciKeyCode {
kSciKeyEtx = 3,
kSciKeyBackspace = 8,
kSciKeyTab = '\t',
kSciKeyEnter = 13,
kSciKeyEsc = 27,
kSciKeyShiftTab = 15 << 8,
kSciKeyHome = 71 << 8, // numpad 7
kSciKeyUp = 72 << 8, // numpad 8
kSciKeyPageUp = 73 << 8, // numpad 9
kSciKeyLeft = 75 << 8, // numpad 4
kSciKeyCenter = 76 << 8, // numpad 5
kSciKeyRight = 77 << 8, // numpad 6
kSciKeyEnd = 79 << 8, // numpad 1
kSciKeyDown = 80 << 8, // numpad 2
kSciKeyPageDown = 81 << 8, // numpad 3
kSciKeyInsert = 82 << 8, // numpad 0
kSciKeyDelete = 83 << 8, // numpad .
kSciKeyF1 = 59 << 8,
kSciKeyF2 = 60 << 8,
kSciKeyF3 = 61 << 8,
kSciKeyF4 = 62 << 8,
kSciKeyF5 = 63 << 8,
kSciKeyF6 = 64 << 8,
kSciKeyF7 = 65 << 8,
kSciKeyF8 = 66 << 8,
kSciKeyF9 = 67 << 8,
kSciKeyF10 = 68 << 8,
kSciKeyShiftF1 = 84 << 8,
kSciKeyShiftF2 = 85 << 8,
kSciKeyShiftF3 = 86 << 8,
kSciKeyShiftF4 = 87 << 8,
kSciKeyShiftF5 = 88 << 8,
kSciKeyShiftF6 = 89 << 8,
kSciKeyShiftF7 = 90 << 8,
kSciKeyShiftF8 = 91 << 8,
kSciKeyShiftF9 = 92 << 8,
kSciKeyShiftF10 = 93 << 8
};
enum SciKeyModifiers {
kSciKeyModNone = 0,
kSciKeyModRShift = 1,
kSciKeyModLShift = 1 << 1,
kSciKeyModShift = kSciKeyModRShift | kSciKeyModLShift,
kSciKeyModCtrl = 1 << 2,
kSciKeyModAlt = 1 << 3,
kSciKeyModScrLock = 1 << 4,
kSciKeyModNumLock = 1 << 5,
kSciKeyModCapsLock = 1 << 6,
kSciKeyModInsert = 1 << 7,
kSciKeyModNonSticky = kSciKeyModRShift | kSciKeyModLShift | kSciKeyModCtrl | kSciKeyModAlt,
kSciKeyModAll = ~kSciKeyModNone
};
inline SciKeyModifiers &operator|=(SciKeyModifiers &a, SciKeyModifiers b) {
return a = static_cast((int)a | (int)b);
}
struct SciEvent {
SciEventType type;
SciKeyModifiers modifiers;
/**
* For keyboard events: the actual character of the key that was pressed
* For 'Alt', characters are interpreted by their
* PC keyboard scancodes.
*/
uint16 character;
/**
* The mouse position at the time the event was created, in script
* coordinates (SCI16) or display coordinates (SCI32).
*/
Common::Point mousePos;
#ifdef ENABLE_SCI32
/**
* The mouse position at the time the event was created, in script
* coordinates. Used only by SCI32.
*/
Common::Point mousePosSci;
/**
* The currently active hot rectangle, or -1 if no hot rectangle is active.
* Used only by the chase scene in Phantasmagoria 1.
*/
int16 hotRectangleIndex;
#endif
};
class EventManager {
public:
EventManager(bool fontIsExtended);
~EventManager();
void updateScreen();
SciEvent getSciEvent(SciEventType mask);
void flushEvents();
private:
SciEvent getScummVMEvent();
const bool _fontIsExtended;
Common::List _events;
#ifdef ENABLE_SCI32
public:
void setHotRectanglesActive(const bool active);
void setHotRectangles(const Common::Array &rects);
void checkHotRectangles(const Common::Point &mousePosition);
private:
bool _hotRectanglesActive;
Common::Array _hotRects;
int16 _activeRectIndex;
#endif
};
} // End of namespace Sci
#endif