]> git.lizzy.rs Git - minetest.git/blob - src/client/inputhandler.cpp
3b01f5d93ea520e4bb2837981b28cd4403f39ef2
[minetest.git] / src / client / inputhandler.cpp
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2017 nerzhul, Loic Blot <loic.blot@unix-experience.fr>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include "util/numeric.h"
22 #include "inputhandler.h"
23 #include "gui/mainmenumanager.h"
24
25 void KeyCache::populate_nonchanging()
26 {
27         key[KeyType::ESC] = EscapeKey;
28 }
29
30 void KeyCache::populate()
31 {
32         key[KeyType::FORWARD]      = getKeySetting("keymap_forward");
33         key[KeyType::BACKWARD]     = getKeySetting("keymap_backward");
34         key[KeyType::LEFT]         = getKeySetting("keymap_left");
35         key[KeyType::RIGHT]        = getKeySetting("keymap_right");
36         key[KeyType::JUMP]         = getKeySetting("keymap_jump");
37         key[KeyType::SPECIAL1]     = getKeySetting("keymap_special1");
38         key[KeyType::SNEAK]        = getKeySetting("keymap_sneak");
39
40         key[KeyType::AUTOFORWARD]  = getKeySetting("keymap_autoforward");
41
42         key[KeyType::DROP]         = getKeySetting("keymap_drop");
43         key[KeyType::INVENTORY]    = getKeySetting("keymap_inventory");
44         key[KeyType::CHAT]         = getKeySetting("keymap_chat");
45         key[KeyType::CMD]          = getKeySetting("keymap_cmd");
46         key[KeyType::CMD_LOCAL]    = getKeySetting("keymap_cmd_local");
47         key[KeyType::CONSOLE]      = getKeySetting("keymap_console");
48         key[KeyType::MINIMAP]      = getKeySetting("keymap_minimap");
49         key[KeyType::FREEMOVE]     = getKeySetting("keymap_freemove");
50         key[KeyType::FASTMOVE]     = getKeySetting("keymap_fastmove");
51         key[KeyType::NOCLIP]       = getKeySetting("keymap_noclip");
52         key[KeyType::HOTBAR_PREV]  = getKeySetting("keymap_hotbar_previous");
53         key[KeyType::HOTBAR_NEXT]  = getKeySetting("keymap_hotbar_next");
54         key[KeyType::MUTE]         = getKeySetting("keymap_mute");
55         key[KeyType::INC_VOLUME]   = getKeySetting("keymap_increase_volume");
56         key[KeyType::DEC_VOLUME]   = getKeySetting("keymap_decrease_volume");
57         key[KeyType::CINEMATIC]    = getKeySetting("keymap_cinematic");
58         key[KeyType::SCREENSHOT]   = getKeySetting("keymap_screenshot");
59         key[KeyType::TOGGLE_HUD]   = getKeySetting("keymap_toggle_hud");
60         key[KeyType::TOGGLE_CHAT]  = getKeySetting("keymap_toggle_chat");
61         key[KeyType::TOGGLE_FORCE_FOG_OFF]
62                 = getKeySetting("keymap_toggle_force_fog_off");
63         key[KeyType::TOGGLE_UPDATE_CAMERA]
64                 = getKeySetting("keymap_toggle_update_camera");
65         key[KeyType::TOGGLE_DEBUG]
66                 = getKeySetting("keymap_toggle_debug");
67         key[KeyType::TOGGLE_PROFILER]
68                 = getKeySetting("keymap_toggle_profiler");
69         key[KeyType::CAMERA_MODE]
70                 = getKeySetting("keymap_camera_mode");
71         key[KeyType::INCREASE_VIEWING_RANGE]
72                 = getKeySetting("keymap_increase_viewing_range_min");
73         key[KeyType::DECREASE_VIEWING_RANGE]
74                 = getKeySetting("keymap_decrease_viewing_range_min");
75         key[KeyType::RANGESELECT]
76                 = getKeySetting("keymap_rangeselect");
77         key[KeyType::ZOOM] = getKeySetting("keymap_zoom");
78
79         key[KeyType::QUICKTUNE_NEXT] = getKeySetting("keymap_quicktune_next");
80         key[KeyType::QUICKTUNE_PREV] = getKeySetting("keymap_quicktune_prev");
81         key[KeyType::QUICKTUNE_INC]  = getKeySetting("keymap_quicktune_inc");
82         key[KeyType::QUICKTUNE_DEC]  = getKeySetting("keymap_quicktune_dec");
83
84         for (int i = 0; i < 23; i++) {
85                 std::string slot_key_name = "keymap_slot" + std::to_string(i + 1);
86                 key[KeyType::SLOT_1 + i] = getKeySetting(slot_key_name.c_str());
87         }
88
89         if (handler) {
90                 // First clear all keys, then re-add the ones we listen for
91                 handler->dontListenForKeys();
92                 for (const KeyPress &k : key) {
93                         handler->listenForKey(k);
94                 }
95                 handler->listenForKey(EscapeKey);
96                 handler->listenForKey(CancelKey);
97         }
98 }
99
100 bool MyEventReceiver::OnEvent(const SEvent &event)
101 {
102         /*
103                 React to nothing here if a menu is active
104         */
105         if (isMenuActive()) {
106 #ifdef HAVE_TOUCHSCREENGUI
107                 if (m_touchscreengui) {
108                         m_touchscreengui->Toggle(false);
109                 }
110 #endif
111                 return g_menumgr.preprocessEvent(event);
112         }
113
114         // Remember whether each key is down or up
115         if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
116                 const KeyPress &keyCode = event.KeyInput;
117                 if (keysListenedFor[keyCode]) {
118                         if (event.KeyInput.PressedDown) {
119                                 keyIsDown.set(keyCode);
120                                 keyWasDown.set(keyCode);
121                         } else {
122                                 keyIsDown.unset(keyCode);
123                         }
124                         return true;
125                 }
126         }
127
128 #ifdef HAVE_TOUCHSCREENGUI
129         // case of touchscreengui we have to handle different events
130         if (m_touchscreengui && event.EventType == irr::EET_TOUCH_INPUT_EVENT) {
131                 m_touchscreengui->translateEvent(event);
132                 return true;
133         }
134 #endif
135
136         if (event.EventType == irr::EET_JOYSTICK_INPUT_EVENT) {
137                 /* TODO add a check like:
138                 if (event.JoystickEvent != joystick_we_listen_for)
139                         return false;
140                 */
141                 return joystick->handleEvent(event.JoystickEvent);
142         }
143         // handle mouse events
144         if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
145                 if (isMenuActive()) {
146                         left_active = false;
147                         middle_active = false;
148                         right_active = false;
149                 } else {
150                         left_active = event.MouseInput.isLeftPressed();
151                         middle_active = event.MouseInput.isMiddlePressed();
152                         right_active = event.MouseInput.isRightPressed();
153
154                         if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
155                                 leftclicked = true;
156                         }
157                         if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
158                                 rightclicked = true;
159                         }
160                         if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
161                                 leftreleased = true;
162                         }
163                         if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
164                                 rightreleased = true;
165                         }
166                         if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) {
167                                 mouse_wheel += event.MouseInput.Wheel;
168                         }
169                 }
170         } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) {
171                 static const LogLevel irr_loglev_conv[] = {
172                                 LL_VERBOSE, // ELL_DEBUG
173                                 LL_INFO,    // ELL_INFORMATION
174                                 LL_WARNING, // ELL_WARNING
175                                 LL_ERROR,   // ELL_ERROR
176                                 LL_NONE,    // ELL_NONE
177                 };
178                 assert(event.LogEvent.Level < ARRLEN(irr_loglev_conv));
179                 g_logger.log(irr_loglev_conv[event.LogEvent.Level],
180                                 std::string("Irrlicht: ") + event.LogEvent.Text);
181                 return true;
182         }
183         /* always return false in order to continue processing events */
184         return false;
185 }
186
187 /*
188  * RandomInputHandler
189  */
190 s32 RandomInputHandler::Rand(s32 min, s32 max)
191 {
192         return (myrand() % (max - min + 1)) + min;
193 }