diff --git a/locales/en.ftl b/locales/en.ftl index c5c7e87..ee9921a 100644 --- a/locales/en.ftl +++ b/locales/en.ftl @@ -63,6 +63,9 @@ blue-recorder = Blue Recorder # Copy right copy-right = © 2021 Salem Yaslem +# Close error dialog +close-error-dialog = Close + # Run command label default-command = Default command: @@ -78,15 +81,18 @@ delay-title = Start Recording in… # Stop delay timer delay-window-stop = Stop -# About message -dialog-comment = A simple screen recorder for Linux desktop. Supports Wayland & Xorg. - # Details button details-button = Details +# About message +dialog-comment = A simple screen recorder for Linux desktop. Supports Wayland & Xorg. + # Run command input enter-command = Enter your command here.. +# Error dialog +error-dialog = Error + # Frames label file-name = Default filename: diff --git a/src/ffmpeg_interface.rs b/src/ffmpeg_interface.rs index 860d2d5..381c2d3 100644 --- a/src/ffmpeg_interface.rs +++ b/src/ffmpeg_interface.rs @@ -17,6 +17,7 @@ use std::thread::sleep; use std::time::Duration; use subprocess::Exec; use filename::Filename; +use std::io::{Error, ErrorKind}; #[derive(Clone)] pub struct Ffmpeg { @@ -45,7 +46,7 @@ pub struct Ffmpeg { } impl Ffmpeg { - pub fn start_record(&mut self, x: u16, y: u16, width: u16, height: u16) -> Option<()> { + pub fn start_record(&mut self, x: u16, y: u16, width: u16, height: u16) -> Result<(), Error> { self.saved_filename = Some( self.filename .0 @@ -83,7 +84,7 @@ impl Ffmpeg { message_dialog.close(); if answer != ResponseType::Yes { - return None; + return Err(Error::new(ErrorKind::Interrupted, "failed to overwrite file")); } } @@ -247,8 +248,7 @@ impl Ffmpeg { } }, )) { - println!("failed to start recording"); - return None; + return Err(Error::new(ErrorKind::Interrupted,"failed to start recording")); } } @@ -265,7 +265,7 @@ impl Ffmpeg { self.audio_process = Some(Rc::new(RefCell::new(ffmpeg_command.spawn().unwrap()))); } - Some(()) + Ok(()) } pub fn stop_record(&mut self) { diff --git a/src/main.rs b/src/main.rs index d0be7d4..2efbce7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,6 +11,7 @@ mod utils; use ffmpeg_interface::Ffmpeg; use gtk::glib; use gtk::prelude::*; +use gtk::TextBuffer; use gtk::{ AboutDialog, Application, Builder, Button, CheckButton, ComboBoxText, CssProvider, Entry, FileChooserAction, FileChooserNative, Image, Label, MessageDialog, SpinButton, @@ -18,6 +19,7 @@ use gtk::{ }; use utils::{get_bundle, is_wayland}; use std::cell::RefCell; +use std::io::ErrorKind; use std::ops::Add; use std::path::Path; use std::rc::Rc; @@ -597,14 +599,22 @@ pub fn build_ui(application: &Application) { ); } else if _delay_spin.value() as u64 == 0 { let _area_capture = area_capture.borrow_mut(); - match _ffmpeg_record_interface.borrow_mut().start_record( + let start_record = _ffmpeg_record_interface.borrow_mut().start_record( _area_capture.x, _area_capture.y, _area_capture.width, _area_capture.height, - ) { - None => { - // Do nothing if the start_record function return nothing + ); + match start_record { + Err(ref error) => { + if error.kind() == ErrorKind::Interrupted { + // Do nothing if the start_record function interrupted + } else { + error_dialog_label.set_label(&get_bundle("start-error", None)); + let text_buffer = TextBuffer::new(None); + text_buffer.set_text(&error.to_string()); + error_message.set_buffer(Some(&text_buffer)); + } } _ => { start_timer(record_time_label.clone()); @@ -645,6 +655,11 @@ pub fn build_ui(application: &Application) { _ffmpeg_record_interface.borrow_mut().clone().play_record(); }); + // Error Dialog + error_dialog.set_title(Some(&get_bundle("error-dialog", None))); + error_dialog_button.set_label(&get_bundle("close-error-dialog", None)); + error_expander_label.set_label(&get_bundle("details-button", None)); + // About Dialog let mut about_icon_path = { let mut current_exec_dir = std::env::current_exe().unwrap();