Fix http://opensimulator.org/mantis/view.php?id=4657 where OpenSim.Grid.UserServer.exe fails on startup if no previous config

probably appears to occur because mono 2.4.2.3 (and possibly later) erroneously returns a value of 0 for BufferWidth and BufferHeight in some circumstances
0.6.9
Justin Clark-Casey (justincc) 2010-04-16 20:40:01 +01:00
parent 54cedfe432
commit c77444a821
2 changed files with 48 additions and 17 deletions

View File

@ -38,7 +38,7 @@ namespace OpenSim.Framework.Console
{ {
/// <summary> /// <summary>
/// A console that uses cursor control and color /// A console that uses cursor control and color
/// </summary> /// </summary>
public class LocalConsole : CommandConsole public class LocalConsole : CommandConsole
{ {
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@ -100,24 +100,40 @@ namespace OpenSim.Framework.Console
private int SetCursorTop(int top) private int SetCursorTop(int top)
{ {
// From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try // 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. // 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. // Therefore, we need to make sure that the column position is valid first.
int left = System.Console.CursorLeft; int left = System.Console.CursorLeft;
if (left < 0) if (left < 0)
{
System.Console.CursorLeft = 0; System.Console.CursorLeft = 0;
else if (left >= System.Console.BufferWidth) }
System.Console.CursorLeft = System.Console.BufferWidth - 1; else
{
int bw = System.Console.BufferWidth;
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
if (bw > 0 && left >= bw)
System.Console.CursorLeft = bw - 1;
}
if (top < 0) if (top < 0)
{
top = 0; top = 0;
if (top >= System.Console.BufferHeight) }
top = System.Console.BufferHeight - 1; else
{
int bh = System.Console.BufferHeight;
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
if (bh > 0 && top >= bh)
top = bh - 1;
}
System.Console.CursorTop = top; System.Console.CursorTop = top;
return top; return top;
} }
/// <summary> /// <summary>
/// Set the cursor column. /// Set the cursor column.
@ -129,23 +145,38 @@ namespace OpenSim.Framework.Console
/// </param> /// </param>
/// <returns> /// <returns>
/// The new cursor column. /// The new cursor column.
/// </returns> /// </returns>
private int SetCursorLeft(int left) private int SetCursorLeft(int left)
{ {
// From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try // 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. // 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. // Therefore, we need to make sure that the row position is valid first.
int top = System.Console.CursorTop; int top = System.Console.CursorTop;
if (top < 0) if (top < 0)
{
System.Console.CursorTop = 0; System.Console.CursorTop = 0;
else if (top >= System.Console.BufferHeight) }
System.Console.CursorTop = System.Console.BufferHeight - 1; else
{
int bh = System.Console.BufferHeight;
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
if (bh > 0 && top >= bh)
System.Console.CursorTop = bh - 1;
}
if (left < 0) if (left < 0)
{
left = 0; left = 0;
if (left >= System.Console.BufferWidth) }
left = System.Console.BufferWidth - 1; else
{
int bw = System.Console.BufferWidth;
// On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657)
if (bw > 0 && left >= bw)
left = bw - 1;
}
System.Console.CursorLeft = left; System.Console.CursorLeft = left;
@ -183,7 +214,7 @@ namespace OpenSim.Framework.Console
System.Console.Write("{0}", prompt); System.Console.Write("{0}", prompt);
SetCursorTop(new_y); SetCursorTop(new_y);
SetCursorLeft(new_x); SetCursorLeft(new_x);
} }
} }

View File

@ -1441,4 +1441,4 @@ namespace OpenSim.Framework
return (diff >= 0) ? diff : (diff + EnvironmentTickCountMask + 1); return (diff >= 0) ? diff : (diff + EnvironmentTickCountMask + 1);
} }
} }
} }