From 7565a0353989ba693a177025199b3e4da24cdc62 Mon Sep 17 00:00:00 2001 From: Fabricio Silva Date: Tue, 5 May 2026 23:46:56 +0100 Subject: [PATCH] Add "screensaver" gallery to intermissions (same as Nickel default behaviour) --- contrib/Settings-sample.toml | 2 +- crates/core/src/settings/mod.rs | 1 + crates/core/src/view/intermission.rs | 23 ++++++++++++++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/contrib/Settings-sample.toml b/contrib/Settings-sample.toml index 84f8ae5..d4f963f 100644 --- a/contrib/Settings-sample.toml +++ b/contrib/Settings-sample.toml @@ -67,7 +67,7 @@ name = "KePub" path = "/mnt/onboard/.kobo/kepub" # Defines the images displayed when entering an intermission. -# Possible values: "logo:", "cover:", "/path/to/image/file". +# Possible values: "logo:", "cover:", "screensaver:", "/path/to/image/file". # If a relative file path is given, it will be relative to # the installation directory. [intermissions] diff --git a/crates/core/src/settings/mod.rs b/crates/core/src/settings/mod.rs index 2a270ab..c55f989 100644 --- a/crates/core/src/settings/mod.rs +++ b/crates/core/src/settings/mod.rs @@ -21,6 +21,7 @@ pub const INTERNAL_CARD_ROOT: &str = "/mnt/onboard"; pub const EXTERNAL_CARD_ROOT: &str = "/mnt/sd"; pub const LOGO_SPECIAL_PATH: &str = "logo:"; pub const COVER_SPECIAL_PATH: &str = "cover:"; +pub const SCREENSAVER_SPECIAL_PATH: &str = "screensaver:"; // Default font size in points. pub const DEFAULT_FONT_SIZE: f32 = 11.0; // Default margin width in millimeters. diff --git a/crates/core/src/view/intermission.rs b/crates/core/src/view/intermission.rs index 8811d52..7b4202e 100644 --- a/crates/core/src/view/intermission.rs +++ b/crates/core/src/view/intermission.rs @@ -5,7 +5,7 @@ use crate::geom::Rectangle; use crate::font::{Fonts, font_from_style, DISPLAY_STYLE}; use super::{View, Event, Hub, Bus, Id, ID_FEEDER, RenderQueue}; use crate::framebuffer::Framebuffer; -use crate::settings::{IntermKind, LOGO_SPECIAL_PATH, COVER_SPECIAL_PATH}; +use crate::settings::{IntermKind, LOGO_SPECIAL_PATH, COVER_SPECIAL_PATH, SCREENSAVER_SPECIAL_PATH}; use crate::metadata::{SortMethod, BookQuery, sort}; use crate::color::{TEXT_NORMAL, TEXT_INVERTED_HARD}; use crate::context::Context; @@ -42,6 +42,27 @@ impl Intermission { Message::Text(kind.text().to_string()) } }, + Some(SCREENSAVER_SPECIAL_PATH) => { + let dir = PathBuf::from("/mnt/onboard/.kobo/screensaver"); + let mut files: Vec<_> = std::fs::read_dir(&dir).ok() + .map(|rd| rd.filter_map(|e| e.ok()) + .filter(|e| e.file_name() + .to_str() + .map(|name| !name.starts_with('.')) + .unwrap_or(false)) + .map(|e| e.path()) + .filter(|p| p.extension() + .map(|e| e.eq_ignore_ascii_case("png")) + .unwrap_or(false)) + .collect()) + .unwrap_or_default(); + if !files.is_empty() { + let index = (chrono::Local::now().timestamp_subsec_nanos() as usize) % files.len(); + Message::Image(files.swap_remove(index)) + } else { + Message::Text(kind.text().to_string()) + } + }, _ => Message::Image(path.clone()), }; Intermission { -- 2.51.2