feat: high contrast toggle (#1039)
This commit is contained in:
parent
ba53a94e09
commit
efabc394fc
4 changed files with 110 additions and 19 deletions
34
Cargo.lock
generated
34
Cargo.lock
generated
|
|
@ -1519,7 +1519,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "cosmic-config"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"atomicwrites",
|
||||
"cosmic-config-derive",
|
||||
|
|
@ -1541,7 +1541,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "cosmic-config-derive"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
|
|
@ -1822,8 +1822,8 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "cosmic-text"
|
||||
version = "0.12.1"
|
||||
source = "git+https://github.com/pop-os/cosmic-text.git#974ddaed96b334f560b606ebe5d2ca2d2f9f23ef"
|
||||
version = "0.13.1"
|
||||
source = "git+https://github.com/pop-os/cosmic-text.git#60f2c2b0c2e7cf8734b3ad0fc94ef7bce94f649b"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
"fontdb 0.16.2",
|
||||
|
|
@ -1845,7 +1845,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "cosmic-theme"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"almost",
|
||||
"cosmic-config",
|
||||
|
|
@ -3216,7 +3216,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"dnd",
|
||||
"iced_accessibility",
|
||||
|
|
@ -3234,7 +3234,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_accessibility"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"accesskit",
|
||||
"accesskit_winit",
|
||||
|
|
@ -3243,7 +3243,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_core"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
"bytes",
|
||||
|
|
@ -3268,7 +3268,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_futures"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"iced_core",
|
||||
|
|
@ -3294,7 +3294,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_graphics"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"bitflags 2.8.0",
|
||||
"bytemuck",
|
||||
|
|
@ -3316,7 +3316,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_renderer"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"iced_graphics",
|
||||
"iced_tiny_skia",
|
||||
|
|
@ -3328,7 +3328,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_runtime"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"cosmic-client-toolkit",
|
||||
|
|
@ -3344,7 +3344,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_tiny_skia"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"cosmic-text",
|
||||
|
|
@ -3360,7 +3360,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_wgpu"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"as-raw-xcb-connection",
|
||||
"bitflags 2.8.0",
|
||||
|
|
@ -3391,7 +3391,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_widget"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"cosmic-client-toolkit",
|
||||
"dnd",
|
||||
|
|
@ -3410,7 +3410,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "iced_winit"
|
||||
version = "0.14.0-dev"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"cosmic-client-toolkit",
|
||||
"dnd",
|
||||
|
|
@ -4416,7 +4416,7 @@ checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
|
|||
[[package]]
|
||||
name = "libcosmic"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/pop-os/libcosmic#50d2104485649bdddf1247f63ec3cf2eb81c5817"
|
||||
source = "git+https://github.com/pop-os/libcosmic#64ddcb3bf2aed84256fe8261a0b05e1831720463"
|
||||
dependencies = [
|
||||
"apply",
|
||||
"ashpd 0.9.2",
|
||||
|
|
|
|||
|
|
@ -800,6 +800,21 @@ impl cosmic::Application for SettingsApp {
|
|||
.dialog(self.active_page)
|
||||
.map(|e| e.map(Message::PageMessage))
|
||||
}
|
||||
|
||||
fn system_theme_update(
|
||||
&mut self,
|
||||
_keys: &[&'static str],
|
||||
new_theme: &cosmic::cosmic_theme::Theme,
|
||||
) -> Task<Self::Message> {
|
||||
if let Some(page) = self.pages.page_mut::<accessibility::Page>() {
|
||||
page.update(accessibility::Message::SystemTheme(Box::new(
|
||||
new_theme.clone(),
|
||||
)))
|
||||
.map(Into::into)
|
||||
} else {
|
||||
Task::none()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SettingsApp {
|
||||
|
|
|
|||
|
|
@ -1,10 +1,13 @@
|
|||
use cosmic::{
|
||||
app,
|
||||
cosmic_theme::{CosmicPalette, ThemeBuilder},
|
||||
iced_core::text::Wrapping,
|
||||
theme,
|
||||
theme::{self, CosmicTheme},
|
||||
widget::{button, container, horizontal_space, icon, settings, text},
|
||||
Apply,
|
||||
Apply, Task,
|
||||
};
|
||||
pub use cosmic_comp_config::ZoomMovement;
|
||||
use cosmic_config::CosmicConfigEntry;
|
||||
use cosmic_settings_page::{
|
||||
self as page,
|
||||
section::{self, Section},
|
||||
|
|
@ -14,6 +17,7 @@ use slotmap::SlotMap;
|
|||
|
||||
pub mod magnifier;
|
||||
mod wayland;
|
||||
use tokio::task::spawn_blocking;
|
||||
pub use wayland::{AccessibilityEvent, AccessibilityRequest};
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
|
|
@ -23,6 +27,8 @@ pub struct Page {
|
|||
|
||||
wayland_available: bool,
|
||||
wayland_thread: Option<wayland::Sender>,
|
||||
theme: Box<cosmic::cosmic_theme::Theme>,
|
||||
high_contrast: Option<bool>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
|
@ -30,6 +36,8 @@ pub enum Message {
|
|||
Event(wayland::AccessibilityEvent),
|
||||
ProtocolUnavailable,
|
||||
Return,
|
||||
HighContrast(bool),
|
||||
SystemTheme(Box<cosmic::cosmic_theme::Theme>),
|
||||
}
|
||||
|
||||
impl page::Page<crate::pages::Message> for Page {
|
||||
|
|
@ -110,6 +118,7 @@ pub fn vision() -> section::Section<crate::pages::Message> {
|
|||
on = fl!("accessibility", "on");
|
||||
off = fl!("accessibility", "off");
|
||||
unavailable = fl!("accessibility", "unavailable");
|
||||
high_contrast = fl!("accessibility", "high-contrast");
|
||||
});
|
||||
|
||||
Section::default()
|
||||
|
|
@ -154,6 +163,13 @@ pub fn vision() -> section::Section<crate::pages::Message> {
|
|||
.then_some(crate::pages::Message::Page(magnifier_entity)),
|
||||
)
|
||||
})
|
||||
.add(
|
||||
cosmic::Element::from(
|
||||
settings::item::builder(&descriptions[high_contrast])
|
||||
.toggler(page.theme.is_high_contrast, Message::HighContrast),
|
||||
)
|
||||
.map(crate::pages::Message::Accessibility),
|
||||
)
|
||||
.into()
|
||||
})
|
||||
}
|
||||
|
|
@ -170,6 +186,65 @@ impl Page {
|
|||
Message::Return => {
|
||||
return cosmic::iced::Task::done(crate::app::Message::Page(self.entity))
|
||||
}
|
||||
Message::SystemTheme(theme) => {
|
||||
self.theme = theme;
|
||||
}
|
||||
Message::HighContrast(enabled) => {
|
||||
if self.theme.is_high_contrast == enabled
|
||||
|| self.high_contrast.is_some_and(|hc| hc == enabled)
|
||||
{
|
||||
return Task::none();
|
||||
}
|
||||
self.high_contrast = Some(enabled);
|
||||
|
||||
_ = std::thread::spawn(move || {
|
||||
let set_hc = |is_dark: bool| {
|
||||
let builder_config = if is_dark {
|
||||
ThemeBuilder::dark_config()?
|
||||
} else {
|
||||
ThemeBuilder::light_config()?
|
||||
};
|
||||
let mut builder = match ThemeBuilder::get_entry(&builder_config) {
|
||||
Ok(b) => b,
|
||||
Err((errs, b)) => {
|
||||
tracing::warn!("{errs:?}");
|
||||
b
|
||||
}
|
||||
};
|
||||
|
||||
builder.palette = if is_dark {
|
||||
if enabled {
|
||||
CosmicPalette::HighContrastDark(builder.palette.inner())
|
||||
} else {
|
||||
CosmicPalette::Dark(builder.palette.inner())
|
||||
}
|
||||
} else if enabled {
|
||||
CosmicPalette::HighContrastLight(builder.palette.inner())
|
||||
} else {
|
||||
CosmicPalette::Light(builder.palette.inner())
|
||||
};
|
||||
builder.write_entry(&builder_config)?;
|
||||
|
||||
let new_theme = builder.build();
|
||||
|
||||
let theme_config = if is_dark {
|
||||
CosmicTheme::dark_config()?
|
||||
} else {
|
||||
CosmicTheme::light_config()?
|
||||
};
|
||||
|
||||
new_theme.write_entry(&theme_config)?;
|
||||
|
||||
Result::<(), cosmic_config::Error>::Ok(())
|
||||
};
|
||||
if let Err(err) = set_hc(true) {
|
||||
tracing::warn!("{err:?}");
|
||||
}
|
||||
if let Err(err) = set_hc(false) {
|
||||
tracing::warn!("{err:?}");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
cosmic::iced::Task::none()
|
||||
|
|
|
|||
|
|
@ -134,6 +134,7 @@ accessibility = Accessibility
|
|||
.on = On
|
||||
.off = Off
|
||||
.unavailable = Unavailable
|
||||
.high-contrast = High contrast mode
|
||||
magnifier = Magnifier
|
||||
.controls = Or use these shortcuts: { $zoom_in ->
|
||||
[zero] {""}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue