Skip to content

fix(macos): #3433 cursor reappears correctly after typing#5107

Open
martona wants to merge 3 commits into
LizardByte:masterfrom
martona:macos-video-pr
Open

fix(macos): #3433 cursor reappears correctly after typing#5107
martona wants to merge 3 commits into
LizardByte:masterfrom
martona:macos-video-pr

Conversation

@martona
Copy link
Copy Markdown
Contributor

@martona martona commented May 13, 2026

Description

Move macOS display capture to ScreenCaptureKit when available, with AVFoundation kept as fallback.

This is a backport of macOS capture work from Lumen, which appears to be an abandoned fork of Sunshine. The old AVFoundation capture path is still present and used if ScreenCaptureKit is unavailable or fails to initialize.

The main benefit is more reliable cursor capture. With the current AVFoundation path, some macOS apps can hide the pointer while typing and Sunshine does not see it reappear until the pointer returns to the Dock. This seems to be an Apple bug in AVFoundation, with ScreenCaptureKit being the most efficient fix.

Other benefits include improving handling for virtual or newly-created displays by refreshing ScreenCaptureKit shareable content when the selected display is not immediately available.

Tested manually on macOS with Moonlight/Sunshine streaming. This fixes the cursor-hidden-until-leaving-window behavior I was seeing with apps that hide the pointer during text input, which is pretty much everything from Terminal to XCode.

Issues Fixed or Closed

Resolves #3433.

Type of Change

  • feat: New feature (non-breaking change which adds functionality)
  • fix: Bug fix (non-breaking change which fixes an issue)
  • docs: Documentation only changes
  • style: Changes that do not affect the meaning of the code (white-space, formatting, missing semicolons, etc.)
  • refactor: Code change that neither fixes a bug nor adds a feature
  • perf: Code change that improves performance
  • test: Adding missing tests or correcting existing tests
  • build: Changes that affect the build system or external dependencies
  • ci: Changes to CI configuration files and scripts
  • chore: Other changes that don't modify src or test files
  • revert: Reverts a previous commit
  • BREAKING CHANGE: Introduces a breaking change (can be combined with any type above)

Checklist

  • Code follows the style guidelines of this project
  • Code has been self-reviewed
  • Code has been commented, particularly in hard-to-understand areas
  • Code docstring/documentation-blocks for new or existing methods/components have been added or updated
  • Unit tests have been added or updated for any new or modified functionality

AI Usage

  • None: No AI tools were used in creating this PR
  • Light: AI provided minor assistance (formatting, simple suggestions)
  • Moderate: AI helped with code generation or debugging specific parts
  • Heavy: AI generated most or all of the code changes

@martona
Copy link
Copy Markdown
Contributor Author

martona commented May 14, 2026

I did one follow-up pass on the ScreenCaptureKit path after testing in macOS VM environments.

Two changes seemed worth folding in:

  1. The stream callback now only accepts complete ScreenCaptureKit frames with usable image data. Previously we could process update notifications that did not actually carry a screen buffer, which was harmless but unnecessary work.

  2. There is now a 60 Hz fallback poll for an on-demand sample when the SCKit stream is idle. In Apple virtualization environments, some visible guest-side updates do not appear to reliably produce stream frames, which could leave Sunshine displaying stale content until a later input or screen event. The poll bounds that delay to roughly one frame interval.

In testing this fixed the delayed-update behavior without measurable CPU impact. The encoder path is already running at the target frame cadence, and the fallback still feeds it a zero-copy sample buffer rather than introducing a software copy path.

@sonarqubecloud
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

macOS 15: The cursor disappears and does not reappear

1 participant