Include backtrace in error message when LuaErrors occur
[minetest-c55.git] / src / client / inputhandler.h
blob69e4b25fa62003f3b3b9c07cbe2a17e69537543c
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #ifndef INPUT_HANDLER_H
21 #define INPUT_HANDLER_H
23 #include "irrlichttypes_extrabloated.h"
25 class MyEventReceiver : public IEventReceiver
27 public:
28 // This is the one method that we have to implement
29 virtual bool OnEvent(const SEvent& event)
32 React to nothing here if a menu is active
34 if (noMenuActive() == false) {
35 #ifdef HAVE_TOUCHSCREENGUI
36 if (m_touchscreengui != 0) {
37 m_touchscreengui->Toggle(false);
39 #endif
40 return g_menumgr.preprocessEvent(event);
43 // Remember whether each key is down or up
44 if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
45 if (event.KeyInput.PressedDown) {
46 keyIsDown.set(event.KeyInput);
47 keyWasDown.set(event.KeyInput);
48 } else {
49 keyIsDown.unset(event.KeyInput);
53 #ifdef HAVE_TOUCHSCREENGUI
54 // case of touchscreengui we have to handle different events
55 if ((m_touchscreengui != 0) &&
56 (event.EventType == irr::EET_TOUCH_INPUT_EVENT)) {
57 m_touchscreengui->translateEvent(event);
58 return true;
60 #endif
61 // handle mouse events
62 if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
63 if (noMenuActive() == false) {
64 left_active = false;
65 middle_active = false;
66 right_active = false;
67 } else {
68 left_active = event.MouseInput.isLeftPressed();
69 middle_active = event.MouseInput.isMiddlePressed();
70 right_active = event.MouseInput.isRightPressed();
72 if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
73 leftclicked = true;
75 if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
76 rightclicked = true;
78 if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
79 leftreleased = true;
81 if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
82 rightreleased = true;
84 if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) {
85 mouse_wheel += event.MouseInput.Wheel;
88 } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) {
89 static const LogLevel irr_loglev_conv[] = {
90 LL_VERBOSE, // ELL_DEBUG
91 LL_INFO, // ELL_INFORMATION
92 LL_WARNING, // ELL_WARNING
93 LL_ERROR, // ELL_ERROR
94 LL_NONE, // ELL_NONE
96 assert(event.LogEvent.Level < ARRLEN(irr_loglev_conv));
97 g_logger.log(irr_loglev_conv[event.LogEvent.Level],
98 std::string("Irrlicht: ") + (const char*) event.LogEvent.Text);
99 return true;
101 /* always return false in order to continue processing events */
102 return false;
105 bool IsKeyDown(const KeyPress &keyCode) const
107 return keyIsDown[keyCode];
110 // Checks whether a key was down and resets the state
111 bool WasKeyDown(const KeyPress &keyCode)
113 bool b = keyWasDown[keyCode];
114 if (b)
115 keyWasDown.unset(keyCode);
116 return b;
119 s32 getMouseWheel()
121 s32 a = mouse_wheel;
122 mouse_wheel = 0;
123 return a;
126 void clearInput()
128 keyIsDown.clear();
129 keyWasDown.clear();
131 leftclicked = false;
132 rightclicked = false;
133 leftreleased = false;
134 rightreleased = false;
136 left_active = false;
137 middle_active = false;
138 right_active = false;
140 mouse_wheel = 0;
143 MyEventReceiver()
145 clearInput();
146 #ifdef HAVE_TOUCHSCREENGUI
147 m_touchscreengui = NULL;
148 #endif
151 bool leftclicked;
152 bool rightclicked;
153 bool leftreleased;
154 bool rightreleased;
156 bool left_active;
157 bool middle_active;
158 bool right_active;
160 s32 mouse_wheel;
162 #ifdef HAVE_TOUCHSCREENGUI
163 TouchScreenGUI* m_touchscreengui;
164 #endif
166 private:
167 // The current state of keys
168 KeyList keyIsDown;
169 // Whether a key has been pressed or not
170 KeyList keyWasDown;
175 Separated input handler
178 class RealInputHandler : public InputHandler
180 public:
181 RealInputHandler(IrrlichtDevice *device, MyEventReceiver *receiver):
182 m_device(device),
183 m_receiver(receiver),
184 m_mousepos(0,0)
187 virtual bool isKeyDown(const KeyPress &keyCode)
189 return m_receiver->IsKeyDown(keyCode);
191 virtual bool wasKeyDown(const KeyPress &keyCode)
193 return m_receiver->WasKeyDown(keyCode);
195 virtual v2s32 getMousePos()
197 if (m_device->getCursorControl()) {
198 return m_device->getCursorControl()->getPosition();
200 else {
201 return m_mousepos;
204 virtual void setMousePos(s32 x, s32 y)
206 if (m_device->getCursorControl()) {
207 m_device->getCursorControl()->setPosition(x, y);
209 else {
210 m_mousepos = v2s32(x,y);
214 virtual bool getLeftState()
216 return m_receiver->left_active;
218 virtual bool getRightState()
220 return m_receiver->right_active;
223 virtual bool getLeftClicked()
225 return m_receiver->leftclicked;
227 virtual bool getRightClicked()
229 return m_receiver->rightclicked;
231 virtual void resetLeftClicked()
233 m_receiver->leftclicked = false;
235 virtual void resetRightClicked()
237 m_receiver->rightclicked = false;
240 virtual bool getLeftReleased()
242 return m_receiver->leftreleased;
244 virtual bool getRightReleased()
246 return m_receiver->rightreleased;
248 virtual void resetLeftReleased()
250 m_receiver->leftreleased = false;
252 virtual void resetRightReleased()
254 m_receiver->rightreleased = false;
257 virtual s32 getMouseWheel()
259 return m_receiver->getMouseWheel();
262 void clear()
264 m_receiver->clearInput();
266 private:
267 IrrlichtDevice *m_device;
268 MyEventReceiver *m_receiver;
269 v2s32 m_mousepos;
272 class RandomInputHandler : public InputHandler
274 public:
275 RandomInputHandler()
277 leftdown = false;
278 rightdown = false;
279 leftclicked = false;
280 rightclicked = false;
281 leftreleased = false;
282 rightreleased = false;
283 keydown.clear();
285 virtual bool isKeyDown(const KeyPress &keyCode)
287 return keydown[keyCode];
289 virtual bool wasKeyDown(const KeyPress &keyCode)
291 return false;
293 virtual v2s32 getMousePos()
295 return mousepos;
297 virtual void setMousePos(s32 x, s32 y)
299 mousepos = v2s32(x, y);
302 virtual bool getLeftState()
304 return leftdown;
306 virtual bool getRightState()
308 return rightdown;
311 virtual bool getLeftClicked()
313 return leftclicked;
315 virtual bool getRightClicked()
317 return rightclicked;
319 virtual void resetLeftClicked()
321 leftclicked = false;
323 virtual void resetRightClicked()
325 rightclicked = false;
328 virtual bool getLeftReleased()
330 return leftreleased;
332 virtual bool getRightReleased()
334 return rightreleased;
336 virtual void resetLeftReleased()
338 leftreleased = false;
340 virtual void resetRightReleased()
342 rightreleased = false;
345 virtual s32 getMouseWheel()
347 return 0;
350 virtual void step(float dtime)
353 static float counter1 = 0;
354 counter1 -= dtime;
355 if (counter1 < 0.0) {
356 counter1 = 0.1 * Rand(1, 40);
357 keydown.toggle(getKeySetting("keymap_jump"));
361 static float counter1 = 0;
362 counter1 -= dtime;
363 if (counter1 < 0.0) {
364 counter1 = 0.1 * Rand(1, 40);
365 keydown.toggle(getKeySetting("keymap_special1"));
369 static float counter1 = 0;
370 counter1 -= dtime;
371 if (counter1 < 0.0) {
372 counter1 = 0.1 * Rand(1, 40);
373 keydown.toggle(getKeySetting("keymap_forward"));
377 static float counter1 = 0;
378 counter1 -= dtime;
379 if (counter1 < 0.0) {
380 counter1 = 0.1 * Rand(1, 40);
381 keydown.toggle(getKeySetting("keymap_left"));
385 static float counter1 = 0;
386 counter1 -= dtime;
387 if (counter1 < 0.0) {
388 counter1 = 0.1 * Rand(1, 20);
389 mousespeed = v2s32(Rand(-20, 20), Rand(-15, 20));
393 static float counter1 = 0;
394 counter1 -= dtime;
395 if (counter1 < 0.0) {
396 counter1 = 0.1 * Rand(1, 30);
397 leftdown = !leftdown;
398 if (leftdown)
399 leftclicked = true;
400 if (!leftdown)
401 leftreleased = true;
405 static float counter1 = 0;
406 counter1 -= dtime;
407 if (counter1 < 0.0) {
408 counter1 = 0.1 * Rand(1, 15);
409 rightdown = !rightdown;
410 if (rightdown)
411 rightclicked = true;
412 if (!rightdown)
413 rightreleased = true;
416 mousepos += mousespeed;
419 s32 Rand(s32 min, s32 max)
421 return (myrand()%(max-min+1))+min;
423 private:
424 KeyList keydown;
425 v2s32 mousepos;
426 v2s32 mousespeed;
427 bool leftdown;
428 bool rightdown;
429 bool leftclicked;
430 bool rightclicked;
431 bool leftreleased;
432 bool rightreleased;
435 #endif