diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 99a34d0..0e4c6a3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -118,3 +118,22 @@ jobs: run: scripts/build-ohos-example.sh env: OHOS_SDK_HOME: ${{ steps.setup-ohos-sdk.outputs.ohos-base-sdk-home }} + + ci-wasm: + name: Wasm + runs-on: windows-2022 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + - uses: mymindstorm/setup-emsdk@v14 + with: + version: 4.0.9 + actions-cache-folder: emsdk-cache + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + - name: Install + run: | + rustup target add wasm32-unknown-emscripten + - name: Build + run: cd examples/gallery && cargo build --target wasm32-unknown-emscripten --release \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 9502db8..55c8d14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" [dependencies] deft-macros = { path = "packages/deft-macros", version = "0.3.1" } -quick-js = { package = "deft-quick-js", version = "0.6.1"} +quick-js = { package = "deft-quick-js", version = "0.7.0"} yoga = { package = "deft-yoga", version = "0.7.0" } winit = { package = "deft-winit", version = "0.32.1", features = ["android-native-activity", "rwh_06"] } skia-window = { path = "skia-window", version = "0.8.0"} @@ -102,9 +102,9 @@ cfg_aliases = "0.2.1" [target.'cfg(target_env = "ohos")'.build-dependencies] napi-build-ohos = "1.0.4" -[profile.release] -lto = true -opt-level = "z" +#[profile.release] +#lto = true +#opt-level = "z" #[lib] #name = "deft" diff --git a/README.md b/README.md index 2039cdb..9304d79 100644 --- a/README.md +++ b/README.md @@ -70,13 +70,15 @@ apt install build-essential libssl-dev libclang-dev libc++-dev \ Native: ``` -cargo run --example gallery +cd examples/gallery +cargo run ``` Wasm: > Make sure that [Emscripten SDK](https://emscripten.org/docs/getting_started/downloads.html) is installed. ```bash -./scripts/build-wasm.sh --release +cd examples/gallery +cargo build --target wasm32-unknown-emscripten --release python3 -m http.server ``` Visit `http://localhost:8000/web/` to preview. diff --git a/examples/demo.rs b/examples/demo.rs index 481ce69..f6fd1ec 100644 --- a/examples/demo.rs +++ b/examples/demo.rs @@ -2,7 +2,7 @@ use deft::app::{App, IApp}; use deft::bootstrap; use deft::js::js_engine::JsEngine; -use quick_js::loader::{FsJsModuleLoader, JsModuleLoader}; +use quick_js::loader::JsModuleLoader; struct AppImpl {} @@ -21,23 +21,25 @@ impl IApp for AppImpl { fn create_module_loader(&mut self) -> Box { use deft::loader::StaticModuleLoader; let mut ml = StaticModuleLoader::new(); - ml.add_module("index.js".to_string(), include_str!("./demo-js/index.js").to_owned()); + ml.add_module( + "index.js".to_string(), + include_str!("./demo-js/index.js").to_owned(), + ); Box::new(ml) } } fn bootstrap_app() { - env_logger::init(); let app = App::new(AppImpl {}); bootstrap(app); } #[cfg(not(target_arch = "wasm32"))] fn main() { + env_logger::init(); bootstrap_app(); } - #[cfg(target_os = "emscripten")] pub fn main() { // Do nothing @@ -46,5 +48,7 @@ pub fn main() { #[cfg(target_os = "emscripten")] #[no_mangle] pub extern "C" fn asm_main() { + use deft::log::SimpleLogger; + SimpleLogger::init_with_max_level(log::LevelFilter::Info); bootstrap_app(); -} \ No newline at end of file +} diff --git a/examples/gallery/Cargo.toml b/examples/gallery/Cargo.toml new file mode 100644 index 0000000..08de744 --- /dev/null +++ b/examples/gallery/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "gallery" +version = "0.1.0" +edition = "2024" + +[dependencies] +deft = { path = "../..", default-features = false} +env_logger = "0.11.8" +log = "0.4.27" + +[build-dependencies] +cfg_aliases = "0.2.1" \ No newline at end of file diff --git a/examples/gallery/build.rs b/examples/gallery/build.rs new file mode 100644 index 0000000..0a84b53 --- /dev/null +++ b/examples/gallery/build.rs @@ -0,0 +1,17 @@ +use cfg_aliases::cfg_aliases; +fn main() { + println!("cargo:rustc-env=EMCC_CFLAGS=-s MAX_WEBGL_VERSION=2 -s MODULARIZE=1 -s EXPORT_NAME=loadDeftApp -s EXPORTED_RUNTIME_METHODS=GL,cwrap"); + println!("cargo:rerun-if-changed=build.rs"); + + cfg_aliases! { + // Systems. + web_platform: { all(target_family = "wasm", target_os = "unknown") }, + emscripten_platform: { all(target_family = "wasm", target_os = "emscripten") }, + macos_platform: { target_os = "macos" }, + windows_platform: { target_os = "windows" }, + linux_platform: { all(target_os = "linux", not(ohos)) }, + desktop_platform: { any(windows_platform, linux_platform, macos_platform) }, + ohos: { target_env = "ohos" }, + + } +} \ No newline at end of file diff --git a/examples/gallery-js/img.svg b/examples/gallery/src/gallery-js/img.svg similarity index 100% rename from examples/gallery-js/img.svg rename to examples/gallery/src/gallery-js/img.svg diff --git a/examples/gallery-js/index.js b/examples/gallery/src/gallery-js/index.js similarity index 100% rename from examples/gallery-js/index.js rename to examples/gallery/src/gallery-js/index.js diff --git a/examples/gallery.rs b/examples/gallery/src/main.rs similarity index 79% rename from examples/gallery.rs rename to examples/gallery/src/main.rs index 1f2d8d4..c123120 100644 --- a/examples/gallery.rs +++ b/examples/gallery/src/main.rs @@ -2,8 +2,8 @@ use deft::app::{App, IApp}; use deft::bootstrap; use deft::js::js_engine::JsEngine; -use quick_js::loader::JsModuleLoader; use deft::resource::Resource; +use deft::js::loader::JsModuleLoader; struct AppImpl {} @@ -14,7 +14,7 @@ impl IApp for AppImpl { #[cfg(desktop_platform)] fn create_module_loader(&mut self) -> Box { - use quick_js::loader::FsJsModuleLoader; + use deft::js::loader::FsJsModuleLoader; let ml = FsJsModuleLoader::new("examples/gallery-js"); Box::new(ml) } @@ -23,7 +23,10 @@ impl IApp for AppImpl { fn create_module_loader(&mut self) -> Box { use deft::loader::StaticModuleLoader; let mut ml = StaticModuleLoader::new(); - ml.add_module("index.js".to_string(), include_str!("./gallery-js/index.js").to_owned()); + ml.add_module( + "index.js".to_string(), + include_str!("./gallery-js/index.js").to_owned(), + ); Box::new(ml) } } @@ -43,14 +46,15 @@ fn main() { bootstrap_app(); } - #[cfg(target_os = "emscripten")] pub fn main() { // Do nothing } #[cfg(target_os = "emscripten")] -#[no_mangle] +#[unsafe(no_mangle)] pub extern "C" fn asm_main() { + use deft::log::SimpleLogger; + SimpleLogger::init_with_max_level(log::LevelFilter::Info); bootstrap_app(); -} \ No newline at end of file +} diff --git a/web/debug.html b/examples/gallery/web/debug.html old mode 100755 new mode 100644 similarity index 100% rename from web/debug.html rename to examples/gallery/web/debug.html diff --git a/web/index.html b/examples/gallery/web/index.html old mode 100755 new mode 100644 similarity index 100% rename from web/index.html rename to examples/gallery/web/index.html diff --git a/web/main.js b/examples/gallery/web/main.js old mode 100755 new mode 100644 similarity index 100% rename from web/main.js rename to examples/gallery/web/main.js diff --git a/scripts/build-wasm.bat b/scripts/build-wasm.bat new file mode 100644 index 0000000..e464635 --- /dev/null +++ b/scripts/build-wasm.bat @@ -0,0 +1,2 @@ +@echo off +cargo build --target wasm32-unknown-emscripten --no-default-features diff --git a/scripts/build-wasm.sh b/scripts/build-wasm.sh index 1e019e6..3f11b66 100755 --- a/scripts/build-wasm.sh +++ b/scripts/build-wasm.sh @@ -1,3 +1,2 @@ #!/bin/bash -export EMCC_CFLAGS="-s MAX_WEBGL_VERSION=2 -s MODULARIZE=1 -s EXPORT_NAME=loadDeftApp -s EXPORTED_RUNTIME_METHODS=GL,cwrap" -cargo build --target wasm32-unknown-emscripten --no-default-features --example gallery $@ +cargo build --target wasm32-unknown-emscripten --no-default-features $@ diff --git a/src/element/common/image_object.rs b/src/element/common/image_object.rs index ebc9d73..f858cfe 100644 --- a/src/element/common/image_object.rs +++ b/src/element/common/image_object.rs @@ -1,6 +1,7 @@ use crate::element::common::svg_object::SvgObject; use crate::img_manager::{dyn_image_to_skia_image, IMG_MANAGER}; use crate::render::RenderFn; +use crate::resource::Resource; use anyhow::Error; use base64::prelude::BASE64_STANDARD; use base64::Engine; @@ -8,7 +9,6 @@ use image::{EncodableLayout, ImageReader}; use log::error; use skia_safe::Color; use std::io::Cursor; -use crate::resource::Resource; #[derive(Clone)] enum ImageSrc { @@ -22,7 +22,7 @@ unsafe impl Send for ImageSrc {} impl ImageSrc { pub fn get_size(&self) -> (f32, f32) { match self { - ImageSrc::Svg(dom) => unsafe { dom.container_size() }, + ImageSrc::Svg(dom) => dom.container_size(), ImageSrc::Img(img) => (img.width() as f32, img.height() as f32), ImageSrc::None => (0.0, 0.0), } @@ -122,7 +122,8 @@ impl ImageObject { } else { Self::load_image_from_data(data) } - }).unwrap_or_else(|| { + }) + .unwrap_or_else(|| { error!("Image not found: {:?}", src); ImageSrc::None }); diff --git a/src/element/common/svg_object.rs b/src/element/common/svg_object.rs index 1b61bca..df43829 100644 --- a/src/element/common/svg_object.rs +++ b/src/element/common/svg_object.rs @@ -1,14 +1,14 @@ use anyhow::Error; use resvg::usvg::Tree; use resvg::{tiny_skia, usvg, RenderOptions}; -use skia_safe::{Color}; +use skia_safe::Color; use skia_safe::{surfaces, AlphaType, Canvas, ColorType, ImageInfo}; use std::fs; use std::sync::{Arc, Mutex}; -pub struct SvgState{ +pub struct SvgState { tree: Tree, - options: RenderOptions, + options: RenderOptions, } #[derive(Clone)] @@ -21,7 +21,7 @@ impl SvgObject { let options = usvg::Options::default(); let tree = Tree::from_data(bytes, &options)?; let options = RenderOptions::default(); - Ok(Self { + Ok(Self { state: Arc::new(Mutex::new(SvgState { tree, options })), }) } diff --git a/src/element/font_manager.rs b/src/element/font_manager.rs index cb80f46..c368319 100644 --- a/src/element/font_manager.rs +++ b/src/element/font_manager.rs @@ -14,7 +14,6 @@ use font_kit::sources::mem::MemSource as SystemSource; use skia_safe::font_style::Slant; use skia_safe::wrapper::NativeTransmutableWrapper; use std::collections::HashMap; -use std::sync::Arc; use swash::{ObliqueAngle, Style, Weight}; #[mrc_object] @@ -35,10 +34,12 @@ impl FontManager { #[cfg(target_os = "emscripten")] let mut source = { let mut source = SystemSource::empty(); - source.add_font(Handle::Memory { - bytes: Arc::new(include_bytes!("../../fonts/NotoSerif-Regular.ttf").to_vec()), - font_index: 0, - }).unwrap(); + source + .add_font(Handle::Memory { + bytes: std::sync::Arc::new(include_bytes!("../../fonts/NotoSerif-Regular.ttf").to_vec()), + font_index: 0, + }) + .unwrap(); source }; diff --git a/src/element/label.rs b/src/element/label.rs index 4ed34a7..66b576d 100644 --- a/src/element/label.rs +++ b/src/element/label.rs @@ -9,14 +9,8 @@ use crate::style::StylePropKey; use crate::text::textbox::{TextBox, TextElement, TextUnit}; use crate::text::TextAlign; use deft_macros::{element_backend, js_methods}; -use skia_safe::FontMgr; use yoga::Size; -thread_local! { - //TODO remove - pub static FONT_MGR: FontMgr = FontMgr::new(); -} - pub fn parse_align(align: &str) -> TextAlign { match align { "left" => TextAlign::Left, diff --git a/src/element/paragraph.rs b/src/element/paragraph.rs index 0edaea3..f4f9a47 100644 --- a/src/element/paragraph.rs +++ b/src/element/paragraph.rs @@ -1,6 +1,5 @@ #![allow(unused)] pub mod simple_paragraph_builder; -pub mod typeface_mgr; use crate as deft; use crate::base::{EventContext, MouseDetail, MouseEventType}; diff --git a/src/element/paragraph/typeface_mgr.rs b/src/element/paragraph/typeface_mgr.rs deleted file mode 100644 index 9b4a670..0000000 --- a/src/element/paragraph/typeface_mgr.rs +++ /dev/null @@ -1,48 +0,0 @@ -use skia_safe::{FontMgr, Typeface}; -use std::collections::HashMap; - -pub struct TypefaceMgr { - system_font_mgr: FontMgr, - typefaces: HashMap, -} - -impl TypefaceMgr { - pub fn new() -> Self { - Self { - system_font_mgr: FontMgr::new(), - typefaces: HashMap::new(), - } - } - - pub fn get_typeface(&mut self, family_name: &str) -> Typeface { - if let Some(tf) = self.typefaces.get(family_name) { - return tf.clone(); - } - let tf = Self::search_typeface(&self.system_font_mgr, family_name); - self.typefaces.insert(family_name.to_string(), tf.clone()); - tf - } - - fn search_typeface(system_font_mgr: &FontMgr, family_name: &str) -> Typeface { - for i in 0..system_font_mgr.count_families() { - let name = system_font_mgr.family_name(i); - if name != family_name { - continue; - } - let mut style_set = system_font_mgr.new_style_set(i); - for style_index in 0..style_set.count() { - // let (_, style_name) = style_set.style(style_index); - let face = style_set.new_typeface(style_index); - if let Some(face) = face { - if face.family_name() == family_name { - return face; - } - } - } - } - system_font_mgr - .match_family(family_name) - .new_typeface(0) - .unwrap() - } -} diff --git a/src/element/select.rs b/src/element/select.rs index 1869660..4c4ed86 100644 --- a/src/element/select.rs +++ b/src/element/select.rs @@ -171,7 +171,6 @@ impl ElementBackend for Select { fn on_event(&mut self, event: &mut Event, _ctx: &mut EventContext) { let el = ok_or_return!(self.element_weak.upgrade()); let w = some_or_return!(el.get_window()); - let window = ok_or_return!(w.upgrade_mut()); let bounds = el.get_origin_bounds(); if let Some(_) = ClickEvent::cast(event) { let mut popup: Mrc> = Mrc::new(None); diff --git a/src/element/text/skia_text_paragraph.rs b/src/element/text/skia_text_paragraph.rs deleted file mode 100644 index 00f22b8..0000000 --- a/src/element/text/skia_text_paragraph.rs +++ /dev/null @@ -1,84 +0,0 @@ -use skia_safe::{Canvas, Font, Paint, Point, Rect}; -use skia_safe::textlayout::{Paragraph as SkParagraph, ParagraphBuilder, ParagraphStyle, StrutStyle, TextAlign, TextStyle}; -use crate::element::text::{FONT_COLLECTION, FONT_MGR, ZERO_WIDTH_WHITESPACE}; -use crate::element::text::text_paragraph::TextParams; -use crate::string::StringUtils; - -pub struct SkiaTextParagraph { - text: String, - paragraph: SkParagraph, -} - -impl SkiaTextParagraph { - pub fn new(text: String, params: &TextParams) -> Self { - let paragraph = Self::build_paragraph(&text, params); - Self { - paragraph, - text, - } - } - - pub fn get_text(&self) -> &str { - &self.text - } - - pub fn layout(&mut self, available_width: f32) { - self.paragraph.layout(available_width) - } - - pub fn height(&self) -> f32 { - self.paragraph.height() - } - - pub fn max_intrinsic_width(&self) -> f32 { - self.paragraph.max_intrinsic_width() - } - - pub fn get_char_bounds(&mut self, char_offset: usize) -> Option { - let gc = self.paragraph.get_glyph_info_at_utf16_offset(char_offset); - gc.map(|g| g.grapheme_layout_bounds) - } - - pub fn get_char_offset_at_coordinate(&self, coord: (f32, f32)) -> usize { - self.paragraph.get_glyph_position_at_coordinate(coord).position as usize - } - - pub fn get_soft_line_height(&self, char_offset: usize) -> f32 { - let ln = self.paragraph.get_line_number_at_utf16_offset(char_offset).unwrap(); - let lm = self.paragraph.get_line_metrics_at(ln).unwrap(); - lm.height as f32 - } - - pub fn paint(&self, canvas: &Canvas, p: impl Into) { - self.paragraph.paint(canvas, p) - } - - pub fn build_paragraph(text: &str, params: &TextParams) -> SkParagraph { - let mut text = text.trim_line_endings().to_string(); - text.push_str(ZERO_WIDTH_WHITESPACE); - let mut font_collection = FONT_COLLECTION.with(|f| f.clone()); - FONT_MGR.with(|fm| { - font_collection.set_default_font_manager(Some(fm.clone()), None); - }); - let mut paragraph_style = ParagraphStyle::new(); - paragraph_style.set_text_align(params.align); - - if let Some(line_height) = params.line_height { - let mut strut_style = StrutStyle::default(); - strut_style.set_font_families(&["Roboto"]); - strut_style.set_strut_enabled(true); - strut_style.set_font_size(line_height); - strut_style.set_force_strut_height(true); - paragraph_style.set_strut_style(strut_style); - } - - let mut pb = ParagraphBuilder::new(¶graph_style, font_collection); - let mut text_style = TextStyle::new(); - text_style.set_foreground_paint(¶ms.paint); - text_style.set_font_size(params.font_size); - - pb.push_style(&text_style); - pb.add_text(&text); - pb.build() - } -} \ No newline at end of file diff --git a/src/js/js_binding.rs b/src/js/js_binding.rs index dc8915b..c60c72e 100644 --- a/src/js/js_binding.rs +++ b/src/js/js_binding.rs @@ -107,7 +107,11 @@ macro_rules! impl_number_from_js_value { value .as_number() .map(|f| f as $ty) - .ok_or(ValueError::Internal(format!("Cannot convert js:{} to rust:{}", value.value_type(), stringify!($ty)))) + .ok_or(ValueError::Internal(format!( + "Cannot convert js:{} to rust:{}", + value.value_type(), + stringify!($ty) + ))) } } }; diff --git a/src/js/js_engine.rs b/src/js/js_engine.rs index 30db41b..822abf2 100644 --- a/src/js/js_engine.rs +++ b/src/js/js_engine.rs @@ -101,7 +101,7 @@ impl JsEngine { SharedModuleLoader::new(app.create_module_loader()) }; #[cfg(not(emscripten_platform))] - let runtime = { + let runtime = { Builder::new_multi_thread() .worker_threads(4) .enable_all() @@ -109,12 +109,7 @@ impl JsEngine { .unwrap() }; #[cfg(emscripten_platform)] - let runtime = { - Builder::new_current_thread() - .enable_all() - .build() - .unwrap() - }; + let runtime = { Builder::new_current_thread().enable_all().build().unwrap() }; let js_context = Context::builder() .console(Console::new()) @@ -311,6 +306,7 @@ impl JsEngine { && pos.1 <= wy + wh; if !is_in_window { let _ = window.window.set_cursor_grab(CursorGrabMode::None); + #[allow(suspicious_double_ref_op)] result.push(w.clone().clone()); } } diff --git a/src/lib.rs b/src/lib.rs index 4a87960..693c7f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -51,9 +51,11 @@ mod font; mod frame_rate; mod id_generator; mod id_hash_map; +pub mod log; mod paint; mod platform; pub mod render; +pub mod resource; mod state; mod style_list; mod stylesheet; @@ -61,7 +63,6 @@ mod task_executor; mod text; mod typeface; pub mod winit; -pub mod resource; use crate::base::ResultWaiter; use crate::console::init_console; @@ -133,17 +134,17 @@ pub fn android_bootstrap(app: AndroidApp, deft_app: App) { use winit::platform::android::EventLoopBuilderExtAndroid; android::init_android_app(&app); - android_logger::init_once(android_logger::Config::default().with_min_level(log::Level::Warn)); + android_logger::init_once(android_logger::Config::default().with_min_level(::log::Level::Warn)); // info!("starting"); if let Some(p) = app.internal_data_path() { let data_path = p.into_os_string().to_string_lossy().to_string(); - log::debug!("internal data_path:{}", data_path); + ::log::debug!("internal data_path:{}", data_path); unsafe { std::env::set_var(data_dir::ENV_KEY, data_path); } } - log::debug!("data path: {:?}", data_dir::get_data_path("")); + ::log::debug!("data path: {:?}", data_dir::get_data_path("")); let event_loop = EventLoop::with_user_event() .with_android_app(app) .build() diff --git a/src/log.rs b/src/log.rs new file mode 100644 index 0000000..d3e1ade --- /dev/null +++ b/src/log.rs @@ -0,0 +1,34 @@ +use log::{Metadata, Record}; + +pub struct SimpleLogger { + max_level: log::LevelFilter, +} + +impl SimpleLogger { + fn new() -> Self { + SimpleLogger { + max_level: log::LevelFilter::Info, + } + } + + pub fn init_with_max_level(max_level: log::LevelFilter) { + let logger = SimpleLogger::new(); + if log::set_boxed_logger(Box::new(logger)).is_ok() { + log::set_max_level(max_level); + } + } +} + +impl log::Log for SimpleLogger { + fn enabled(&self, metadata: &Metadata) -> bool { + metadata.level() <= self.max_level + } + + fn log(&self, record: &Record) { + if self.enabled(record.metadata()) { + println!("{} - {}", record.level(), record.args()); + } + } + + fn flush(&self) {} +} diff --git a/src/platform.rs b/src/platform.rs index 75ac3d5..c63921d 100644 --- a/src/platform.rs +++ b/src/platform.rs @@ -31,4 +31,4 @@ pub use ios::*; #[cfg(emscripten_platform)] mod emscripten; #[cfg(emscripten_platform)] -pub use emscripten::*; \ No newline at end of file +pub use emscripten::*; diff --git a/src/platform/emscripten.rs b/src/platform/emscripten.rs index 63456df..d272368 100644 --- a/src/platform/emscripten.rs +++ b/src/platform/emscripten.rs @@ -1,4 +1,4 @@ pub const PLATFORM_NAME: &'static str = "web"; pub fn support_multiple_windows() -> bool { false -} \ No newline at end of file +} diff --git a/src/resource.rs b/src/resource.rs index a50257c..b52e2a5 100644 --- a/src/resource.rs +++ b/src/resource.rs @@ -22,7 +22,7 @@ impl Resource { pub fn read) -> R>(key: &str, handler: F) -> Option { let data = RESOURCES.data.clone(); - let mut data = data.lock().unwrap(); + let data = data.lock().unwrap(); data.get(&key.to_string()).map(|value| handler(value)) } } diff --git a/src/timer.rs b/src/timer.rs index 2303c72..7190548 100644 --- a/src/timer.rs +++ b/src/timer.rs @@ -7,7 +7,6 @@ use std::sync::mpsc::{channel, Sender}; use std::sync::{Arc, Mutex}; use std::thread; use std::time::{Duration, Instant}; -use libc::c_int; thread_local! { pub static TIMER: RefCell = RefCell::new(Timer::new()); @@ -71,9 +70,9 @@ enum InnerTimerHandle { #[cfg(not(emscripten_platform))] Task(u64), #[cfg(emscripten_platform)] - JsTimeout(c_int), + JsTimeout(libc::c_int), #[cfg(emscripten_platform)] - JsInterval(c_int), + JsInterval(libc::c_int), } pub struct TimerHandle { @@ -84,7 +83,6 @@ impl TimerHandle { fn new(inner: InnerTimerHandle) -> Self { Self { inner } } - } impl Drop for TimerHandle { @@ -167,17 +165,15 @@ pub fn set_timeout_nanos(callback: F, nanos: u64) -> Time #[no_mangle] extern "C" fn js_timeout_callback(user_data: *mut ::core::ffi::c_void) { - let mut callback = unsafe { Box::from_raw(user_data as *mut Box) }; + let callback = unsafe { Box::from_raw(user_data as *mut Box) }; callback(); } #[no_mangle] extern "C" fn js_interval_callback(user_data: *mut ::core::ffi::c_void) { - unsafe { - let mut callback = unsafe { Box::from_raw(user_data as *mut Box) }; - callback(); - Box::leak(callback); - } + let callback = unsafe { Box::from_raw(user_data as *mut Box) }; + callback(); + Box::leak(callback); } #[cfg(target_os = "emscripten")] @@ -189,7 +185,7 @@ pub fn set_timeout_nanos(callback: F, nanos: u64) -> Time let id = deft_emscripten_sys::emscripten_set_timeout( Some(js_timeout_callback), timeout, - user_data as *mut _ as *mut ::core::ffi::c_void + user_data as *mut _ as *mut ::core::ffi::c_void, ); TimerHandle::new(InnerTimerHandle::JsTimeout(id)) } @@ -215,7 +211,7 @@ pub fn set_interval(callback: F, interval: u64) -> TimerHandl let id = deft_emscripten_sys::emscripten_set_interval( Some(js_interval_callback), interval as f64, - user_data as *mut _ as *mut ::core::ffi::c_void + user_data as *mut _ as *mut ::core::ffi::c_void, ); TimerHandle::new(InnerTimerHandle::JsInterval(id)) } diff --git a/src/window.rs b/src/window.rs index cd9c2b8..b3a296b 100644 --- a/src/window.rs +++ b/src/window.rs @@ -180,7 +180,7 @@ impl BorrowFromJs for Window { let window = WindowHandle::from_js_value(value)?; let mut wi = window .upgrade_mut() - .map_err(|e| ValueError::UnexpectedType)?; + .map_err(|_| ValueError::UnexpectedType)?; Ok(receiver(&mut wi)) } } diff --git a/src/window/popup.rs b/src/window/popup.rs index efd4737..d35768f 100644 --- a/src/window/popup.rs +++ b/src/window/popup.rs @@ -56,7 +56,7 @@ impl Popup { let window_handle = Window::create_with_raw_attrs(window_attrs, winit_attrs).unwrap(); //TODO no unwrap let mut window = window_handle.upgrade_mut().unwrap(); - window.set_body(element.clone()); + let _ = window.set_body(element.clone()); let current_monitor = owner.window.current_monitor(); let window_weak = window_handle.clone(); window.register_event_listener(WindowResizeEventListener::new(move |e, _| {