Fix: Align macOS mouse coordinates with the captured display
The macOS client derived its logical screen size from [NSScreen mainScreen] while it captured CGMainDisplayID. In clamshell mode with an external display the former can still report the disabled built-in panel (1470x956) while the captured frame is 1280x1024, so every injected point was scaled by logical/encode and drifted linearly with the distance from the top left corner, independently on each axis. Take the logical size from CGDisplayBounds of the captured display instead, and report the same bounds in the login resolution. For hosts that still run the old client, the remote desktop dialog gains a per-host mouse calibration in its system menu. The factors are stored by client ID together with the reported resolution and the captured frame size, so they stop applying once the client is upgraded or a different display is captured, and come back automatically when the original display returns. When no calibration has been saved the dialog pre-fills the factors from frame/reported, but only for macOS clients, because the other clients derive their conversion from the captured display itself and a mismatching report there would be misleading. Co-Authored-By: deepseek-flash
This commit is contained in:
1 parent
38cd207f5d
commit
3ae6298746
7 files changed
+250
-12
No files matched your search
+10
-8
@@ -88,14 +88,16 @@ bool ScreenHandler::init()
|
||||
m_height = (int)CGDisplayPixelsHigh(m_displayID);
|
||||
}
|
||||
|
||||
// Get logical point dimensions (what CGEvent uses)
|
||||
// NSScreen provides logical dimensions
|
||||
NSScreen* mainScreen = [NSScreen mainScreen];
|
||||
if (mainScreen) {
|
||||
NSRect frame = [mainScreen frame];
|
||||
m_logicalWidth = (int)frame.size.width;
|
||||
m_logicalHeight = (int)frame.size.height;
|
||||
} else {
|
||||
// 逻辑尺寸必须取自「实际抓屏的那块屏」(CGMainDisplayID)。CGEvent 的鼠标坐标是
|
||||
// 全局显示坐标(points),而我们发给服务端的是这块屏的编码像素。
|
||||
// [NSScreen mainScreen] 取的是菜单栏/焦点窗口所在屏:合盖外接显示器时它仍可能是
|
||||
// 已停用的内置屏(例如 13" MacBook Air 的 1470x956),与抓屏的外置屏(1280x1024)
|
||||
// 不是同一块屏。用错尺寸会让每个注入点变成 p * (logical / encode),表现为从左上角
|
||||
// 起线性增长、且 x/y 各轴独立的鼠标偏移(见 ScreenHandler::OnReceive 的换算)。
|
||||
CGRect bounds = CGDisplayBounds(m_displayID);
|
||||
m_logicalWidth = (int)(bounds.size.width + 0.5);
|
||||
m_logicalHeight = (int)(bounds.size.height + 0.5);
|
||||
if (m_logicalWidth <= 0 || m_logicalHeight <= 0) {
|
||||
// Fallback: use physical dimensions
|
||||
m_logicalWidth = m_width;
|
||||
m_logicalHeight = m_height;
|
||||
|
||||
Reference in new issue
Block a user