From e74f155cb680f0bdacb95491c7b5794aac54e1eb Mon Sep 17 00:00:00 2001 From: 21pages Date: Wed, 21 Sep 2022 16:03:08 +0800 Subject: [PATCH] fix recording start stop Signed-off-by: 21pages --- Cargo.lock | 2 +- flutter/lib/desktop/pages/remote_page.dart | 1 + .../lib/desktop/widgets/remote_menubar.dart | 4 +-- flutter/lib/models/model.dart | 32 ++++++++++--------- libs/scrap/src/common/record.rs | 2 -- src/flutter.rs | 4 +-- src/ui/header.tis | 7 ++-- src/ui/remote.tis | 5 ++- 8 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c43bccbbe..60852eba1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2444,7 +2444,7 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hwcodec" version = "0.1.0" -source = "git+https://github.com/21pages/hwcodec#097a476a0ee249e28d99573899ed4c9c0c01f884" +source = "git+https://github.com/21pages/hwcodec#1f03d203eca24dc976c21a47228f3bc31484c2bc" dependencies = [ "bindgen", "cc", diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 1225e5a66..4c13f4cde 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -118,6 +118,7 @@ class _RemotePageState extends State void dispose() { debugPrint("REMOTE PAGE dispose ${widget.id}"); _ffi.dialogManager.hideMobileActionsOverlay(); + _ffi.recordingModel.onClose(); _rawKeyFocusNode.dispose(); _ffi.close(); _timer?.cancel(); diff --git a/flutter/lib/desktop/widgets/remote_menubar.dart b/flutter/lib/desktop/widgets/remote_menubar.dart index dd0a0bf05..785471740 100644 --- a/flutter/lib/desktop/widgets/remote_menubar.dart +++ b/flutter/lib/desktop/widgets/remote_menubar.dart @@ -359,9 +359,7 @@ class _RemoteMenubarState extends State { tooltip: value.start ? translate('Stop session recording') : translate('Start session recording'), - onPressed: () async { - await value.toggle(); - }, + onPressed: () => value.toggle(), icon: Icon( value.start ? Icons.pause_circle_filled diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 8bc3e8083..c90b07daf 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -197,13 +197,13 @@ class FfiModel with ChangeNotifier { _display.height = int.parse(evt['height']); if (old != _pi.currentDisplay) { parent.target?.cursorModel.updateDisplayOrigin(_display.x, _display.y); - parent.target?.recordingModel.switchDisplay(); } // remote is mobile, and orientation changed if ((_display.width > _display.height) != oldOrientation) { gFFI.canvasModel.updateViewStyle(); } + parent.target?.recordingModel.onSwitchDisplay(); notifyListeners(); } @@ -979,33 +979,35 @@ class RecordingModel with ChangeNotifier { bool _start = false; get start => _start; - switchDisplay() { + onSwitchDisplay() { if (!isDesktop || !_start) return; var id = parent.target?.id; int? width = parent.target?.canvasModel.getDisplayWidth(); int? height = parent.target?.canvasModel.getDisplayWidth(); if (id == null || width == null || height == null) return; - bind.sessionRecordScreen( - id: id, start: _start, width: width, height: height); + bind.sessionRecordScreen(id: id, start: true, width: width, height: height); } - Future toggle() async { + toggle() { if (!isDesktop) return; var id = parent.target?.id; - int? width = parent.target?.canvasModel.getDisplayWidth(); - int? height = parent.target?.canvasModel.getDisplayWidth(); - if (id == null || width == null || height == null) return; - - await bind.sessionRecordScreen( - id: id, start: !_start, width: width, height: height); + if (id == null) return; _start = !_start; notifyListeners(); if (_start) { - Future.delayed(const Duration(milliseconds: 100), () { - bind.sessionRefresh(id: id); - }); + bind.sessionRefresh(id: id); + } else { + bind.sessionRecordScreen(id: id, start: false, width: 0, height: 0); } } + + onClose() { + if (!isDesktop) return; + var id = parent.target?.id; + if (id == null) return; + _start = false; + bind.sessionRecordScreen(id: id, start: false, width: 0, height: 0); + } } /// Mouse button enum. @@ -1174,7 +1176,7 @@ class FFI { Map event = json.decode(message.field0); await cb(event); } catch (e) { - debugPrint('json.decode fail(): $e'); + debugPrint('json.decode fail1(): $e, ${message.field0}'); } } else if (message is Rgba) { imageModel.onRgba(message.field0, tabBarHeight); diff --git a/libs/scrap/src/common/record.rs b/libs/scrap/src/common/record.rs index 836f759c2..e8bbacf02 100644 --- a/libs/scrap/src/common/record.rs +++ b/libs/scrap/src/common/record.rs @@ -298,11 +298,9 @@ impl RecorderApi for HwRecorder { #[cfg(feature = "hwcodec")] impl Drop for HwRecorder { fn drop(&mut self) { - log::info!("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD {}", self.ctx.filename); self.muxer.write_tail().ok(); if !self.written || self.start.elapsed().as_secs() < MIN_SECS { std::fs::remove_file(&self.ctx.filename).ok(); } - log::info!("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD ok"); } } diff --git a/src/flutter.rs b/src/flutter.rs index fea412c23..755e245fe 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -257,7 +257,7 @@ impl InvokeUiSession for FlutterHandler { self.push_event( "switch_display", vec![ - ("display", &display.to_string()), + ("display", &display.display.to_string()), ("x", &display.x.to_string()), ("y", &display.y.to_string()), ("width", &display.width.to_string()), @@ -485,4 +485,4 @@ pub fn make_fd_flutter(id: i32, entries: &Vec, only_count: bool) -> S } m.insert("total_size".into(), json!(n as f64)); serde_json::to_string(&m).unwrap_or("".into()) -} \ No newline at end of file +} diff --git a/src/ui/header.tis b/src/ui/header.tis index a997ce4b3..b8f1bdfd8 100644 --- a/src/ui/header.tis +++ b/src/ui/header.tis @@ -93,7 +93,6 @@ function editOSPassword(login=false) { } var recording = false; -var recording_refresh = false; class Header: Reactor.Component { this var conn_note = ""; @@ -286,10 +285,12 @@ class Header: Reactor.Component { } event click $(span#recording) (_, me) { - handler.record_screen(!recording, display_width, display_height); recording = !recording; header.update(); - if (recording) self.timer(100ms, function() { recording_refresh = true; handler.refresh_video(); }); + if (recording) + handler.refresh_video(); + else + handler.record_screen(false, display_width, display_height); } event click $(#screen) (_, me) { diff --git a/src/ui/remote.tis b/src/ui/remote.tis index 393c83384..dc9d60d54 100644 --- a/src/ui/remote.tis +++ b/src/ui/remote.tis @@ -20,9 +20,7 @@ handler.setDisplay = function(x, y, w, h) { display_origin_x = x; display_origin_y = y; adaptDisplay(); - - if (recording && !recording_refresh) handler.record_screen(true, w, h); - recording_refresh = false; + if (recording) handler.record_screen(true, w, h); } // in case toolbar not shown correclty @@ -470,6 +468,7 @@ function self.closing() { var (x, y, w, h) = view.box(#rectw, #border, #screen); if (is_file_transfer) save_file_transfer_close_state(); if (is_file_transfer || is_port_forward || size_adapted) handler.save_size(x, y, w, h); + if (recording) handler.record_screen(false, display_width, display_height); } var qualityMonitor;