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;