Browse Source

Added font size to the WindowsDriver.

BDisp 4 years ago
parent
commit
f44be14e61
1 changed files with 46 additions and 9 deletions
  1. 46 9
      Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

+ 46 - 9
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -533,6 +533,42 @@ namespace Terminal.Gui {
 			return GetWindowRect (handle, out lpRect);
 		}
 
+		[StructLayout (LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+		public class ConsoleFontInfoEx {
+			private int cbSize;
+			public ConsoleFontInfoEx ()
+			{
+				cbSize = Marshal.SizeOf (typeof (ConsoleFontInfoEx));
+			}
+			public int FontIndex;
+			public short FontWidth;
+			public short FontHeight;
+			public int FontFamily;
+			public int FontWeight;
+			[MarshalAs (UnmanagedType.ByValTStr, SizeConst = 32)]
+			public string FaceName;
+		}
+
+		[DllImport ("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+		extern static bool GetCurrentConsoleFontEx (
+			IntPtr hConsoleOutput,
+			bool bMaximumWindow,
+			[In, Out] ConsoleFontInfoEx lpConsoleCurrentFont);
+
+		internal ConsoleFontInfoEx GetCurrentFontSize ()
+		{
+			//IntPtr _consoleOutputHandle = GetStdHandle (STD_OUTPUT_HANDLE);
+			IntPtr _consoleOutputHandle = OutputHandle;
+
+			ConsoleFontInfoEx currentFont = new ConsoleFontInfoEx ();
+			GetCurrentConsoleFontEx (
+				_consoleOutputHandle,
+				false,
+				currentFont);
+
+			return currentFont;
+		}
+
 #if false
 		// size of a device name string
 		private const int CCHDEVICENAME = 32;
@@ -1480,13 +1516,12 @@ namespace Terminal.Gui {
 			}
 		}
 
-		const int Width_Divider = 8;
-		const int Height_Divider = 18;
 		bool docked;
 
 		void WaitWinChange ()
 		{
 			var handle = winConsole.GetConsole ();
+			var fontSize = winConsole.GetCurrentFontSize ();
 
 			while (!consoleDriver.HeightAsBuffer) {
 				WindowsConsole.WindowPlacement windowPlacement = new WindowsConsole.WindowPlacement ();
@@ -1522,8 +1557,10 @@ namespace Terminal.Gui {
 
 			Size SetWindowSize (System.Drawing.Rectangle rect)
 			{
-				return new Size (Math.Max (((rect.Width - rect.X) / Width_Divider) - 2, 0),
-					Math.Max (((rect.Height - rect.Y) / Height_Divider) - 2, 0));
+				var fontHDividerW = fontSize.FontHeight / fontSize.FontWidth;
+
+				return new Size (Math.Max (((rect.Width - rect.X) / fontSize.FontWidth) - (fontHDividerW * 3), 0),
+					Math.Max (((rect.Height - rect.Y) / fontSize.FontHeight) - fontHDividerW - 1, 0));
 			}
 
 			bool IsDockedToMonitor (IntPtr hWnd, WindowsConsole.WindowPlacement placement)
@@ -1545,9 +1582,9 @@ namespace Terminal.Gui {
 					windowSize = SetWindowSize (rc);
 
 					if ((rc.X < 0) || (rc.Y == 0) || (rc.Y == 0 && rc.X < 0)
-						|| (rc.Y == 0 && rc.Right / Width_Divider >= Console.LargestWindowWidth)
-						|| (rc.X < 0 && rc.Bottom / Height_Divider >= Console.LargestWindowHeight)
-						|| (rc.X / Width_Divider >= Console.LargestWindowWidth / 2 - 1 && rc.Bottom / Height_Divider >= Console.LargestWindowHeight)) {
+						|| (rc.Y == 0 && rc.Right / fontSize.FontWidth >= Console.LargestWindowWidth)
+						|| (rc.X < 0 && rc.Bottom / fontSize.FontHeight >= Console.LargestWindowHeight)
+						|| (rc.X / fontSize.FontWidth >= Console.LargestWindowWidth / 2 - 1 && rc.Bottom / fontSize.FontHeight >= Console.LargestWindowHeight)) {
 						if (!docked || consoleDriver.Cols != windowSize.Width
 							|| consoleDriver.Rows != windowSize.Height) {
 							docked = true;
@@ -1555,8 +1592,8 @@ namespace Terminal.Gui {
 							changed = false;
 						}
 					} else {
-						if (!docked && (pSize == rSize || rSize.Width / Width_Divider >= Console.LargestWindowWidth
-							|| rSize.Height / Height_Divider >= Console.LargestWindowHeight)) {
+						if (!docked && (pSize == rSize || rSize.Width / fontSize.FontWidth >= Console.LargestWindowWidth
+							|| rSize.Height / fontSize.FontHeight >= Console.LargestWindowHeight)) {
 							changed = false;
 						}
 						docked = false;