diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 635e8326e2d..b55eda0e51d 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -4951,6 +4951,16 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA Input::get_singleton()->parse_input_event(mbd); } + // Propagate the button up event to the window on which the button down + // event was triggered. This is needed for drag & drop to work between windows, + // because the engine expects events to keep being processed + // on the same window dragging started. + if (mb->is_pressed()) { + last_mouse_button_down_window = window_id; + } else if (last_mouse_button_down_window != INVALID_WINDOW_ID) { + mb->set_window_id(last_mouse_button_down_window); + last_mouse_button_down_window = INVALID_WINDOW_ID; + } } break; case WM_WINDOWPOSCHANGED: { diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 8a2f9f81a6f..3deb7ac8b01 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -537,7 +537,7 @@ class DisplayServerWindows : public DisplayServer { RBMap windows; WindowID last_focused_window = INVALID_WINDOW_ID; - + WindowID last_mouse_button_down_window = INVALID_WINDOW_ID; HCURSOR hCursor; WNDPROC user_proc = nullptr;