From 1b3b510376465136adba1e4e976762426be74260 Mon Sep 17 00:00:00 2001 From: "Stefanos A." Date: Thu, 9 Jan 2014 00:10:41 +0100 Subject: [PATCH 1/2] [Win] Check registry keys before accessing Fixes crashes when using OpenTK over the Remote Desktop Client for Mac (version 2010). --- Source/OpenTK/Platform/Windows/WinRawKeyboard.cs | 10 ++++++++-- Source/OpenTK/Platform/Windows/WinRawMouse.cs | 13 ++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs b/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs index 81f6e6ee..84b17a18 100644 --- a/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs +++ b/Source/OpenTK/Platform/Windows/WinRawKeyboard.cs @@ -103,10 +103,11 @@ namespace OpenTK.Platform.Windows // This is a keyboard or USB keyboard device. In the latter case, discover if it really is a // keyboard device by qeurying the registry. RegistryKey regkey = GetRegistryKey(name); - string deviceDesc = (string)regkey.GetValue("DeviceDesc"); + if (regkey == null) + continue; + string deviceDesc = (string)regkey.GetValue("DeviceDesc"); string deviceClass = (string)regkey.GetValue("Class"); - string deviceClassGUID = (string)regkey.GetValue("ClassGUID"); // for windows 8 support via OpenTK issue 3198 // making a guess at backwards compatability. Not sure what older windows returns in these cases... @@ -205,10 +206,15 @@ namespace OpenTK.Platform.Windows static RegistryKey GetRegistryKey(string name) { + if (name.Length < 4) + return null; + // remove the \??\ name = name.Substring(4); string[] split = name.Split('#'); + if (split.Length < 3) + return null; string id_01 = split[0]; // ACPI (Class code) string id_02 = split[1]; // PNP0303 (SubClass code) diff --git a/Source/OpenTK/Platform/Windows/WinRawMouse.cs b/Source/OpenTK/Platform/Windows/WinRawMouse.cs index 727d3b6a..15ae0430 100644 --- a/Source/OpenTK/Platform/Windows/WinRawMouse.cs +++ b/Source/OpenTK/Platform/Windows/WinRawMouse.cs @@ -110,11 +110,13 @@ namespace OpenTK.Platform.Windows // This is a mouse or a USB mouse device. In the latter case, discover if it really is a // mouse device by qeurying the registry. RegistryKey regkey = FindRegistryKey(name); - string deviceDesc = (string)regkey.GetValue("DeviceDesc"); + if (regkey == null) + continue; - + string deviceDesc = (string)regkey.GetValue("DeviceDesc"); string deviceClass = (string)regkey.GetValue("Class") as string; - if(deviceClass == null){ + if(deviceClass == null) + { // Added to address OpenTK issue 3198 with mouse on Windows 8 string deviceClassGUID = (string)regkey.GetValue("ClassGUID"); RegistryKey classGUIDKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\" + deviceClassGUID); @@ -266,10 +268,15 @@ namespace OpenTK.Platform.Windows static RegistryKey FindRegistryKey(string name) { + if (name.Length < 4) + return null; + // remove the \??\ name = name.Substring(4); string[] split = name.Split('#'); + if (split.Length < 3) + return null; string id_01 = split[0]; // ACPI (Class code) string id_02 = split[1]; // PNP0303 (SubClass code) From 28ac3cec0b4cce7757c6e69fa2d1ac8033ea2093 Mon Sep 17 00:00:00 2001 From: "Stefanos A." Date: Thu, 9 Jan 2014 00:14:25 +0100 Subject: [PATCH 2/2] [Win] Fix issue #35 (OpenTK over Remote Desktop) When running over remote desktop without hardware acceleration, there are no GraphicsModes that support desktop composition. This patch adds logic to avoid requesting composition-capable modes when running over RDP. Additionally, it changes the mode selection logic to consider modes that support features partially (e.g. 16bpp color instead of 32bpp), albeit with a heavy penalty over fully supported modes. --- .../Platform/Windows/WinGraphicsMode.cs | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/Source/OpenTK/Platform/Windows/WinGraphicsMode.cs b/Source/OpenTK/Platform/Windows/WinGraphicsMode.cs index 9de28341..a5886f98 100644 --- a/Source/OpenTK/Platform/Windows/WinGraphicsMode.cs +++ b/Source/OpenTK/Platform/Windows/WinGraphicsMode.cs @@ -216,15 +216,31 @@ namespace OpenTK.Platform.Windows static bool Compare(int got, int requested, ref int distance) { - if (got < requested) + bool valid = true; + if (got == 0 && requested != 0) { - return false; + // mode does not support the requested feature. + valid = false; + } + else if (got >= requested) + { + // mode supports the requested feature, + // calculate the distance from an "ideal" mode + // that matches this feature exactly. + distance += got - requested; } else { - distance += got - requested; - return true; + // mode supports the requested feature, + // but at a suboptimal level. For example: + // - requsted AA = 8x, got 4x + // - requested color = 32bpp, got 16bpp + // We can still use this mode but only if + // no better mode exists. + const int penalty = 8; + distance += penalty * Math.Abs(got - requested); } + return valid; } static AccelerationType GetAccelerationType(ref PixelFormatDescriptor pfd) @@ -262,8 +278,18 @@ namespace OpenTK.Platform.Windows // Does not appear to be supported by DescribePixelFormat //flags |= PixelFormatDescriptorFlags.DOUBLEBUFFER; } - if (System.Environment.OSVersion.Version.Major >= 6) + + if (System.Environment.OSVersion.Version.Major >= 6 && + requested_acceleration_type != AccelerationType.None) { + // Request a compositor-capable mode when running on + // Vista+ and using hardware acceleration. Without this, + // some modes will cause the compositor to turn off, + // which is very annoying to the user. + // Note: compositor-capable modes require hardware + // acceleration. Don't set this flag when running + // with software acceleration (e.g. over Remote Desktop + // as described in bug https://github.com/opentk/opentk/issues/35) flags |= PixelFormatDescriptorFlags.SUPPORT_COMPOSITION; }