[Linux] Improve checks for TTY
authorthefiddler <stapostol@gmail.com>
Mon, 14 Jul 2014 21:07:28 +0000 (21:07 +0000)
committerthefiddler <stapostol@gmail.com>
Wed, 16 Jul 2014 12:28:27 +0000 (14:28 +0200)
Source/OpenTK/Platform/Linux/Bindings/Libc.cs
Source/OpenTK/Platform/Linux/Bindings/Terminal.cs
Source/OpenTK/Platform/Linux/LinuxKeyboardTTY.cs

index 264bab2..0667365 100644 (file)
@@ -38,6 +38,12 @@ namespace OpenTK.Platform.Linux
         const string lib = "libc";
 
         [DllImport(lib)]
+        public static extern int dup(int file);
+
+        [DllImport(lib)]
+        public static extern int dup2(int file1, int file2);
+
+        [DllImport(lib)]
         public static extern int ioctl(int d, JoystickIoctlCode request, ref int data);
 
         [DllImport(lib)]
index 8ed7257..e72ad74 100644 (file)
@@ -36,6 +36,10 @@ namespace OpenTK.Platform.Linux
     {
         const string lib = "libc";
 
+        [DllImport(lib, EntryPoint = "isatty", CallingConvention = CallingConvention.Cdecl)]
+        [return: MarshalAs(UnmanagedType.I4)]
+        public static extern bool IsTerminal(int fd);
+
         [DllImport(lib, EntryPoint = "tcgetattr", CallingConvention = CallingConvention.Cdecl)]
         public static extern int GetAttributes(int fd, out TerminalState state);
 
index 1ba8d14..d9c0c6b 100644 (file)
@@ -47,9 +47,12 @@ namespace OpenTK.Platform.Linux
         TerminalState current_state;
 
         IntPtr original_mode = new IntPtr(-1);
+        int original_stdin;
 
         public LinuxKeyboardTTY()
         {
+            Debug.Print("[Linux] Using TTY keyboard input.");
+
             if (!SetupTTY(stdin))
             {
                 throw new NotSupportedException();
@@ -64,6 +67,16 @@ namespace OpenTK.Platform.Linux
 
         bool SetupTTY(int stdin)
         {
+            // Ensure that we are using a real terminal,
+            // rather than some short of file redirection.thing.
+            if (!Terminal.IsTerminal(stdin))
+            {
+                Debug.Print("[Linux] Terminal.IsTerminal({0}) returned false.", stdin);
+                return false;
+            }
+
+            //original_stdin = Libc.dup(stdin);
+
             int ret = Terminal.GetAttributes(stdin, out original_state);
             if (ret < 0)
             {
@@ -83,7 +96,7 @@ namespace OpenTK.Platform.Linux
 
             // Update terminal state
             current_state = original_state;
-            current_state.LocalMode &= ~(LocalFlags.ECHO | LocalFlags.ICANON | LocalFlags.ISIG);
+            current_state.LocalMode &= ~(/*LocalFlags.ECHO |*/ LocalFlags.ICANON | LocalFlags.ISIG);
             current_state.InputMode &= ~(
                 InputFlags.ISTRIP | InputFlags.IGNCR | InputFlags.ICRNL |
                 InputFlags.INLCR | InputFlags.IXOFF | InputFlags.IXON);
@@ -113,6 +126,8 @@ namespace OpenTK.Platform.Linux
         {
             if (original_mode != new IntPtr(-1))
             {
+                Debug.Print("[Linux] Exiting TTY keyboard input.");
+
                 Libc.ioctl(stdin, KeyboardIoctlCode.SetMode, ref original_mode);
                 Terminal.SetAttributes(stdin, OptionalActions.FLUSH, ref original_state);
                 original_mode = new IntPtr(-1);