From 8201a225232ec6ef388bae7acf355b6ee9659b08 Mon Sep 17 00:00:00 2001 From: hecomi Date: Sun, 27 Nov 2016 14:44:23 +0900 Subject: [PATCH] move cursor owner from monitor to manager. --- .../Plugins/x86_64/uDesktopDuplication.dll | Bin 77312 -> 76800 bytes Assets/uDesktopDuplication/Scripts/Lib.cs | 12 ++-- Assets/uDesktopDuplication/Scripts/Monitor.cs | 10 +-- .../uDesktopDuplication/Cursor.cpp | 40 ++++------- .../uDesktopDuplication/Cursor.h | 9 +-- .../uDesktopDuplication/Monitor.cpp | 29 ++++---- .../uDesktopDuplication/Monitor.h | 5 -- .../uDesktopDuplication/MonitorManager.cpp | 6 ++ .../uDesktopDuplication/MonitorManager.h | 3 +- .../uDesktopDuplication/main.cpp | 67 ++++++------------ 10 files changed, 67 insertions(+), 114 deletions(-) diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 0ab42cc4462f26b5c06f49ff08533a4aec67b757..9a80636d957fc22d220b9898cb7bc8c465547a48 100644 GIT binary patch delta 34045 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 QA5C{{!gl;+TyM?)16QdrBme*a delta 33804 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 z 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 + GetMonitorManager()->SetCursorMonitorId(monitor->GetId()); } x_ = frameInfo.PointerPosition.Position.x; y_ = frameInfo.PointerPosition.Position.y; timestamp_ = frameInfo.LastMouseUpdateTime; - if (!IsCursorOnParentMonitor()) - { - return; - } - if (frameInfo.PointerShapeBufferSize == 0) { return; @@ -55,7 +49,7 @@ void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) // Get mouse pointer information UINT bufferSize; DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo; - const auto hr = monitor_->GetDeskDupl()->GetFramePointerShape( + const auto hr = monitor->GetDeskDupl()->GetFramePointerShape( apiBuffer_.Size(), apiBuffer_.Get(), &bufferSize, @@ -72,15 +66,10 @@ void Cursor::UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) } -void Cursor::UpdateTexture() +void Cursor::Draw(Monitor* monitor) { - if (!IsCursorOnParentMonitor()) - { - return; - } - // Check desktop texure - if (monitor_->GetUnityTexture() == nullptr) + if (monitor->GetUnityTexture() == nullptr) { Debug::Error("Cursor::UpdateTexture() => Monitor::GetUnityTexture() is null."); return; @@ -107,15 +96,15 @@ void Cursor::UpdateTexture() // Calculate information to capture desktop image under cursor. D3D11_BOX box; - const auto monitorRot = static_cast(monitor_->GetRotation()); + const auto monitorRot = static_cast(monitor->GetRotation()); auto colMin = 0; auto colMax = cursorImageWidth; auto rowMin = 0; auto rowMax = cursorImageHeight; { - const auto monitorWidth = monitor_->GetWidth(); - const auto monitorHeight = monitor_->GetHeight(); + const auto monitorWidth = monitor->GetWidth(); + const auto monitorHeight = monitor->GetHeight(); const auto isVertical = monitorRot == DXGI_MODE_ROTATION_ROTATE90 || monitorRot == DXGI_MODE_ROTATION_ROTATE270; @@ -230,7 +219,7 @@ void Cursor::UpdateTexture() { ComPtr context; GetDevice()->GetImmediateContext(&context); - context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, monitor_->GetUnityTexture(), 0, &box); + context->CopySubresourceRegion(texture.Get(), 0, 0, 0, 0, monitor->GetUnityTexture(), 0, &box); } // Get mapped surface @@ -265,6 +254,7 @@ void Cursor::UpdateTexture() return desktop32[col * desktopPitch + (capturedImageHeight - 1 - row)]; case DXGI_MODE_ROTATION_IDENTITY: case DXGI_MODE_ROTATION_UNSPECIFIED: + default: return desktop32[row * desktopPitch + col]; } }; @@ -389,7 +379,7 @@ void Cursor::UpdateTexture() { ComPtr context; GetDevice()->GetImmediateContext(&context); - context->UpdateSubresource(monitor_->GetUnityTexture(), 0, &box, bgraBuffer_.Get(), GetWidth() * 4, 0); + context->UpdateSubresource(monitor->GetUnityTexture(), 0, &box, bgraBuffer_.Get(), GetWidth() * 4, 0); } if (FAILED(surface->Unmap())) @@ -474,10 +464,4 @@ int Cursor::GetPitch() const int Cursor::GetType() const { return shapeInfo_.Type; -} - - -bool Cursor::IsCursorOnParentMonitor() const -{ - return GetMonitorManager()->GetCursorMonitorId() == monitor_->GetId(); } \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h index c35372a..2ab9dbe 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Cursor.h @@ -10,10 +10,10 @@ class Monitor; class Cursor { public: - explicit Cursor(Monitor* monitor); + explicit Cursor(); ~Cursor(); - void UpdateBuffer(const DXGI_OUTDUPL_FRAME_INFO& frameInfo); - void UpdateTexture(); + void UpdateBuffer(Monitor* monitor, const DXGI_OUTDUPL_FRAME_INFO& frameInfo); + void Draw(Monitor* monitor); void GetTexture(ID3D11Texture2D* texture); bool IsVisible() const; @@ -25,9 +25,6 @@ public: int GetType() const; private: - bool IsCursorOnParentMonitor() const; - - Monitor* monitor_; bool isVisible_ = false; int x_ = -1; int y_ = -1; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index 6aa18bf..8278cf2 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -10,7 +10,6 @@ using namespace Microsoft::WRL; Monitor::Monitor(int id) : id_(id) - , cursor_(std::make_unique(this)) { } @@ -197,7 +196,16 @@ void Monitor::Render(UINT timeout) } UpdateMetadata(frameInfo); - UpdateCursor(frameInfo); + + if (frameInfo.PointerPosition.Visible) + { + GetMonitorManager()->SetCursorMonitorId(id_); + } + + if (GetMonitorManager()->GetCursorMonitorId() == id_) + { + UpdateCursor(frameInfo); + } hr = deskDupl_->ReleaseFrame(); if (FAILED(hr)) @@ -229,8 +237,9 @@ void Monitor::Render(UINT timeout) void Monitor::UpdateCursor(const DXGI_OUTDUPL_FRAME_INFO& frameInfo) { - cursor_->UpdateBuffer(frameInfo); - cursor_->UpdateTexture(); + auto cursor_ = GetMonitorManager()->GetCursor(); + cursor_->UpdateBuffer(this, frameInfo); + cursor_->Draw(this); } @@ -360,18 +369,6 @@ IDXGIOutputDuplication* Monitor::GetDeskDupl() } -const std::unique_ptr& Monitor::GetCursor() -{ - return cursor_; -} - - -void Monitor::GetCursorTexture(ID3D11Texture2D* texture) -{ - cursor_->GetTexture(texture); -} - - void Monitor::GetName(char* buf, int len) const { strcpy_s(buf, len, monitorInfo_.szDevice); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h index e1bc4d0..3c7c01e 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h @@ -6,8 +6,6 @@ #include #include "Common.h" -class Cursor; - enum class MonitorState { NotSet = -1, @@ -31,7 +29,6 @@ public: ~Monitor(); void Initialize(IDXGIOutput* output); void Render(UINT timeout = 0); - void GetCursorTexture(ID3D11Texture2D* texture); public: int GetId() const; @@ -50,7 +47,6 @@ public: int GetDpiX() const; int GetDpiY() const; IDXGIOutputDuplication* GetDeskDupl(); - const std::unique_ptr& GetCursor(); int GetMoveRectCount() const; DXGI_OUTDUPL_MOVE_RECT* GetMoveRects() const; int GetDirtyRectCount() const; @@ -66,7 +62,6 @@ private: UINT dpiX_ = -1, dpiY_ = -1; int width_ = -1, height_ = -1; State state_ = State::NotSet; - std::unique_ptr cursor_; IDXGIOutputDuplication* deskDupl_ = nullptr; ID3D11Texture2D* unityTexture_ = nullptr; DXGI_OUTPUT_DESC outputDesc_; diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp index 90102bd..f7a12f8 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.cpp @@ -112,6 +112,12 @@ std::shared_ptr MonitorManager::GetMonitor(int id) const } +std::shared_ptr MonitorManager::GetCursor() const +{ + return cursor_; +} + + void MonitorManager::Update() { if (isReinitializationRequired_) diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h index 34692ee..968f2d5 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/MonitorManager.h @@ -21,6 +21,7 @@ public: void SetCursorMonitorId(int id) { cursorMonitorId_ = id; } int GetCursorMonitorId() const { return cursorMonitorId_; } std::shared_ptr GetMonitor(int id) const; + std::shared_ptr GetCursor() const; private: void Initialize(); @@ -41,7 +42,7 @@ public: private: int timeout_ = 10; std::vector> monitors_; - std::shared_ptr cursor_; + std::shared_ptr cursor_ = std::make_shared(); int cursorMonitorId_ = -1; bool isReinitializationRequired_ = false; }; \ No newline at end of file diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index d039fbb..6b4f667 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -295,83 +295,52 @@ extern "C" return -1; } - UNITY_INTERFACE_EXPORT bool UNITY_INTERFACE_API IsCursorVisible(int id) + UNITY_INTERFACE_EXPORT bool UNITY_INTERFACE_API IsCursorVisible() { if (!g_manager) return false; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->IsVisible(); - } - return false; + return g_manager->GetCursor()->IsVisible(); } - UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorX(int id) + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorX() { if (!g_manager) return -1; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->GetX(); - } - return -1; + return g_manager->GetCursor()->GetX(); } - UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorY(int id) + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorY() { if (!g_manager) return -1; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->GetY(); - } - return -1; + return g_manager->GetCursor()->GetY(); } - UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapeWidth(int id) + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapeWidth() { if (!g_manager) return -1; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->GetWidth(); - } - return -1; + return g_manager->GetCursor()->GetWidth(); } - UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapeHeight(int id) + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapeHeight() { if (!g_manager) return -1; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->GetHeight(); - } - return -1; + return g_manager->GetCursor()->GetHeight(); } - UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapePitch(int id) + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapePitch() { if (!g_manager) return -1; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->GetPitch(); - } - return -1; + return g_manager->GetCursor()->GetPitch(); } - UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapeType(int id) + UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetCursorShapeType() { if (!g_manager) return -1; - if (auto monitor = g_manager->GetMonitor(id)) - { - return monitor->GetCursor()->GetType(); - } - return -1; + return g_manager->GetCursor()->GetType(); } - UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API GetCursorTexture(int id, ID3D11Texture2D* texture) + UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API GetCursorTexture(ID3D11Texture2D* texture) { if (!g_manager) return; - if (auto monitor = g_manager->GetMonitor(id)) - { - monitor->GetCursorTexture(texture); - } + return g_manager->GetCursor()->GetTexture(texture); } UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API SetTexturePtr(int id, void* texture) @@ -391,6 +360,7 @@ extern "C" { return monitor->GetMoveRectCount(); } + return 0; } UNITY_INTERFACE_EXPORT void* UNITY_INTERFACE_API GetMoveRects(int id) @@ -400,6 +370,7 @@ extern "C" { return monitor->GetMoveRects(); } + return nullptr; } UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API GetDirtyRectCount(int id) @@ -409,6 +380,7 @@ extern "C" { return monitor->GetDirtyRectCount(); } + return 0; } UNITY_INTERFACE_EXPORT void* UNITY_INTERFACE_API GetDirtyRects(int id) @@ -418,5 +390,6 @@ extern "C" { return monitor->GetDirtyRects(); } + return nullptr; } } \ No newline at end of file