aboutsummaryrefslogtreecommitdiffstats
path: root/ports
diff options
context:
space:
mode:
Diffstat (limited to 'ports')
-rw-r--r--ports/libsimpleservo/api/src/lib.rs14
-rw-r--r--ports/libsimpleservo/capi/src/lib.rs59
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(