diff options
Diffstat (limited to 'ports')
-rw-r--r-- | ports/libsimpleservo/api/src/lib.rs | 14 | ||||
-rw-r--r-- | ports/libsimpleservo/capi/src/lib.rs | 59 |
2 files changed, 62 insertions, 11 deletions
diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs index 05a8bf9d32c..468a3b2d331 100644 --- a/ports/libsimpleservo/api/src/lib.rs +++ b/ports/libsimpleservo/api/src/lib.rs @@ -7,7 +7,8 @@ extern crate log; pub mod gl_glue; -pub use servo::script_traits::MouseButton; +pub use servo::embedder_traits::MediaSessionPlaybackState; +pub use servo::script_traits::{MediaSessionActionType, MouseButton}; use getopts::Options; use servo::compositing::windowing::{ @@ -133,7 +134,7 @@ pub trait HostTrait { /// Called when we get the media session metadata/ fn on_media_session_metadata(&self, title: String, artist: String, album: String); /// Called when the media session playback state changes. - fn on_media_session_playback_state_change(&self, state: i32); + fn on_media_session_playback_state_change(&self, state: MediaSessionPlaybackState); /// Called when the media session position state is set. fn on_media_session_set_position_state(&self, duration: f64, position: f64, playback_rate: f64); } @@ -472,9 +473,12 @@ impl ServoGlue { self.process_event(WindowEvent::Keyboard(key_event)) } - pub fn media_session_action(&mut self, action: i32) -> Result<(), &'static str> { + pub fn media_session_action( + &mut self, + action: MediaSessionActionType, + ) -> Result<(), &'static str> { info!("Media session action {:?}", action); - self.process_event(WindowEvent::MediaSessionAction(action.into())) + self.process_event(WindowEvent::MediaSessionAction(action)) } fn process_event(&mut self, event: WindowEvent) -> Result<(), &'static str> { @@ -595,7 +599,7 @@ impl ServoGlue { MediaSessionEvent::PlaybackStateChange(state) => self .callbacks .host_callbacks - .on_media_session_playback_state_change(state as i32), + .on_media_session_playback_state_change(state), MediaSessionEvent::SetPositionState(position_state) => self .callbacks .host_callbacks diff --git a/ports/libsimpleservo/capi/src/lib.rs b/ports/libsimpleservo/capi/src/lib.rs index 26c2046df88..73bdb2de77c 100644 --- a/ports/libsimpleservo/capi/src/lib.rs +++ b/ports/libsimpleservo/capi/src/lib.rs @@ -17,7 +17,8 @@ use env_logger; use log::LevelFilter; use simpleservo::{self, gl_glue, ServoGlue, SERVO}; use simpleservo::{ - Coordinates, EventLoopWaker, HostTrait, InitOptions, MouseButton, VRInitOptions, + Coordinates, EventLoopWaker, HostTrait, InitOptions, MediaSessionActionType, + MediaSessionPlaybackState, MouseButton, VRInitOptions, }; use std::ffi::{CStr, CString}; #[cfg(target_os = "windows")] @@ -218,7 +219,7 @@ pub struct CHostCallbacks { pub set_clipboard_contents: extern "C" fn(contents: *const c_char), pub on_media_session_metadata: extern "C" fn(title: *const c_char, album: *const c_char, artist: *const c_char), - pub on_media_session_playback_state_change: extern "C" fn(state: i32), + pub on_media_session_playback_state_change: extern "C" fn(state: CMediaSessionPlaybackState), pub on_media_session_set_position_state: extern "C" fn(duration: f64, position: f64, playback_rate: f64), } @@ -254,6 +255,52 @@ impl CMouseButton { } } +#[repr(C)] +pub enum CMediaSessionPlaybackState { + None = 1, + Playing, + Paused, +} + +impl From<MediaSessionPlaybackState> for CMediaSessionPlaybackState { + fn from(state: MediaSessionPlaybackState) -> Self { + match state { + MediaSessionPlaybackState::None_ => CMediaSessionPlaybackState::None, + MediaSessionPlaybackState::Playing => CMediaSessionPlaybackState::Playing, + MediaSessionPlaybackState::Paused => CMediaSessionPlaybackState::Paused, + } + } +} + +#[repr(C)] +pub enum CMediaSessionActionType { + Play = 1, + Pause, + SeekBackward, + SeekForward, + PreviousTrack, + NextTrack, + SkipAd, + Stop, + SeekTo, +} + +impl CMediaSessionActionType { + pub fn convert(&self) -> MediaSessionActionType { + match self { + CMediaSessionActionType::Play => MediaSessionActionType::Play, + CMediaSessionActionType::Pause => MediaSessionActionType::Pause, + CMediaSessionActionType::SeekBackward => MediaSessionActionType::SeekBackward, + CMediaSessionActionType::SeekForward => MediaSessionActionType::SeekForward, + CMediaSessionActionType::PreviousTrack => MediaSessionActionType::PreviousTrack, + CMediaSessionActionType::NextTrack => MediaSessionActionType::NextTrack, + CMediaSessionActionType::SkipAd => MediaSessionActionType::SkipAd, + CMediaSessionActionType::Stop => MediaSessionActionType::Stop, + CMediaSessionActionType::SeekTo => MediaSessionActionType::SeekTo, + } + } +} + /// The returned string is not freed. This will leak. #[no_mangle] pub extern "C" fn servo_version() -> *const c_char { @@ -608,10 +655,10 @@ pub extern "C" fn click(x: f32, y: f32) { } #[no_mangle] -pub extern "C" fn media_session_action(action: i32) { +pub extern "C" fn media_session_action(action: CMediaSessionActionType) { catch_any_panic(|| { debug!("media_session_action"); - call(|s| s.media_session_action(action)); + call(|s| s.media_session_action(action.convert())); }); } @@ -733,9 +780,9 @@ impl HostTrait for HostCallbacks { (self.0.on_media_session_metadata)(title.as_ptr(), artist.as_ptr(), album.as_ptr()); } - fn on_media_session_playback_state_change(&self, state: i32) { + fn on_media_session_playback_state_change(&self, state: MediaSessionPlaybackState) { debug!("on_media_session_playback_state_change {:?}", state); - (self.0.on_media_session_playback_state_change)(state); + (self.0.on_media_session_playback_state_change)(state.into()); } fn on_media_session_set_position_state( |