aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/events.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/glk/events.h')
-rw-r--r--engines/glk/events.h291
1 files changed, 291 insertions, 0 deletions
diff --git a/engines/glk/events.h b/engines/glk/events.h
new file mode 100644
index 0000000000..537813f314
--- /dev/null
+++ b/engines/glk/events.h
@@ -0,0 +1,291 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GLK_EVENTS_H
+#define GLK_EVENTS_H
+
+#include "common/events.h"
+#include "graphics/surface.h"
+#include "glk/utils.h"
+
+namespace Gargoyle {
+
+#define GAME_FRAME_RATE 100
+#define GAME_FRAME_TIME (1000 / GAME_FRAME_RATE)
+
+class Window;
+
+/**
+ * Event types
+ */
+enum EvType {
+ evtype_None = 0,
+ evtype_Timer = 1,
+ evtype_CharInput = 2,
+ evtype_LineInput = 3,
+ evtype_MouseInput = 4,
+ evtype_Arrange = 5,
+ evtype_Redraw = 6,
+ evtype_SoundNotify = 7,
+ evtype_Hyperlink = 8,
+ evtype_VolumeNotify = 9,
+
+ // ScummVM custom events
+ evtype_Quit = 99
+};
+
+/**
+ * Keycodes
+ */
+enum Keycode {
+ keycode_Unknown = 0xffffffffU,
+ keycode_Left = 0xfffffffeU,
+ keycode_Right = 0xfffffffdU,
+ keycode_Up = 0xfffffffcU,
+ keycode_Down = 0xfffffffbU,
+ keycode_Return = 0xfffffffaU,
+ keycode_Delete = 0xfffffff9U,
+ keycode_Escape = 0xfffffff8U,
+ keycode_Tab = 0xfffffff7U,
+ keycode_PageUp = 0xfffffff6U,
+ keycode_PageDown = 0xfffffff5U,
+ keycode_Home = 0xfffffff4U,
+ keycode_End = 0xfffffff3U,
+ keycode_Func1 = 0xffffffefU,
+ keycode_Func2 = 0xffffffeeU,
+ keycode_Func3 = 0xffffffedU,
+ keycode_Func4 = 0xffffffecU,
+ keycode_Func5 = 0xffffffebU,
+ keycode_Func6 = 0xffffffeaU,
+ keycode_Func7 = 0xffffffe9U,
+ keycode_Func8 = 0xffffffe8U,
+ keycode_Func9 = 0xffffffe7U,
+ keycode_Func10 = 0xffffffe6U,
+ keycode_Func11 = 0xffffffe5U,
+ keycode_Func12 = 0xffffffe4U,
+
+ // non standard keycodes
+ keycode_Erase = 0xffffef7fU,
+ keycode_MouseWheelUp = 0xffffeffeU,
+ keycode_MouseWheelDown = 0xffffefffU,
+ keycode_SkipWordLeft = 0xfffff000U,
+ keycode_SkipWordRight = 0xfffff001U,
+
+ // The last keycode is always = 0x100000000 - keycode_MAXVAL)
+ keycode_MAXVAL = 28U
+};
+
+/**
+ * List of cursors
+ */
+enum CursorId {
+ CURSOR_NONE = 0,
+ CURSOR_ARROW = 1,
+ CURSOR_IBEAM = 2,
+ CURSOR_HAND = 3
+};
+
+/**
+ * Event structure
+ */
+struct Event {
+ EvType type;
+ Window *window;
+ uint32 val1, val2;
+
+ /**
+ * Constructor
+ */
+ Event() {
+ clear();
+ }
+
+ /**
+ * Constructor
+ */
+ Event(EvType evType, Window *evWindow, uint32 evVal1, uint32 evVal2) {
+ type = evType;
+ window = evWindow;
+ val1 = evVal1;
+ val2 = evVal2;
+ }
+
+ /**
+ * Clear
+ */
+ void clear() {
+ type = evtype_None;
+ window = nullptr;
+ val1 = val2 = 0;
+ }
+
+ /**
+ * Boolean cast to allow checking whether event is filled out
+ */
+ operator bool() const {
+ return type != evtype_None;
+ }
+};
+typedef Event event_t;
+
+class EventQueue : public Common::Queue<Event> {
+public:
+ /**
+ * Retrieve a pending event, if any
+ */
+ Event retrieve() {
+ return empty() ? Event() : pop();
+ }
+};
+
+/**
+ * Events manager
+ */
+class Events {
+ struct Surface : public Graphics::Surface {
+ Common::Point _hotspot;
+ };
+private:
+ EventQueue _eventsPolled; ///< User generated events
+ EventQueue _eventsLogged; ///< Custom events generated by game code
+ Event *_currentEvent; ///< Event pointer passed during event retrieval
+ uint32 _priorFrameTime; ///< Time of prior game frame
+ uint32 _frameCounter; ///< Frame counter
+ bool _redraw; ///< Screen needed redrawing
+ CursorId _cursorId; ///< Current cursor Id
+ Surface _cursors[4]; ///< Cursor pixel data
+ uint _timerMilli; ///< Time in milliseconds between timer events
+ uint _timerTimeExpiry; ///< When to trigger next timer event
+private:
+ /**
+ * Initialize the cursor graphics
+ */
+ void initializeCursors();
+
+ /**
+ * Checks for whether it's time for the next game frame
+ */
+ void checkForNextFrameCounter();
+
+ /**
+ * Dispatches an event
+ */
+ void dispatchEvent(Event &ev, bool polled);
+
+ /**
+ * Poll for user events
+ */
+ void pollEvents();
+
+ /**
+ * Handle a key down event
+ */
+ void handleKeyDown(const Common::KeyState &ks);
+
+ /**
+ * Handle scroll events
+ */
+ void handleScroll(bool wheelUp);
+
+ /**
+ * Handle mouse move events
+ */
+ void handleMouseMove(const Point &pos);
+
+ /**
+ * Handle mouse down events
+ */
+ void handleButtonDown(bool isLeft, const Point &pos);
+
+ /**
+ * Handle mouse up events
+ */
+ void handleButtonUp(bool isLeft, const Point &pos);
+public:
+ bool _forceClick;
+public:
+ /**
+ * Constructor
+ */
+ Events();
+
+ /**
+ * Destructor
+ */
+ ~Events();
+
+ /**
+ * Get any pending event
+ */
+ void getEvent(event_t *event, bool polled);
+
+ /**
+ * Store an event for retrieval
+ */
+ void store(EvType type, Window *win, uint32 val1 = 0, uint32 val2 = 0);
+
+ /**
+ * Wait for a keyboard or mouse press
+ */
+ void waitForPress();
+
+ /**
+ * Get the total number of frames played
+ */
+ uint32 getTotalPlayTicks() const {
+ return _frameCounter;
+ }
+
+ /**
+ * Set the total number of frames played
+ */
+ void setTotalPlayTicks(uint frames) {
+ _frameCounter = frames;
+ }
+
+ /**
+ * Flags the screen for redrawing
+ */
+ void redraw() {
+ _redraw = true;
+ }
+
+ /**
+ * Sets the current cursor
+ */
+ void setCursor(CursorId cursorId);
+
+ /**
+ * Set a timer interval
+ * @param milli Time in millieseconds for intervals, or 0 for off
+ */
+ void setTimerInterval(uint milli);
+
+ /**
+ * Returns true if it's time for a timer event
+ */
+ bool isTimerExpired() const;
+};
+
+} // End of namespace Gargoyle
+
+#endif