diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py /home/jyelon/integration.UE/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py
--- /home/jyelon/integration.UE.orig/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py	2025-03-11 10:33:14.000000000 -0400
+++ /home/jyelon/integration.UE/Engine/Extras/LLDBDataFormatters/UEDataFormatters_2ByteChars.py	2025-09-08 15:15:35.242987722 -0400
@@ -32,7 +32,7 @@
         if DataVal == 0:
             Val = 'NULL'
         else:
-            Expr = '(char16_t*)(%s)' % Data
+            Expr = '(char16_t*)(%s)' % DataVal
             ValRef = valobj.CreateValueFromExpression('string', Expr)
             Val = ValRef.GetSummary()
     elif Type.IsReferenceType():
@@ -47,6 +47,11 @@
             Expr = '(char16_t*)(%s)' % valobj.GetAddress()
             ValRef = valobj.CreateValueFromExpression('string', Expr)
             Val = ValRef.GetSummary()
+    else:
+        DataVal = valobj.GetValueAsUnsigned(0)
+        Expr = '(char16_t)(%s)' % DataVal
+        ValRef = valobj.CreateValueFromExpression('string', Expr)
+        Val = ValRef.GetSummary()
     return Val
 	
 def UESignedCharSummaryProvider(valobj,dict):
diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp /home/jyelon/integration.UE/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp
--- /home/jyelon/integration.UE.orig/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp	2025-03-11 10:33:14.000000000 -0400
+++ /home/jyelon/integration.UE/Engine/Plugins/Developer/VisualStudioCodeSourceCodeAccess/Source/VisualStudioCodeSourceCodeAccess/Private/VisualStudioCodeSourceCodeAccessor.cpp	2026-03-02 15:28:34.593675093 -0500
@@ -149,7 +149,7 @@
 		FString SolutionDir = GetSolutionPath();
 		TArray<FString> Args;
 		Args.Add(MakePath(SolutionDir));
-		Args.Add(TEXT("-g ") + MakePath(FullPath) + FString::Printf(TEXT(":%d:%d"), LineNumber, ColumnNumber));
+		Args.Add(TEXT("-g ") + MakePath(FullPath + FString::Printf(TEXT(":%d:%d"), LineNumber, ColumnNumber)));
 		return Launch(Args);
 	}
 
diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp /home/jyelon/integration.UE/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp
--- /home/jyelon/integration.UE.orig/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp	2025-03-11 10:33:14.000000000 -0400
+++ /home/jyelon/integration.UE/Engine/Source/Editor/UnrealEd/Private/SourceCodeNavigation.cpp	2026-03-02 15:37:59.934459864 -0500
@@ -463,7 +463,7 @@
 	ISourceCodeAccessModule& SourceCodeAccessModule = FModuleManager::LoadModuleChecked<ISourceCodeAccessModule>("SourceCodeAccess");
 	ISourceCodeAccessor& SourceCodeAccessor = SourceCodeAccessModule.GetAccessor();
 
-#if PLATFORM_WINDOWS
+#if PLATFORM_WINDOWS || PLATFORM_LINUX
 	FString SourceFileName;
 	uint32 SourceLineNumber = 1;
 	uint32 SourceColumnNumber = 0;
@@ -622,8 +622,8 @@
 	}
     
     UE_LOG(LogSelectionDetails, Warning, TEXT("NavigateToFunctionSource: Unable to look up symbol: %s in module:%s"), *FunctionSymbolName, *FunctionModuleName);
-    
-#endif	// PLATFORM_WINDOWS
+
+#endif	// PLATFORM_WINDOWS || PLATFORM_LINUX
 }
 
 
diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp /home/jyelon/integration.UE/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp
--- /home/jyelon/integration.UE.orig/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp	2025-03-11 10:33:14.000000000 -0400
+++ /home/jyelon/integration.UE/Engine/Source/Runtime/ApplicationCore/Private/Linux/LinuxPlatformApplicationMisc.cpp	2025-09-08 15:15:35.242987722 -0400
@@ -299,6 +299,9 @@
 		SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE, "1"); // When relative mouse mode is active, don't hide cursor.
 		SDL_SetHint(SDL_HINT_MOUSE_RELATIVE_MODE_WARP, "0"); // Don't warp the cursor to the center in relative mouse mode.
 
+		// Unreal does its own dynamic capturing, we don't need SDL to do it.
+		SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0");
+
 		// If we're rendering offscreen, use the "dummy" SDL video driver
 		if (FParse::Param(FCommandLine::Get(), TEXT("RenderOffScreen")) && !getenv("SDL_VIDEODRIVER"))
 		{
diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp
--- /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp	2025-03-11 10:33:14.000000000 -0400
+++ /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Private/Unix/UnixPlatformStackWalk.cpp	2026-03-02 15:37:24.464156072 -0500
@@ -15,6 +15,7 @@
 #include "HAL/ExceptionHandling.h"
 #include "HAL/PlatformProcess.h"
 #include "HAL/PlatformTime.h"
+#include "Modules/ModuleManager.h"
 #include "AutoRTFM/AutoRTFM.h"
 
 #include <link.h>
@@ -1060,3 +1061,69 @@
 	}
 	ReportLock.Unlock();
 }
+
+bool FUnixPlatformStackWalk::GetFunctionDefinitionLocation(const FString& FunctionSymbolName, const FString& FunctionModuleName, FString& OutPathname, uint32& OutLineNumber, uint32& OutColumnNumber)
+{
+	// Find the .so path for this module.
+	FString ModulePath;
+	TArray<FModuleStatus> AllModules;
+	FModuleManager::Get().QueryModules(AllModules);
+	for (const FModuleStatus& Status : AllModules)
+	{
+		if (FPaths::GetBaseFilename(Status.FilePath) == FunctionModuleName)
+		{
+			ModulePath = Status.FilePath;
+			break;
+		}
+	}
+	if (ModulePath.IsEmpty())
+	{
+		return false;
+	}
+
+	// Debug symbols are in a separate .debug file alongside the .so.
+	FString DebugPath = FPaths::ChangeExtension(ModulePath, TEXT("debug"));
+	if (!FPaths::FileExists(DebugPath))
+	{
+		return false;
+	}
+
+	// Use lldb to look up the source file and line number.
+	// Run: lldb -b -o "image lookup -v -n ClassName::FuncName" <debug_file>
+	FString LldbParams = FString::Printf(TEXT("-b -o \"image lookup -v -n %s\" \"%s\""), *FunctionSymbolName, *DebugPath);
+	int32 ReturnCode = 0;
+	FString AllOutput;
+	FString Errors;
+	FPlatformProcess::ExecProcess(TEXT("/usr/bin/lldb"), *LldbParams, &ReturnCode, &AllOutput, &Errors);
+	if (ReturnCode != 0)
+	{
+		return false;
+	}
+
+	// Parse the LineEntry from lldb verbose output.
+	// Format: "LineEntry: [0x...-0x...): /path/to/file.cpp:132"
+	TArray<FString> Lines;
+	AllOutput.ParseIntoArrayLines(Lines);
+	for (const FString& Line : Lines)
+	{
+		FString Trimmed = Line.TrimStartAndEnd();
+		if (!Trimmed.StartsWith(TEXT("LineEntry:")))
+			continue;
+
+		int32 ParenIndex = Trimmed.Find(TEXT("): "));
+		if (ParenIndex == INDEX_NONE)
+			continue;
+		FString FileAndLine = Trimmed.Mid(ParenIndex + 3);
+
+		int32 ColonIndex;
+		if (!FileAndLine.FindLastChar(TCHAR(':'), ColonIndex))
+			continue;
+
+		OutPathname = FileAndLine.Left(ColonIndex);
+		OutLineNumber = FCString::Atoi(*FileAndLine.Mid(ColonIndex + 1));
+		OutColumnNumber = 0;
+		return true;
+	}
+
+	return false;
+}
diff -u --recursive '--exclude=*.o' '--exclude=*.d' '--exclude=Intermediate' '--exclude=Binaries' '--exclude=Saved' '--exclude=DerivedDataCache' '--exclude=*.pyc' '--exclude=__pycache__' /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h
--- /home/jyelon/integration.UE.orig/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h	2025-03-11 10:33:14.000000000 -0400
+++ /home/jyelon/integration.UE/Engine/Source/Runtime/Core/Public/Unix/UnixPlatformStackWalk.h	2026-03-02 15:36:22.690627000 -0500
@@ -24,6 +24,8 @@
 	static CORE_API void ThreadStackWalkAndDump(ANSICHAR* HumanReadableString, SIZE_T HumanReadableStringSize, int32 IgnoreCount, uint32 ThreadId);
 	static CORE_API int32 GetProcessModuleCount();
 	static CORE_API int32 GetProcessModuleSignatures(FStackWalkModuleInfo *ModuleSignatures, const int32 ModuleSignaturesSize);
+
+	static CORE_API bool GetFunctionDefinitionLocation(const FString& FunctionSymbolName, const FString& FunctionModuleName, FString& OutPathname, uint32& OutLineNumber, uint32& OutColumnNumber);
 };
 
 typedef FUnixPlatformStackWalk FPlatformStackWalk;
