diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index bcbd39559..f332f31dd 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -434,7 +434,7 @@ class _RemoteToolbarState extends State<RemoteToolbar> { toolbarItems.add(_ChatMenu(id: widget.id, ffi: widget.ffi)); toolbarItems.add(_VoiceCallMenu(id: widget.id, ffi: widget.ffi)); } - toolbarItems.add(_RecordMenu()); + toolbarItems.add(_RecordMenu(ffi: widget.ffi)); toolbarItems.add(_CloseMenu(id: widget.id, ffi: widget.ffi)); return Column( mainAxisSize: MainAxisSize.min, @@ -1219,11 +1219,12 @@ class _ResolutionsMenuState extends State<_ResolutionsMenu> { } for (final r in resolutions) { - if (r.width == _localResolution!.width && r.height == _localResolution!.height) { + if (r.width == _localResolution!.width && + r.height == _localResolution!.height) { return r; } } - + return null; } @@ -1467,16 +1468,17 @@ class _VoiceCallMenu extends StatelessWidget { } class _RecordMenu extends StatelessWidget { - const _RecordMenu({Key? key}) : super(key: key); + final FFI ffi; + const _RecordMenu({Key? key, required this.ffi}) : super(key: key); @override Widget build(BuildContext context) { - var ffi = Provider.of<FfiModel>(context); + var ffiModel = Provider.of<FfiModel>(context); var recordingModel = Provider.of<RecordingModel>(context); final visible = - recordingModel.start || ffi.permissions['recording'] != false; + recordingModel.start || ffiModel.permissions['recording'] != false; if (!visible) return Offstage(); - return _IconMenuButton( + final menuButton = _IconMenuButton( assetName: 'assets/rec.svg', tooltip: recordingModel.start ? 'Stop session recording' @@ -1489,6 +1491,14 @@ class _RecordMenu extends StatelessWidget { ? _ToolbarTheme.hoverRedColor : _ToolbarTheme.hoverBlueColor, ); + return ChangeNotifierProvider.value( + value: ffi.qualityMonitorModel, + child: Consumer<QualityMonitorModel>( + builder: (context, model, child) => Offstage( + // If already started, AV1->Hidden/Stop, Other->Start, same as actual + offstage: model.data.codecFormat == 'AV1', + child: menuButton, + ))); } } diff --git a/libs/scrap/src/common/record.rs b/libs/scrap/src/common/record.rs index 9de70ae14..2893cbf18 100644 --- a/libs/scrap/src/common/record.rs +++ b/libs/scrap/src/common/record.rs @@ -101,6 +101,9 @@ impl DerefMut for Recorder { impl Recorder { pub fn new(mut ctx: RecorderContext) -> ResultType<Self> { + if ctx.format == CodecFormat::AV1 { + bail!("not support av1 recording"); + } ctx.set_filename()?; let recorder = match ctx.format { CodecFormat::VP8 | CodecFormat::VP9 => Recorder { diff --git a/src/ui/header.tis b/src/ui/header.tis index 22b3ba1d0..52b2a7f07 100644 --- a/src/ui/header.tis +++ b/src/ui/header.tis @@ -144,7 +144,7 @@ class Header: Reactor.Component { <span #action>{svg_action}</span> <span #display>{svg_display}</span> <span #keyboard>{svg_keyboard}</span> - {recording_enabled ? <span #recording>{recording ? svg_recording_on : svg_recording_off}</span> : ""} + {recording_enabled && qualityMonitorData[4] != "AV1" ? <span #recording>{recording ? svg_recording_on : svg_recording_off}</span> : ""} {this.renderKeyboardPop()} {this.renderDisplayPop()} {this.renderActionPop()} diff --git a/src/ui/remote.tis b/src/ui/remote.tis index 5c828689d..2ed436833 100644 --- a/src/ui/remote.tis +++ b/src/ui/remote.tis @@ -522,6 +522,7 @@ handler.updateQualityStatus = function(speed, fps, delay, bitrate, codec_format) bitrate ? qualityMonitorData[3] = bitrate:null; codec_format ? qualityMonitorData[4] = codec_format:null; qualityMonitor.update(); + if (codec_format) header.update(); } handler.setPermission = function(name, enabled) {