mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-04-03 22:11:29 +03:00
Merge remote-tracking branch 'github/master' into sigma
This commit is contained in:
@@ -37,7 +37,7 @@ class _MenuButtonState extends State<MenuButton> {
|
||||
message: widget.tooltip,
|
||||
child: Material(
|
||||
type: MaterialType.transparency,
|
||||
child: Ink(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(_borderRadius),
|
||||
color: _isHover ? widget.hoverColor : widget.color,
|
||||
|
||||
@@ -23,6 +23,10 @@ import '../../common/shared_state.dart';
|
||||
import './popup_menu.dart';
|
||||
import './kb_layout_type_chooser.dart';
|
||||
|
||||
const _kKeyLegacyMode = 'legacy';
|
||||
const _kKeyMapMode = 'map';
|
||||
const _kKeyTranslateMode = 'translate';
|
||||
|
||||
class MenubarState {
|
||||
final kStoreKey = 'remoteMenubarState';
|
||||
late RxBool show;
|
||||
@@ -598,6 +602,7 @@ class _ControlMenu extends StatelessWidget {
|
||||
hoverColor: _MenubarTheme.hoverBlueColor,
|
||||
ffi: ffi,
|
||||
menuChildren: [
|
||||
requestElevation(),
|
||||
osPassword(),
|
||||
transferFile(context),
|
||||
tcpTunneling(context),
|
||||
@@ -605,12 +610,22 @@ class _ControlMenu extends StatelessWidget {
|
||||
Divider(),
|
||||
ctrlAltDel(),
|
||||
restart(),
|
||||
insertLock(),
|
||||
blockUserInput(),
|
||||
switchSides(),
|
||||
refresh(),
|
||||
]);
|
||||
}
|
||||
|
||||
requestElevation() {
|
||||
final visible = ffi.elevationModel.showRequestMenu;
|
||||
if (!visible) return Offstage();
|
||||
return _MenuItemButton(
|
||||
child: Text(translate('Request Elevation')),
|
||||
ffi: ffi,
|
||||
onPressed: () => showRequestElevationDialog(id, ffi.dialogManager));
|
||||
}
|
||||
|
||||
osPassword() {
|
||||
return _MenuItemButton(
|
||||
child: Text(translate('OS Password')),
|
||||
@@ -779,6 +794,16 @@ class _ControlMenu extends StatelessWidget {
|
||||
onPressed: () => showRestartRemoteDevice(pi, id, ffi.dialogManager));
|
||||
}
|
||||
|
||||
insertLock() {
|
||||
final perms = ffi.ffiModel.permissions;
|
||||
final visible = perms['keyboard'] != false;
|
||||
if (!visible) return Offstage();
|
||||
return _MenuItemButton(
|
||||
child: Text(translate('Insert Lock')),
|
||||
ffi: ffi,
|
||||
onPressed: () => bind.sessionLockScreen(id: id));
|
||||
}
|
||||
|
||||
blockUserInput() {
|
||||
final perms = ffi.ffiModel.permissions;
|
||||
final pi = ffi.ffiModel.pi;
|
||||
@@ -1092,7 +1117,8 @@ class _DisplayMenuState extends State<_DisplayMenu> {
|
||||
await bind.sessionSetImageQuality(id: widget.id, value: value);
|
||||
}
|
||||
|
||||
return SubmenuButton(
|
||||
return _SubmenuButton(
|
||||
ffi: widget.ffi,
|
||||
child: Text(translate('Image Quality')),
|
||||
menuChildren: [
|
||||
_RadioMenuButton<String>(
|
||||
@@ -1126,7 +1152,7 @@ class _DisplayMenuState extends State<_DisplayMenu> {
|
||||
},
|
||||
ffi: widget.ffi,
|
||||
),
|
||||
].map((e) => _buildPointerTrackWidget(e, widget.ffi)).toList(),
|
||||
],
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -1301,7 +1327,8 @@ class _DisplayMenuState extends State<_DisplayMenu> {
|
||||
bind.sessionChangePreferCodec(id: widget.id);
|
||||
}
|
||||
|
||||
return SubmenuButton(
|
||||
return _SubmenuButton(
|
||||
ffi: widget.ffi,
|
||||
child: Text(translate('Codec')),
|
||||
menuChildren: [
|
||||
_RadioMenuButton<String>(
|
||||
@@ -1332,7 +1359,7 @@ class _DisplayMenuState extends State<_DisplayMenu> {
|
||||
onChanged: onChanged,
|
||||
ffi: widget.ffi,
|
||||
),
|
||||
].map((e) => _buildPointerTrackWidget(e, widget.ffi)).toList());
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1364,7 +1391,8 @@ class _DisplayMenuState extends State<_DisplayMenu> {
|
||||
}
|
||||
}
|
||||
|
||||
return SubmenuButton(
|
||||
return _SubmenuButton(
|
||||
ffi: widget.ffi,
|
||||
menuChildren: resolutions
|
||||
.map((e) => _RadioMenuButton(
|
||||
value: '${e.width}x${e.height}',
|
||||
@@ -1372,8 +1400,6 @@ class _DisplayMenuState extends State<_DisplayMenu> {
|
||||
onChanged: onChanged,
|
||||
ffi: widget.ffi,
|
||||
child: Text('${e.width}x${e.height}')))
|
||||
.toList()
|
||||
.map((e) => _buildPointerTrackWidget(e, widget.ffi))
|
||||
.toList(),
|
||||
child: Text(translate("Resolution")));
|
||||
}
|
||||
@@ -1534,11 +1560,16 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var ffiModel = Provider.of<FfiModel>(context);
|
||||
if (ffiModel.permissions['keyboard'] == false) return Offstage();
|
||||
// Do not support peer 1.1.9.
|
||||
// Do not check permission here?
|
||||
// var ffiModel = Provider.of<FfiModel>(context);
|
||||
// if (ffiModel.permissions['keyboard'] == false) return Offstage();
|
||||
if (stateGlobal.grabKeyboard) {
|
||||
bind.sessionSetKeyboardMode(id: id, value: 'map');
|
||||
if (bind.sessionIsKeyboardModeSupported(id: id, mode: _kKeyMapMode)) {
|
||||
bind.sessionSetKeyboardMode(id: id, value: _kKeyMapMode);
|
||||
} else if (bind.sessionIsKeyboardModeSupported(
|
||||
id: id, mode: _kKeyLegacyMode)) {
|
||||
bind.sessionSetKeyboardMode(id: id, value: _kKeyLegacyMode);
|
||||
}
|
||||
return Offstage();
|
||||
}
|
||||
return _IconSubmenuButton(
|
||||
@@ -1551,13 +1582,13 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
|
||||
mode() {
|
||||
return futureBuilder(future: () async {
|
||||
return await bind.sessionGetKeyboardMode(id: id) ?? 'legacy';
|
||||
return await bind.sessionGetKeyboardMode(id: id) ?? _kKeyLegacyMode;
|
||||
}(), hasData: (data) {
|
||||
final groupValue = data as String;
|
||||
List<KeyboardModeMenu> modes = [
|
||||
KeyboardModeMenu(key: 'legacy', menu: 'Legacy mode'),
|
||||
KeyboardModeMenu(key: 'map', menu: 'Map mode'),
|
||||
KeyboardModeMenu(key: 'translate', menu: 'Translate mode'),
|
||||
KeyboardModeMenu(key: _kKeyLegacyMode, menu: 'Legacy mode'),
|
||||
KeyboardModeMenu(key: _kKeyMapMode, menu: 'Map mode'),
|
||||
KeyboardModeMenu(key: _kKeyTranslateMode, menu: 'Translate mode'),
|
||||
];
|
||||
List<_RadioMenuButton> list = [];
|
||||
onChanged(String? value) async {
|
||||
@@ -1567,13 +1598,13 @@ class _KeyboardMenu extends StatelessWidget {
|
||||
|
||||
for (KeyboardModeMenu mode in modes) {
|
||||
if (bind.sessionIsKeyboardModeSupported(id: id, mode: mode.key)) {
|
||||
if (mode.key == 'translate') {
|
||||
if (mode.key == _kKeyTranslateMode) {
|
||||
if (Platform.isLinux || pi.platform == kPeerPlatformLinux) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
var text = translate(mode.menu);
|
||||
if (mode.key == 'translate') {
|
||||
if (mode.key == _kKeyTranslateMode) {
|
||||
text = '$text beta';
|
||||
}
|
||||
list.add(_RadioMenuButton<String>(
|
||||
@@ -1877,6 +1908,28 @@ class _IconSubmenuButtonState extends State<_IconSubmenuButton> {
|
||||
}
|
||||
}
|
||||
|
||||
class _SubmenuButton extends StatelessWidget {
|
||||
final List<Widget> menuChildren;
|
||||
final Widget? child;
|
||||
final FFI ffi;
|
||||
const _SubmenuButton({
|
||||
Key? key,
|
||||
required this.menuChildren,
|
||||
required this.child,
|
||||
required this.ffi,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SubmenuButton(
|
||||
key: key,
|
||||
child: child,
|
||||
menuChildren:
|
||||
menuChildren.map((e) => _buildPointerTrackWidget(e, ffi)).toList(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _MenuItemButton extends StatelessWidget {
|
||||
final VoidCallback? onPressed;
|
||||
final Widget? trailingIcon;
|
||||
|
||||
@@ -523,12 +523,18 @@ class WindowActionPanelState extends State<WindowActionPanel>
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _setMaximize(bool maximize) {
|
||||
stateGlobal.setMaximize(maximize);
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@override
|
||||
void onWindowMaximize() {
|
||||
// catch maximize from system
|
||||
if (!widget.isMaximized.value) {
|
||||
widget.isMaximized.value = true;
|
||||
}
|
||||
_setMaximize(true);
|
||||
super.onWindowMaximize();
|
||||
}
|
||||
|
||||
@@ -538,6 +544,7 @@ class WindowActionPanelState extends State<WindowActionPanel>
|
||||
if (widget.isMaximized.value) {
|
||||
widget.isMaximized.value = false;
|
||||
}
|
||||
_setMaximize(false);
|
||||
super.onWindowUnmaximize();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user