|
@@ -137,58 +137,6 @@ struct winrt_capture {
|
|
BOOL active;
|
|
BOOL active;
|
|
struct winrt_capture *next;
|
|
struct winrt_capture *next;
|
|
|
|
|
|
- void draw_cursor()
|
|
|
|
- {
|
|
|
|
- CURSORINFO ci{};
|
|
|
|
- ci.cbSize = sizeof(CURSORINFO);
|
|
|
|
- if (!GetCursorInfo(&ci))
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- if (!(ci.flags & CURSOR_SHOWING))
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- HICON icon = CopyIcon(ci.hCursor);
|
|
|
|
- if (!icon)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- ICONINFO ii;
|
|
|
|
- if (GetIconInfo(icon, &ii)) {
|
|
|
|
- POINT win_pos{};
|
|
|
|
- if (window) {
|
|
|
|
- if (client_area) {
|
|
|
|
- ClientToScreen(window, &win_pos);
|
|
|
|
- } else {
|
|
|
|
- RECT window_rect;
|
|
|
|
- if (DwmGetWindowAttribute(
|
|
|
|
- window,
|
|
|
|
- DWMWA_EXTENDED_FRAME_BOUNDS,
|
|
|
|
- &window_rect,
|
|
|
|
- sizeof(window_rect)) ==
|
|
|
|
- S_OK) {
|
|
|
|
- win_pos.x = window_rect.left;
|
|
|
|
- win_pos.y = window_rect.top;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- POINT pos;
|
|
|
|
- pos.x = ci.ptScreenPos.x - (int)ii.xHotspot - win_pos.x;
|
|
|
|
- pos.y = ci.ptScreenPos.y - (int)ii.yHotspot - win_pos.y;
|
|
|
|
-
|
|
|
|
- HDC hdc = (HDC)gs_texture_get_dc(texture);
|
|
|
|
-
|
|
|
|
- DrawIconEx(hdc, pos.x, pos.y, icon, 0, 0, 0, NULL,
|
|
|
|
- DI_NORMAL);
|
|
|
|
-
|
|
|
|
- gs_texture_release_dc(texture);
|
|
|
|
-
|
|
|
|
- DeleteObject(ii.hbmColor);
|
|
|
|
- DeleteObject(ii.hbmMask);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- DestroyIcon(icon);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
void on_closed(
|
|
void on_closed(
|
|
winrt::Windows::Graphics::Capture::GraphicsCaptureItem const &,
|
|
winrt::Windows::Graphics::Capture::GraphicsCaptureItem const &,
|
|
winrt::Windows::Foundation::IInspectable const &)
|
|
winrt::Windows::Foundation::IInspectable const &)
|
|
@@ -256,10 +204,6 @@ struct winrt_capture {
|
|
frame_surface.get());
|
|
frame_surface.get());
|
|
}
|
|
}
|
|
|
|
|
|
- if (capture_cursor && cursor_visible) {
|
|
|
|
- draw_cursor();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
texture_written = true;
|
|
texture_written = true;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -342,9 +286,9 @@ static void winrt_capture_device_loss_rebuild(void *device_void, void *data)
|
|
const winrt::Windows::Graphics::Capture::GraphicsCaptureSession session =
|
|
const winrt::Windows::Graphics::Capture::GraphicsCaptureSession session =
|
|
frame_pool.CreateCaptureSession(item);
|
|
frame_pool.CreateCaptureSession(item);
|
|
|
|
|
|
- /* disable cursor capture if possible since ours performs better */
|
|
|
|
if (winrt_capture_cursor_toggle_supported())
|
|
if (winrt_capture_cursor_toggle_supported())
|
|
- session.IsCursorCaptureEnabled(false);
|
|
|
|
|
|
+ session.IsCursorCaptureEnabled(capture->capture_cursor &&
|
|
|
|
+ capture->cursor_visible);
|
|
|
|
|
|
capture->item = item;
|
|
capture->item = item;
|
|
capture->device = device;
|
|
capture->device = device;
|
|
@@ -425,12 +369,13 @@ try {
|
|
const BOOL cursor_toggle_supported =
|
|
const BOOL cursor_toggle_supported =
|
|
winrt_capture_cursor_toggle_supported();
|
|
winrt_capture_cursor_toggle_supported();
|
|
if (cursor_toggle_supported)
|
|
if (cursor_toggle_supported)
|
|
- session.IsCursorCaptureEnabled(false);
|
|
|
|
|
|
+ session.IsCursorCaptureEnabled(cursor);
|
|
|
|
|
|
struct winrt_capture *capture = new winrt_capture{};
|
|
struct winrt_capture *capture = new winrt_capture{};
|
|
capture->window = window;
|
|
capture->window = window;
|
|
capture->client_area = client_area;
|
|
capture->client_area = client_area;
|
|
capture->capture_cursor = cursor && cursor_toggle_supported;
|
|
capture->capture_cursor = cursor && cursor_toggle_supported;
|
|
|
|
+ capture->cursor_visible = cursor;
|
|
capture->item = item;
|
|
capture->item = item;
|
|
capture->device = device;
|
|
capture->device = device;
|
|
d3d_device->GetImmediateContext(&capture->context);
|
|
d3d_device->GetImmediateContext(&capture->context);
|
|
@@ -523,7 +468,12 @@ extern "C" EXPORT BOOL winrt_capture_active(const struct winrt_capture *capture)
|
|
extern "C" EXPORT void winrt_capture_show_cursor(struct winrt_capture *capture,
|
|
extern "C" EXPORT void winrt_capture_show_cursor(struct winrt_capture *capture,
|
|
BOOL visible)
|
|
BOOL visible)
|
|
{
|
|
{
|
|
- capture->cursor_visible = visible;
|
|
|
|
|
|
+ if (capture->capture_cursor) {
|
|
|
|
+ if (capture->cursor_visible != visible) {
|
|
|
|
+ capture->session.IsCursorCaptureEnabled(visible);
|
|
|
|
+ capture->cursor_visible = visible;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
extern "C" EXPORT void winrt_capture_render(struct winrt_capture *capture,
|
|
extern "C" EXPORT void winrt_capture_render(struct winrt_capture *capture,
|