From 886a2cff7526bd416d4a5392761760cd6a46661e Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sun, 20 Nov 2022 22:39:30 -0500 Subject: [PATCH] Embed the res directory in the binary ...and extract to a temporary directory when needed (if `PARROTD_RESOURCE_DIR` is not defined) --- Cargo.lock | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 2 ++ src/main.rs | 16 +++++++++++- 3 files changed, 88 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e6de683..9265c43 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -144,6 +144,15 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + [[package]] name = "field-offset" version = "0.3.4" @@ -420,6 +429,34 @@ dependencies = [ "libc", ] +[[package]] +name = "include_dir" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18762faeff7122e89e0857b02f7ce6fcc0d101d5e9ad2ad7846cc01d61b7f19e" +dependencies = [ + "include_dir_macros", +] + +[[package]] +name = "include_dir_macros" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b139284b5cf57ecfa712bcc66950bb635b31aff41c188e8a4cfc758eca374a3f" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + [[package]] name = "libappindicator" version = "0.7.1" @@ -544,8 +581,10 @@ dependencies = [ "alphanumeric-sort", "glib", "gtk", + "include_dir", "libappindicator", "sysinfo", + "tempfile", ] [[package]] @@ -652,6 +691,24 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + [[package]] name = "rustc_version" version = "0.3.3" @@ -745,6 +802,20 @@ dependencies = [ "version-compare", ] +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall", + "remove_dir_all", + "winapi", +] + [[package]] name = "thiserror" version = "1.0.37" diff --git a/Cargo.toml b/Cargo.toml index 11f771c..8f329fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,5 @@ gtk = "0.15" glib = "0.15" sysinfo = "0.26" alphanumeric-sort = "1.4" +include_dir = "0.7" +tempfile = "3" diff --git a/src/main.rs b/src/main.rs index 15aac16..0bc7760 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,6 +10,9 @@ use pack::*; use std::cell::RefCell; use std::time::{Duration, Instant}; use sysinfo::*; +use include_dir::{include_dir, Dir}; + +static EMBEDDED_RES: Dir<'_> = include_dir!("$CARGO_MANIFEST_DIR/res"); thread_local! { static SYSTEM: RefCell = RefCell::new(System::new_all()); @@ -45,7 +48,14 @@ fn init_indicator(icon_pack: &IconPack) -> AppIndicator { fn main() { gtk::init().unwrap(); - let res_dir = std::env::var("PARROTD_RESOURCE_DIR").unwrap_or("./res".to_owned()); + let tmp_dir = tempfile::tempdir(); + + let _tmp_dir = tmp_dir.as_ref(); + let res_dir = std::env::var("PARROTD_RESOURCE_DIR").unwrap_or_else(|_| { + let tmp_dir = _tmp_dir.expect("Cannot create temporary directory"); + EMBEDDED_RES.extract(tmp_dir.path()).unwrap(); + tmp_dir.path().to_str().unwrap().to_string() + }); let pack_name = std::env::var("PARROTD_ICON_PACK").unwrap_or("parrot".to_owned()); let variant = PackVariant::parse( &std::env::var("PARROTD_VARIANT").unwrap_or("dark".to_owned())).expect("Invalid variant name"); @@ -75,4 +85,8 @@ fn main() { }); gtk::main(); + + if let Ok(tmp_dir) = tmp_dir { + tmp_dir.close().unwrap(); + } }