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
@@ -141,6 +141,7 @@ enum {
|
||||
IDM_AUDIO_TOGGLE, // 音频开关
|
||||
IDM_ENABLE_H264_HARD,
|
||||
IDM_ENABLE_AV1_HARD,
|
||||
IDM_MOUSE_CALIB, // 鼠标坐标校准(逐主机补偿客户端坐标换算偏差)
|
||||
};
|
||||
|
||||
// 状态信息窗口 - 全屏时显示帧率/速度/质量
|
||||
@@ -243,6 +244,13 @@ public:
|
||||
CCursorInfo m_CursorInfo; //自定义的一个系统的光标类
|
||||
VOID SendCommand(const MYMSG* Msg);
|
||||
void SendScaledMouseMessage(MSG* pMsg, bool makeLP);
|
||||
// 鼠标坐标补偿:默认 1.0(不补偿)。用于客户端上报的逻辑分辨率与实际显示不一致
|
||||
// (例如合盖后用外接显示器的 Mac)时,抵消客户端在 OnReceive 里的错误换算。
|
||||
double m_mouseScaleX = 1.0;
|
||||
double m_mouseScaleY = 1.0;
|
||||
bool m_mouseScaleFromConfig = false; // 当前系数来自已保存配置(否则对话框可自动建议)
|
||||
void LoadMouseScale(); // 从配置读取本主机的补偿系数(会校验上报分辨率)
|
||||
void ShowMouseCalibration();// 系统菜单「鼠标坐标校准」入口
|
||||
VOID UpdateServerClipboard(char *szBuffer,ULONG ulLength);
|
||||
VOID SendServerClipboard(void);
|
||||
|
||||
|
||||
Reference in new issue
Block a user