Fix repeated ArgumentOutOfRangeException when a local OpenSim console is resized under mono
May fix mantises 3186, 3270, 4022, 4238mysql-performance
							parent
							
								
									3bf69aa5a3
								
							
						
					
					
						commit
						22b1ffdc6c
					
				|  | @ -552,8 +552,9 @@ namespace OpenSim.Framework.Console | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // A console that processes commands internally | ||||
|     // | ||||
|     /// <summary> | ||||
|     /// A console that processes commands internally | ||||
|     /// </summary> | ||||
|     public class CommandConsole : ConsoleBase | ||||
|     { | ||||
|         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
|  | @ -574,6 +575,9 @@ namespace OpenSim.Framework.Console | |||
|                 Output(s); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Display a command prompt on the console and wait for user input | ||||
|         /// </summary> | ||||
|         public void Prompt() | ||||
|         { | ||||
|             string line = ReadLine(m_defaultPrompt + "# ", true, true); | ||||
|  |  | |||
|  | @ -36,8 +36,9 @@ using log4net; | |||
| 
 | ||||
| namespace OpenSim.Framework.Console | ||||
| { | ||||
|     // A console that uses cursor control and color | ||||
|     // | ||||
|     /// <summary> | ||||
|     /// A console that uses cursor control and color | ||||
|     /// </summary>     | ||||
|     public class LocalConsole : CommandConsole | ||||
|     { | ||||
| //        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||||
|  | @ -85,30 +86,70 @@ namespace OpenSim.Framework.Console | |||
|             history.Add(text); | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Set the cursor row. | ||||
|         /// </summary> | ||||
|         /// | ||||
|         /// <param name="top"> | ||||
|         /// Row to set.  If this is below 0, then the row is set to 0.  If it is equal to the buffer height or greater | ||||
|         /// then it is set to one less than the height. | ||||
|         /// </param> | ||||
|         /// <returns> | ||||
|         /// The new cursor row. | ||||
|         /// </returns> | ||||
|         private int SetCursorTop(int top) | ||||
|         { | ||||
|             if (top >= 0 && top < System.Console.BufferHeight) | ||||
|             { | ||||
|                 System.Console.CursorTop = top; | ||||
|                 return top; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return System.Console.CursorTop; | ||||
|             } | ||||
|             // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values.  If we try | ||||
|             // to set a cursor row position with a currently invalid column, mono will throw an exception.   | ||||
|             // Therefore, we need to make sure that the column position is valid first.               | ||||
|             int left = System.Console.CursorLeft; | ||||
| 
 | ||||
|             if (left < 0) | ||||
|                 System.Console.CursorLeft = 0; | ||||
|             else if (left >= System.Console.BufferWidth) | ||||
|                 System.Console.CursorLeft = System.Console.BufferWidth - 1; | ||||
|              | ||||
|             if (top < 0) | ||||
|                 top = 0; | ||||
|             if (top >= System.Console.BufferHeight) | ||||
|                 top = System.Console.BufferHeight - 1; | ||||
| 
 | ||||
|             System.Console.CursorTop = top; | ||||
| 
 | ||||
|             return top; | ||||
|         } | ||||
| 
 | ||||
|         /// <summary> | ||||
|         /// Set the cursor column. | ||||
|         /// </summary> | ||||
|         /// | ||||
|         /// <param name="left"> | ||||
|         /// Column to set.  If this is below 0, then the column is set to 0.  If it is equal to the buffer width or greater | ||||
|         /// then it is set to one less than the width. | ||||
|         /// </param> | ||||
|         /// <returns> | ||||
|         /// The new cursor column. | ||||
|         /// </returns>         | ||||
|         private int SetCursorLeft(int left) | ||||
|         { | ||||
|             if (left >= 0 && left < System.Console.BufferWidth) | ||||
|             { | ||||
|                 System.Console.CursorLeft = left; | ||||
|                 return left; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return System.Console.CursorLeft; | ||||
|             } | ||||
|             // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values.  If we try | ||||
|             // to set a cursor column position with a currently invalid row, mono will throw an exception.   | ||||
|             // Therefore, we need to make sure that the row position is valid first.                | ||||
|             int top = System.Console.CursorTop; | ||||
| 
 | ||||
|             if (top < 0) | ||||
|                 System.Console.CursorTop = 0; | ||||
|             else if (top >= System.Console.BufferHeight) | ||||
|                 System.Console.CursorTop = System.Console.BufferHeight - 1; | ||||
|              | ||||
|             if (left < 0) | ||||
|                 left = 0; | ||||
|             if (left >= System.Console.BufferWidth) | ||||
|                 left = System.Console.BufferWidth - 1; | ||||
| 
 | ||||
|             System.Console.CursorLeft = left; | ||||
| 
 | ||||
|             return left; | ||||
|         } | ||||
| 
 | ||||
|         private void Show() | ||||
|  | @ -128,21 +169,21 @@ namespace OpenSim.Framework.Console | |||
|                 { | ||||
|                     y--; | ||||
|                     new_y--; | ||||
|                     System.Console.CursorLeft = 0; | ||||
|                     System.Console.CursorTop = System.Console.BufferHeight-1; | ||||
|                     SetCursorLeft(0); | ||||
|                     SetCursorTop(System.Console.BufferHeight - 1); | ||||
|                     System.Console.WriteLine(" "); | ||||
|                 } | ||||
| 
 | ||||
|                 y=SetCursorTop(y); | ||||
|                 System.Console.CursorLeft = 0; | ||||
|                 y = SetCursorTop(y); | ||||
|                 SetCursorLeft(0); | ||||
| 
 | ||||
|                 if (echo) | ||||
|                     System.Console.Write("{0}{1}", prompt, cmdline); | ||||
|                 else | ||||
|                     System.Console.Write("{0}", prompt); | ||||
| 
 | ||||
|                 SetCursorLeft(new_x); | ||||
|                 SetCursorTop(new_y); | ||||
|                 SetCursorLeft(new_x);                 | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -162,8 +203,7 @@ namespace OpenSim.Framework.Console | |||
|                         System.Console.Write(" "); | ||||
| 
 | ||||
|                     y = SetCursorTop(y); | ||||
|                     System.Console.CursorLeft = 0; | ||||
| 
 | ||||
|                     SetCursorLeft(0); | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception) | ||||
|  | @ -252,7 +292,7 @@ namespace OpenSim.Framework.Console | |||
|                 } | ||||
| 
 | ||||
|                 y = SetCursorTop(y); | ||||
|                 System.Console.CursorLeft = 0; | ||||
|                 SetCursorLeft(0); | ||||
| 
 | ||||
|                 int count = cmdline.Length + prompt.Length; | ||||
| 
 | ||||
|  | @ -260,7 +300,7 @@ namespace OpenSim.Framework.Console | |||
|                     System.Console.Write(" "); | ||||
| 
 | ||||
|                 y = SetCursorTop(y); | ||||
|                 System.Console.CursorLeft = 0; | ||||
|                 SetCursorLeft(0); | ||||
| 
 | ||||
|                 WriteLocalText(text, level); | ||||
| 
 | ||||
|  | @ -299,7 +339,7 @@ namespace OpenSim.Framework.Console | |||
|             echo = e; | ||||
|             int historyLine = history.Count; | ||||
| 
 | ||||
|             System.Console.CursorLeft = 0; // Needed for mono | ||||
|             SetCursorLeft(0); // Needed for mono | ||||
|             System.Console.Write(" "); // Needed for mono | ||||
| 
 | ||||
|             lock (cmdline) | ||||
|  | @ -339,7 +379,7 @@ namespace OpenSim.Framework.Console | |||
|                         cmdline.Remove(cp-1, 1); | ||||
|                         cp--; | ||||
| 
 | ||||
|                         System.Console.CursorLeft = 0; | ||||
|                         SetCursorLeft(0); | ||||
|                         y = SetCursorTop(y); | ||||
| 
 | ||||
|                         System.Console.Write("{0}{1} ", prompt, cmdline); | ||||
|  | @ -387,7 +427,7 @@ namespace OpenSim.Framework.Console | |||
|                             cp++; | ||||
|                         break; | ||||
|                     case ConsoleKey.Enter: | ||||
|                         System.Console.CursorLeft = 0; | ||||
|                         SetCursorLeft(0); | ||||
|                         y = SetCursorTop(y); | ||||
| 
 | ||||
|                         System.Console.WriteLine("{0}{1}", prompt, cmdline); | ||||
|  | @ -424,4 +464,4 @@ namespace OpenSim.Framework.Console | |||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	 Justin Clark-Casey (justincc)
						Justin Clark-Casey (justincc)