Browse Source

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

Yuri Roubinsky 4 years ago
parent
commit
d4939aa05f

+ 36 - 31
platform/windows/display_server_windows.cpp

@@ -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];

+ 9 - 6
platform/windows/display_server_windows.h

@@ -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);