Merge pull request #2216 from akoeplinger/fix-array-sort
[mono.git] / mcs / class / corlib / System / WindowsConsoleDriver.cs
old mode 100644 (file)
new mode 100755 (executable)
index 8b614ec..2e8b643
@@ -26,7 +26,7 @@
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-#if (NET_2_0||BOOTSTRAP_NET_2_0) && !NET_2_1
+#if !NET_2_1
 using System.Runtime.InteropServices;
 using System.Text;
 namespace System {
@@ -265,7 +265,7 @@ namespace System {
                                                return false;
 
                                        //KEY_EVENT == 1
-                                       if (record.EventType == 1 && record.KeyDown)
+                                       if (record.EventType == 1 && record.KeyDown && !IsModifierKey (record.VirtualKeyCode))
                                                return true;
 
                                        if (!ReadConsoleInput (inputHandle, out record, 1, out eventsRead))
@@ -330,7 +330,7 @@ namespace System {
                public bool TreatControlCAsInput {
                        get {
                                int mode;
-                               if (!GetConsoleMode (outputHandle, out mode))
+                               if (!GetConsoleMode (inputHandle, out mode))
                                        throw new Exception ("Failed in GetConsoleMode: " + Marshal.GetLastWin32Error ());
 
                                // ENABLE_PROCESSED_INPUT
@@ -339,7 +339,7 @@ namespace System {
 
                        set {
                                int mode;
-                               if (!GetConsoleMode (outputHandle, out mode))
+                               if (!GetConsoleMode (inputHandle, out mode))
                                        throw new Exception ("Failed in GetConsoleMode: " + Marshal.GetLastWin32Error ());
 
                                bool cAsInput = ((mode & 1) == 0);
@@ -349,9 +349,9 @@ namespace System {
                                if (value)
                                        mode &= ~1;
                                else
-                                       mode++;
+                                       mode |= 1;
 
-                               if (!SetConsoleMode (outputHandle, mode))
+                               if (!SetConsoleMode (inputHandle, mode))
                                        throw new Exception ("Failed in SetConsoleMode: " + Marshal.GetLastWin32Error ());
                        }
                }
@@ -474,11 +474,13 @@ namespace System {
                {
                        int eventsRead;
                        InputRecord record = new InputRecord ();
-                       do {
+                       for (;;) {
                                if (!ReadConsoleInput (inputHandle, out record, 1, out eventsRead))
                                        throw new InvalidOperationException ("Error in ReadConsoleInput " +
                                                                        Marshal.GetLastWin32Error ());
-                       } while (record.EventType != 1 && !record.KeyDown);
+                               if (record.KeyDown && record.EventType == 1 && !IsModifierKey (record.VirtualKeyCode))
+                                       break;
+                       }
 
                        // RIGHT_ALT_PRESSED 1
                        // LEFT_ALT_PRESSED 2
@@ -540,6 +542,23 @@ namespace System {
                                throw new ArgumentOutOfRangeException ("left/top", "Windows error " + Marshal.GetLastWin32Error ());
                }
 
+               static bool IsModifierKey (short virtualKeyCode)
+               {
+                       // 0x10 through 0x14 is shift/control/alt/pause/capslock
+                       // 0x2C is print screen, 0x90 is numlock, 0x91 is scroll lock
+                       switch (virtualKeyCode) {
+                       case 0x10:
+                       case 0x11:
+                       case 0x12:
+                       case 0x14:
+                       case 0x90:
+                       case 0x91:
+                               return true;
+                       default:
+                               return false;
+                       }
+               }
+
                //
                // Imports
                //