From a0edc1a4399531db5993773865b2624dd820de95 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sat, 12 Nov 2016 16:28:33 +0900 Subject: [PATCH] use system cursor position for zoom when cursor is invisible (e.g. dragging). --- .../Examples/Scripts/Loupe.cs | 16 ++++++---- Assets/uDesktopDuplication/Scripts/Monitor.cs | 19 ++++++++++++ Assets/uDesktopDuplication/Scripts/Utility.cs | 30 +++++++++++++++++++ .../Scripts/Utility.cs.meta | 12 ++++++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 Assets/uDesktopDuplication/Scripts/Utility.cs create mode 100644 Assets/uDesktopDuplication/Scripts/Utility.cs.meta diff --git a/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs b/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs index 0c1cca7..5b4eac8 100644 --- a/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs +++ b/Assets/uDesktopDuplication/Examples/Scripts/Loupe.cs @@ -20,15 +20,19 @@ public class Loupe : MonoBehaviour uddTexture_.monitorId = uDesktopDuplication.Manager.cursorMonitorId; // To get other monitor textures, set dirty flag. - foreach (var monitor in uDesktopDuplication.Manager.monitors) { - monitor.CreateTexture(); - monitor.shouldBeUpdated = true; + foreach (var target in uDesktopDuplication.Manager.monitors) { + target.CreateTexture(); + target.shouldBeUpdated = true; } - var x = (float)uddTexture_.monitor.cursorX / uddTexture_.monitor.width; - var y = (float)uddTexture_.monitor.cursorY / uddTexture_.monitor.height; + var monitor = uddTexture_.monitor; + var cursorX = monitor.isCursorVisible ? monitor.cursorX : monitor.systemCursorX; + var cursorY = monitor.isCursorVisible ? monitor.cursorY : monitor.systemCursorY; + + var x = (float)cursorX / monitor.width; + var y = (float)cursorY / monitor.height; var w = 1f / zoom; - var h = w / aspect * uddTexture_.monitor.aspect; + var h = w / aspect * monitor.aspect; x = Mathf.Clamp(x - w / 2, 0f, 1f - w); y = Mathf.Clamp(y - h / 2, 0f, 1f - h); uddTexture_.clipPos = new Vector2(x, y); diff --git a/Assets/uDesktopDuplication/Scripts/Monitor.cs b/Assets/uDesktopDuplication/Scripts/Monitor.cs index 920feb8..c8ef34b 100644 --- a/Assets/uDesktopDuplication/Scripts/Monitor.cs +++ b/Assets/uDesktopDuplication/Scripts/Monitor.cs @@ -1,4 +1,5 @@ using UnityEngine; +using System.Runtime.InteropServices; namespace uDesktopDuplication { @@ -157,6 +158,24 @@ public class Monitor get { return Lib.GetCursorY(id); } } + public int systemCursorX + { + get + { + var p = Utility.GetCursorPos(); + return p.x - left; + } + } + + public int systemCursorY + { + get + { + var p = Utility.GetCursorPos(); + return p.y - top; + } + } + public int cursorShapeWidth { get { return Lib.GetCursorShapeWidth(id); } diff --git a/Assets/uDesktopDuplication/Scripts/Utility.cs b/Assets/uDesktopDuplication/Scripts/Utility.cs new file mode 100644 index 0000000..b11ebb4 --- /dev/null +++ b/Assets/uDesktopDuplication/Scripts/Utility.cs @@ -0,0 +1,30 @@ +using UnityEngine; +using System.Runtime.InteropServices; + +namespace uDesktopDuplication +{ + +public struct MousePoint +{ + public int x; + public int y; +} + +public static class Utility +{ + [DllImport("user32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool GetCursorPos(out MousePoint point); + + public static MousePoint GetCursorPos() + { + MousePoint p; + if (!GetCursorPos(out p)) { + p.x = -1; + p.y = -1; + } + return p; + } +} + +} \ No newline at end of file diff --git a/Assets/uDesktopDuplication/Scripts/Utility.cs.meta b/Assets/uDesktopDuplication/Scripts/Utility.cs.meta new file mode 100644 index 0000000..bb62220 --- /dev/null +++ b/Assets/uDesktopDuplication/Scripts/Utility.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6c7e8da181b03ce4fb343ffa33cbb929 +timeCreated: 1478934399 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: