mirror of
				https://github.com/Tim-Paik/neutauri.git
				synced 2024-10-12 23:29:41 +00:00 
			
		
		
		
	update runner
This commit is contained in:
		
							
								
								
									
										242
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										242
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -2,6 +2,18 @@
 | 
			
		||||
# It is not intended for manual editing.
 | 
			
		||||
version = 3
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "adler"
 | 
			
		||||
version = "1.0.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "adler32"
 | 
			
		||||
version = "1.2.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "alloc-no-stdlib"
 | 
			
		||||
version = "2.0.3"
 | 
			
		||||
@ -106,6 +118,18 @@ dependencies = [
 | 
			
		||||
 "alloc-stdlib",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "bytemuck"
 | 
			
		||||
version = "1.7.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "byteorder"
 | 
			
		||||
version = "1.4.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "bytes"
 | 
			
		||||
version = "1.1.0"
 | 
			
		||||
@ -224,6 +248,12 @@ dependencies = [
 | 
			
		||||
 "objc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "color_quant"
 | 
			
		||||
version = "1.1.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "com"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
@ -337,6 +367,15 @@ dependencies = [
 | 
			
		||||
 "objc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "crc32fast"
 | 
			
		||||
version = "1.3.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a2209c310e29876f7f0b2721e7e26b84aff178aa3da5d091f9bfbf47669e60e3"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 1.0.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "crossbeam-channel"
 | 
			
		||||
version = "0.5.2"
 | 
			
		||||
@ -347,6 +386,30 @@ dependencies = [
 | 
			
		||||
 "crossbeam-utils",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "crossbeam-deque"
 | 
			
		||||
version = "0.8.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 1.0.0",
 | 
			
		||||
 "crossbeam-epoch",
 | 
			
		||||
 "crossbeam-utils",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "crossbeam-epoch"
 | 
			
		||||
version = "0.9.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "97242a70df9b89a65d0b6df3c4bf5b9ce03c5b7309019777fbde37e7537f8762"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "cfg-if 1.0.0",
 | 
			
		||||
 "crossbeam-utils",
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "memoffset",
 | 
			
		||||
 "scopeguard",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "crossbeam-utils"
 | 
			
		||||
version = "0.8.6"
 | 
			
		||||
@ -398,6 +461,16 @@ dependencies = [
 | 
			
		||||
 "syn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "deflate"
 | 
			
		||||
version = "0.8.6"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "adler32",
 | 
			
		||||
 "byteorder",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "dispatch"
 | 
			
		||||
version = "0.2.0"
 | 
			
		||||
@ -560,6 +633,16 @@ dependencies = [
 | 
			
		||||
 "system-deps 3.2.0",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "gif"
 | 
			
		||||
version = "0.11.3"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "c3a7187e78088aead22ceedeee99779455b23fc231fe13ec443f99bb71694e5b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "color_quant",
 | 
			
		||||
 "weezl",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "gio"
 | 
			
		||||
version = "0.14.8"
 | 
			
		||||
@ -793,6 +876,25 @@ dependencies = [
 | 
			
		||||
 "unicode-normalization",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "image"
 | 
			
		||||
version = "0.23.14"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytemuck",
 | 
			
		||||
 "byteorder",
 | 
			
		||||
 "color_quant",
 | 
			
		||||
 "gif",
 | 
			
		||||
 "jpeg-decoder",
 | 
			
		||||
 "num-iter",
 | 
			
		||||
 "num-rational",
 | 
			
		||||
 "num-traits",
 | 
			
		||||
 "png",
 | 
			
		||||
 "scoped_threadpool",
 | 
			
		||||
 "tiff",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "indexmap"
 | 
			
		||||
version = "1.8.0"
 | 
			
		||||
@ -852,6 +954,15 @@ version = "0.3.0"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "jpeg-decoder"
 | 
			
		||||
version = "0.1.22"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "rayon",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "lazy_static"
 | 
			
		||||
version = "1.4.0"
 | 
			
		||||
@ -918,6 +1029,25 @@ version = "0.3.16"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "miniz_oxide"
 | 
			
		||||
version = "0.3.7"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "adler32",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "miniz_oxide"
 | 
			
		||||
version = "0.4.4"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "adler",
 | 
			
		||||
 "autocfg",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "ndk"
 | 
			
		||||
version = "0.4.0"
 | 
			
		||||
@ -977,6 +1107,7 @@ version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bincode",
 | 
			
		||||
 "brotli",
 | 
			
		||||
 "image",
 | 
			
		||||
 "new_mime_guess",
 | 
			
		||||
 "serde",
 | 
			
		||||
 "toml",
 | 
			
		||||
@ -993,6 +1124,57 @@ dependencies = [
 | 
			
		||||
 "unicase",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-integer"
 | 
			
		||||
version = "0.1.44"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "num-traits",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-iter"
 | 
			
		||||
version = "0.1.42"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "num-integer",
 | 
			
		||||
 "num-traits",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-rational"
 | 
			
		||||
version = "0.3.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "num-integer",
 | 
			
		||||
 "num-traits",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num-traits"
 | 
			
		||||
version = "0.2.14"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num_cpus"
 | 
			
		||||
version = "1.13.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "hermit-abi",
 | 
			
		||||
 "libc",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "num_enum"
 | 
			
		||||
version = "0.5.6"
 | 
			
		||||
@ -1130,6 +1312,18 @@ version = "0.3.24"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "png"
 | 
			
		||||
version = "0.16.8"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bitflags",
 | 
			
		||||
 "crc32fast",
 | 
			
		||||
 "deflate",
 | 
			
		||||
 "miniz_oxide 0.3.7",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "proc-macro-crate"
 | 
			
		||||
version = "0.1.5"
 | 
			
		||||
@ -1210,6 +1404,31 @@ dependencies = [
 | 
			
		||||
 "cty",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rayon"
 | 
			
		||||
version = "1.5.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "autocfg",
 | 
			
		||||
 "crossbeam-deque",
 | 
			
		||||
 "either",
 | 
			
		||||
 "rayon-core",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "rayon-core"
 | 
			
		||||
version = "1.9.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "crossbeam-channel",
 | 
			
		||||
 "crossbeam-deque",
 | 
			
		||||
 "crossbeam-utils",
 | 
			
		||||
 "lazy_static",
 | 
			
		||||
 "num_cpus",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "redox_syscall"
 | 
			
		||||
version = "0.2.10"
 | 
			
		||||
@ -1234,6 +1453,12 @@ version = "1.0.9"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "scoped_threadpool"
 | 
			
		||||
version = "0.1.9"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "scopeguard"
 | 
			
		||||
version = "1.1.0"
 | 
			
		||||
@ -1506,6 +1731,17 @@ dependencies = [
 | 
			
		||||
 "syn",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "tiff"
 | 
			
		||||
version = "0.6.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "9a53f4706d65497df0c4349241deddf35f84cee19c87ed86ea8ca590f4464437"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "jpeg-decoder",
 | 
			
		||||
 "miniz_oxide 0.4.4",
 | 
			
		||||
 "weezl",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "tinyvec"
 | 
			
		||||
version = "1.5.1"
 | 
			
		||||
@ -1671,6 +1907,12 @@ dependencies = [
 | 
			
		||||
 "winapi",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "weezl"
 | 
			
		||||
version = "0.1.5"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "widestring"
 | 
			
		||||
version = "0.5.1"
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ version = "0.1.0"
 | 
			
		||||
[dependencies]
 | 
			
		||||
bincode = "1.3"
 | 
			
		||||
brotli = "3.3"
 | 
			
		||||
image = "0.23"
 | 
			
		||||
new_mime_guess = "4.0"
 | 
			
		||||
serde = {version = "1.0", features = ["derive"]}
 | 
			
		||||
toml = "0.5"
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ use std::{
 | 
			
		||||
    io::{self, Read, Result, Seek, SeekFrom},
 | 
			
		||||
    path::{self, Component, Path, PathBuf},
 | 
			
		||||
};
 | 
			
		||||
use wry::application::dpi::{Position, Size};
 | 
			
		||||
use wry::application::dpi::Position;
 | 
			
		||||
 | 
			
		||||
const MAGIC_NUMBER_START: &[u8; 9] = b"NEUTFSv01";
 | 
			
		||||
const MAGIC_NUMBER_END: &[u8; 9] = b"NEUTFSEnd";
 | 
			
		||||
@ -31,30 +31,55 @@ struct Dir {
 | 
			
		||||
    dirs: Vec<(String, Dir)>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
struct Config {
 | 
			
		||||
    window_attr: WindowAttr,
 | 
			
		||||
    webview_attr: WebViewAttr,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug)]
 | 
			
		||||
pub struct Data {
 | 
			
		||||
    config: Config,
 | 
			
		||||
    pub window_attr: WindowAttr,
 | 
			
		||||
    pub webview_attr: WebViewAttr,
 | 
			
		||||
    fs: Dir,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Clone, Debug)]
 | 
			
		||||
pub enum WindowSize {
 | 
			
		||||
    Large,
 | 
			
		||||
    Medium,
 | 
			
		||||
    Small,
 | 
			
		||||
    Fixed(f64, f64),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Clone, Debug)]
 | 
			
		||||
pub struct Config {
 | 
			
		||||
    pub source: PathBuf,
 | 
			
		||||
    pub target: PathBuf,
 | 
			
		||||
    pub inner_size: Option<WindowSize>,
 | 
			
		||||
    pub min_inner_size: Option<WindowSize>,
 | 
			
		||||
    pub max_inner_size: Option<WindowSize>,
 | 
			
		||||
    pub resizable: bool,
 | 
			
		||||
    pub fullscreen: bool,
 | 
			
		||||
    pub title: String,
 | 
			
		||||
    pub maximized: bool,
 | 
			
		||||
    pub visible: bool,
 | 
			
		||||
    pub transparent: bool,
 | 
			
		||||
    pub decorations: bool,
 | 
			
		||||
    pub always_on_top: bool,
 | 
			
		||||
    pub window_icon: Option<PathBuf>,
 | 
			
		||||
    pub spa: bool,
 | 
			
		||||
    pub url: Option<String>,
 | 
			
		||||
    pub html: Option<PathBuf>,
 | 
			
		||||
    pub initialization_script: Option<String>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Clone, Debug)]
 | 
			
		||||
pub struct Icon {
 | 
			
		||||
    rgba: Vec<u8>,
 | 
			
		||||
    width: u32,
 | 
			
		||||
    height: u32,
 | 
			
		||||
    pub rgba: Vec<u8>,
 | 
			
		||||
    pub width: u32,
 | 
			
		||||
    pub height: u32,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Clone, Debug)]
 | 
			
		||||
pub struct WindowAttr {
 | 
			
		||||
    pub inner_size: Option<Size>,
 | 
			
		||||
    pub min_inner_size: Option<Size>,
 | 
			
		||||
    pub max_inner_size: Option<Size>,
 | 
			
		||||
    pub inner_size: Option<WindowSize>,
 | 
			
		||||
    pub min_inner_size: Option<WindowSize>,
 | 
			
		||||
    pub max_inner_size: Option<WindowSize>,
 | 
			
		||||
    pub position: Option<Position>,
 | 
			
		||||
    pub resizable: bool,
 | 
			
		||||
    pub fullscreen: bool,
 | 
			
		||||
@ -71,15 +96,15 @@ pub struct WindowAttr {
 | 
			
		||||
pub struct WebViewAttr {
 | 
			
		||||
    pub visible: bool,
 | 
			
		||||
    pub transparent: bool,
 | 
			
		||||
    pub spa: bool,
 | 
			
		||||
    pub url: Option<String>,
 | 
			
		||||
    pub html: Option<String>,
 | 
			
		||||
    pub initialization_scripts: Vec<String>,
 | 
			
		||||
    pub initialization_script: Option<String>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl File {
 | 
			
		||||
    pub fn decompressed_data(&mut self) -> Result<Vec<u8>> {
 | 
			
		||||
        let mut data = Vec::with_capacity(self.data.len());
 | 
			
		||||
        //brotli::BrotliDecompress(&mut self.data, &mut data);
 | 
			
		||||
        let mut r = brotli::Decompressor::new(self.data.as_slice(), 4096);
 | 
			
		||||
        r.read_to_end(&mut data)?;
 | 
			
		||||
        Ok(data)
 | 
			
		||||
@ -164,10 +189,8 @@ impl Data {
 | 
			
		||||
        dir.fill_with(source, source, &mut length)?;
 | 
			
		||||
        Ok(Self {
 | 
			
		||||
            fs: dir,
 | 
			
		||||
            config: Config {
 | 
			
		||||
                window_attr,
 | 
			
		||||
                webview_attr,
 | 
			
		||||
            },
 | 
			
		||||
            window_attr,
 | 
			
		||||
            webview_attr,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -197,11 +220,20 @@ impl Data {
 | 
			
		||||
        Ok(target)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn pack<P: AsRef<path::Path>>(source: P, target: P, config: P) -> Result<()> {
 | 
			
		||||
        let config: Config = toml::from_str(fs::read_to_string(config)?.as_str())?;
 | 
			
		||||
    pub fn pack<P: AsRef<path::Path>>(config_path: P) -> Result<()> {
 | 
			
		||||
        let config_path: &Path = config_path.as_ref().clone();
 | 
			
		||||
        let config: Config = toml::from_str(fs::read_to_string(config_path)?.as_str())?;
 | 
			
		||||
        let source = &match config_path.parent() {
 | 
			
		||||
            Some(path) => path.join(&config.source).canonicalize()?,
 | 
			
		||||
            None => config.source.canonicalize()?,
 | 
			
		||||
        };
 | 
			
		||||
        let target = &match config_path.parent() {
 | 
			
		||||
            Some(path) => path.join(&config.target).canonicalize()?,
 | 
			
		||||
            None => config.target.canonicalize()?,
 | 
			
		||||
        };
 | 
			
		||||
        fs::write(
 | 
			
		||||
            target,
 | 
			
		||||
            Self::build_from_dir(source, config.window_attr, config.webview_attr)?,
 | 
			
		||||
            Self::build_from_dir(source, config.window_attr()?, config.webview_attr()?)?,
 | 
			
		||||
        )?;
 | 
			
		||||
        Ok(())
 | 
			
		||||
    }
 | 
			
		||||
@ -242,7 +274,6 @@ impl Data {
 | 
			
		||||
        // 此时指针指向 Data 前
 | 
			
		||||
        base.take(u64::from_be_bytes(data_length_data))
 | 
			
		||||
            .read_to_end(&mut data)?;
 | 
			
		||||
        fs::write("test2", &data)?;
 | 
			
		||||
        let serialize_options = bincode::DefaultOptions::new()
 | 
			
		||||
            .with_fixint_encoding()
 | 
			
		||||
            .allow_trailing_bytes()
 | 
			
		||||
@ -287,12 +318,91 @@ impl Data {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Default for Config {
 | 
			
		||||
    fn default() -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            source: PathBuf::from("."),
 | 
			
		||||
            target: PathBuf::from("app.neu"),
 | 
			
		||||
            inner_size: Some(WindowSize::Medium),
 | 
			
		||||
            min_inner_size: None,
 | 
			
		||||
            max_inner_size: None,
 | 
			
		||||
            resizable: true,
 | 
			
		||||
            fullscreen: false,
 | 
			
		||||
            title: "".to_string(),
 | 
			
		||||
            maximized: false,
 | 
			
		||||
            visible: true,
 | 
			
		||||
            transparent: false,
 | 
			
		||||
            decorations: true,
 | 
			
		||||
            always_on_top: false,
 | 
			
		||||
            window_icon: None,
 | 
			
		||||
            spa: false,
 | 
			
		||||
            url: Some("/index.html".to_string()),
 | 
			
		||||
            html: None,
 | 
			
		||||
            initialization_script: Some("".to_string()),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Config {
 | 
			
		||||
    pub fn window_attr(&self) -> Result<WindowAttr> {
 | 
			
		||||
        Ok(WindowAttr {
 | 
			
		||||
            inner_size: self.inner_size.clone(),
 | 
			
		||||
            min_inner_size: self.min_inner_size.clone(),
 | 
			
		||||
            max_inner_size: self.max_inner_size.clone(),
 | 
			
		||||
            position: None,
 | 
			
		||||
            resizable: self.resizable,
 | 
			
		||||
            fullscreen: self.fullscreen,
 | 
			
		||||
            title: self.title.clone(),
 | 
			
		||||
            maximized: self.maximized,
 | 
			
		||||
            visible: self.visible,
 | 
			
		||||
            transparent: self.transparent,
 | 
			
		||||
            decorations: self.decorations,
 | 
			
		||||
            always_on_top: self.always_on_top,
 | 
			
		||||
            window_icon: match &self.window_icon {
 | 
			
		||||
                Some(path) => Some(load_icon(&path.as_path())?),
 | 
			
		||||
                None => None,
 | 
			
		||||
            },
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
    pub fn webview_attr(&self) -> Result<WebViewAttr> {
 | 
			
		||||
        Ok(WebViewAttr {
 | 
			
		||||
            visible: self.visible,
 | 
			
		||||
            transparent: self.transparent,
 | 
			
		||||
            spa: self.spa,
 | 
			
		||||
            url: self.url.clone(),
 | 
			
		||||
            html: match &self.html {
 | 
			
		||||
                Some(path) => fs::read_to_string(path.as_path()).ok(),
 | 
			
		||||
                None => None,
 | 
			
		||||
            },
 | 
			
		||||
            initialization_script: self.initialization_script.clone(),
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn load<P: AsRef<path::Path> + Copy>(path: P) -> Result<Data> {
 | 
			
		||||
    Data::new(path)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn pack<P: AsRef<path::Path>>(source: P, target: P, config: P) -> Result<()> {
 | 
			
		||||
    Data::pack(source, target, config)
 | 
			
		||||
pub fn pack<P: AsRef<path::Path>>(config: P) -> Result<()> {
 | 
			
		||||
    Data::pack(config)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn load_icon(path: &Path) -> Result<Icon> {
 | 
			
		||||
    let (icon_rgba, icon_width, icon_height) = {
 | 
			
		||||
        let image = match image::open(path) {
 | 
			
		||||
            Ok(img) => img,
 | 
			
		||||
            Err(e) => return Err(io::Error::new(io::ErrorKind::InvalidData, e)),
 | 
			
		||||
        }
 | 
			
		||||
        .into_rgba8();
 | 
			
		||||
        let (width, height) = image.dimensions();
 | 
			
		||||
        let rgba = image.into_raw();
 | 
			
		||||
        (rgba, width, height)
 | 
			
		||||
    };
 | 
			
		||||
    Ok(Icon {
 | 
			
		||||
        rgba: icon_rgba,
 | 
			
		||||
        width: icon_width,
 | 
			
		||||
        height: icon_height,
 | 
			
		||||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn normalize_path(path: &Path) -> PathBuf {
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,10 @@
 | 
			
		||||
use wry::{
 | 
			
		||||
    application::{
 | 
			
		||||
        event::{Event, StartCause, WindowEvent},
 | 
			
		||||
        event_loop::{ControlFlow, EventLoop},
 | 
			
		||||
        window::WindowBuilder,
 | 
			
		||||
        event_loop::{self, ControlFlow, EventLoop},
 | 
			
		||||
        window::{Fullscreen, Icon, Window, WindowBuilder},
 | 
			
		||||
    },
 | 
			
		||||
    webview::WebViewBuilder,
 | 
			
		||||
    webview::{RpcRequest, WebViewBuilder},
 | 
			
		||||
};
 | 
			
		||||
mod data;
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ const PROTOCOL_PREFIX: &str = "https://{PROTOCOL}.";
 | 
			
		||||
#[cfg(not(windows))]
 | 
			
		||||
const PROTOCOL_PREFIX: &str = "{PROTOCOL}://";
 | 
			
		||||
 | 
			
		||||
const PROTOCOL: &str = "neutauri";
 | 
			
		||||
const PROTOCOL: &str = "neu";
 | 
			
		||||
 | 
			
		||||
fn custom_protocol_uri<T: Into<String>>(protocol: T, path: T) -> String {
 | 
			
		||||
    PROTOCOL_PREFIX.replacen("{PROTOCOL}", &protocol.into(), 1) + &path.into()
 | 
			
		||||
@ -32,26 +32,135 @@ fn custom_protocol_uri_to_path<T: Into<String>>(protocol: T, uri: T) -> wry::Res
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn main() -> wry::Result<()> {
 | 
			
		||||
    let res = data::load(std::env::current_exe()?.as_path())?;
 | 
			
		||||
    data::pack("config.toml")?;
 | 
			
		||||
    let res = match data::load(std::env::current_exe()?.as_path()) {
 | 
			
		||||
        Ok(data) => data,
 | 
			
		||||
        Err(_) => data::load("app.neu")?,
 | 
			
		||||
    };
 | 
			
		||||
    let event_loop = EventLoop::new();
 | 
			
		||||
    let window = WindowBuilder::new().build(&event_loop)?;
 | 
			
		||||
    let _webview = WebViewBuilder::new(window)?
 | 
			
		||||
        .with_transparent(false)
 | 
			
		||||
 | 
			
		||||
    let window_builder = WindowBuilder::new()
 | 
			
		||||
        .with_always_on_top(res.window_attr.always_on_top)
 | 
			
		||||
        .with_decorations(res.window_attr.decorations)
 | 
			
		||||
        .with_resizable(res.window_attr.resizable)
 | 
			
		||||
        .with_title(res.window_attr.title.clone())
 | 
			
		||||
        .with_maximized(res.window_attr.maximized)
 | 
			
		||||
        .with_transparent(res.window_attr.transparent)
 | 
			
		||||
        .with_visible(res.window_attr.visible);
 | 
			
		||||
    let window_builder = match res.window_attr.fullscreen {
 | 
			
		||||
        true => window_builder.with_fullscreen(Some(Fullscreen::Borderless(None))),
 | 
			
		||||
        false => window_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let window_builder = match res.window_attr.window_icon {
 | 
			
		||||
        Some(ref icon) => window_builder.with_window_icon(Some(Icon::from_rgba(
 | 
			
		||||
            icon.rgba.clone(),
 | 
			
		||||
            icon.width,
 | 
			
		||||
            icon.height,
 | 
			
		||||
        )?)),
 | 
			
		||||
        None => window_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let monitor = event_loop
 | 
			
		||||
        .primary_monitor()
 | 
			
		||||
        .unwrap_or_else(|| event_loop.available_monitors().next().unwrap());
 | 
			
		||||
    dbg!(
 | 
			
		||||
        monitor.size(),
 | 
			
		||||
        monitor.name(),
 | 
			
		||||
        monitor.position(),
 | 
			
		||||
        monitor.scale_factor(),
 | 
			
		||||
        monitor.video_modes().collect::<Vec<_>>()
 | 
			
		||||
    );
 | 
			
		||||
    let window_builder = match res.window_attr.inner_size {
 | 
			
		||||
        Some(size) => match size {
 | 
			
		||||
            data::WindowSize::Large => todo!(),
 | 
			
		||||
            data::WindowSize::Medium => todo!(),
 | 
			
		||||
            data::WindowSize::Small => todo!(),
 | 
			
		||||
            data::WindowSize::Fixed(width, height) => todo!(),
 | 
			
		||||
        },
 | 
			
		||||
        None => window_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let window_builder = match res.window_attr.max_inner_size {
 | 
			
		||||
        Some(size) => match size {
 | 
			
		||||
            data::WindowSize::Large => todo!(),
 | 
			
		||||
            data::WindowSize::Medium => todo!(),
 | 
			
		||||
            data::WindowSize::Small => todo!(),
 | 
			
		||||
            data::WindowSize::Fixed(width, height) => todo!(),
 | 
			
		||||
        },
 | 
			
		||||
        None => window_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let window_builder = match res.window_attr.min_inner_size {
 | 
			
		||||
        Some(size) => match size {
 | 
			
		||||
            data::WindowSize::Large => todo!(),
 | 
			
		||||
            data::WindowSize::Medium => todo!(),
 | 
			
		||||
            data::WindowSize::Small => todo!(),
 | 
			
		||||
            data::WindowSize::Fixed(width, height) => todo!(),
 | 
			
		||||
        },
 | 
			
		||||
        None => window_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let window = window_builder.build(&event_loop)?;
 | 
			
		||||
 | 
			
		||||
    let webview_builder = WebViewBuilder::new(window)?;
 | 
			
		||||
    let url = res.webview_attr.url.clone();
 | 
			
		||||
    let webview_builder = match url {
 | 
			
		||||
        Some(url) => {
 | 
			
		||||
            if url.starts_with("/") {
 | 
			
		||||
                webview_builder.with_url(&custom_protocol_uri(PROTOCOL, &url))?
 | 
			
		||||
            } else {
 | 
			
		||||
                webview_builder.with_url(&url)?
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        None => webview_builder.with_url(&custom_protocol_uri(PROTOCOL, "/index.html"))?,
 | 
			
		||||
    };
 | 
			
		||||
    let html = res.webview_attr.html.clone();
 | 
			
		||||
    let webview_builder = match html {
 | 
			
		||||
        Some(html) => webview_builder.with_html(&html)?,
 | 
			
		||||
        None => webview_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let initialization_script = res.webview_attr.initialization_script.clone();
 | 
			
		||||
    let webview_builder = match initialization_script {
 | 
			
		||||
        Some(script) => webview_builder.with_initialization_script(&script),
 | 
			
		||||
        None => webview_builder,
 | 
			
		||||
    };
 | 
			
		||||
    let webview_builder = match res.window_attr.visible {
 | 
			
		||||
        true => webview_builder.with_visible(true),
 | 
			
		||||
        false => webview_builder
 | 
			
		||||
            .with_visible(false)
 | 
			
		||||
            .with_initialization_script(
 | 
			
		||||
                r#"window.addEventListener('load', function(event) { rpc.call('show_window'); });"#,
 | 
			
		||||
            ),
 | 
			
		||||
    };
 | 
			
		||||
    let _webview = webview_builder
 | 
			
		||||
        .with_visible(res.window_attr.visible)
 | 
			
		||||
        .with_transparent(res.window_attr.transparent)
 | 
			
		||||
        .with_custom_protocol(PROTOCOL.to_string(), move |request| {
 | 
			
		||||
            let path = custom_protocol_uri_to_path(PROTOCOL, request.uri())?;
 | 
			
		||||
            let mut file = res.open(path)?;
 | 
			
		||||
            let mut file = match res.open(path) {
 | 
			
		||||
                Ok(file) => file,
 | 
			
		||||
                Err(e) => {
 | 
			
		||||
                    if e.kind() == std::io::ErrorKind::NotFound && res.webview_attr.spa {
 | 
			
		||||
                        res.open("index.html")?
 | 
			
		||||
                    } else {
 | 
			
		||||
                        return Err(wry::Error::Io(e));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
            wry::http::ResponseBuilder::new()
 | 
			
		||||
                .mimetype(&file.mimetype())
 | 
			
		||||
                .body(file.decompressed_data()?)
 | 
			
		||||
        })
 | 
			
		||||
        .with_url(&custom_protocol_uri(PROTOCOL, "/index.html"))?
 | 
			
		||||
        .with_rpc_handler(|window: &Window, req: RpcRequest| {
 | 
			
		||||
            match req.method.as_str() {
 | 
			
		||||
                "show_window" => window.set_visible(true),
 | 
			
		||||
                "ping" => println!("recived a ping"),
 | 
			
		||||
                _ => (),
 | 
			
		||||
            };
 | 
			
		||||
            None
 | 
			
		||||
        })
 | 
			
		||||
        .build()?;
 | 
			
		||||
 | 
			
		||||
    event_loop.run(move |event, _, control_flow| {
 | 
			
		||||
        *control_flow = ControlFlow::Wait;
 | 
			
		||||
 | 
			
		||||
        match event {
 | 
			
		||||
            Event::NewEvents(StartCause::Init) => println!("Wry has started!"),
 | 
			
		||||
            Event::WindowEvent {
 | 
			
		||||
                event: WindowEvent::CloseRequested,
 | 
			
		||||
                ..
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user