feat: show my cursor (#12745)

Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
fufesou
2025-08-28 15:20:01 +08:00
committed by GitHub
parent ac70f380a6
commit d0e9c6dc57
62 changed files with 1276 additions and 27 deletions

View File

@@ -172,6 +172,7 @@ const kHideUsernameOnCard = "hide-username-on-card";
const String kOptionHideHelpCards = "hide-help-cards";
const String kOptionToggleViewOnly = "view-only";
const String kOptionToggleShowMyCursor = "show-my-cursor";
const String kOptionDisableFloatingWindow = "disable-floating-window";

View File

@@ -1593,6 +1593,7 @@ class _KeyboardMenu extends StatelessWidget {
inputSource(),
Divider(),
viewMode(),
if (pi.platform == kPeerPlatformWindows) showMyCursor(),
Divider(),
...toolbarToggles(),
...mouseSpeed(),
@@ -1749,12 +1750,36 @@ class _KeyboardMenu extends StatelessWidget {
final viewOnly = await bind.sessionGetToggleOption(
sessionId: ffi.sessionId, arg: kOptionToggleViewOnly);
ffiModel.setViewOnly(id, viewOnly ?? value);
final showMyCursor = await bind.sessionGetToggleOption(
sessionId: ffi.sessionId, arg: kOptionToggleShowMyCursor);
ffiModel.setShowMyCursor(showMyCursor ?? value);
}
: null,
ffi: ffi,
child: Text(translate('View Mode')));
}
showMyCursor() {
final ffiModel = ffi.ffiModel;
return CkbMenuButton(
value: ffiModel.showMyCursor,
onChanged: ffiModel.viewOnly
? (value) async {
if (value == null) return;
await bind.sessionToggleOption(
sessionId: ffi.sessionId,
value: kOptionToggleShowMyCursor);
final showMyCursor = await bind.sessionGetToggleOption(
sessionId: ffi.sessionId,
arg: kOptionToggleShowMyCursor);
ffiModel.setShowMyCursor(showMyCursor ?? value);
}
: null,
ffi: ffi,
child: Text(translate('Show my cursor')))
.paddingOnly(left: 26.0);
}
mobileActions() {
if (pi.platform != kPeerPlatformAndroid) return [];
final enabled = versionCmp(pi.version, '1.2.7') >= 0;

View File

@@ -371,6 +371,7 @@ class InputModel {
String get id => parent.target?.id ?? '';
String? get peerPlatform => parent.target?.ffiModel.pi.platform;
bool get isViewOnly => parent.target!.ffiModel.viewOnly;
bool get showMyCursor => parent.target!.ffiModel.showMyCursor;
double get devicePixelRatio => parent.target!.canvasModel.devicePixelRatio;
bool get isViewCamera => parent.target!.connType == ConnType.viewCamera;
int get trackpadSpeed => _trackpadSpeed;
@@ -876,7 +877,7 @@ class InputModel {
void onPointHoverImage(PointerHoverEvent e) {
_stopFling = true;
if (isViewOnly) return;
if (isViewOnly && !showMyCursor) return;
if (e.kind != ui.PointerDeviceKind.mouse) return;
if (!isPhysicalMouse.value) {
isPhysicalMouse.value = true;
@@ -1037,7 +1038,7 @@ class InputModel {
if (isDesktop) _queryOtherWindowCoords = true;
_remoteWindowCoords = [];
_windowRect = null;
if (isViewOnly) return;
if (isViewOnly && !showMyCursor) return;
if (isViewCamera) return;
if (e.kind != ui.PointerDeviceKind.mouse) {
if (isPhysicalMouse.value) {
@@ -1051,7 +1052,7 @@ class InputModel {
void onPointUpImage(PointerUpEvent e) {
if (isDesktop) _queryOtherWindowCoords = false;
if (isViewOnly) return;
if (isViewOnly && !showMyCursor) return;
if (isViewCamera) return;
if (e.kind != ui.PointerDeviceKind.mouse) return;
if (isPhysicalMouse.value) {
@@ -1060,7 +1061,7 @@ class InputModel {
}
void onPointMoveImage(PointerMoveEvent e) {
if (isViewOnly) return;
if (isViewOnly && !showMyCursor) return;
if (isViewCamera) return;
if (e.kind != ui.PointerDeviceKind.mouse) return;
if (_queryOtherWindowCoords) {

View File

@@ -116,6 +116,7 @@ class FfiModel with ChangeNotifier {
Timer? _timer;
var _reconnects = 1;
bool _viewOnly = false;
bool _showMyCursor = false;
WeakReference<FFI> parent;
late final SessionID sessionId;
@@ -154,6 +155,7 @@ class FfiModel with ChangeNotifier {
bool get isPeerMobile => isPeerAndroid;
bool get viewOnly => _viewOnly;
bool get showMyCursor => _showMyCursor;
set inputBlocked(v) {
_inputBlocked = v;
@@ -1144,6 +1146,8 @@ class FfiModel with ChangeNotifier {
peerId,
bind.sessionGetToggleOptionSync(
sessionId: sessionId, arg: kOptionToggleViewOnly));
setShowMyCursor(bind.sessionGetToggleOptionSync(
sessionId: sessionId, arg: kOptionToggleShowMyCursor));
}
if (connType == ConnType.defaultConn || connType == ConnType.viewCamera) {
final platformAdditions = evt['platform_additions'];
@@ -1494,6 +1498,13 @@ class FfiModel with ChangeNotifier {
notifyListeners();
}
}
void setShowMyCursor(bool value) {
if (_showMyCursor != value) {
_showMyCursor = value;
notifyListeners();
}
}
}
class ImageModel with ChangeNotifier {