mirror of
https://github.com/Xevion/rust-sdl2-emscripten.git
synced 2025-12-06 01:16:14 -06:00
Add localStorage accessor for storing/retrieving volume between sessions, script execution
This commit is contained in:
54
src/store.rs
Normal file
54
src/store.rs
Normal file
@@ -0,0 +1,54 @@
|
||||
pub struct Store;
|
||||
|
||||
#[cfg(not(target_os = "emscripten"))]
|
||||
impl Store {
|
||||
pub fn volume(&self) -> Option<u32> {
|
||||
None
|
||||
}
|
||||
|
||||
pub fn set_volume(&self, volume: u32) {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "emscripten")]
|
||||
extern "C" {
|
||||
pub fn emscripten_run_script(script: *const libc::c_char);
|
||||
pub fn emscripten_run_script_string(script: *const libc::c_char) -> *mut libc::c_char;
|
||||
}
|
||||
|
||||
#[cfg(target_os = "emscripten")]
|
||||
impl Store {
|
||||
fn run_script(script: &str) {
|
||||
use std::ffi::CString;
|
||||
|
||||
let script = CString::new(script).unwrap();
|
||||
unsafe {
|
||||
emscripten_run_script(script.as_ptr());
|
||||
}
|
||||
}
|
||||
|
||||
fn run_script_string(script: &str) -> String {
|
||||
use std::ffi::{CStr, CString};
|
||||
|
||||
let script = CString::new(script).unwrap();
|
||||
unsafe {
|
||||
let ptr = emscripten_run_script_string(script.as_ptr());
|
||||
let c_str = CStr::from_ptr(ptr);
|
||||
String::from(c_str.to_str().unwrap())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn volume(&self) -> Option<u32> {
|
||||
// Use local storage to try and read volume
|
||||
let script = "localStorage.getItem('volume')";
|
||||
let response = Store::run_script_string(&script);
|
||||
response.parse::<u32>().ok()
|
||||
}
|
||||
|
||||
pub fn set_volume(&self, volume: u32) {
|
||||
// Use local storage to set volume
|
||||
let script = format!("localStorage.setItem('volume', '{}')", volume);
|
||||
Store::run_script_string(&script);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user