Fix PopupMenu's which are not closed after a recent commit

This commit is contained in:
Yuri Roubinsky 2021-01-05 22:37:45 +03:00
parent a390e1e8a2
commit d4939aa05f
2 changed files with 45 additions and 37 deletions

View file

@ -1877,11 +1877,15 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
break;
}
case WM_ACTIVATE: { // Watch For Window Activate Message
saved_wparam = wParam;
saved_lparam = lParam;
if (!windows[window_id].window_focused) {
_process_activate_event(window_id, wParam, lParam);
} else {
windows[window_id].saved_wparam = wParam;
windows[window_id].saved_lparam = lParam;
// Run a timer to prevent event catching warning if the window is closing.
focus_timer_id = SetTimer(windows[window_id].hWnd, 2, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
// Run a timer to prevent event catching warning if the focused window is closing.
windows[window_id].focus_timer_id = SetTimer(windows[window_id].hWnd, 2, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
}
return 0; // Return To The Message Loop
}
case WM_GETMINMAXINFO: {
@ -1922,8 +1926,8 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_CLOSE: // Did We Receive A Close Message?
{
if (focus_timer_id != 0U) {
KillTimer(windows[window_id].hWnd, focus_timer_id);
if (windows[window_id].focus_timer_id != 0U) {
KillTimer(windows[window_id].hWnd, windows[window_id].focus_timer_id);
}
_send_window_event(windows[window_id], WINDOW_EVENT_CLOSE_REQUEST);
@ -2607,39 +2611,21 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
case WM_ENTERSIZEMOVE: {
Input::get_singleton()->release_pressed_events();
move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
windows[window_id].move_timer_id = SetTimer(windows[window_id].hWnd, 1, USER_TIMER_MINIMUM, (TIMERPROC) nullptr);
} break;
case WM_EXITSIZEMOVE: {
KillTimer(windows[window_id].hWnd, move_timer_id);
KillTimer(windows[window_id].hWnd, windows[window_id].move_timer_id);
} break;
case WM_TIMER: {
if (wParam == move_timer_id) {
if (wParam == windows[window_id].move_timer_id) {
_process_key_events();
if (!Main::is_iterating()) {
Main::iteration();
}
} else if (wParam == focus_timer_id) {
windows[window_id].minimized = HIWORD(saved_wparam) != 0;
if (LOWORD(saved_wparam) == WA_ACTIVE || LOWORD(saved_wparam) == WA_CLICKACTIVE) {
_send_window_event(windows[window_id], WINDOW_EVENT_FOCUS_IN);
windows[window_id].window_focused = true;
alt_mem = false;
control_mem = false;
shift_mem = false;
} else { // WM_INACTIVE
Input::get_singleton()->release_pressed_events();
_send_window_event(windows[window_id], WINDOW_EVENT_FOCUS_OUT);
windows[window_id].window_focused = false;
alt_mem = false;
};
if ((OS::get_singleton()->get_current_tablet_driver() == "wintab") && wintab_available && windows[window_id].wtctx) {
wintab_WTEnable(windows[window_id].wtctx, GET_WM_ACTIVATE_STATE(saved_wparam, saved_lparam));
}
KillTimer(windows[window_id].hWnd, focus_timer_id);
focus_timer_id = 0U;
} else if (wParam == windows[window_id].focus_timer_id) {
_process_activate_event(window_id, windows[window_id].saved_wparam, windows[window_id].saved_lparam);
KillTimer(windows[window_id].hWnd, wParam);
windows[window_id].focus_timer_id = 0U;
}
} break;
@ -2796,6 +2782,25 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
}
void DisplayServerWindows::_process_activate_event(WindowID p_window_id, WPARAM wParam, LPARAM lParam) {
if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) {
_send_window_event(windows[p_window_id], WINDOW_EVENT_FOCUS_IN);
windows[p_window_id].window_focused = true;
alt_mem = false;
control_mem = false;
shift_mem = false;
} else { // WM_INACTIVE
Input::get_singleton()->release_pressed_events();
_send_window_event(windows[p_window_id], WINDOW_EVENT_FOCUS_OUT);
windows[p_window_id].window_focused = false;
alt_mem = false;
};
if ((OS::get_singleton()->get_current_tablet_driver() == "wintab") && wintab_available && windows[p_window_id].wtctx) {
wintab_WTEnable(windows[p_window_id].wtctx, GET_WM_ACTIVATE_STATE(wParam, lParam));
}
}
void DisplayServerWindows::_process_key_events() {
for (int i = 0; i < key_event_pos; i++) {
KeyEvent &ke = key_event_buffer[i];

View file

@ -339,6 +339,14 @@ private:
bool no_focus = false;
bool window_has_focus = false;
// Used to transfer data between events using timer.
WPARAM saved_wparam;
LPARAM saved_lparam;
// Timers.
uint32_t move_timer_id = 0U;
uint32_t focus_timer_id = 0U;
HANDLE wtctx;
LOGCONTEXTW wtlc;
int min_pressure;
@ -387,9 +395,6 @@ private:
WindowID last_focused_window = INVALID_WINDOW_ID;
uint32_t move_timer_id = 0U;
uint32_t focus_timer_id = 0U;
HCURSOR hCursor;
WNDPROC user_proc = nullptr;
@ -409,9 +414,6 @@ private:
bool in_dispatch_input_event = false;
bool console_visible = false;
WPARAM saved_wparam;
LPARAM saved_lparam;
WNDCLASSEXW wc;
HCURSOR cursors[CURSOR_MAX] = { nullptr };
@ -428,6 +430,7 @@ private:
void _set_mouse_mode_impl(MouseMode p_mode);
void _process_activate_event(WindowID p_window_id, WPARAM wParam, LPARAM lParam);
void _process_key_events();
static void _dispatch_input_events(const Ref<InputEvent> &p_event);