1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * Additional copyright for this file:
8  * Copyright (C) 1995-1997 Presto Studios, Inc.
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  */
25 
26 #ifndef PEGASUS_INPUT_H
27 #define PEGASUS_INPUT_H
28 
29 #include "common/events.h"
30 #include "common/rect.h"
31 #include "common/singleton.h"
32 
33 #include "pegasus/constants.h"
34 #include "pegasus/types.h"
35 
36 namespace Pegasus {
37 
38 class Hotspot;
39 class Input;
40 
41 enum PegasusAction {
42 	kPegasusActionNone,
43 	kPegasusActionUp,
44 	kPegasusActionDown,
45 	kPegasusActionLeft,
46 	kPegasusActionRight,
47 	kPegasusActionInteract,
48 	kPegasusActionShowInventory,
49 	kPegasusActionShowBiochip,
50 	kPegasusActionToggleCenterDisplay,
51 	kPegasusActionShowInfoScreen,
52 	kPegasusActionShowPauseMenu,
53 	kPegasusActionSaveGameState,
54 	kPegasusActionLoadGameState,
55 	kPegasusActionEnableEasterEgg,
56 	kPegasusActionToggleChattyAI,
57 
58 	kPegasusActionCount
59 };
60 
61 class InputDeviceManager : public Common::Singleton<InputDeviceManager>, public Common::EventObserver {
62 public:
63 	InputDeviceManager();
64 	~InputDeviceManager() override;
65 
66 	bool notifyEvent(const Common::Event &event) override;
67 
68 	void getInput(Input &, const InputBits);
69 
70 	void waitInput(const InputBits);
71 
72 	void pumpEvents();
73 
74 protected:
75 	friend class Common::Singleton<SingletonBaseType>;
76 
77 	// Keep track of which keys are down (= true) or not
78 	bool _keysDown[kPegasusActionCount];
79 	InputBits _lastRawBits;
80 	bool _AKeyWasDown;
81 };
82 
83 enum {
84 	kButtonDownBit = 0,
85 	kAutoButtonBit = 1,
86 	kBitsPerButton = 2,
87 
88 	kButtonDownMask = 1 << kButtonDownBit,
89 	kAutoButtonMask = 1 << kAutoButtonBit,
90 
91 	kButtonStateBits = kButtonDownMask | kAutoButtonMask,
92 
93 	kRawButtonUp = 0,
94 	kRawButtonDown = kButtonDownMask | kAutoButtonMask,
95 
96 	kButtonUp = 0,
97 	kButtonDown = kButtonDownMask,
98 	kButtonAutoUp = kAutoButtonMask,
99 	kButtonAutoDown = kButtonDownMask | kAutoButtonMask
100 };
101 
102 enum {
103 	kUpButtonNum = 0,
104 	kLeftButtonNum = 1,
105 	kDownButtonNum = 2,
106 	kRightButtonNum = 3,
107 	kLeftFireButtonNum = 4,
108 	kRightFireButtonNum = 5,
109 	kOneButtonNum = 6,
110 	kTwoButtonNum = 7,
111 	kThreeButtonNum = 8,
112 	kFourButtonNum = 9,
113 	kMod1ButtonNum = 10,
114 	kMod2ButtonNum = 11,
115 	kMod3ButtonNum = 12
116 };
117 
118 enum {
119 	kUpButtonShift = kUpButtonNum * kBitsPerButton,
120 	kLeftButtonShift = kLeftButtonNum * kBitsPerButton,
121 	kDownButtonShift = kDownButtonNum * kBitsPerButton,
122 	kRightButtonShift = kRightButtonNum * kBitsPerButton,
123 	kLeftFireButtonShift = kLeftFireButtonNum * kBitsPerButton,
124 	kRightFireButtonShift = kRightFireButtonNum * kBitsPerButton,
125 	kOneButtonShift = kOneButtonNum * kBitsPerButton,
126 	kTwoButtonShift = kTwoButtonNum * kBitsPerButton,
127 	kThreeButtonShift = kThreeButtonNum * kBitsPerButton,
128 	kFourButtonShift = kFourButtonNum * kBitsPerButton,
129 	kMod1ButtonShift = kMod1ButtonNum * kBitsPerButton,
130 	kMod2ButtonShift = kMod2ButtonNum * kBitsPerButton,
131 	kMod3ButtonShift = kMod3ButtonNum * kBitsPerButton
132 };
133 
134 enum {
135 	kAllUpBits =	(kButtonUp << kUpButtonShift) |
136 					(kButtonUp << kLeftButtonShift) |
137 					(kButtonUp << kDownButtonShift) |
138 					(kButtonUp << kRightButtonShift) |
139 					(kButtonUp << kLeftFireButtonShift) |
140 					(kButtonUp << kRightFireButtonShift) |
141 					(kButtonUp << kOneButtonShift) |
142 					(kButtonUp << kTwoButtonShift) |
143 					(kButtonUp << kThreeButtonShift) |
144 					(kButtonUp << kFourButtonShift) |
145 					(kButtonUp << kMod1ButtonShift) |
146 					(kButtonUp << kMod2ButtonShift) |
147 					(kButtonUp << kMod3ButtonShift),
148 	kDirectionBits =	(kButtonDownMask << kUpButtonShift) |
149 						(kButtonDownMask << kLeftButtonShift) |
150 						(kButtonDownMask << kDownButtonShift) |
151 						(kButtonDownMask << kRightButtonShift),
152 	kButtonBits =	(kButtonDownMask << kLeftFireButtonShift) |
153 					(kButtonDownMask << kRightFireButtonShift) |
154 					(kButtonDownMask << kOneButtonShift) |
155 					(kButtonDownMask << kTwoButtonShift) |
156 					(kButtonDownMask << kThreeButtonShift) |
157 					(kButtonDownMask << kFourButtonShift) |
158 					(kButtonDownMask << kMod1ButtonShift) |
159 					(kButtonDownMask << kMod2ButtonShift) |
160 					(kButtonDownMask << kMod3ButtonShift),
161 	kAllButtonDownBits = kDirectionBits | kButtonBits,
162 	kAllAutoBits =	(kAutoButtonMask << kUpButtonShift) |
163 					(kAutoButtonMask << kLeftButtonShift) |
164 					(kAutoButtonMask << kDownButtonShift) |
165 					(kAutoButtonMask << kRightButtonShift) |
166 					(kAutoButtonMask << kLeftFireButtonShift) |
167 					(kAutoButtonMask << kRightFireButtonShift) |
168 					(kAutoButtonMask << kOneButtonShift) |
169 					(kAutoButtonMask << kTwoButtonShift) |
170 					(kAutoButtonMask << kThreeButtonShift) |
171 					(kAutoButtonMask << kFourButtonShift) |
172 					(kAutoButtonMask << kMod1ButtonShift) |
173 					(kAutoButtonMask << kMod2ButtonShift) |
174 					(kAutoButtonMask << kMod3ButtonShift),
175 
176 	kFilterUpButton =			kButtonDownMask << kUpButtonShift,
177 	kFilterUpAuto =				kAutoButtonMask << kUpButtonShift,
178 	kFilterUpButtonAny =		kFilterUpButton | kFilterUpAuto,
179 	kFilterLeftButton =			kButtonDownMask << kLeftButtonShift,
180 	kFilterLeftAuto =			kAutoButtonMask << kLeftButtonShift,
181 	kFilterLeftButtonAny =		kFilterLeftButton | kFilterLeftAuto,
182 	kFilterDownButton =			kButtonDownMask << kDownButtonShift,
183 	kFilterDownAuto =			kAutoButtonMask << kDownButtonShift,
184 	kFilterDownButtonAny =		kFilterDownButton | kFilterDownAuto,
185 	kFilterRightButton =		kButtonDownMask << kRightButtonShift,
186 	kFilterRightAuto =			kAutoButtonMask << kRightButtonShift,
187 	kFilterRightButtonAny =		kFilterRightButton | kFilterRightAuto,
188 	kFilterLeftFireButton =		kButtonDownMask << kLeftFireButtonShift,
189 	kFilterLeftFireAuto =		kAutoButtonMask << kLeftFireButtonShift,
190 	kFilterLeftFireButtonAny =	kFilterLeftFireButton | kFilterLeftFireAuto,
191 	kFilterRightFireButton =	kButtonDownMask << kRightFireButtonShift,
192 	kFilterRightFireAuto =		kAutoButtonMask << kRightFireButtonShift,
193 	kFilterRightFireButtonAny =	kFilterRightFireButton | kFilterRightFireAuto,
194 	kFilterOneButton =			kButtonDownMask << kOneButtonShift,
195 	kFilterOneAuto =			kAutoButtonMask << kOneButtonShift,
196 	kFilterOneButtonAny =		kFilterOneButton | kFilterOneAuto,
197 	kFilterTwoButton =			kButtonDownMask << kTwoButtonShift,
198 	kFilterTwoAuto =			kAutoButtonMask << kTwoButtonShift,
199 	kFilterTwoButtonAny =		kFilterTwoButton | kFilterTwoAuto,
200 	kFilterThreeButton =		kButtonDownMask << kThreeButtonShift,
201 	kFilterThreeAuto =			kAutoButtonMask << kThreeButtonShift,
202 	kFilterThreeButtonAny =		kFilterThreeButton | kFilterThreeAuto,
203 	kFilterFourButton =			kButtonDownMask << kFourButtonShift,
204 	kFilterFourAuto =			kAutoButtonMask << kFourButtonShift,
205 	kFilterFourButtonAny =		kFilterFourButton | kFilterFourAuto,
206 	kFilterMod1Button =			kButtonDownMask << kMod1ButtonShift,
207 	kFilterMod1Auto =			kAutoButtonMask << kMod1ButtonShift,
208 	kFilterMod1ButtonAny =		kFilterMod1Button | kFilterMod1Auto,
209 	kFilterMod2Button =			kButtonDownMask << kMod2ButtonShift,
210 	kFilterMod2Auto =			kAutoButtonMask << kMod2ButtonShift,
211 	kFilterMod2ButtonAny =		kFilterMod2Button | kFilterMod2Auto,
212 	kFilterMod3Button =			kButtonDownMask << kMod3ButtonShift,
213 	kFilterMod3Auto =			kAutoButtonMask << kMod3ButtonShift,
214 	kFilterMod3ButtonAny =		kFilterMod3Button | kFilterMod3Auto,
215 
216 	kFilterNoInput =			0,
217 	kFilterAllInput =			kFilterUpButton |
218 								kFilterUpAuto |
219 								kFilterLeftButton |
220 								kFilterLeftAuto |
221 								kFilterDownButton |
222 								kFilterDownAuto |
223 								kFilterRightButton |
224 								kFilterRightAuto |
225 								kFilterLeftFireButton |
226 								kFilterLeftFireAuto |
227 								kFilterRightFireButton |
228 								kFilterRightFireAuto |
229 								kFilterOneButton |
230 								kFilterOneAuto |
231 								kFilterTwoButton |
232 								kFilterTwoAuto |
233 								kFilterThreeButton |
234 								kFilterThreeAuto |
235 								kFilterFourButton |
236 								kFilterFourAuto |
237 								kFilterMod1Button |
238 								kFilterMod1Auto |
239 								kFilterMod2Button |
240 								kFilterMod2Auto |
241 								kFilterMod3Button |
242 								kFilterMod3Auto,
243 
244 	kFilterAllDirections =		kFilterUpButton |
245 								kFilterUpAuto |
246 								kFilterLeftButton |
247 								kFilterLeftAuto |
248 								kFilterDownButton |
249 								kFilterDownAuto |
250 								kFilterRightButton |
251 								kFilterRightAuto,
252 
253 	kFilterButtons =			kFilterOneButton |
254 								kFilterOneAuto |
255 								kFilterTwoButton |
256 								kFilterTwoAuto |
257 								kFilterThreeButton |
258 								kFilterThreeAuto |
259 								kFilterFourButton |
260 								kFilterFourAuto,
261 
262 	kFilterFireButtons =		kFilterLeftFireButton |
263 								kFilterLeftFireAuto |
264 								kFilterRightFireButton |
265 								kFilterRightFireAuto,
266 
267 	kFilterAllButtons =			kFilterLeftFireButton |
268 								kFilterLeftFireAuto |
269 								kFilterRightFireButton |
270 								kFilterRightFireAuto |
271 								kFilterOneButton |
272 								kFilterOneAuto |
273 								kFilterTwoButton |
274 								kFilterTwoAuto |
275 								kFilterThreeButton |
276 								kFilterThreeAuto |
277 								kFilterFourButton |
278 								kFilterFourAuto |
279 								kFilterMod1Button |
280 								kFilterMod1Auto |
281 								kFilterMod2Button |
282 								kFilterMod2Auto |
283 								kFilterMod3Button |
284 								kFilterMod3Auto,
285 
286 	kFilterAllInputNoAuto =		kFilterUpButton |
287 								kFilterLeftButton |
288 								kFilterDownButton |
289 								kFilterRightButton |
290 								kFilterLeftFireButton |
291 								kFilterRightFireButton |
292 								kFilterOneButton |
293 								kFilterTwoButton |
294 								kFilterThreeButton |
295 								kFilterFourButton |
296 								kFilterMod1Button |
297 								kFilterMod2Button |
298 								kFilterMod3Button
299 };
300 
301 static const InputBits kHintInterruption = kFilterAllInputNoAuto;
302 static const InputBits kWarningInterruption = kFilterAllInputNoAuto;
303 static const InputBits kOpticalInterruption = kFilterAllInputNoAuto;
304 
305 /*
306 
307 	Buttons are defined as:
308 		up, left, down, right		direction buttons.
309 		fireLeft, fireRight:		fire buttons.
310 		mod1, mod2, mod3:			modifier buttons, similar to shift, control, etc.
311 		a, b, c, d:					general purpose buttons.
312 
313 	button state is held as bits in a long word, two bits per button.
314 
315 	Filter bits:
316 		for each button, two bits are assigned for filtering. If bit 0 is set, the
317 		corresponding button is available for "button down" input. If bit 1 is set,
318 		the corresponding button is available for "auto down" input. Note that bit
319 		1 is meaningful only if bit 0 is set.
320 
321 */
322 
323 class Input {
324 friend int operator==(const Input &, const Input &);
325 friend int operator!=(const Input &, const Input &);
326 friend class InputDeviceManager;
327 
328 public:
Input()329 	Input() { clearInput(); }
330 
upButtonDown()331 	bool upButtonDown() const { return (_inputState & (kButtonStateBits << kUpButtonShift)) == (kButtonDown << kUpButtonShift); }
upButtonAutoDown()332 	bool upButtonAutoDown() const { return (_inputState & (kButtonStateBits << kUpButtonShift)) == (kButtonAutoDown << kUpButtonShift); }
upButtonAnyDown()333 	bool upButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kUpButtonShift)) != 0; }
334 
leftButtonDown()335 	bool leftButtonDown() const { return (_inputState & (kButtonStateBits << kLeftButtonShift)) == (kButtonDown << kLeftButtonShift); }
leftButtonAutoDown()336 	bool leftButtonAutoDown() const { return (_inputState & (kButtonStateBits << kLeftButtonShift)) == (kButtonAutoDown << kLeftButtonShift); }
leftButtonAnyDown()337 	bool leftButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kLeftButtonShift)) != 0; }
338 
downButtonDown()339 	bool downButtonDown() const { return (_inputState & (kButtonStateBits << kDownButtonShift)) == (kButtonDown << kDownButtonShift); }
downButtonAutoDown()340 	bool downButtonAutoDown() const { return (_inputState & (kButtonStateBits << kDownButtonShift)) == (kButtonAutoDown << kDownButtonShift); }
downButtonAnyDown()341 	bool downButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kDownButtonShift)) != 0; }
342 
rightButtonDown()343 	bool rightButtonDown() const { return (_inputState & (kButtonStateBits << kRightButtonShift)) == (kButtonDown << kRightButtonShift); }
rightButtonAutoDown()344 	bool rightButtonAutoDown() const { return (_inputState & (kButtonStateBits << kRightButtonShift)) == (kButtonAutoDown << kRightButtonShift); }
rightButtonAnyDown()345 	bool rightButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kRightButtonShift)) != 0; }
346 
leftFireButtonDown()347 	bool leftFireButtonDown() const { return (_inputState & (kButtonStateBits << kLeftFireButtonShift)) == (kButtonDown << kLeftFireButtonShift); }
leftFireButtonAutoDown()348 	bool leftFireButtonAutoDown() const { return (_inputState & (kButtonStateBits << kLeftFireButtonShift)) == (kButtonAutoDown << kLeftFireButtonShift); }
leftFireButtonAnyDown()349 	bool leftFireButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kLeftFireButtonShift)) != 0; }
350 
rightFireButtonDown()351 	bool rightFireButtonDown() const { return (_inputState & (kButtonStateBits << kRightFireButtonShift)) == (kButtonDown << kRightFireButtonShift); }
rightFireButtonAutoDown()352 	bool rightFireButtonAutoDown() const { return (_inputState & (kButtonStateBits << kRightFireButtonShift)) == (kButtonAutoDown << kRightFireButtonShift); }
rightFireButtonAnyDown()353 	bool rightFireButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kRightFireButtonShift)) != 0; }
354 
oneButtonDown()355 	bool oneButtonDown() const { return	(_inputState & (kButtonStateBits << kOneButtonShift)) == (kButtonDown << kOneButtonShift); }
oneButtonAutoDown()356 	bool oneButtonAutoDown() const { return (_inputState & (kButtonStateBits << kOneButtonShift)) == (kButtonAutoDown << kOneButtonShift); }
oneButtonAnyDown()357 	bool oneButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kOneButtonShift)) != 0; }
358 
twoButtonDown()359 	bool twoButtonDown() const { return (_inputState & (kButtonStateBits << kTwoButtonShift)) == (kButtonDown << kTwoButtonShift); }
twoButtonAutoDown()360 	bool twoButtonAutoDown() const { return (_inputState & (kButtonStateBits << kTwoButtonShift)) == (kButtonAutoDown << kTwoButtonShift); }
twoButtonAnyDown()361 	bool twoButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kTwoButtonShift)) != 0; }
362 
threeButtonDown()363 	bool threeButtonDown() const { return (_inputState & (kButtonStateBits << kThreeButtonShift)) == (kButtonDown << kThreeButtonShift); }
threeButtonAutoDown()364 	bool threeButtonAutoDown() const { return (_inputState & (kButtonStateBits << kThreeButtonShift)) == (kButtonAutoDown << kThreeButtonShift); }
threeButtonAnyDown()365 	bool threeButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kThreeButtonShift)) != 0; }
366 
fourButtonDown()367 	bool fourButtonDown() const { return (_inputState & (kButtonStateBits << kFourButtonShift)) == (kButtonDown << kFourButtonShift); }
fourButtonAutoDown()368 	bool fourButtonAutoDown() const { return (_inputState & (kButtonStateBits << kFourButtonShift)) == (kButtonAutoDown << kFourButtonShift); }
fourButtonAnyDown()369 	bool fourButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kFourButtonShift)) != 0; }
370 
mod1ButtonDown()371 	bool mod1ButtonDown() const { return (_inputState & (kButtonStateBits << kMod1ButtonShift)) == (kButtonDown << kMod1ButtonShift); }
mod1ButtonAutoDown()372 	bool mod1ButtonAutoDown() const { return (_inputState & (kButtonStateBits << kMod1ButtonShift)) == (kButtonAutoDown << kMod1ButtonShift); }
mod1ButtonAnyDown()373 	bool mod1ButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kMod1ButtonShift)) != 0; }
374 
mod2ButtonDown()375 	bool mod2ButtonDown() const { return (_inputState & (kButtonStateBits << kMod2ButtonShift)) == (kButtonDown << kMod2ButtonShift); }
mod2ButtonAutoDown()376 	bool mod2ButtonAutoDown() const { return (_inputState & (kButtonStateBits << kMod2ButtonShift)) == (kButtonAutoDown << kMod2ButtonShift); }
mod2ButtonAnyDown()377 	bool mod2ButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kMod2ButtonShift)) != 0; }
378 
mod3ButtonDown()379 	bool mod3ButtonDown() const { return (_inputState & (kButtonStateBits << kMod3ButtonShift)) == (kButtonDown << kMod3ButtonShift); }
mod3ButtonAutoDown()380 	bool mod3ButtonAutoDown() const { return (_inputState & (kButtonStateBits << kMod3ButtonShift)) == (kButtonAutoDown << kMod3ButtonShift); }
mod3ButtonAnyDown()381 	bool mod3ButtonAnyDown() const { return (_inputState & (kButtonAutoDown << kMod3ButtonShift)) != 0; }
382 
allAutoInput()383 	bool allAutoInput() const { return (_inputState & kAllAutoBits) != 0; }
anyDirectionInput()384 	bool anyDirectionInput() const { return (_inputState & kDirectionBits) != 0; }
anyButtonInput()385 	bool anyButtonInput() const { return (_inputState & kButtonBits) != 0; }
anyInput()386 	bool anyInput() const { return _inputState != 0; }
387 
getInputLocation(Common::Point & where)388 	void getInputLocation(Common::Point &where) const { where = _inputLocation; }
389 
anyInputBitSet(const InputBits bits)390 	bool anyInputBitSet(const InputBits bits) const { return (_inputState & bits) != 0; }
391 
isAltDown()392 	bool isAltDown() const { return _altDown; }
393 
clearInput()394 	void clearInput() {
395 		_inputState = kAllUpBits;
396 		_inputLocation.x = 0;
397 		_inputLocation.y = 0;
398 		_altDown = false;
399 	}
400 
401 protected:
setInputBits(const InputBits state)402 	void setInputBits(const InputBits state) { _inputState = state; }
setInputLocation(const Common::Point & where)403 	void setInputLocation(const Common::Point &where) { _inputLocation = where; }
setAltDown(bool altDown)404 	void setAltDown(bool altDown) { _altDown = altDown; }
405 
406 	InputBits _inputState;
407 	Common::Point _inputLocation;
408 	bool _altDown;
409 };
410 
411 class InputHandler {
412 public:
413 	static InputHandler *setInputHandler(InputHandler*);
getCurrentHandler()414 	static InputHandler *getCurrentHandler() { return _inputHandler; }
415 	static void pollForInput();
416 	static void getInput(Input&, Hotspot*&);
417 	static void readInputDevice(Input&);
invalHotspots()418 	static void invalHotspots() { _invalHotspots = true; }
getCurrentFilter()419 	static InputBits getCurrentFilter() { return _lastFilter; }
420 
421 	InputHandler(InputHandler*);
422 	virtual ~InputHandler();
423 
setNextHandler(InputHandler * nextHandler)424 	virtual void setNextHandler(InputHandler *nextHandler) { _nextHandler = nextHandler; }
getNextHandler()425 	virtual InputHandler *getNextHandler() { return _nextHandler; }
426 
427 	virtual void handleInput(const Input &, const Hotspot *);
428 	virtual void clickInHotspot(const Input &, const Hotspot *);
429 
430 	virtual void activateHotspots();
431 	virtual void updateCursor(const Common::Point, const Hotspot *);
432 	virtual bool isClickInput(const Input &, const Hotspot *);
433 	virtual bool wantsCursor();
434 
releaseInputFocus()435 	virtual bool releaseInputFocus() { return true; }
grabInputFocus()436 	virtual void grabInputFocus() {}
437 
438 	// This returns bits set for what kinds of input to accept.
439 	virtual InputBits getInputFilter();
440 
441 	// This returns bits defining what input constitutes a "click."
442 	virtual InputBits getClickFilter();
443 
allowInput(const bool allow)444 	virtual void allowInput(const bool allow) { _allowInput = allow; }
445 
446 protected:
447 	static InputHandler *_inputHandler;
448 	static bool _invalHotspots;
449 	static InputBits _lastFilter;
450 
451 	InputHandler *_nextHandler;
452 	bool _allowInput;
453 };
454 
455 
456 /*
457 
458 	Tracker implements "dragging". A Tracker can receive a startTracking message,
459 	which causes it to be the current tracker, as well as setting it up as the current
460 	input handler. In addition, only one tracker can be tracking at a time, and no
461 	other handler can be set up as the current handler until the track finishes. By
462 	default, there is no next input handler for a Tracker, but this behavior can be
463 	overridden if desired.
464 
465 */
466 
467 class Tracker : public InputHandler {
468 public:
Tracker()469 	Tracker() : InputHandler(0), _savedHandler(nullptr) {}
~Tracker()470 	~Tracker() override {}
471 
472 	void handleInput(const Input &, const Hotspot *) override;
stopTrackingInput(const Input &)473 	virtual bool stopTrackingInput(const Input &) { return false; }
474 
475 	virtual void startTracking(const Input &);
476 	virtual void stopTracking(const Input &);
continueTracking(const Input &)477 	virtual void continueTracking(const Input &) {}
478 
isTracking()479 	bool isTracking() { return this == _currentTracker; }
480 	bool isClickInput(const Input &, const Hotspot *) override;
481 
releaseInputFocus()482 	bool releaseInputFocus() override { return !isTracking(); }
483 
484 protected:
485 	static Tracker *_currentTracker;
486 
487 	InputHandler *_savedHandler;
488 };
489 
490 class JMPPPInput {
491 public:
isMenuButtonPressInput(const Input & input)492 	static bool isMenuButtonPressInput(const Input &input) { return input.twoButtonDown(); }
493 
getClickInputFilter()494 	static InputBits getClickInputFilter() { return kFilterTwoButton; }
isClickInput(const Input & input)495 	static bool isClickInput(const Input &input) { return input.twoButtonDown(); }
isDraggingInput(const Input & input)496 	static bool isDraggingInput(const Input &input) { return input.twoButtonAnyDown(); }
isPressingInput(const Input & input)497 	static bool isPressingInput(const Input &input) { return input.twoButtonAnyDown(); }
498 
isRaiseInventoryInput(const Input & input)499 	static bool isRaiseInventoryInput(const Input &input) { return input.leftFireButtonDown(); }
isRaiseBiochipsInput(const Input & input)500 	static bool isRaiseBiochipsInput(const Input &input) { return input.rightFireButtonDown(); }
getItemPanelsInputFilter()501 	static InputBits getItemPanelsInputFilter() { return kFilterFourButton | kFilterLeftFireButton | kFilterRightFireButton; }
502 
isToggleAIMiddleInput(const Input & input)503 	static bool isToggleAIMiddleInput(const Input &input) { return input.threeButtonDown(); }
504 
isToggleInfoInput(const Input & input)505 	static bool isToggleInfoInput(const Input &input) { return input.fourButtonDown(); }
506 
507 	// Hmmmmm....
isEasterEggModifierInput(const Input & input)508 	static bool isEasterEggModifierInput(const Input &input) { return input.isAltDown(); }
509 
isTogglePauseInput(const Input & input)510 	static bool isTogglePauseInput(const Input &input) { return input.mod3ButtonDown(); }
511 };
512 
513 } // End of namespace Pegasus
514 
515 #define InputDevice (::Pegasus::InputDeviceManager::instance())
516 
517 #endif
518