aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-01-08 14:45:40 +0000
committerJustin Clark-Casey (justincc)2010-01-08 14:45:40 +0000
commit22b1ffdc6ce59e3d8108ef26522dfce815b1a921 (patch)
tree99dfa2146cdd8d0f44fb7a219b89558b57462424
parentChange ConsoleClient to allow quoted values to be passed through. This (diff)
downloadopensim-SC-22b1ffdc6ce59e3d8108ef26522dfce815b1a921.zip
opensim-SC-22b1ffdc6ce59e3d8108ef26522dfce815b1a921.tar.gz
opensim-SC-22b1ffdc6ce59e3d8108ef26522dfce815b1a921.tar.bz2
opensim-SC-22b1ffdc6ce59e3d8108ef26522dfce815b1a921.tar.xz
Fix repeated ArgumentOutOfRangeException when a local OpenSim console is resized under mono
May fix mantises 3186, 3270, 4022, 4238
-rw-r--r--OpenSim/Framework/Console/CommandConsole.cs8
-rw-r--r--OpenSim/Framework/Console/LocalConsole.cs106
2 files changed, 79 insertions, 35 deletions
diff --git a/OpenSim/Framework/Console/CommandConsole.cs b/OpenSim/Framework/Console/CommandConsole.cs
index 9671bc2..66f483c 100644
--- a/OpenSim/Framework/Console/CommandConsole.cs
+++ b/OpenSim/Framework/Console/CommandConsole.cs
@@ -552,8 +552,9 @@ namespace OpenSim.Framework.Console
552 } 552 }
553 } 553 }
554 554
555 // A console that processes commands internally 555 /// <summary>
556 // 556 /// A console that processes commands internally
557 /// </summary>
557 public class CommandConsole : ConsoleBase 558 public class CommandConsole : ConsoleBase
558 { 559 {
559 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 560 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -574,6 +575,9 @@ namespace OpenSim.Framework.Console
574 Output(s); 575 Output(s);
575 } 576 }
576 577
578 /// <summary>
579 /// Display a command prompt on the console and wait for user input
580 /// </summary>
577 public void Prompt() 581 public void Prompt()
578 { 582 {
579 string line = ReadLine(m_defaultPrompt + "# ", true, true); 583 string line = ReadLine(m_defaultPrompt + "# ", true, true);
diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs
index 39edd2a..b7e191b 100644
--- a/OpenSim/Framework/Console/LocalConsole.cs
+++ b/OpenSim/Framework/Console/LocalConsole.cs
@@ -36,8 +36,9 @@ using log4net;
36 36
37namespace OpenSim.Framework.Console 37namespace OpenSim.Framework.Console
38{ 38{
39 // A console that uses cursor control and color 39 /// <summary>
40 // 40 /// A console that uses cursor control and color
41 /// </summary>
41 public class LocalConsole : CommandConsole 42 public class LocalConsole : CommandConsole
42 { 43 {
43// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 44// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -85,30 +86,70 @@ namespace OpenSim.Framework.Console
85 history.Add(text); 86 history.Add(text);
86 } 87 }
87 88
89 /// <summary>
90 /// Set the cursor row.
91 /// </summary>
92 ///
93 /// <param name="top">
94 /// 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
95 /// then it is set to one less than the height.
96 /// </param>
97 /// <returns>
98 /// The new cursor row.
99 /// </returns>
88 private int SetCursorTop(int top) 100 private int SetCursorTop(int top)
89 { 101 {
90 if (top >= 0 && top < System.Console.BufferHeight) 102 // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try
91 { 103 // to set a cursor row position with a currently invalid column, mono will throw an exception.
92 System.Console.CursorTop = top; 104 // Therefore, we need to make sure that the column position is valid first.
93 return top; 105 int left = System.Console.CursorLeft;
94 } 106
95 else 107 if (left < 0)
96 { 108 System.Console.CursorLeft = 0;
97 return System.Console.CursorTop; 109 else if (left >= System.Console.BufferWidth)
98 } 110 System.Console.CursorLeft = System.Console.BufferWidth - 1;
111
112 if (top < 0)
113 top = 0;
114 if (top >= System.Console.BufferHeight)
115 top = System.Console.BufferHeight - 1;
116
117 System.Console.CursorTop = top;
118
119 return top;
99 } 120 }
100 121
122 /// <summary>
123 /// Set the cursor column.
124 /// </summary>
125 ///
126 /// <param name="left">
127 /// 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
128 /// then it is set to one less than the width.
129 /// </param>
130 /// <returns>
131 /// The new cursor column.
132 /// </returns>
101 private int SetCursorLeft(int left) 133 private int SetCursorLeft(int left)
102 { 134 {
103 if (left >= 0 && left < System.Console.BufferWidth) 135 // From at least mono 2.4.2.3, window resizing can give mono an invalid row and column values. If we try
104 { 136 // to set a cursor column position with a currently invalid row, mono will throw an exception.
105 System.Console.CursorLeft = left; 137 // Therefore, we need to make sure that the row position is valid first.
106 return left; 138 int top = System.Console.CursorTop;
107 } 139
108 else 140 if (top < 0)
109 { 141 System.Console.CursorTop = 0;
110 return System.Console.CursorLeft; 142 else if (top >= System.Console.BufferHeight)
111 } 143 System.Console.CursorTop = System.Console.BufferHeight - 1;
144
145 if (left < 0)
146 left = 0;
147 if (left >= System.Console.BufferWidth)
148 left = System.Console.BufferWidth - 1;
149
150 System.Console.CursorLeft = left;
151
152 return left;
112 } 153 }
113 154
114 private void Show() 155 private void Show()
@@ -128,21 +169,21 @@ namespace OpenSim.Framework.Console
128 { 169 {
129 y--; 170 y--;
130 new_y--; 171 new_y--;
131 System.Console.CursorLeft = 0; 172 SetCursorLeft(0);
132 System.Console.CursorTop = System.Console.BufferHeight-1; 173 SetCursorTop(System.Console.BufferHeight - 1);
133 System.Console.WriteLine(" "); 174 System.Console.WriteLine(" ");
134 } 175 }
135 176
136 y=SetCursorTop(y); 177 y = SetCursorTop(y);
137 System.Console.CursorLeft = 0; 178 SetCursorLeft(0);
138 179
139 if (echo) 180 if (echo)
140 System.Console.Write("{0}{1}", prompt, cmdline); 181 System.Console.Write("{0}{1}", prompt, cmdline);
141 else 182 else
142 System.Console.Write("{0}", prompt); 183 System.Console.Write("{0}", prompt);
143 184
144 SetCursorLeft(new_x);
145 SetCursorTop(new_y); 185 SetCursorTop(new_y);
186 SetCursorLeft(new_x);
146 } 187 }
147 } 188 }
148 189
@@ -162,8 +203,7 @@ namespace OpenSim.Framework.Console
162 System.Console.Write(" "); 203 System.Console.Write(" ");
163 204
164 y = SetCursorTop(y); 205 y = SetCursorTop(y);
165 System.Console.CursorLeft = 0; 206 SetCursorLeft(0);
166
167 } 207 }
168 } 208 }
169 catch (Exception) 209 catch (Exception)
@@ -252,7 +292,7 @@ namespace OpenSim.Framework.Console
252 } 292 }
253 293
254 y = SetCursorTop(y); 294 y = SetCursorTop(y);
255 System.Console.CursorLeft = 0; 295 SetCursorLeft(0);
256 296
257 int count = cmdline.Length + prompt.Length; 297 int count = cmdline.Length + prompt.Length;
258 298
@@ -260,7 +300,7 @@ namespace OpenSim.Framework.Console
260 System.Console.Write(" "); 300 System.Console.Write(" ");
261 301
262 y = SetCursorTop(y); 302 y = SetCursorTop(y);
263 System.Console.CursorLeft = 0; 303 SetCursorLeft(0);
264 304
265 WriteLocalText(text, level); 305 WriteLocalText(text, level);
266 306
@@ -299,7 +339,7 @@ namespace OpenSim.Framework.Console
299 echo = e; 339 echo = e;
300 int historyLine = history.Count; 340 int historyLine = history.Count;
301 341
302 System.Console.CursorLeft = 0; // Needed for mono 342 SetCursorLeft(0); // Needed for mono
303 System.Console.Write(" "); // Needed for mono 343 System.Console.Write(" "); // Needed for mono
304 344
305 lock (cmdline) 345 lock (cmdline)
@@ -339,7 +379,7 @@ namespace OpenSim.Framework.Console
339 cmdline.Remove(cp-1, 1); 379 cmdline.Remove(cp-1, 1);
340 cp--; 380 cp--;
341 381
342 System.Console.CursorLeft = 0; 382 SetCursorLeft(0);
343 y = SetCursorTop(y); 383 y = SetCursorTop(y);
344 384
345 System.Console.Write("{0}{1} ", prompt, cmdline); 385 System.Console.Write("{0}{1} ", prompt, cmdline);
@@ -387,7 +427,7 @@ namespace OpenSim.Framework.Console
387 cp++; 427 cp++;
388 break; 428 break;
389 case ConsoleKey.Enter: 429 case ConsoleKey.Enter:
390 System.Console.CursorLeft = 0; 430 SetCursorLeft(0);
391 y = SetCursorTop(y); 431 y = SetCursorTop(y);
392 432
393 System.Console.WriteLine("{0}{1}", prompt, cmdline); 433 System.Console.WriteLine("{0}{1}", prompt, cmdline);
@@ -424,4 +464,4 @@ namespace OpenSim.Framework.Console
424 } 464 }
425 } 465 }
426 } 466 }
427} 467} \ No newline at end of file