فهرست منبع

Adjustment under ubuntu & ubuntu xTerm

Gilles Freart 4 سال پیش
والد
کامیت
ff512f5846

+ 20 - 14
Terminal.Gui/ConsoleDrivers/CursesDriver/CursesDriver.cs

@@ -85,6 +85,9 @@ namespace Terminal.Gui {
 			if (reportableMouseEvents.HasFlag (Curses.Event.ReportMousePosition)) {
 				StopReportingMouseMoves ();
 			}
+
+			SetCursorVisibility (CursorVisibility.Default);
+			
 			Curses.endwin ();
 			// Clear and reset entire screen.
 			Console.Out.Write ("\x1b[2J");
@@ -693,15 +696,14 @@ namespace Terminal.Gui {
 				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;
+			// 
+			// We are setting Invisible as default so we could ignore XTerm DECSUSR setting
+			//
+			switch (Curses.curs_set (0)) {
+				case 0:		currentCursorVisibility = initialCursorVisibility = CursorVisibility.Invisible;	break;
+				case 1:		currentCursorVisibility = initialCursorVisibility = CursorVisibility.Underline;	Curses.curs_set (1); break;
+				case 2:		currentCursorVisibility = initialCursorVisibility = CursorVisibility.Box;		Curses.curs_set (2); break;
+				default:	currentCursorVisibility = initialCursorVisibility = null;						break;
 			}
 
 			Curses.raw ();
@@ -886,7 +888,7 @@ namespace Terminal.Gui {
 
 		public override bool GetCursorVisibility (out CursorVisibility visibility)
 		{
-			visibility = CursorVisibility.Normal;
+			visibility = CursorVisibility.Invisible;
 
 			if (!currentCursorVisibility.HasValue) {
 				return false;
@@ -903,12 +905,16 @@ namespace Terminal.Gui {
 				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;
+			Curses.curs_set (((int) visibility >> 16) & 0x000000FF);
+
+			if (visibility != CursorVisibility.Invisible)
+			{
+				Console.Out.Write ("\x1b[{0} q", ((int) visibility >> 24) & 0xFF);
+				Console.Out.Flush ();
 			}
 
+			currentCursorVisibility = visibility;
+
 			return true;
 		}
 

+ 1 - 1
Terminal.Gui/ConsoleDrivers/FakeDriver/FakeDriver.cs

@@ -420,7 +420,7 @@ namespace Terminal.Gui {
 
 		public override bool GetCursorVisibility (out CursorVisibility visibility)
 		{
-			visibility = CursorVisibility.Normal;
+			visibility = CursorVisibility.Default;
 
 			return true;
 		}

+ 1 - 34
Terminal.Gui/ConsoleDrivers/NetDriver.cs

@@ -18,10 +18,6 @@ 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);
@@ -63,52 +59,23 @@ namespace Terminal.Gui {
 
 		public bool GetCursorVisibility (out CursorVisibility visibility)
 		{
-			//if (initialCursorVisibility.HasValue) {
-			//	visibility = currentCursorVisibility.Value;
-			//	return true;
-			//}
-
-			visibility = CursorVisibility.Normal;
+			visibility = CursorVisibility.Default;
 
 			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 ()}.");
 			}

+ 6 - 6
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -124,14 +124,14 @@ namespace Terminal.Gui {
 					throw new System.ComponentModel.Win32Exception (err);
 				}
 
-				visibility = Gui.CursorVisibility.Normal;
+				visibility = Gui.CursorVisibility.Default;
 
 				return false;
 			}
 
-			if (!info.bVisible)		visibility = CursorVisibility.Invisible;
-			else if (info.dwSize > 50)	visibility = CursorVisibility.Block;
-			else				visibility = CursorVisibility.Normal;
+			if (!info.bVisible)			visibility = CursorVisibility.Invisible;
+			else if (info.dwSize > 50)	visibility = CursorVisibility.Box;
+			else						visibility = CursorVisibility.Underline;
 
 			return true;
 		}
@@ -157,8 +157,8 @@ namespace Terminal.Gui {
 
 			if (currentCursorVisibility.HasValue == false || currentCursorVisibility.Value != visibility) {
 				ConsoleCursorInfo info = new ConsoleCursorInfo {
-					dwSize   = visibility == CursorVisibility.Block ? 100u : 25u,
-					bVisible = visibility != CursorVisibility.Invisible
+					dwSize   =  (uint) visibility & 0x00FF,
+					bVisible = ((uint) visibility & 0xFF00) != 0
 				};
 
 				if (!SetConsoleCursorInfo (ScreenBuffer, ref info)) {

+ 43 - 6
Terminal.Gui/Core/ConsoleDriver.cs

@@ -479,21 +479,58 @@ namespace Terminal.Gui {
 	/// <summary>
 	/// Cursors Visibility that are displayed
 	/// </summary>
-	public enum CursorVisibility : Int32 {
+	// 
+	// Hexa value are set as 0xAABBCCDD where :
+	//
+	//     AA stand for the TERMINFO DECSUSR parameter value to be used under Linux & MacOS
+	//     BB stand for the NCurses curs_set parameter value to be used under Linux & MacOS
+	//     CC stand for the CONSOLE_CURSOR_INFO.bVisible parameter value to be used under Windows
+	//     DD stand for the CONSOLE_CURSOR_INFO.dwSize parameter value to be used under Windows
+	//
+	public enum CursorVisibility {
+		/// <summary>
+		///	Cursor caret has default
+		/// </summary>
+		Default 			= 0x00010119,
+
 		/// <summary>
 		///	Cursor caret is hidden
 		/// </summary>
-		Invisible = 0,
+		Invisible 			= 0x03000019,
+
+		/// <summary>
+		///	Cursor caret is normally shown as an _
+		/// </summary>
+		/// <remarks>Under Windows, this is equivalent to <see ref="UnderscoreBlinking"/></remarks>
+		Underline			= 0x04010019,
+
+		/// <summary>
+		///	Cursor caret is normally shown as an blinking _
+		/// </summary>
+		UnderlineBlinking	= 0x03010019,
+
+		/// <summary>
+		///	Cursor caret is displayed a bar |
+		/// </summary>
+		/// <remarks>Works under Xterm-like terminal otherwise this is equivalent to <see ref="UnderscoreBlinking"/></remarks>
+		Vertical			= 0x06010019,
+
+		/// <summary>
+		///	Cursor caret is displayed a blinking bar |
+		/// </summary>
+		/// <remarks>Works under Xterm-like terminal otherwise this is equivalent to <see ref="UnderscoreBlinking"/></remarks>
+		VerticalBlinking	= 0x05010019,
 
 		/// <summary>
-		///	Cursor caret is normally shown
+		///	Cursor caret is displayed a block ▉
 		/// </summary>
-		Normal = 1,
+		/// <remarks>Works under Xterm-like terminal otherwise this is equivalent to <see ref="BlockBlinking"/></remarks>
+		Box					= 0x02020064,
 
 		/// <summary>
-		///	Cursor caret is displayed a block
+		///	Cursor caret is displayed a block
 		/// </summary>
-		Block = 2
+		BoxBlinking			= 0x01020064,
 	}
 
 	///// <summary>

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

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

+ 15 - 5
Terminal.Gui/Views/HexView.cs

@@ -396,12 +396,22 @@ namespace Terminal.Gui {
 			edits = new SortedDictionary<long, byte> ();
 		}
 
-		///<inheritdoc/>
-		public override bool OnEnter (View view)
-		{
-			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+		private CursorVisibility wishedCursorVisibility = CursorVisibility.BoxBlinking;
+
+		/// <summary>
+		/// Get / Set the wished cursor when the field is focused
+		/// </summary>
+		public CursorVisibility WishedCursorVisibility 
+		{ 
+			get => wishedCursorVisibility; 
+			set {
+				if (wishedCursorVisibility != value && HasFocus)
+				{
+					Application.Driver.SetCursorVisibility (value);		
+				}
 
-			return base.OnEnter (view);
+				wishedCursorVisibility = value;
+			}
 		}
 	}
 }

+ 20 - 1
Terminal.Gui/Views/TextField.cs

@@ -867,10 +867,29 @@ namespace Terminal.Gui {
 			return ev;
 		}
 
+
+		private CursorVisibility wishedCursorVisibility = CursorVisibility.BoxBlinking;
+
+		/// <summary>
+		/// Get / Set the wished cursor when the field is focused
+		/// </summary>
+		public CursorVisibility WishedCursorVisibility 
+		{ 
+			get => wishedCursorVisibility; 
+			set {
+				if (wishedCursorVisibility != value && HasFocus)
+				{
+					Application.Driver.SetCursorVisibility (value);		
+				}
+
+				wishedCursorVisibility = value;
+			}
+		}
+
 		///<inheritdoc/>
 		public override bool OnEnter (View view)
 		{
-			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+			Application.Driver.SetCursorVisibility (WishedCursorVisibility);
 
 			return base.OnEnter (view);
 		}

+ 20 - 1
Terminal.Gui/Views/TextView.cs

@@ -480,6 +480,7 @@ namespace Terminal.Gui {
 		/// </summary>
 		public int Lines => model.Count;
 
+
 		/// <summary>
 		/// Loads the contents of the file into the  <see cref="TextView"/>.
 		/// </summary>
@@ -598,11 +599,29 @@ namespace Terminal.Gui {
 			}
 		}
 
+		private CursorVisibility wishedCursorVisibility = CursorVisibility.BoxBlinking;
+
+		/// <summary>
+		/// Get / Set the wished cursor when the field is focused
+		/// </summary>
+		public CursorVisibility WishedCursorVisibility 
+		{ 
+			get => wishedCursorVisibility; 
+			set {
+				if (wishedCursorVisibility != value && HasFocus)
+				{
+					Application.Driver.SetCursorVisibility (value);		
+				}
+
+				wishedCursorVisibility = value;
+			}
+		}
+
 		///<inheritdoc/>
 		public override bool OnEnter (View view)
 		{
 			//TODO: Improve it by handling read only mode of the text field
-			Application.Driver.SetCursorVisibility (CursorVisibility.Normal);
+			Application.Driver.SetCursorVisibility (WishedCursorVisibility);
 
 			return base.OnEnter (view);
 		}

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

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

+ 18 - 0
UICatalog/Scenarios/Editor.cs

@@ -36,6 +36,19 @@ namespace UICatalog {
 					new MenuItem ("C_ut", "", () => Cut()),
 					new MenuItem ("_Paste", "", () => Paste())
 				}),
+				new MenuBarItem ("_Cursor", new MenuItem [] {
+					new MenuItem ("_Invisible",           "", () => SetCursor(CursorVisibility.Invisible)),
+					new MenuItem ("_Box",                 "", () => SetCursor(CursorVisibility.Box)),
+					new MenuItem ("_Underline",           "", () => SetCursor(CursorVisibility.Underline)),
+					new MenuItem ("", 				      "", () => {}, () => { return false; }),
+					new MenuItem ("xTerm :", 			  "", () => {}, () => { return false; }),
+					new MenuItem ("", 				      "", () => {}, () => { return false; }),
+					new MenuItem ("  _Default",    		  "", () => SetCursor(CursorVisibility.Default)),
+					new MenuItem ("  B_ox Blinking",      "", () => SetCursor(CursorVisibility.BoxBlinking)),
+					new MenuItem ("  U_nderline Blinking","", () => SetCursor(CursorVisibility.UnderlineBlinking)),
+					new MenuItem ("  _Vertical",          "", () => SetCursor(CursorVisibility.Vertical)),
+					new MenuItem ("  V_ertical Blinking", "", () => SetCursor(CursorVisibility.VerticalBlinking))
+				}),
 				new MenuBarItem ("_ScrollBarView", CreateKeepChecked ())
 			});
 			Top.Add (menu);
@@ -141,6 +154,11 @@ namespace UICatalog {
 			//}
 		}
 
+		private void SetCursor (CursorVisibility visibility)
+		{
+			_textView.WishedCursorVisibility = visibility;
+		}
+
 		private void Open ()
 		{
 			var d = new OpenDialog ("Open", "Open a file") { AllowsMultipleSelection = false };