summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRĂ©mi Verschelde <rverschelde@gmail.com>2019-04-29 18:39:45 +0200
committerGitHub <noreply@github.com>2019-04-29 18:39:45 +0200
commitb2f6beb888d17b2a01779bba203067c0aba548c4 (patch)
tree5400b67183b8264693d02ac32157f5bdcc729611
parent23147ae2c3740e73f0247cf4bff24ba9326683a4 (diff)
parentc709dfdf06f6b09b61c1f34ff5a32cbfa8acc523 (diff)
Merge pull request #28061 from guilhermefelipecgs/fix_19137
[Input] Release keys/actions pressed if window loses focus
-rw-r--r--main/input_default.cpp13
-rw-r--r--main/input_default.h1
-rw-r--r--platform/osx/os_osx.mm5
-rw-r--r--platform/windows/os_windows.cpp2
-rw-r--r--platform/x11/os_x11.cpp2
5 files changed, 23 insertions, 0 deletions
diff --git a/main/input_default.cpp b/main/input_default.cpp
index 6c3252ad1a..a939d77a1e 100644
--- a/main/input_default.cpp
+++ b/main/input_default.cpp
@@ -677,6 +677,19 @@ void InputDefault::set_use_accumulated_input(bool p_enable) {
use_accumulated_input = p_enable;
}
+void InputDefault::release_pressed_events() {
+
+ flush_accumulated_events(); // this is needed to release actions strengths
+
+ keys_pressed.clear();
+ joy_buttons_pressed.clear();
+ _joy_axis.clear();
+
+ for (Map<StringName, InputDefault::Action>::Element *E = action_state.front(); E; E = E->next()) {
+ action_release(E->key());
+ }
+}
+
InputDefault::InputDefault() {
use_accumulated_input = true;
diff --git a/main/input_default.h b/main/input_default.h
index f9b4cbbd57..80ee17656c 100644
--- a/main/input_default.h
+++ b/main/input_default.h
@@ -272,6 +272,7 @@ public:
virtual void flush_accumulated_events();
virtual void set_use_accumulated_input(bool p_enable);
+ virtual void release_pressed_events();
InputDefault();
};
diff --git a/platform/osx/os_osx.mm b/platform/osx/os_osx.mm
index 789e0bbd3e..fec524c04b 100644
--- a/platform/osx/os_osx.mm
+++ b/platform/osx/os_osx.mm
@@ -337,6 +337,11 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt
}
- (void)windowDidMove:(NSNotification *)notification {
+
+ if (OS_OSX::singleton->get_main_loop()) {
+ OS_OSX::singleton->input->release_pressed_events();
+ }
+
/*
[window->nsgl.context update];
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp
index dbfa1b171c..0b61770d87 100644
--- a/platform/windows/os_windows.cpp
+++ b/platform/windows/os_windows.cpp
@@ -346,6 +346,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
control_mem = false;
shift_mem = false;
} else { // WM_INACTIVE
+ input->release_pressed_events();
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
alt_mem = false;
};
@@ -786,6 +787,7 @@ LRESULT OS_Windows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
} break;
case WM_ENTERSIZEMOVE: {
+ input->release_pressed_events();
move_timer_id = SetTimer(hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC)NULL);
} break;
case WM_EXITSIZEMOVE: {
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index f6161a9485..8d857de239 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -2076,7 +2076,9 @@ void OS_X11::process_xevents() {
case FocusOut:
window_has_focus = false;
+ input->release_pressed_events();
main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT);
+
if (mouse_mode_grab) {
//dear X11, I try, I really try, but you never work, you do whathever you want.
if (mouse_mode == MOUSE_MODE_CAPTURED) {