瀏覽代碼

Merge branch 'master' of https://github.com/migueldeicaza/gui.cs into combobox_fixes2

Ross Ferguson 5 年之前
父節點
當前提交
d11119a2ab
共有 2 個文件被更改,包括 22 次插入10 次删除
  1. 20 8
      Terminal.Gui/ConsoleDrivers/WindowsDriver.cs
  2. 2 2
      Terminal.Gui/Views/ListView.cs

+ 20 - 8
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -364,7 +364,7 @@ namespace Terminal.Gui {
 		[DllImport ("kernel32.dll", EntryPoint = "ReadConsoleInputW", CharSet = CharSet.Unicode)]
 		[DllImport ("kernel32.dll", EntryPoint = "ReadConsoleInputW", CharSet = CharSet.Unicode)]
 		public static extern bool ReadConsoleInput (
 		public static extern bool ReadConsoleInput (
 			IntPtr hConsoleInput,
 			IntPtr hConsoleInput,
-			[Out] InputRecord [] lpBuffer,
+			IntPtr lpBuffer,
 			uint nLength,
 			uint nLength,
 			out uint lpNumberOfEventsRead);
 			out uint lpNumberOfEventsRead);
 
 
@@ -420,6 +420,24 @@ namespace Terminal.Gui {
 				return v;
 				return v;
 			}
 			}
 		}
 		}
+		
+		public InputRecord [] ReadConsoleInput ()
+		{
+			const int bufferSize = 1;
+			var pRecord = Marshal.AllocHGlobal (Marshal.SizeOf<InputRecord> () * bufferSize);
+			try {
+				ReadConsoleInput (InputHandle, pRecord, bufferSize,
+					out var numberEventsRead);
+
+				return numberEventsRead == 0
+					? null
+					: new [] {Marshal.PtrToStructure<InputRecord> (pRecord)};
+			} catch (Exception) {
+				return null;
+			} finally {
+				Marshal.FreeHGlobal (pRecord);
+			}
+		}
 
 
 #if false // See: https://github.com/migueldeicaza/gui.cs/issues/357
 #if false // See: https://github.com/migueldeicaza/gui.cs/issues/357
 		[StructLayout (LayoutKind.Sequential)]
 		[StructLayout (LayoutKind.Sequential)]
@@ -577,13 +595,7 @@ namespace Terminal.Gui {
 				waitForProbe.Wait ();
 				waitForProbe.Wait ();
 				waitForProbe.Reset ();
 				waitForProbe.Reset ();
 
 
-				uint numberEventsRead = 0;
-
-				WindowsConsole.ReadConsoleInput (winConsole.InputHandle, records, 1, out numberEventsRead);
-				if (numberEventsRead == 0)
-					result = null;
-				else
-					result = records;
+				result = winConsole.ReadConsoleInput ();
 
 
 				eventReady.Set ();
 				eventReady.Set ();
 			}
 			}

+ 2 - 2
Terminal.Gui/Views/ListView.cs

@@ -285,7 +285,7 @@ namespace Terminal.Gui {
 			for (int row = 0; row < f.Height; row++, item++) {
 			for (int row = 0; row < f.Height; row++, item++) {
 				bool isSelected = item == selected;
 				bool isSelected = item == selected;
 
 
-				var newcolor = focused ? (isSelected ? ColorScheme.Focus : ColorScheme.Normal) : ColorScheme.Normal;
+				var newcolor = focused ? (isSelected ? ColorScheme.Focus : ColorScheme.Normal) : (isSelected ? ColorScheme.HotNormal : ColorScheme.Normal);
 				if (newcolor != current) {
 				if (newcolor != current) {
 					Driver.SetAttribute (newcolor);
 					Driver.SetAttribute (newcolor);
 					current = newcolor;
 					current = newcolor;
@@ -568,7 +568,7 @@ namespace Terminal.Gui {
 			for (int i = 0; i < byteLen;) {
 			for (int i = 0; i < byteLen;) {
 				(var rune, var size) = Utf8.DecodeRune (ustr, i, i - byteLen);
 				(var rune, var size) = Utf8.DecodeRune (ustr, i, i - byteLen);
 				var count = Rune.ColumnWidth (rune);
 				var count = Rune.ColumnWidth (rune);
-				if (used + count >= width)
+				if (used + count > width)
 					break;
 					break;
 				driver.AddRune (rune);
 				driver.AddRune (rune);
 				used += count;
 				used += count;