Browse Source

Merge branch 'v1_develop' into v1_release

Tig 3 months ago
parent
commit
152bb18183

+ 1 - 1
ReactiveExample/ReactiveExample.csproj

@@ -11,7 +11,7 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="ReactiveUI.Fody" Version="19.5.41" />
-    <PackageReference Include="ReactiveUI" Version="20.1.1" />
+    <PackageReference Include="ReactiveUI" Version="20.2.45" />
     <PackageReference Include="ReactiveMarbles.ObservableEvents.SourceGenerator" Version="1.3.1" PrivateAssets="all" />
   </ItemGroup>
   <ItemGroup>

+ 129 - 134
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -18,6 +18,7 @@ namespace Terminal.Gui {
 		public const int STD_ERROR_HANDLE = -12;
 
 		internal IntPtr InputHandle, OutputHandle;
+		IntPtr screenBuffer;
 		readonly uint originalConsoleMode;
 		CursorVisibility? initialCursorVisibility = null;
 		CursorVisibility? currentCursorVisibility = null;
@@ -39,47 +40,47 @@ namespace Terminal.Gui {
 
 		public bool WriteToConsole (Size size, CharInfo [] charInfoBuffer, Coord coords, SmallRect window)
 		{
-			//if (OutputHandle == IntPtr.Zero) {
-			//	ReadFromConsoleOutput (size, coords, ref window);
-			//}
+			if (!IsWindowsTerminal && screenBuffer == IntPtr.Zero) {
+				ReadFromConsoleOutput (size, coords, ref window);
+			}
 
-			return WriteConsoleOutput (OutputHandle, charInfoBuffer, coords, new Coord () { X = window.Left, Y = window.Top }, ref window);
-		}
+			if (!initialCursorVisibility.HasValue && GetCursorVisibility (out CursorVisibility visibility)) {
+				initialCursorVisibility = visibility;
+			}
 
-		//public void ReadFromConsoleOutput (Size size, Coord coords, ref SmallRect window)
-		//{
-		//	OutputHandle = CreateConsoleScreenBuffer (
-		//		DesiredAccess.GenericRead | DesiredAccess.GenericWrite,
-		//		ShareMode.FileShareRead | ShareMode.FileShareWrite,
-		//		IntPtr.Zero,
-		//		1,
-		//		IntPtr.Zero
-		//	);
-		//	if (ScreenBuffer == INVALID_HANDLE_VALUE) {
-		//		var err = Marshal.GetLastWin32Error ();
+			return WriteConsoleOutput (IsWindowsTerminal ? OutputHandle : screenBuffer, charInfoBuffer, coords, new Coord () { X = window.Left, Y = window.Top }, ref window);
+		}
 
-		//		if (err != 0)
-		//			throw new System.ComponentModel.Win32Exception (err);
-		//	}
+		public void ReadFromConsoleOutput (Size size, Coord coords, ref SmallRect window)
+		{
+			screenBuffer = CreateConsoleScreenBuffer (
+				DesiredAccess.GenericRead | DesiredAccess.GenericWrite,
+				ShareMode.FileShareRead | ShareMode.FileShareWrite,
+				IntPtr.Zero,
+				1,
+				IntPtr.Zero
+			);
+			if (screenBuffer == INVALID_HANDLE_VALUE) {
+				var err = Marshal.GetLastWin32Error ();
 
-		//	if (!initialCursorVisibility.HasValue && GetCursorVisibility (out CursorVisibility visibility)) {
-		//		initialCursorVisibility = visibility;
-		//	}
+				if (err != 0)
+					throw new System.ComponentModel.Win32Exception (err);
+			}
 
-		//	if (!SetConsoleActiveScreenBuffer (ScreenBuffer)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
+			if (!SetConsoleActiveScreenBuffer (screenBuffer)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
 
-		//	OriginalStdOutChars = new CharInfo [size.Height * size.Width];
+			OriginalStdOutChars = new CharInfo [size.Height * size.Width];
 
-		//	if (!ReadConsoleOutput (ScreenBuffer, OriginalStdOutChars, coords, new Coord () { X = 0, Y = 0 }, ref window)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-		//}
+			if (!ReadConsoleOutput (screenBuffer, OriginalStdOutChars, coords, new Coord () { X = 0, Y = 0 }, ref window)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+		}
 
 		public bool SetCursorPosition (Coord position)
 		{
-			return SetConsoleCursorPosition (OutputHandle, position);
+			return SetConsoleCursorPosition (IsWindowsTerminal ? OutputHandle : screenBuffer, position);
 		}
 
 		public void SetInitialCursorVisibility ()
@@ -91,11 +92,11 @@ namespace Terminal.Gui {
 
 		public bool GetCursorVisibility (out CursorVisibility visibility)
 		{
-			if (OutputHandle == IntPtr.Zero) {
+			if ((IsWindowsTerminal ? OutputHandle : screenBuffer) == IntPtr.Zero) {
 				visibility = CursorVisibility.Invisible;
 				return false;
 			}
-			if (!GetConsoleCursorInfo (OutputHandle, out ConsoleCursorInfo info)) {
+			if (!GetConsoleCursorInfo (IsWindowsTerminal ? OutputHandle : screenBuffer, out ConsoleCursorInfo info)) {
 				var err = Marshal.GetLastWin32Error ();
 				if (err != 0) {
 					throw new System.ComponentModel.Win32Exception (err);
@@ -148,7 +149,7 @@ namespace Terminal.Gui {
 					bVisible = ((uint)visibility & 0xFF00) != 0
 				};
 
-				if (!SetConsoleCursorInfo (OutputHandle, ref info))
+				if (!SetConsoleCursorInfo (IsWindowsTerminal ? OutputHandle : screenBuffer, ref info))
 					return false;
 
 				currentCursorVisibility = visibility;
@@ -164,28 +165,28 @@ namespace Terminal.Gui {
 			}
 
 			ConsoleMode = originalConsoleMode;
-			//if (!SetConsoleActiveScreenBuffer (OutputHandle)) {
-			//	var err = Marshal.GetLastWin32Error ();
-			//	Console.WriteLine ("Error: {0}", err);
-			//}
+			if (!SetConsoleActiveScreenBuffer (OutputHandle)) {
+				var err = Marshal.GetLastWin32Error ();
+				Console.WriteLine ("Error: {0}", err);
+			}
 
-			//if (ScreenBuffer != IntPtr.Zero) {
-			//	CloseHandle (ScreenBuffer);
-			//}
+			if (screenBuffer != IntPtr.Zero) {
+				CloseHandle (screenBuffer);
+			}
 
-			//ScreenBuffer = IntPtr.Zero;
+			screenBuffer = IntPtr.Zero;
 		}
 
 		internal Size GetConsoleBufferWindow (out Point position)
 		{
-			if (OutputHandle == IntPtr.Zero) {
+			if ((IsWindowsTerminal ? OutputHandle : screenBuffer) == IntPtr.Zero) {
 				position = Point.Empty;
 				return Size.Empty;
 			}
 
 			var csbi = new CONSOLE_SCREEN_BUFFER_INFOEX ();
 			csbi.cbSize = (uint)Marshal.SizeOf (csbi);
-			if (!GetConsoleScreenBufferInfoEx (OutputHandle, ref csbi)) {
+			if (!GetConsoleScreenBufferInfoEx ((IsWindowsTerminal ? OutputHandle : screenBuffer), ref csbi)) {
 				//throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
 				position = Point.Empty;
 				return Size.Empty;
@@ -211,68 +212,70 @@ namespace Terminal.Gui {
 			return sz;
 		}
 
-		//internal Size SetConsoleWindow (short cols, short rows)
-		//{
-		//	var csbi = new CONSOLE_SCREEN_BUFFER_INFOEX ();
-		//	csbi.cbSize = (uint)Marshal.SizeOf (csbi);
-
-		//	if (!GetConsoleScreenBufferInfoEx (ScreenBuffer, ref csbi)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-		//	var maxWinSize = GetLargestConsoleWindowSize (ScreenBuffer);
-		//	var newCols = Math.Min (cols, maxWinSize.X);
-		//	var newRows = Math.Min (rows, maxWinSize.Y);
-		//	csbi.dwSize = new Coord (newCols, Math.Max (newRows, (short)1));
-		//	csbi.srWindow = new SmallRect (0, 0, newCols, newRows);
-		//	csbi.dwMaximumWindowSize = new Coord (newCols, newRows);
-		//	if (!SetConsoleScreenBufferInfoEx (ScreenBuffer, ref csbi)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-		//	var winRect = new SmallRect (0, 0, (short)(newCols - 1), (short)Math.Max (newRows - 1, 0));
-		//	if (!SetConsoleWindowInfo (OutputHandle, true, ref winRect)) {
-		//		//throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//		return new Size (cols, rows);
-		//	}
-		//	SetConsoleOutputWindow (csbi);
-		//	return new Size (winRect.Right + 1, newRows - 1 < 0 ? 0 : winRect.Bottom + 1);
-		//}
-
-		//void SetConsoleOutputWindow (CONSOLE_SCREEN_BUFFER_INFOEX csbi)
-		//{
-		//	if (ScreenBuffer != IntPtr.Zero && !SetConsoleScreenBufferInfoEx (ScreenBuffer, ref csbi)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-		//}
-
-		//internal Size SetConsoleOutputWindow (out Point position)
-		//{
-		//	if (ScreenBuffer == IntPtr.Zero) {
-		//		position = Point.Empty;
-		//		return Size.Empty;
-		//	}
-
-		//	var csbi = new CONSOLE_SCREEN_BUFFER_INFOEX ();
-		//	csbi.cbSize = (uint)Marshal.SizeOf (csbi);
-		//	if (!GetConsoleScreenBufferInfoEx (ScreenBuffer, ref csbi)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-		//	var sz = new Size (csbi.srWindow.Right - csbi.srWindow.Left + 1,
-		//		Math.Max (csbi.srWindow.Bottom - csbi.srWindow.Top + 1, 0));
-		//	position = new Point (csbi.srWindow.Left, csbi.srWindow.Top);
-		//	SetConsoleOutputWindow (csbi);
-		//	var winRect = new SmallRect (0, 0, (short)(sz.Width - 1), (short)Math.Max (sz.Height - 1, 0));
-		//	if (!SetConsoleScreenBufferInfoEx (OutputHandle, ref csbi)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-		//	if (!SetConsoleWindowInfo (OutputHandle, true, ref winRect)) {
-		//		throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
-		//	}
-
-		//	return sz;
-		//}
+		internal Size SetConsoleWindow (short cols, short rows)
+		{
+			var csbi = new CONSOLE_SCREEN_BUFFER_INFOEX ();
+			csbi.cbSize = (uint)Marshal.SizeOf (csbi);
+
+			if (!GetConsoleScreenBufferInfoEx (IsWindowsTerminal ? OutputHandle : screenBuffer, ref csbi)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+			var maxWinSize = GetLargestConsoleWindowSize (IsWindowsTerminal ? OutputHandle : screenBuffer);
+			var newCols = Math.Min (cols, maxWinSize.X);
+			var newRows = Math.Min (rows, maxWinSize.Y);
+			csbi.dwSize = new Coord (newCols, Math.Max (newRows, (short)1));
+			csbi.srWindow = new SmallRect (0, 0, newCols, newRows);
+			csbi.dwMaximumWindowSize = new Coord (newCols, newRows);
+			if (!SetConsoleScreenBufferInfoEx (IsWindowsTerminal ? OutputHandle : screenBuffer, ref csbi)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+			var winRect = new SmallRect (0, 0, (short)(newCols - 1), (short)Math.Max (newRows - 1, 0));
+			if (!SetConsoleWindowInfo (OutputHandle, true, ref winRect)) {
+				//throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+				return new Size (cols, rows);
+			}
+			SetConsoleOutputWindow (csbi);
+			return new Size (winRect.Right + 1, newRows - 1 < 0 ? 0 : winRect.Bottom + 1);
+		}
+
+		void SetConsoleOutputWindow (CONSOLE_SCREEN_BUFFER_INFOEX csbi)
+		{
+			if ((IsWindowsTerminal ? OutputHandle : screenBuffer) != IntPtr.Zero && !SetConsoleScreenBufferInfoEx (IsWindowsTerminal ? OutputHandle : screenBuffer, ref csbi)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+		}
+
+		internal Size SetConsoleOutputWindow (out Point position)
+		{
+			if ((IsWindowsTerminal ? OutputHandle : screenBuffer) == IntPtr.Zero) {
+				position = Point.Empty;
+				return Size.Empty;
+			}
+
+			var csbi = new CONSOLE_SCREEN_BUFFER_INFOEX ();
+			csbi.cbSize = (uint)Marshal.SizeOf (csbi);
+			if (!GetConsoleScreenBufferInfoEx (IsWindowsTerminal ? OutputHandle : screenBuffer, ref csbi)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+			var sz = new Size (csbi.srWindow.Right - csbi.srWindow.Left + 1,
+				Math.Max (csbi.srWindow.Bottom - csbi.srWindow.Top + 1, 0));
+			position = new Point (csbi.srWindow.Left, csbi.srWindow.Top);
+			SetConsoleOutputWindow (csbi);
+			var winRect = new SmallRect (0, 0, (short)(sz.Width - 1), (short)Math.Max (sz.Height - 1, 0));
+			if (!SetConsoleScreenBufferInfoEx (OutputHandle, ref csbi)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+			if (!SetConsoleWindowInfo (OutputHandle, true, ref winRect)) {
+				throw new System.ComponentModel.Win32Exception (Marshal.GetLastWin32Error ());
+			}
+
+			return sz;
+		}
 
 		//bool ContinueListeningForConsoleEvents = true;
 
+		internal bool IsWindowsTerminal { get; set; }
+
 		public uint ConsoleMode {
 			get {
 				GetConsoleMode (InputHandle, out uint v);
@@ -733,7 +736,7 @@ namespace Terminal.Gui {
 			WinConsole = new WindowsConsole ();
 			clipboard = new WindowsClipboard ();
 
-			isWindowsTerminal = Environment.GetEnvironmentVariable ("WT_SESSION") != null || Environment.GetEnvironmentVariable ("VSAPPIDNAME") != null;
+			WinConsole.IsWindowsTerminal = isWindowsTerminal = Environment.GetEnvironmentVariable ("WT_SESSION") != null || Environment.GetEnvironmentVariable ("VSAPPIDNAME") != null;
 		}
 
 		public override void PrepareToRun (MainLoop mainLoop, Action<KeyEvent> keyHandler, Action<KeyEvent> keyDownHandler, Action<KeyEvent> keyUpHandler, Action<MouseEvent> mouseHandler)
@@ -747,28 +750,28 @@ namespace Terminal.Gui {
 
 			mLoop.ProcessInput = (e) => ProcessInput (e);
 
-			//mLoop.WinChanged = (e) => {
-			//	ChangeWin (e);
-			//};
-		}
-
-		//private void ChangeWin (Size e)
-		//{
-		//	var w = e.Width;
-		//	if (w == cols - 3 && e.Height < rows) {
-		//		w += 3;
-		//	}
-		//	var newSize = WinConsole.SetConsoleWindow (
-		//		(short)Math.Max (w, 16), (short)Math.Max (e.Height, 0));
-
-		//	left = 0;
-		//	top = 0;
-		//	cols = newSize.Width;
-		//	rows = newSize.Height;
-		//	ResizeScreen ();
-		//	UpdateOffScreen ();
-		//	TerminalResized.Invoke ();
-		//}
+			mLoop.WinChanged = (e) => {
+				ChangeWin (e);
+			};
+		}
+
+		private void ChangeWin (Size e)
+		{
+			var w = e.Width;
+			if (w == cols - 3 && e.Height < rows) {
+				w += 3;
+			}
+			var newSize = WinConsole.SetConsoleWindow (
+				(short)Math.Max (w, 16), (short)Math.Max (e.Height, 0));
+
+			left = 0;
+			top = 0;
+			cols = newSize.Width;
+			rows = newSize.Height;
+			ResizeScreen ();
+			UpdateOffScreen ();
+			TerminalResized.Invoke ();
+		}
 
 		void ProcessInput (WindowsConsole.InputRecord inputEvent)
 		{
@@ -892,14 +895,6 @@ namespace Terminal.Gui {
 			case WindowsConsole.EventType.Focus:
 				keyModifiers = null;
 				break;
-
-			case WindowsConsole.EventType.WindowBufferSize:
-				cols = inputEvent.WindowBufferSizeEvent.size.X;
-				rows = inputEvent.WindowBufferSizeEvent.size.Y;
-
-				ResizeScreen ();
-				TerminalResized.Invoke ();
-				break;
 			}
 		}
 

+ 1 - 1
Terminal.Gui/Resources/Strings.ja-JP.resx

@@ -166,6 +166,6 @@
     <value>終える</value>
   </data>
   <data name="wzNext" xml:space="preserve">
-    <value>次に</value>
+    <value>次に...</value>
   </data>
 </root>

+ 1 - 1
Terminal.Gui/Resources/Strings.pt-PT.resx

@@ -166,6 +166,6 @@
     <value>Acabam_ento</value>
   </data>
   <data name="wzNext" xml:space="preserve">
-    <value>S_eguir</value>
+    <value>S_eguir...</value>
   </data>
 </root>

+ 2 - 2
Terminal.Gui/Terminal.Gui.csproj

@@ -20,7 +20,7 @@
     <DebugType>portable</DebugType>
   </PropertyGroup>
   <PropertyGroup>
-    <TargetFrameworks>net472;netstandard2.0;netstandard2.1;net6.0;net7.0;net8.0</TargetFrameworks>
+    <TargetFrameworks>net472;netstandard2.0;netstandard2.1;net6.0;net8.0</TargetFrameworks>
     <RootNamespace>Terminal.Gui</RootNamespace>
     <AssemblyName>Terminal.Gui</AssemblyName>
     <SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
@@ -30,7 +30,7 @@
   <!-- =================================================================== -->
   <ItemGroup>
     <PackageReference Include="NStack.Core" Version="1.1.1" />
-    <PackageReference Include="System.Management" Version="8.0.0" />
+    <PackageReference Include="System.Management" Version="9.0.4" />
     <!-- Enable Nuget Source Link for github -->
     <PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="All" />
     <InternalsVisibleTo Include="UnitTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c135ca0dc72ed9549b7ebf23772eb9e3dc2dc9e4a4fb795fa88404a175cfbe230a3d5edb1802c7952b1b5edbeb8136dc16ea6ab03f3f6fed01e9937d8ef40378bee9a31502cd56bfc14adfb2858d438c66d87aea4c54c49bfad28a282bed869af33ac256fe9584b1c5b96479b52a0c95b5a400a7b833820faa272d16ce0586ed" />

+ 4 - 3
UICatalog/UICatalog.csproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <OutputType>Exe</OutputType>
     <TargetFramework>net8.0</TargetFramework>
@@ -9,6 +9,8 @@
     <!-- Do not modify these. -->
     <FileVersion>1.0.0.0</FileVersion>
     <Version>1.0.0</Version>
+    <SignAssembly>True</SignAssembly>
+    <AssemblyOriginatorKeyFile>UICatalog.snk</AssemblyOriginatorKeyFile>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
     <DefineConstants>TRACE</DefineConstants>
@@ -20,8 +22,7 @@
     <None Update="./Scenarios/Spinning_globe_dark_small.gif" CopyToOutputDirectory="PreserveNewest" />
   </ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
-    <PackageReference Include="SixLabors.ImageSharp" Version="3.1.5" />
+    <PackageReference Include="SixLabors.ImageSharp" Version="3.1.7" />
     <PackageReference Include="CsvHelper" Version="33.0.1" />
     <PackageReference Include="Microsoft.DotNet.PlatformAbstractions" Version="3.1.6" />
   </ItemGroup>

BIN
UICatalog/UICatalog.snk


+ 5 - 5
UnitTests/UnitTests.csproj

@@ -18,15 +18,15 @@
     <DefineConstants>TRACE;DEBUG_IDISPOSABLE</DefineConstants>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
-    <PackageReference Include="ReportGenerator" Version="5.3.8" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
+    <PackageReference Include="ReportGenerator" Version="5.4.5" />
     <PackageReference Include="System.Collections" Version="4.3.0" />
-    <PackageReference Include="xunit" Version="2.9.0" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
+    <PackageReference Include="xunit" Version="2.9.3" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="3.0.2">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-    <PackageReference Include="coverlet.collector" Version="6.0.2">
+    <PackageReference Include="coverlet.collector" Version="6.0.4">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>