forked from Mirrorlandia_minetest/minetest
Simulate all keys being released when when game loses focus (#13336)
This commit is contained in:
parent
fe75ec8d0d
commit
e139749b5c
@ -1005,6 +1005,7 @@ private:
|
|||||||
bool m_invert_mouse = false;
|
bool m_invert_mouse = false;
|
||||||
bool m_first_loop_after_window_activation = false;
|
bool m_first_loop_after_window_activation = false;
|
||||||
bool m_camera_offset_changed = false;
|
bool m_camera_offset_changed = false;
|
||||||
|
bool m_game_focused;
|
||||||
|
|
||||||
bool m_does_lost_focus_pause_game = false;
|
bool m_does_lost_focus_pause_game = false;
|
||||||
|
|
||||||
@ -1965,20 +1966,29 @@ void Game::processUserInput(f32 dtime)
|
|||||||
{
|
{
|
||||||
// Reset input if window not active or some menu is active
|
// Reset input if window not active or some menu is active
|
||||||
if (!device->isWindowActive() || isMenuActive() || guienv->hasFocus(gui_chat_console)) {
|
if (!device->isWindowActive() || isMenuActive() || guienv->hasFocus(gui_chat_console)) {
|
||||||
input->clear();
|
if(m_game_focused) {
|
||||||
|
m_game_focused = false;
|
||||||
|
infostream << "Game lost focus" << std::endl;
|
||||||
|
input->releaseAllKeys();
|
||||||
|
} else {
|
||||||
|
input->clear();
|
||||||
|
}
|
||||||
#ifdef HAVE_TOUCHSCREENGUI
|
#ifdef HAVE_TOUCHSCREENGUI
|
||||||
g_touchscreengui->hide();
|
g_touchscreengui->hide();
|
||||||
#endif
|
#endif
|
||||||
}
|
} else {
|
||||||
#ifdef HAVE_TOUCHSCREENGUI
|
#ifdef HAVE_TOUCHSCREENGUI
|
||||||
else if (g_touchscreengui) {
|
if (g_touchscreengui) {
|
||||||
/* on touchscreengui step may generate own input events which ain't
|
/* on touchscreengui step may generate own input events which ain't
|
||||||
* what we want in case we just did clear them */
|
* what we want in case we just did clear them */
|
||||||
g_touchscreengui->show();
|
g_touchscreengui->show();
|
||||||
g_touchscreengui->step(dtime);
|
g_touchscreengui->step(dtime);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
m_game_focused = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!guienv->hasFocus(gui_chat_console) && gui_chat_console->isOpen()) {
|
if (!guienv->hasFocus(gui_chat_console) && gui_chat_console->isOpen()) {
|
||||||
gui_chat_console->closeConsoleAtOnce();
|
gui_chat_console->closeConsoleAtOnce();
|
||||||
}
|
}
|
||||||
|
@ -124,6 +124,13 @@ public:
|
|||||||
push_back(key);
|
push_back(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void append(const KeyList &other)
|
||||||
|
{
|
||||||
|
for (const KeyPress &key : other) {
|
||||||
|
set(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool operator[](const KeyPress &key) const { return find(key) != end(); }
|
bool operator[](const KeyPress &key) const { return find(key) != end(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -178,6 +185,12 @@ public:
|
|||||||
mouse_wheel = 0;
|
mouse_wheel = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void releaseAllKeys()
|
||||||
|
{
|
||||||
|
keyWasReleased.append(keyIsDown);
|
||||||
|
keyIsDown.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void clearWasKeyPressed()
|
void clearWasKeyPressed()
|
||||||
{
|
{
|
||||||
keyWasPressed.clear();
|
keyWasPressed.clear();
|
||||||
@ -263,6 +276,7 @@ public:
|
|||||||
virtual void step(float dtime) {}
|
virtual void step(float dtime) {}
|
||||||
|
|
||||||
virtual void clear() {}
|
virtual void clear() {}
|
||||||
|
virtual void releaseAllKeys() {}
|
||||||
|
|
||||||
JoystickController joystick;
|
JoystickController joystick;
|
||||||
KeyCache keycache;
|
KeyCache keycache;
|
||||||
@ -395,6 +409,12 @@ public:
|
|||||||
m_receiver->clearInput();
|
m_receiver->clearInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void releaseAllKeys()
|
||||||
|
{
|
||||||
|
joystick.releaseAllKeys();
|
||||||
|
m_receiver->releaseAllKeys();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MyEventReceiver *m_receiver = nullptr;
|
MyEventReceiver *m_receiver = nullptr;
|
||||||
v2s32 m_mousepos;
|
v2s32 m_mousepos;
|
||||||
|
@ -109,6 +109,12 @@ public:
|
|||||||
bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
|
bool handleEvent(const irr::SEvent::SJoystickEvent &ev);
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
|
void releaseAllKeys()
|
||||||
|
{
|
||||||
|
m_keys_released |= m_keys_down;
|
||||||
|
m_keys_down.reset();
|
||||||
|
}
|
||||||
|
|
||||||
bool wasKeyDown(GameKeyType b)
|
bool wasKeyDown(GameKeyType b)
|
||||||
{
|
{
|
||||||
bool r = m_past_keys_pressed[b];
|
bool r = m_past_keys_pressed[b];
|
||||||
|
Loading…
Reference in New Issue
Block a user