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 983c91e..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
+#if !NET_2_1
 using System.Runtime.InteropServices;
 using System.Text;
 namespace System {
@@ -35,6 +35,7 @@ namespace System {
                public bool Visible;
        }
 
+#pragma warning disable 169
        struct InputRecord {
                public short EventType;
                // This is KEY_EVENT_RECORD
@@ -48,6 +49,7 @@ namespace System {
                bool pad2;
                //
        }
+#pragma warning restore 169
 
        struct CharInfo {
                public char Character;
@@ -98,7 +100,6 @@ namespace System {
                IntPtr inputHandle;
                IntPtr outputHandle;
                short defaultAttribute;
-               bool inited;
 
                public WindowsConsoleDriver ()
                {
@@ -236,11 +237,6 @@ namespace System {
                        }
                }
 
-               public bool Echo { // not really used on windows
-                       get { return true; }
-                       set {}
-               }
-
                public ConsoleColor ForegroundColor {
                        get {
                                ConsoleScreenBufferInfo info = new ConsoleScreenBufferInfo ();
@@ -269,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))
@@ -334,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
@@ -343,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);
@@ -353,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 ());
                        }
                }
@@ -478,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
@@ -544,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
                //