diff --git a/Cargo.lock b/Cargo.lock index 52dabd6b4c..278db69a0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -632,7 +632,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ "serde", "termcolor", - "unicode-width 0.1.14", + "unicode-width", ] [[package]] @@ -691,7 +691,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.1", + "unicode-width", "windows-sys 0.60.2", ] @@ -938,6 +938,27 @@ dependencies = [ "crypto-common", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.60.2", +] + [[package]] name = "dispatch" version = "0.2.0" @@ -1799,6 +1820,7 @@ dependencies = [ "base64 0.22.1", "bytemuck", "cef", + "dirs", "graphite-editor", "include_dir", "pollster", @@ -2332,7 +2354,7 @@ checksum = "70a646d946d06bedbbc4cac4c218acf4bbf2d87757a784857025f4d447e4e1cd" dependencies = [ "console", "portable-atomic", - "unicode-width 0.2.1", + "unicode-width", "unit-prefix", "web-time", ] @@ -3328,6 +3350,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "orbclient" version = "0.3.48" @@ -4032,6 +4060,17 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.12", +] + [[package]] name = "regex" version = "1.11.1" @@ -5290,12 +5329,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - [[package]] name = "unicode-width" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index a999485205..035af6384f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -155,6 +155,7 @@ criterion = { version = "0.5", features = ["html_reports"] } iai-callgrind = { version = "0.12.3" } ndarray = "0.16.1" strum = { version = "0.26.3", features = ["derive"] } +dirs = "6.0" [profile.dev] opt-level = 1 diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index fb4b2899a0..9e73c32a9d 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -30,3 +30,4 @@ tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } tracing = "0.1.41" bytemuck = { version = "1.23.1", features = ["derive"] } include_dir = "0.7.4" +dirs.workspace = true diff --git a/desktop/src/cef.rs b/desktop/src/cef.rs index eaa2170354..c79b3a65bd 100644 --- a/desktop/src/cef.rs +++ b/desktop/src/cef.rs @@ -2,6 +2,7 @@ use crate::FrameBuffer; use std::time::Instant; mod context; +mod dirs; mod input; mod internal; mod scheme_handler; diff --git a/desktop/src/cef/context.rs b/desktop/src/cef/context.rs index a19172e189..04ebffb4ab 100644 --- a/desktop/src/cef/context.rs +++ b/desktop/src/cef/context.rs @@ -4,6 +4,8 @@ use cef::{Browser, CefString, Settings, api_hash, args::Args, execute_process}; use thiserror::Error; use winit::event::WindowEvent; +use crate::cef::dirs::{cef_cache_dir, cef_data_dir}; + use super::input::InputState; use super::scheme_handler::{FRONTEND_DOMAIN, GRAPHITE_SCHEME}; use super::{CefEventHandler, input}; @@ -62,6 +64,8 @@ impl Context { windowless_rendering_enabled: 1, multi_threaded_message_loop: 0, external_message_pump: 1, + root_cache_path: cef_data_dir().to_str().map(CefString::from).unwrap(), + cache_path: cef_cache_dir().to_str().map(CefString::from).unwrap(), ..Default::default() }; diff --git a/desktop/src/cef/dirs.rs b/desktop/src/cef/dirs.rs new file mode 100644 index 0000000000..0d4ce6fbc2 --- /dev/null +++ b/desktop/src/cef/dirs.rs @@ -0,0 +1,17 @@ +use std::path::PathBuf; + +use crate::dirs::{ensure_dir_exists, graphite_data_dir}; + +static CEF_DIR_NAME: &str = "browser"; + +pub(crate) fn cef_data_dir() -> PathBuf { + let path = graphite_data_dir().join(CEF_DIR_NAME); + ensure_dir_exists(&path); + path +} + +pub(crate) fn cef_cache_dir() -> PathBuf { + let path = cef_data_dir().join("cache"); + ensure_dir_exists(&path); + path +} diff --git a/desktop/src/dirs.rs b/desktop/src/dirs.rs new file mode 100644 index 0000000000..5e3cf636b8 --- /dev/null +++ b/desktop/src/dirs.rs @@ -0,0 +1,16 @@ +use std::fs::create_dir_all; +use std::path::PathBuf; + +static APP_NAME: &str = "graphite-desktop"; + +pub(crate) fn ensure_dir_exists(path: &PathBuf) { + if !path.exists() { + create_dir_all(path).unwrap_or_else(|_| panic!("Failed to create directory at {path:?}")); + } +} + +pub(crate) fn graphite_data_dir() -> PathBuf { + let path = dirs::data_dir().expect("Failed to get data directory").join(APP_NAME); + ensure_dir_exists(&path); + path +} diff --git a/desktop/src/main.rs b/desktop/src/main.rs index 824f469d0a..ef92e23b7b 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -15,6 +15,8 @@ use render::{FrameBuffer, GraphicsState}; mod app; use app::WinitApp; +mod dirs; + #[derive(Debug)] pub(crate) enum CustomEvent { UiUpdate,