diff --git a/Source/OpenTK/OpenTK.csproj b/Source/OpenTK/OpenTK.csproj
index 4c2c827d..b8a47635 100644
--- a/Source/OpenTK/OpenTK.csproj
+++ b/Source/OpenTK/OpenTK.csproj
@@ -815,6 +815,10 @@
+
+
+
+
diff --git a/Source/OpenTK/Platform/Linux/Bindings/LibInput.cs b/Source/OpenTK/Platform/Linux/Bindings/LibInput.cs
new file mode 100644
index 00000000..aadf4aaf
--- /dev/null
+++ b/Source/OpenTK/Platform/Linux/Bindings/LibInput.cs
@@ -0,0 +1,92 @@
+#region License
+//
+// LibInput.cs
+//
+// Author:
+// Stefanos A.
+//
+// Copyright (c) 2006-2014 Stefanos Apostolopoulos
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+#pragma warning disable 0169
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Platform.Linux
+{
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ delegate int OpenRestrictedCallback(IntPtr path, int flags, IntPtr data);
+
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ delegate void CloseRestrictedCallback(int fd, IntPtr data);
+
+ class LibInput
+ {
+ const string lib = "libinput";
+
+ [DllImport(lib, EntryPoint = "libinput_udev_create_for_seat", CallingConvention = CallingConvention.Cdecl)]
+ public static extern IntPtr CreateContext(InputInterface @interface,
+ IntPtr user_data, IntPtr udev, string seat_id);
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ class InputInterface
+ {
+ IntPtr open;
+ IntPtr close;
+
+ public InputInterface(
+ OpenRestrictedCallback open_restricted,
+ CloseRestrictedCallback close_restricted)
+ {
+ if (open_restricted == null || close_restricted == null)
+ throw new ArgumentNullException();
+
+ open = Marshal.GetFunctionPointerForDelegate(open_restricted);
+ close = Marshal.GetFunctionPointerForDelegate(close_restricted);
+ }
+
+ #region Default implementation
+
+ static CloseRestrictedCallback CloseRestricted = CloseRestrictedHandler;
+ static void CloseRestrictedHandler(int fd, IntPtr data)
+ {
+ Debug.Print("[Input] Closing fd {0}", fd);
+ Libc.close(fd);
+ }
+
+ static OpenRestrictedCallback OpenRestricted = OpenRestrictedHandler;
+ static int OpenRestrictedHandler(IntPtr path, int flags, IntPtr data)
+ {
+ Debug.Print("[Input] Opening path '{0}'", Marshal.PtrToStringAnsi(path));
+ return Libc.open(path, (OpenFlags)flags);
+ }
+
+ public static readonly InputInterface Default = new InputInterface(
+ OpenRestricted, CloseRestricted);
+
+ #endregion
+ }
+}
+
diff --git a/Source/OpenTK/Platform/Linux/Bindings/Libc.cs b/Source/OpenTK/Platform/Linux/Bindings/Libc.cs
index a4df9710..fc77953d 100644
--- a/Source/OpenTK/Platform/Linux/Bindings/Libc.cs
+++ b/Source/OpenTK/Platform/Linux/Bindings/Libc.cs
@@ -49,11 +49,18 @@ namespace OpenTK.Platform.Linux
[DllImport(lib)]
public static extern int open([MarshalAs(UnmanagedType.LPStr)]string pathname, OpenFlags flags);
+ [DllImport(lib)]
+ public static extern int open(IntPtr pathname, OpenFlags flags);
+
[DllImport(lib)]
public static extern int close(int fd);
[DllImport(lib)]
unsafe public static extern IntPtr read(int fd, void* buffer, UIntPtr count);
+
+ [DllImport(lib)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static extern bool isatty(int fd);
}
[Flags]
diff --git a/Source/OpenTK/Platform/Linux/Bindings/Udev.cs b/Source/OpenTK/Platform/Linux/Bindings/Udev.cs
new file mode 100644
index 00000000..0f674f5a
--- /dev/null
+++ b/Source/OpenTK/Platform/Linux/Bindings/Udev.cs
@@ -0,0 +1,43 @@
+#region License
+//
+// Udev.cs
+//
+// Author:
+// Stefanos A.
+//
+// Copyright (c) 2006-2014 Stefanos Apostolopoulos
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace OpenTK.Platform.Linux
+{
+ class Udev
+ {
+ const string lib = "libudev";
+
+ [DllImport(lib, EntryPoint = "udev_new")]
+ public static extern IntPtr New();
+ }
+}
+
diff --git a/Source/OpenTK/Platform/Linux/LinuxKeyboardLibInput.cs b/Source/OpenTK/Platform/Linux/LinuxKeyboardLibInput.cs
new file mode 100644
index 00000000..d81ceb66
--- /dev/null
+++ b/Source/OpenTK/Platform/Linux/LinuxKeyboardLibInput.cs
@@ -0,0 +1,77 @@
+#region License
+//
+// LinuxKeyboardLibInput.cs
+//
+// Author:
+// thefiddler
+//
+// Copyright (c) 2006-2014
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Diagnostics;
+using OpenTK.Input;
+
+namespace OpenTK.Platform.Linux
+{
+ class LinuxKeyboardLibInput : IKeyboardDriver2
+ {
+ IntPtr udev;
+ IntPtr input_context;
+ InputInterface input_interface = InputInterface.Default;
+
+ public LinuxKeyboardLibInput()
+ {
+ // Todo: add static path fallback when udev is not installed.
+ udev = Udev.New();
+ if (udev == IntPtr.Zero)
+ throw new NotSupportedException("[Input] Udev.New() failed.");
+
+ input_context = LibInput.CreateContext(input_interface,
+ IntPtr.Zero, udev, "seat0");
+ if (input_context == IntPtr.Zero)
+ throw new NotSupportedException("[Input] Udev.New() failed.");
+
+
+ }
+
+ #region IKeyboardDriver2 implementation
+
+ public KeyboardState GetState()
+ {
+ throw new NotImplementedException();
+ }
+
+ public KeyboardState GetState(int index)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string GetDeviceName(int index)
+ {
+ throw new NotImplementedException();
+ }
+
+ #endregion
+ }
+}
+
diff --git a/Source/OpenTK/Platform/Linux/LinuxKeyboardTTY.cs b/Source/OpenTK/Platform/Linux/LinuxKeyboardTTY.cs
new file mode 100644
index 00000000..2d3c848b
--- /dev/null
+++ b/Source/OpenTK/Platform/Linux/LinuxKeyboardTTY.cs
@@ -0,0 +1,64 @@
+#region License
+//
+// LinuxKeyboardTTY.cs
+//
+// Author:
+// thefiddler
+//
+// Copyright (c) 2006-2014
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+using System;
+using OpenTK.Input;
+
+namespace OpenTK.Platform.Linux
+{
+ class LinuxKeyboardTTY : IKeyboardDriver2
+ {
+ public LinuxKeyboardTTY()
+ {
+ }
+
+ #region IKeyboardDriver2 implementation
+
+ public KeyboardState GetState()
+ {
+ throw new NotImplementedException();
+ }
+
+ public KeyboardState GetState(int index)
+ {
+ throw new NotImplementedException();
+ }
+
+ public string GetDeviceName(int index)
+ {
+ throw new NotImplementedException();
+ }
+
+ #endregion
+
+
+
+ }
+}
+
diff --git a/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs b/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs
index 16ae7716..eba4214c 100644
--- a/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs
+++ b/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs
@@ -146,6 +146,11 @@ namespace OpenTK.Platform.Linux
#region INativeWindow Members
+ public override void ProcessEvents()
+ {
+ base.ProcessEvents();
+ }
+
public override void Close()
{
exists = false;