From d3b9d8a4516a985a78d8a081a764aacabd8e3b6d Mon Sep 17 00:00:00 2001 From: Lord-McSweeney Date: Sat, 25 Nov 2023 14:40:38 -0800 Subject: [PATCH] dekstop: Support `quit` and `fullscreen` fscommands --- desktop/src/backends.rs | 2 ++ desktop/src/backends/fscommand.rs | 33 +++++++++++++++++++++++++++++++ desktop/src/player.rs | 8 ++++++-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 desktop/src/backends/fscommand.rs diff --git a/desktop/src/backends.rs b/desktop/src/backends.rs index 66e4bc87e..d81793337 100644 --- a/desktop/src/backends.rs +++ b/desktop/src/backends.rs @@ -1,11 +1,13 @@ mod audio; mod external_interface; +mod fscommand; mod navigator; mod storage; mod ui; pub use audio::CpalAudioBackend; pub use external_interface::DesktopExternalInterfaceProvider; +pub use fscommand::DesktopFSCommandProvider; pub use navigator::ExternalNavigatorBackend; pub use storage::DiskStorageBackend; pub use ui::DesktopUiBackend; diff --git a/desktop/src/backends/fscommand.rs b/desktop/src/backends/fscommand.rs new file mode 100644 index 000000000..c06361b54 --- /dev/null +++ b/desktop/src/backends/fscommand.rs @@ -0,0 +1,33 @@ +use crate::custom_event::RuffleEvent; + +use ruffle_core::external::FsCommandProvider; +use std::rc::Rc; +use winit::event_loop::EventLoopProxy; +use winit::window::{Fullscreen, Window}; + +pub struct DesktopFSCommandProvider { + pub event_loop: EventLoopProxy, + pub window: Rc, +} + +impl FsCommandProvider for DesktopFSCommandProvider { + fn on_fs_command(&self, command: &str, args: &str) -> bool { + match command { + "quit" => { + let _ = self.event_loop.send_event(RuffleEvent::ExitRequested); + } + "fullscreen" => { + match args { + "true" => self + .window + .set_fullscreen(Some(Fullscreen::Borderless(None))), + "false" => self.window.set_fullscreen(None), + _ => {} + }; + } + _ => return false, + }; + + true + } +} diff --git a/desktop/src/player.rs b/desktop/src/player.rs index a0d5c3200..c40e0ae1d 100644 --- a/desktop/src/player.rs +++ b/desktop/src/player.rs @@ -1,6 +1,6 @@ use crate::backends::{ - CpalAudioBackend, DesktopExternalInterfaceProvider, DesktopUiBackend, DiskStorageBackend, - ExternalNavigatorBackend, + CpalAudioBackend, DesktopExternalInterfaceProvider, DesktopFSCommandProvider, DesktopUiBackend, + DiskStorageBackend, ExternalNavigatorBackend, }; use crate::cli::Opt; use crate::custom_event::RuffleEvent; @@ -143,6 +143,10 @@ impl ActivePlayer { .with_navigator(navigator) .with_renderer(renderer) .with_storage(DiskStorageBackend::new().expect("Couldn't create storage backend")) + .with_fs_commands(Box::new(DesktopFSCommandProvider { + event_loop: event_loop.clone(), + window: window.clone(), + })) .with_ui( DesktopUiBackend::new(window.clone(), opt.open_url_mode) .expect("Couldn't create ui backend"),