2
0
Эх сурвалжийг харах

Adjusting cursor size ... working under WindowsDriver

Gilles Freart 4 жил өмнө
parent
commit
9b617a07f0

+ 48 - 0
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -22,6 +22,9 @@ namespace Terminal.Gui {
 		public override int Top => 0;
 		public override bool HeightAsBuffer { get; set; }
 
+		CursorVisibility? initialCursorVisibility = null;
+		CursorVisibility? currentCursorVisibility = null;
+
 		// Current row, and current col, tracked by Move/AddRune only
 		int ccol, crow;
 		bool needMove;
@@ -689,6 +692,18 @@ namespace Terminal.Gui {
 			} catch (Exception e) {
 				Console.WriteLine ("Curses failed to initialize, the exception is: " + e);
 			}
+
+			switch (Curses.curs_set (1)) {
+				case 0:		initialCursorVisibility = CursorVisibility.Invisible;	break;
+				case 1:		initialCursorVisibility = CursorVisibility.Normal;	break;
+				case 2:		initialCursorVisibility = CursorVisibility.Block;	break;
+				default:	initialCursorVisibility = null;				break;
+			}
+
+			if (initialCursorVisibility != null) {
+				currentCursorVisibility = CursorVisibility.Normal;
+			}
+
 			Curses.raw ();
 			Curses.noecho ();
 
@@ -868,6 +883,39 @@ namespace Terminal.Gui {
 		{
 			return currentAttribute;
 		}
+
+		public override bool GetCursorVisibility (out CursorVisibility visibility)
+		{
+			visibility = CursorVisibility.Normal;
+
+			if (!currentCursorVisibility.HasValue) {
+				return false;
+			}
+
+			visibility = currentCursorVisibility.Value;
+
+			return true;
+		}
+
+		public override bool SetCursorVisibility (CursorVisibility visibility)
+		{
+			if (initialCursorVisibility.HasValue == false) {
+				return false;
+			}
+
+			switch (currentCursorVisibility = visibility) {
+				case CursorVisibility.Invisible:	Curses.curs_set (0); break;
+				case CursorVisibility.Normal:		Curses.curs_set (1); break;
+				case CursorVisibility.Block:		Curses.curs_set (2); break;
+			}
+
+			return true;
+		}
+
+		public override bool EnsureCursorVisibility ()
+		{
+			return false;
+		}
 	}
 
 	internal static class Platform {

+ 4 - 0
Terminal.Gui/ConsoleDrivers/CursesDriver/binding.cs

@@ -250,6 +250,7 @@ namespace Unix.Terminal {
 		//static public int wredrawwin (IntPtr win, int beg_line, int num_lines) => methods.wredrawwin (win, beg_line, num_lines);
 		static public int wnoutrefresh (IntPtr win) => methods.wnoutrefresh (win);
 		static public int move (int line, int col) => methods.move (line, col);
+		static public int curs_set (int visibility) => methods.curs_set (visibility);
 		//static public int addch (int ch) => methods.addch (ch);
 		static public int addwstr (string s) => methods.addwstr (s);
 		static public int wmove (IntPtr win, int line, int col) => methods.wmove (win, line, col);
@@ -310,6 +311,7 @@ namespace Unix.Terminal {
 		//public delegate int wredrawwin (IntPtr win, int beg_line, int num_lines);
 		public delegate int wnoutrefresh (IntPtr win);
 		public delegate int move (int line, int col);
+		public delegate int curs_set (int visibility);
 		public delegate int addch (int ch);
 		public delegate int addwstr([MarshalAs(UnmanagedType.LPWStr)]string s);
 		public delegate int wmove (IntPtr win, int line, int col);
@@ -369,6 +371,7 @@ namespace Unix.Terminal {
 		//public readonly Delegates.wredrawwin wredrawwin;
 		public readonly Delegates.wnoutrefresh wnoutrefresh;
 		public readonly Delegates.move move;
+		public readonly Delegates.curs_set curs_set;
 		public readonly Delegates.addch addch;
 		public readonly Delegates.addwstr addwstr;
 		public readonly Delegates.wmove wmove;
@@ -430,6 +433,7 @@ namespace Unix.Terminal {
 			//wredrawwin = lib.GetNativeMethodDelegate<Delegates.wredrawwin> ("wredrawwin");
 			wnoutrefresh = lib.GetNativeMethodDelegate<Delegates.wnoutrefresh> ("wnoutrefresh");
 			move = lib.GetNativeMethodDelegate<Delegates.move> ("move");
+			curs_set = lib.GetNativeMethodDelegate<Delegates.curs_set> ("curs_set");
 			addch = lib.GetNativeMethodDelegate<Delegates.addch>("addch");
 			addwstr = lib.GetNativeMethodDelegate<Delegates.addwstr> ("addwstr");
 			wmove = lib.GetNativeMethodDelegate<Delegates.wmove> ("wmove");

+ 18 - 0
Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs

@@ -417,6 +417,24 @@ namespace Terminal.Gui {
 		public override void UncookMouse ()
 		{
 		}
+
+		public override bool GetCursorVisibility (out CursorVisibility visibility)
+		{
+			visibility = CursorVisibility.Normal;
+
+			return true;
+		}
+
+		public override bool SetCursorVisibility (CursorVisibility visibility)
+		{
+			return true;
+		}
+
+		public override bool EnsureCursorVisibility ()
+		{
+			return false;
+		}
+
 		#endregion
 #pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
 	}

+ 65 - 0
Terminal.Gui/ConsoleDrivers/NetDriver.cs

@@ -18,6 +18,10 @@ namespace Terminal.Gui {
 		IntPtr InputHandle, OutputHandle, ErrorHandle;
 		uint originalInputConsoleMode, originalOutputConsoleMode, originalErrorConsoleMode;
 
+		CursorVisibility? initialCursorVisibility = null;
+		CursorVisibility? currentCursorVisibility = null;
+		CursorVisibility? pendingCursorVisibility = null;
+
 		public NetWinVTConsole ()
 		{
 			InputHandle = GetStdHandle (STD_INPUT_HANDLE);
@@ -57,8 +61,54 @@ namespace Terminal.Gui {
 			}
 		}
 
+		public bool GetCursorVisibility (out CursorVisibility visibility)
+		{
+			//if (initialCursorVisibility.HasValue) {
+			//	visibility = currentCursorVisibility.Value;
+			//	return true;
+			//}
+
+			visibility = CursorVisibility.Normal;
+
+			return false;
+		}
+
+		public bool SetCursorVisibility (CursorVisibility visibility)
+		{
+			//if (initialCursorVisibility.HasValue == false) {
+			//	pendingCursorVisibility = visibility;
+			//	return false;
+			//}
+
+			//if (currentCursorVisibility.HasValue == false ||  currentCursorVisibility.Value != visibility) {
+			//	Console.Out.Write (visibility != CursorVisibility.Invisible ? "\x1b[?25h" : "\x1b[?25l");
+			//	Console.Out.Flush ();
+			//	Console.CursorVisible = visibility != CursorVisibility.Invisible;
+			//	currentCursorVisibility = visibility;
+			//	return true;
+			//}
+
+			return false;
+		}
+
+		public bool EnsureCursorVisibility ()
+		{
+			//if (initialCursorVisibility.HasValue == false && pendingCursorVisibility.HasValue == true) {
+			//	initialCursorVisibility = CursorVisibility.Normal;
+			//	SetCursorVisibility (pendingCursorVisibility.Value);
+			//	pendingCursorVisibility = null;
+			//	return true;
+			//}
+
+			return false;
+		}
+
 		public void Cleanup ()
 		{
+			if (initialCursorVisibility.HasValue) {
+				SetCursorVisibility (initialCursorVisibility.Value);
+			}
+
 			if (!SetConsoleMode (InputHandle, originalInputConsoleMode)) {
 				throw new ApplicationException ($"Failed to restore input console mode, error code: {GetLastError ()}.");
 			}
@@ -1712,6 +1762,21 @@ namespace Terminal.Gui {
 		public override void UncookMouse ()
 		{
 		}
+
+		public override bool GetCursorVisibility (out CursorVisibility visibility)
+		{
+			return NetWinConsole.GetCursorVisibility (out visibility);
+		}
+
+		public override bool SetCursorVisibility (CursorVisibility visibility)
+		{
+			return NetWinConsole.SetCursorVisibility (visibility);
+		}
+
+		public override bool EnsureCursorVisibility ()
+		{
+			return NetWinConsole.EnsureCursorVisibility ();
+		}
 		#endregion
 
 		//

+ 105 - 1
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -41,6 +41,9 @@ namespace Terminal.Gui {
 		internal IntPtr InputHandle, OutputHandle;
 		IntPtr ScreenBuffer;
 		uint originalConsoleMode;
+		CursorVisibility? initialCursorVisibility = null;
+		CursorVisibility? currentCursorVisibility = null;
+		CursorVisibility? pendingCursorVisibility = null;
 
 		public WindowsConsole ()
 		{
@@ -82,6 +85,10 @@ namespace Terminal.Gui {
 				}
 			}
 
+			if (GetCursorVisibility (out CursorVisibility visibility)) {
+				initialCursorVisibility = visibility;
+			}
+
 			if (!SetConsoleActiveScreenBuffer (ScreenBuffer)) {
 				var err = Marshal.GetLastWin32Error ();
 				if (HeightAsBuffer) {
@@ -100,8 +107,76 @@ namespace Terminal.Gui {
 			return SetConsoleCursorPosition (ScreenBuffer, position);
 		}
 
+		public void SetInitialCursorVisibility ()
+		{
+			if (initialCursorVisibility.HasValue == false && GetCursorVisibility (out CursorVisibility visibility)) {
+				initialCursorVisibility = visibility;
+			}
+		}
+
+		public bool GetCursorVisibility (out CursorVisibility visibility)
+		{
+			if (!GetConsoleCursorInfo (ScreenBuffer, out ConsoleCursorInfo info)) {
+
+				var err = Marshal.GetLastWin32Error ();
+
+				if (err != 0) {
+					throw new System.ComponentModel.Win32Exception (err);
+				}
+
+				visibility = Gui.CursorVisibility.Normal;
+
+				return false;
+			}
+
+			if (!info.bVisible)		visibility = CursorVisibility.Invisible;
+			else if (info.dwSize > 50)	visibility = CursorVisibility.Block;
+			else				visibility = CursorVisibility.Normal;
+
+			return true;
+		}
+
+		public bool EnsureCursorVisibility () 
+		{
+			if (initialCursorVisibility.HasValue && pendingCursorVisibility.HasValue && SetCursorVisibility (pendingCursorVisibility.Value)) {
+				pendingCursorVisibility = null;
+
+				return true;
+			}
+
+			return false;
+		}
+
+		public bool SetCursorVisibility (CursorVisibility visibility)
+		{
+			if (initialCursorVisibility.HasValue == false) {
+				pendingCursorVisibility = visibility;
+
+				return false;
+			}
+
+			if (currentCursorVisibility.HasValue == false || currentCursorVisibility.Value != visibility) {
+				ConsoleCursorInfo info = new ConsoleCursorInfo {
+					dwSize   = visibility == CursorVisibility.Block ? 100u : 25u,
+					bVisible = visibility != CursorVisibility.Invisible
+				};
+
+				if (!SetConsoleCursorInfo (ScreenBuffer, ref info)) {
+					return false;
+				}
+
+				currentCursorVisibility = visibility;
+			}
+
+			return true;
+		}
+
 		public void Cleanup ()
 		{
+			if (initialCursorVisibility.HasValue) {
+				SetCursorVisibility (initialCursorVisibility.Value);
+			}
+
 			ConsoleMode = originalConsoleMode;
 			//ContinueListeningForConsoleEvents = false;
 			if (!SetConsoleActiveScreenBuffer (OutputHandle)) {
@@ -414,10 +489,21 @@ namespace Terminal.Gui {
 		[DllImport ("kernel32.dll")]
 		static extern bool SetConsoleCursorPosition (IntPtr hConsoleOutput, Coord dwCursorPosition);
 
+		[StructLayout (LayoutKind.Sequential)]
+		public struct ConsoleCursorInfo {
+			public uint dwSize;
+			public bool bVisible;
+		}
+
+		[DllImport ("kernel32.dll", SetLastError = true)]
+		static extern bool SetConsoleCursorInfo (IntPtr hConsoleOutput, [In] ref ConsoleCursorInfo lpConsoleCursorInfo);
+
+		[DllImport ("kernel32.dll", SetLastError = true)]
+		static extern bool GetConsoleCursorInfo (IntPtr hConsoleOutput, out ConsoleCursorInfo lpConsoleCursorInfo);
+
 		[DllImport ("kernel32.dll")]
 		static extern bool GetConsoleMode (IntPtr hConsoleHandle, out uint lpMode);
 
-
 		[DllImport ("kernel32.dll")]
 		static extern bool SetConsoleMode (IntPtr hConsoleHandle, uint dwMode);
 
@@ -1299,6 +1385,8 @@ namespace Terminal.Gui {
 		public override void Refresh ()
 		{
 			UpdateScreen ();
+
+			winConsole.SetInitialCursorVisibility ();
 #if false
 			var bufferCoords = new WindowsConsole.Coord (){
 				X = (short)Clip.Width,
@@ -1359,6 +1447,21 @@ namespace Terminal.Gui {
 			return currentAttribute;
 		}
 
+		public override bool GetCursorVisibility (out CursorVisibility visibility)
+		{
+			return winConsole.GetCursorVisibility (out visibility);
+		}
+
+		public override bool SetCursorVisibility (CursorVisibility visibility)
+		{
+			return winConsole.SetCursorVisibility (visibility);
+		}
+
+		public override bool EnsureCursorVisibility ()
+		{
+			return winConsole.EnsureCursorVisibility ();
+		}
+
 		#region Unused
 		public override void SetColors (ConsoleColor foreground, ConsoleColor background)
 		{
@@ -1387,6 +1490,7 @@ namespace Terminal.Gui {
 		public override void CookMouse ()
 		{
 		}
+
 		#endregion
 	}
 

+ 7 - 2
Terminal.Gui/Core/Application.cs

@@ -503,6 +503,7 @@ namespace Terminal.Gui {
 			toplevel.PositionCursor ();
 			Driver.Refresh ();
 
+
 			return rs;
 		}
 
@@ -617,6 +618,10 @@ namespace Terminal.Gui {
 
 					MainLoop.MainIteration ();
 					Iteration?.Invoke ();
+					
+					if (Driver.EnsureCursorVisibility ()) {
+						state.Toplevel.SetNeedsDisplay ();
+					}
 				} else if (!wait) {
 					return;
 				}
@@ -704,9 +709,9 @@ namespace Terminal.Gui {
 					resume = false;
 					var runToken = Begin (view);
 					RunLoop (runToken);
+
 					End (runToken);
-				}
-				catch (Exception error)
+				} catch (Exception error)
 				{
 					if (errorHandler == null)
 					{

+ 40 - 0
Terminal.Gui/Core/ConsoleDriver.cs

@@ -476,6 +476,26 @@ namespace Terminal.Gui {
 		public static Dictionary<string, ColorScheme> ColorSchemes { get; }
 	}
 
+	/// <summary>
+	/// Cursors Visibility that are displayed
+	/// </summary>
+	public enum CursorVisibility : Int32 {
+		/// <summary>
+		///	Cursor caret is hidden
+		/// </summary>
+		Invisible = 0,
+
+		/// <summary>
+		///	Cursor caret is normally shown
+		/// </summary>
+		Normal = 1,
+
+		/// <summary>
+		///	Cursor caret is displayed a block
+		/// </summary>
+		Block = 2
+	}
+
 	///// <summary>
 	///// Special characters that can be drawn with 
 	///// </summary>
@@ -628,6 +648,26 @@ namespace Terminal.Gui {
 		/// </summary>
 		public abstract void UpdateCursor ();
 
+		/// <summary>
+		/// Retreive the cursor caret visibility
+		/// </summary>
+		/// <param name="visibility">The current <see cref="CursorVisibility"/></param>
+		/// <returns>true upon success</returns>
+		public abstract bool GetCursorVisibility (out CursorVisibility visibility);
+
+		/// <summary>
+		/// Change the cursor caret visibility
+		/// </summary>
+		/// <param name="visibility">The wished <see cref="CursorVisibility"/></param>
+		/// <returns>true upon success</returns>
+		public abstract bool SetCursorVisibility (CursorVisibility visibility);
+
+		/// <summary>
+		/// Ensure the cursor visibility
+		/// </summary>
+		/// <returns>true upon success</returns>
+		public abstract bool EnsureCursorVisibility ();
+
 		/// <summary>
 		/// Ends the execution of the console driver.
 		/// </summary>

+ 8 - 0
Terminal.Gui/Views/Button.cs

@@ -248,5 +248,13 @@ namespace Terminal.Gui {
 			}
 			base.PositionCursor ();
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/Checkbox.cs

@@ -159,5 +159,13 @@ namespace Terminal.Gui {
 
 			return true;
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 2 - 0
Terminal.Gui/Views/ComboBox.cs

@@ -217,6 +217,8 @@ namespace Terminal.Gui {
 		///<inheritdoc/>
 		public override bool OnEnter (View view)
 		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+
 			if (!search.HasFocus && !listview.HasFocus) {
 				search.SetFocus ();
 			}

+ 8 - 0
Terminal.Gui/Views/DateField.cs

@@ -377,6 +377,14 @@ namespace Terminal.Gui {
 		{
 			DateChanged?.Invoke (args);
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 
 	/// <summary>

+ 8 - 0
Terminal.Gui/Views/FrameView.cs

@@ -191,5 +191,13 @@ namespace Terminal.Gui {
 				base.TextAlignment = contentView.TextAlignment = value;
 			}
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/HexView.cs

@@ -395,5 +395,13 @@ namespace Terminal.Gui {
 			}
 			edits = new SortedDictionary<long, byte> ();
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/Label.cs

@@ -96,5 +96,13 @@ namespace Terminal.Gui {
 			}
 			return false;
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

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

@@ -657,6 +657,8 @@ namespace Terminal.Gui {
 		///<inheritdoc/>
 		public override bool OnEnter (View view)
 		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
 			if (lastSelectedItem == -1) {
 				EnsuresVisibilitySelectedItem ();
 				OnSelectedChanged ();

+ 16 - 1
Terminal.Gui/Views/Menu.cs

@@ -749,6 +749,14 @@ namespace Terminal.Gui {
 
 			return pos;
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 
 
@@ -1621,6 +1629,13 @@ namespace Terminal.Gui {
 
 			return true;
 		}
-	}
 
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
+	}
 }

+ 8 - 0
Terminal.Gui/Views/ProgressBar.cs

@@ -102,5 +102,13 @@ namespace Terminal.Gui {
 					Driver.AddRune (' ');
 			}
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/RadioGroup.cs

@@ -355,6 +355,14 @@ namespace Terminal.Gui {
 			}
 			return true;
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 
 	/// <summary>

+ 8 - 0
Terminal.Gui/Views/ScrollBarView.cs

@@ -658,5 +658,13 @@ namespace Terminal.Gui {
 				(KeepContentAlwaysInViewport ? Host.Bounds.Height + (showBothScrollIndicator ? -2 : -1) : 0) :
 				(KeepContentAlwaysInViewport ? Host.Bounds.Width + (showBothScrollIndicator ? -2 : -1) : 0);
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/ScrollView.cs

@@ -522,5 +522,13 @@ namespace Terminal.Gui {
 			}
 			base.Dispose (disposing);
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/StatusBar.cs

@@ -215,5 +215,13 @@ namespace Terminal.Gui {
 				disposedValue = true;
 			}
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Views/TextField.cs

@@ -866,6 +866,14 @@ namespace Terminal.Gui {
 			TextChanging?.Invoke (ev);
 			return ev;
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+
+			return base.OnEnter (view);
+		}
 	}
 
 	/// <summary>

+ 9 - 0
Terminal.Gui/Views/TextView.cs

@@ -598,6 +598,15 @@ namespace Terminal.Gui {
 			}
 		}
 
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			//TODO: Improve it by handling read only mode of the text field
+			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+
+			return base.OnEnter (view);
+		}
+
 		// Returns an encoded region start..end (top 32 bits are the row, low32 the column)
 		void GetEncodedRegionBounds (out long start, out long end)
 		{

+ 8 - 0
Terminal.Gui/Windows/Dialog.cs

@@ -139,5 +139,13 @@ namespace Terminal.Gui {
 			}
 			return base.ProcessKey (kb);
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 }

+ 8 - 0
Terminal.Gui/Windows/FileDialog.cs

@@ -465,6 +465,14 @@ namespace Terminal.Gui {
 				}
 			}
 		}
+
+		///<inheritdoc/>
+		public override bool OnEnter (View view)
+		{
+			Application.Driver.SetCursorVisibility (CursorVisibility.Invisible);
+
+			return base.OnEnter (view);
+		}
 	}
 
 	/// <summary>

+ 2 - 1
UICatalog/Properties/launchSettings.json

@@ -1,7 +1,8 @@
 {
   "profiles": {
     "UICatalog": {
-      "commandName": "Project"
+      "commandName": "Project",
+      "commandLineArgs": "-usc"
     }
   }
 }