feat(wallpaper): get last active image from cosmic-bg when toggling slideshow

This commit is contained in:
Michael Aaron Murphy 2024-01-31 15:13:17 +01:00 committed by Michael Murphy
parent cff91ea1a4
commit d943b5bd70
3 changed files with 93 additions and 56 deletions

83
Cargo.lock generated
View file

@ -120,9 +120,9 @@ dependencies = [
[[package]]
name = "anstyle"
version = "1.0.4"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
checksum = "2faccea4cc4ab4a667ce676a30e8ec13922a692c99bb8f5b11f1502c72e04220"
[[package]]
name = "anstyle-parse"
@ -994,7 +994,7 @@ dependencies = [
[[package]]
name = "cosmic-bg-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/cosmic-bg#6a6fe4e387e46c2e159df56a9768220a6269ccf4"
source = "git+https://github.com/pop-os/cosmic-bg#5c8a91f8904a39af50369dce2557d9ccb923b4b3"
dependencies = [
"colorgrad",
"cosmic-config",
@ -1028,7 +1028,7 @@ dependencies = [
[[package]]
name = "cosmic-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"atomicwrites",
"calloop",
@ -1046,7 +1046,7 @@ dependencies = [
[[package]]
name = "cosmic-config-derive"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"quote",
"syn 1.0.109",
@ -1055,7 +1055,7 @@ dependencies = [
[[package]]
name = "cosmic-panel-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/cosmic-panel#f7c57a093ff88c6b403aad136ec45f15f73edb5e"
source = "git+https://github.com/pop-os/cosmic-panel#9fe7f3ad19f69040ed88441e708f88f80cfc07ce"
dependencies = [
"anyhow",
"cosmic-config",
@ -1192,7 +1192,7 @@ dependencies = [
[[package]]
name = "cosmic-text"
version = "0.10.0"
source = "git+https://github.com/pop-os/cosmic-text.git#e0ae465f918cd1cffca3a8239547dcf8166d3f77"
source = "git+https://github.com/pop-os/cosmic-text.git#0cea55630c97a47207f84e4cc3530404e17b6bfe"
dependencies = [
"bitflags 2.4.2",
"fontdb",
@ -1214,7 +1214,7 @@ dependencies = [
[[package]]
name = "cosmic-theme"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"almost",
"cosmic-config",
@ -1338,9 +1338,9 @@ dependencies = [
[[package]]
name = "darling"
version = "0.20.3"
version = "0.20.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e"
checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8"
dependencies = [
"darling_core",
"darling_macro",
@ -1348,9 +1348,9 @@ dependencies = [
[[package]]
name = "darling_core"
version = "0.20.3"
version = "0.20.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621"
checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3"
dependencies = [
"fnv",
"ident_case",
@ -1362,9 +1362,9 @@ dependencies = [
[[package]]
name = "darling_macro"
version = "0.20.3"
version = "0.20.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77"
dependencies = [
"darling_core",
"quote",
@ -1828,6 +1828,12 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "font-types"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bd7f3ea17572640b606b35df42cfb6ecdf003704b062580e59918692190b73d"
[[package]]
name = "fontconfig-parser"
version = "0.5.6"
@ -2479,7 +2485,7 @@ dependencies = [
[[package]]
name = "iced"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"iced_accessibility",
"iced_core",
@ -2494,7 +2500,7 @@ dependencies = [
[[package]]
name = "iced_accessibility"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"accesskit",
"accesskit_unix",
@ -2503,7 +2509,7 @@ dependencies = [
[[package]]
name = "iced_core"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"bitflags 1.3.2",
"iced_accessibility",
@ -2521,7 +2527,7 @@ dependencies = [
[[package]]
name = "iced_futures"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"futures",
"iced_core",
@ -2534,7 +2540,7 @@ dependencies = [
[[package]]
name = "iced_graphics"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"bitflags 1.3.2",
"bytemuck",
@ -2557,7 +2563,7 @@ dependencies = [
[[package]]
name = "iced_renderer"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"iced_graphics",
"iced_tiny_skia",
@ -2570,7 +2576,7 @@ dependencies = [
[[package]]
name = "iced_runtime"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"iced_accessibility",
"iced_core",
@ -2582,7 +2588,7 @@ dependencies = [
[[package]]
name = "iced_sctk"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"enum-repr",
"float-cmp",
@ -2606,7 +2612,7 @@ dependencies = [
[[package]]
name = "iced_style"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"iced_core",
"once_cell",
@ -2616,7 +2622,7 @@ dependencies = [
[[package]]
name = "iced_tiny_skia"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"bytemuck",
"cosmic-text",
@ -2634,7 +2640,7 @@ dependencies = [
[[package]]
name = "iced_wgpu"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"bitflags 1.3.2",
"bytemuck",
@ -2654,7 +2660,7 @@ dependencies = [
[[package]]
name = "iced_widget"
version = "0.12.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"iced_renderer",
"iced_runtime",
@ -3060,7 +3066,7 @@ checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
[[package]]
name = "libcosmic"
version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#1291a48d4d62f1da5ca178292a3ce0082204d8d4"
source = "git+https://github.com/pop-os/libcosmic#bf0508816b7e7098cfcc6eb16ee288207ef0cc31"
dependencies = [
"apply",
"ashpd",
@ -4014,9 +4020,9 @@ dependencies = [
[[package]]
name = "profiling"
version = "1.0.13"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d135ede8821cf6376eb7a64148901e1690b788c11ae94dc297ae917dbc91dc0e"
checksum = "0f0f7f43585c34e4fdd7497d746bc32e14458cf11c69341cc0587b1d825dde42"
[[package]]
name = "ptr_meta"
@ -4154,6 +4160,15 @@ version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f"
[[package]]
name = "read-fonts"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7555e052e772f964a1c99f1434f6a2c3a47a5f8e4292236921f121a7753cb2b5"
dependencies = [
"font-types",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
@ -4833,10 +4848,11 @@ dependencies = [
[[package]]
name = "swash"
version = "0.1.8"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b7c73c813353c347272919aa1af2885068b05e625e5532b43049e4f641ae77f"
checksum = "53dab2b2dc9257aead8a24ef0481b253f4c73479ce4d3b4266792dce6870d4f3"
dependencies = [
"read-fonts",
"yazi",
"zeno",
]
@ -4877,14 +4893,13 @@ dependencies = [
[[package]]
name = "synstructure"
version = "0.13.0"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "285ba80e733fac80aa4270fbcdf83772a79b80aa35c97075320abfee4a915b06"
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.48",
"unicode-xid",
]
[[package]]

View file

@ -315,10 +315,19 @@ impl Page {
}
fn cache_display_image(&mut self) {
self.cached_display_handle = None;
let choice = match self.selection.active {
Choice::Wallpaper(id) => self.selection.display_images.get(id),
Choice::Slideshow => self.selection.display_images.values().next(),
Choice::Slideshow => self
.config_output()
.and_then(|output| {
let path = wallpaper::current_image(output).ok()?;
let id = self.wallpaper_id_from_path(&path)?;
Some(&self.selection.display_images[id])
})
.or(self.selection.display_images.values().next()),
Choice::Color(_) => None,
};
@ -327,8 +336,6 @@ impl Page {
return;
};
self.cached_display_handle = None;
let temp_image;
let image = match self.selected_fit {
@ -369,20 +376,19 @@ impl Page {
));
}
fn config_output(&self) -> Option<String> {
fn config_output(&self) -> Option<&str> {
if self.wallpaper_service_config.same_on_all {
Some(String::from("all"))
Some("all")
} else {
self.outputs
.active_data::<OutputName>()
.cloned()
.map(|name| name.0)
.map(|name| name.0.as_str())
}
}
/// Applies the current settings to cosmic-bg.
pub fn config_apply(&mut self) {
let Some(output) = self.config_output() else {
let Some(output) = self.config_output().map(String::from) else {
return;
};
@ -400,10 +406,9 @@ impl Page {
let entry = match self.selection.active {
Choice::Slideshow => {
match self.config_wallpaper_entry(
output.clone(),
self.config.current_folder().to_path_buf(),
) {
match self
.config_wallpaper_entry(output, self.config.current_folder().to_path_buf())
{
Some(entry) => entry,
None => return,
}
@ -411,7 +416,7 @@ impl Page {
Choice::Wallpaper(key) => {
if let Some(path) = self.selection.paths.get(key) {
match self.config_wallpaper_entry(output.clone(), path.clone()) {
match self.config_wallpaper_entry(output, path.clone()) {
Some(entry) => entry,
None => return,
}
@ -420,9 +425,7 @@ impl Page {
}
}
Choice::Color(ref color) => {
Entry::new(output.clone(), wallpaper::Source::Color(color.clone()))
}
Choice::Color(ref color) => Entry::new(output, wallpaper::Source::Color(color.clone())),
};
wallpaper::set(&mut self.wallpaper_service_config, entry);
@ -767,6 +770,20 @@ impl Page {
self.selection.active = Choice::Slideshow;
self.cache_display_image();
} else {
if let Some(output) = self.config_output() {
if let Ok(path) = wallpaper::current_image(output) {
if let Some(entity) = self.wallpaper_id_from_path(&path) {
if let Some(entry) =
self.config_wallpaper_entry(output.to_owned(), path)
{
self.select_wallpaper(&entry, entity, false);
self.config_apply();
return Command::none();
}
}
}
}
self.select_first_wallpaper();
}
}
@ -908,8 +925,9 @@ impl Page {
};
if let Some(output) = self.config_output() {
if let Some(entry) = self.config_wallpaper_entry(output, path.clone()) {
self.select_wallpaper(&entry, entity, path.is_dir());
let is_slideshow = path.is_dir();
if let Some(entry) = self.config_wallpaper_entry(output.to_owned(), path.clone()) {
self.select_wallpaper(&entry, entity, is_slideshow);
}
}
}

View file

@ -43,6 +43,10 @@ pub const DEFAULT_COLORS: &[Color] = &[
}),
];
pub fn current_image(output: &str) -> Result<PathBuf, cosmic_config::Error> {
cosmic_bg_config::context()?.current_image(output)
}
pub async fn config() -> (Config, HashMap<String, (String, (u32, u32))>) {
let mut displays = HashMap::new();
@ -52,9 +56,9 @@ pub async fn config() -> (Config, HashMap<String, (String, (u32, u32))>) {
}
}
let helper = Config::helper().expect("failed to get helper for cosmic bg config");
let context = cosmic_bg_config::context().expect("failed to get helper for cosmic bg config");
let config = match Config::load(&helper) {
let config = match Config::load(&context) {
Ok(conf) => conf,
Err(why) => {
tracing::warn!(?why, "Config file error, falling back to defaults");
@ -66,8 +70,8 @@ pub async fn config() -> (Config, HashMap<String, (String, (u32, u32))>) {
}
pub fn set(config: &mut Config, entry: Entry) {
if let Ok(context) = Config::helper() {
let _res = Config::set_same_on_all(&context, config.same_on_all);
if let Ok(context) = cosmic_bg_config::context() {
let _res = context.set_same_on_all(config.same_on_all);
if let Err(why) = config.set_entry(&context, entry) {
tracing::error!(?why, "failed to set background");