1 // -*- Mode: C++; tab-width:2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi:tw=80:et:ts=2:sts=2
3 //
4 // -----------------------------------------------------------------------
5 //
6 // This file is part of RLVM, a RealLive virtual machine clone.
7 //
8 // -----------------------------------------------------------------------
9 //
10 // Copyright (C) 2007 Elliot Glaysher
11 //
12 // This program is free software; you can redistribute it and/or modify
13 // it under the terms of the GNU General Public License as published by
14 // the Free Software Foundation; either version 3 of the License, or
15 // (at your option) any later version.
16 //
17 // This program is distributed in the hope that it will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 // GNU General Public License for more details.
21 //
22 // You should have received a copy of the GNU General Public License
23 // along with this program; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
25 //
26 // -----------------------------------------------------------------------
27 
28 #ifndef SRC_SYSTEMS_BASE_EVENT_LISTENER_H_
29 #define SRC_SYSTEMS_BASE_EVENT_LISTENER_H_
30 
31 class RLMachine;
32 class Point;
33 
34 enum MouseButton {
35   MOUSE_NONE = 0,
36   MOUSE_LEFT,
37   MOUSE_RIGHT,
38   MOUSE_MIDDLE,
39   MOUSE_WHEELUP,
40   MOUSE_WHEELDOWN
41 };
42 
43 // Note that this looks suspiciously like the SDLKey definition with
44 // s/SDLK_/RLKEY/;. This was done because I'm lazy and SDL was the
45 // first backend I used, and they're right that lining up with ASCII
46 // as much as possible is a really good idea.
47 enum KeyCode {
48   // The keyboard syms have been cleverly chosen to map to ASCII
49   RLKEY_UNKNOWN = 0,
50   RLKEY_FIRST = 0,
51   RLKEY_BACKSPACE = 8,
52   RLKEY_TAB = 9,
53   RLKEY_CLEAR = 12,
54   RLKEY_RETURN = 13,
55   RLKEY_PAUSE = 19,
56   RLKEY_ESCAPE = 27,
57   RLKEY_SPACE = 32,
58   RLKEY_EXCLAIM = 33,
59   RLKEY_QUOTEDBL = 34,
60   RLKEY_HASH = 35,
61   RLKEY_DOLLAR = 36,
62   RLKEY_AMPERSAND = 38,
63   RLKEY_QUOTE = 39,
64   RLKEY_LEFTPAREN = 40,
65   RLKEY_RIGHTPAREN = 41,
66   RLKEY_ASTERISK = 42,
67   RLKEY_PLUS = 43,
68   RLKEY_COMMA = 44,
69   RLKEY_MINUS = 45,
70   RLKEY_PERIOD = 46,
71   RLKEY_SLASH = 47,
72   RLKEY_0 = 48,
73   RLKEY_1 = 49,
74   RLKEY_2 = 50,
75   RLKEY_3 = 51,
76   RLKEY_4 = 52,
77   RLKEY_5 = 53,
78   RLKEY_6 = 54,
79   RLKEY_7 = 55,
80   RLKEY_8 = 56,
81   RLKEY_9 = 57,
82   RLKEY_COLON = 58,
83   RLKEY_SEMICOLON = 59,
84   RLKEY_LESS = 60,
85   RLKEY_EQUALS = 61,
86   RLKEY_GREATER = 62,
87   RLKEY_QUESTION = 63,
88   RLKEY_AT = 64,
89   // Skip uppercase letters
90   RLKEY_LEFTBRACKET = 91,
91   RLKEY_BACKSLASH = 92,
92   RLKEY_RIGHTBRACKET = 93,
93   RLKEY_CARET = 94,
94   RLKEY_UNDERSCORE = 95,
95   RLKEY_BACKQUOTE = 96,
96   RLKEY_a = 97,
97   RLKEY_b = 98,
98   RLKEY_c = 99,
99   RLKEY_d = 100,
100   RLKEY_e = 101,
101   RLKEY_f = 102,
102   RLKEY_g = 103,
103   RLKEY_h = 104,
104   RLKEY_i = 105,
105   RLKEY_j = 106,
106   RLKEY_k = 107,
107   RLKEY_l = 108,
108   RLKEY_m = 109,
109   RLKEY_n = 110,
110   RLKEY_o = 111,
111   RLKEY_p = 112,
112   RLKEY_q = 113,
113   RLKEY_r = 114,
114   RLKEY_s = 115,
115   RLKEY_t = 116,
116   RLKEY_u = 117,
117   RLKEY_v = 118,
118   RLKEY_w = 119,
119   RLKEY_x = 120,
120   RLKEY_y = 121,
121   RLKEY_z = 122,
122   RLKEY_DELETE = 127,
123   // End of ASCII mapped keysyms
124 
125   // International keyboard syms
126   RLKEY_WORLD_0 = 160,  // 0xA0
127   RLKEY_WORLD_1 = 161,
128   RLKEY_WORLD_2 = 162,
129   RLKEY_WORLD_3 = 163,
130   RLKEY_WORLD_4 = 164,
131   RLKEY_WORLD_5 = 165,
132   RLKEY_WORLD_6 = 166,
133   RLKEY_WORLD_7 = 167,
134   RLKEY_WORLD_8 = 168,
135   RLKEY_WORLD_9 = 169,
136   RLKEY_WORLD_10 = 170,
137   RLKEY_WORLD_11 = 171,
138   RLKEY_WORLD_12 = 172,
139   RLKEY_WORLD_13 = 173,
140   RLKEY_WORLD_14 = 174,
141   RLKEY_WORLD_15 = 175,
142   RLKEY_WORLD_16 = 176,
143   RLKEY_WORLD_17 = 177,
144   RLKEY_WORLD_18 = 178,
145   RLKEY_WORLD_19 = 179,
146   RLKEY_WORLD_20 = 180,
147   RLKEY_WORLD_21 = 181,
148   RLKEY_WORLD_22 = 182,
149   RLKEY_WORLD_23 = 183,
150   RLKEY_WORLD_24 = 184,
151   RLKEY_WORLD_25 = 185,
152   RLKEY_WORLD_26 = 186,
153   RLKEY_WORLD_27 = 187,
154   RLKEY_WORLD_28 = 188,
155   RLKEY_WORLD_29 = 189,
156   RLKEY_WORLD_30 = 190,
157   RLKEY_WORLD_31 = 191,
158   RLKEY_WORLD_32 = 192,
159   RLKEY_WORLD_33 = 193,
160   RLKEY_WORLD_34 = 194,
161   RLKEY_WORLD_35 = 195,
162   RLKEY_WORLD_36 = 196,
163   RLKEY_WORLD_37 = 197,
164   RLKEY_WORLD_38 = 198,
165   RLKEY_WORLD_39 = 199,
166   RLKEY_WORLD_40 = 200,
167   RLKEY_WORLD_41 = 201,
168   RLKEY_WORLD_42 = 202,
169   RLKEY_WORLD_43 = 203,
170   RLKEY_WORLD_44 = 204,
171   RLKEY_WORLD_45 = 205,
172   RLKEY_WORLD_46 = 206,
173   RLKEY_WORLD_47 = 207,
174   RLKEY_WORLD_48 = 208,
175   RLKEY_WORLD_49 = 209,
176   RLKEY_WORLD_50 = 210,
177   RLKEY_WORLD_51 = 211,
178   RLKEY_WORLD_52 = 212,
179   RLKEY_WORLD_53 = 213,
180   RLKEY_WORLD_54 = 214,
181   RLKEY_WORLD_55 = 215,
182   RLKEY_WORLD_56 = 216,
183   RLKEY_WORLD_57 = 217,
184   RLKEY_WORLD_58 = 218,
185   RLKEY_WORLD_59 = 219,
186   RLKEY_WORLD_60 = 220,
187   RLKEY_WORLD_61 = 221,
188   RLKEY_WORLD_62 = 222,
189   RLKEY_WORLD_63 = 223,
190   RLKEY_WORLD_64 = 224,
191   RLKEY_WORLD_65 = 225,
192   RLKEY_WORLD_66 = 226,
193   RLKEY_WORLD_67 = 227,
194   RLKEY_WORLD_68 = 228,
195   RLKEY_WORLD_69 = 229,
196   RLKEY_WORLD_70 = 230,
197   RLKEY_WORLD_71 = 231,
198   RLKEY_WORLD_72 = 232,
199   RLKEY_WORLD_73 = 233,
200   RLKEY_WORLD_74 = 234,
201   RLKEY_WORLD_75 = 235,
202   RLKEY_WORLD_76 = 236,
203   RLKEY_WORLD_77 = 237,
204   RLKEY_WORLD_78 = 238,
205   RLKEY_WORLD_79 = 239,
206   RLKEY_WORLD_80 = 240,
207   RLKEY_WORLD_81 = 241,
208   RLKEY_WORLD_82 = 242,
209   RLKEY_WORLD_83 = 243,
210   RLKEY_WORLD_84 = 244,
211   RLKEY_WORLD_85 = 245,
212   RLKEY_WORLD_86 = 246,
213   RLKEY_WORLD_87 = 247,
214   RLKEY_WORLD_88 = 248,
215   RLKEY_WORLD_89 = 249,
216   RLKEY_WORLD_90 = 250,
217   RLKEY_WORLD_91 = 251,
218   RLKEY_WORLD_92 = 252,
219   RLKEY_WORLD_93 = 253,
220   RLKEY_WORLD_94 = 254,
221   RLKEY_WORLD_95 = 255,  // 0xFF
222 
223   // Numeric keypad
224   RLKEY_KP0 = 256,
225   RLKEY_KP1 = 257,
226   RLKEY_KP2 = 258,
227   RLKEY_KP3 = 259,
228   RLKEY_KP4 = 260,
229   RLKEY_KP5 = 261,
230   RLKEY_KP6 = 262,
231   RLKEY_KP7 = 263,
232   RLKEY_KP8 = 264,
233   RLKEY_KP9 = 265,
234   RLKEY_KP_PERIOD = 266,
235   RLKEY_KP_DIVIDE = 267,
236   RLKEY_KP_MULTIPLY = 268,
237   RLKEY_KP_MINUS = 269,
238   RLKEY_KP_PLUS = 270,
239   RLKEY_KP_ENTER = 271,
240   RLKEY_KP_EQUALS = 272,
241 
242   // Arrows + Home/End pad
243   RLKEY_UP = 273,
244   RLKEY_DOWN = 274,
245   RLKEY_RIGHT = 275,
246   RLKEY_LEFT = 276,
247   RLKEY_INSERT = 277,
248   RLKEY_HOME = 278,
249   RLKEY_END = 279,
250   RLKEY_PAGEUP = 280,
251   RLKEY_PAGEDOWN = 281,
252 
253   // Function keys
254   RLKEY_F1 = 282,
255   RLKEY_F2 = 283,
256   RLKEY_F3 = 284,
257   RLKEY_F4 = 285,
258   RLKEY_F5 = 286,
259   RLKEY_F6 = 287,
260   RLKEY_F7 = 288,
261   RLKEY_F8 = 289,
262   RLKEY_F9 = 290,
263   RLKEY_F10 = 291,
264   RLKEY_F11 = 292,
265   RLKEY_F12 = 293,
266   RLKEY_F13 = 294,
267   RLKEY_F14 = 295,
268   RLKEY_F15 = 296,
269 
270   // Key state modifier keys
271   RLKEY_NUMLOCK = 300,
272   RLKEY_CAPSLOCK = 301,
273   RLKEY_SCROLLOCK = 302,
274   RLKEY_RSHIFT = 303,
275   RLKEY_LSHIFT = 304,
276   RLKEY_RCTRL = 305,
277   RLKEY_LCTRL = 306,
278   RLKEY_RALT = 307,
279   RLKEY_LALT = 308,
280   RLKEY_RMETA = 309,
281   RLKEY_LMETA = 310,
282   RLKEY_LSUPER = 311,   // Left "Windows" key
283   RLKEY_RSUPER = 312,   // Right "Windows" key
284   RLKEY_MODE = 313,     // "Alt Gr" key
285   RLKEY_COMPOSE = 314,  // Multi-key compose key
286 
287   // Miscellaneous function keys
288   RLKEY_HELP = 315,
289   RLKEY_PRINT = 316,
290   RLKEY_SYSREQ = 317,
291   RLKEY_BREAK = 318,
292   RLKEY_MENU = 319,
293   RLKEY_POWER = 320,  // Power Macintosh power key
294   RLKEY_EURO = 321,   // Some European keyboards
295   RLKEY_UNDO = 322,   // Atari keyboard has Undo
296 };
297 
298 // Interface to receive information from the Event system when the
299 // mouse is moved.
300 class EventListener {
301  public:
302   virtual ~EventListener();
303 
304   // Notifies of the new location of the mouse hotspot.
305   virtual void MouseMotion(const Point& new_location);
306 
307   // A notification of a mouse or key press. Returns true if this EventListener
308   // handled the message (and this message shouldn't be Dispatched to other
309   // EventListeners).
310   virtual bool MouseButtonStateChanged(MouseButton mouse_button, bool pressed);
311 
312   // A notification that a key was pressed or unpressed. Returns true if this
313   // EventListener handled the message (and this message shouldn't be
314   // Dispatched to other EventListeners).
315   virtual bool KeyStateChanged(KeyCode key_code, bool pressed);
316 };
317 
318 #endif  // SRC_SYSTEMS_BASE_EVENT_LISTENER_H_
319