No description
Find a file
Leandro Pérez G. 65d0f0c7c8
feat(wallpaper): apply EXIF orientation to wallpapers (#2075)
Same fix as pop-os/cosmic-bg#142, which was asked for there.

`open_image` has two decoding paths, and neither applies the Exif
orientation:
`ImageReader::decode` for the common formats, and
`DynamicImage::from_decoder` in
`decode_jpegxl`. Cameras store portrait photos with the pixels laid out
landscape
and record the rotation in the Exif metadata, so such a photo is shown
rotated in
the wallpaper page, both in the preview and in the thumbnails.

Both paths now read the orientation from the decoder and apply it to the
decoded
image. `into_decoder` does not check the allocation limit against the
size of the
decoded image the way `decode` does, so that check is kept explicitly.

Tested with the 8 Exif orientation values, with images that carry no
Exif metadata
(unchanged), and with the JPEG XL wallpapers from gnome-backgrounds,
which decode
identically.

cosmic-greeter needs a different change: it does not decode images
itself. It
passes the raw file bytes to `widget::image::Handle::from_bytes`
(src/common.rs),
and those are decoded by `iced_graphics` with `image::load_from_memory`,
which
does not apply the orientation either. So the orientation has to be
applied before
the handle is built, or in the toolkit.

- [x] I have disclosed use of any AI generated code in my commit
messages.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.

Signed-off-by: Leandro Pérez G. <leandropatodo@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-24 17:24:25 +02:00
.github feat(wallpapers): enable avif support via libdav1d 2026-07-07 16:34:25 -06:00
.vscode feat: dropdown popups 2025-03-14 18:12:40 +01:00
.zed chore: add rustfmt config 2026-05-15 16:26:20 -06:00
cosmic-settings fix(sound): source volume changes applied to sink 2026-07-21 11:15:52 -06:00
crates/cosmic-pipewire/src feat(sound): use cosmic-settings-daemon's varlink API 2026-06-15 21:09:03 +02:00
debian build: make avif feature optional but enable by default 2026-07-07 16:34:25 -06:00
i18n feat: reapply frosted glass feature 2026-07-10 19:06:17 +02:00
page chore: add rustfmt config 2026-05-15 16:26:20 -06:00
pages feat(wallpaper): apply EXIF orientation to wallpapers (#2075) 2026-07-24 17:24:25 +02:00
resources feat: reapply frosted glass feature 2026-07-10 19:06:17 +02:00
subscriptions feat(networking): replace custom NetworkManager backend with nmrs 2026-07-14 12:11:48 -04:00
.gitattributes github: ignore i18n subdirectories in language stats 2025-10-01 20:38:08 +02:00
.gitignore chore: add nix flake 2023-06-26 18:22:58 +02:00
cargo.just build: use cargo vendor --locked 2026-01-13 20:50:45 +01:00
Cargo.lock Update cosmic-protocols dep 2026-07-14 12:11:48 -04:00
Cargo.toml Update cosmic-protocols dep 2026-07-14 12:11:48 -04:00
flake.lock chore: update flake 2025-10-22 04:32:19 +02:00
flake.nix fix(nix): Simplify nix flake and fix dependencies 2025-05-28 17:21:45 +02:00
justfile feat: add openrc cargo feature for OpenRC bluetooth service management 2026-06-04 20:34:57 +02:00
LICENSE.md feat: settings application architecture 2023-01-26 23:20:45 +01:00
README.md feat: merge subscriptions crate into cosmic-settings repo 2025-10-08 21:48:23 +02:00
rust-toolchain.toml build: set MSRV to Rust 1.93 2026-04-27 15:08:13 +02:00
rustfmt.toml chore: add rustfmt config 2026-05-15 16:26:20 -06:00
TESTING.md docs (QA): Add Sound page tests (#2099) 2026-07-22 12:35:08 -06:00

COSMIC Settings

The settings application for the COSMIC desktop environment.

Translators

Translations must go through Weblate at https://hosted.weblate.org/projects/pop-os/cosmic-settings.

Distributors

We will accept pull requests for distro-specific features and pages. Make them compile conditionally with a cargo feature.

The accent palettes on the Appearance settings page are configurable through the cosmic-config directory at /usr/share/cosmic/com.system76.CosmicSettings/v1/. One at accent_palette_dark, and another at accent_palette_light. Examples can be found at resources/accent_palette_dark.ron and resources/accent_palette_light.ron. This can be copied locally to ~/.config/cosmic/com.system76.CosmicSettings/v1/ for testing, and then move to /usr/share/cosmic for packaging.

Build

Dependencies

See the Build-Depends section of the debian control file.

Install

COSMIC uses just as its preferred build tool.

just
sudo just install

Packaging

If packaging for a Linux distribution, vendor dependencies locally with the vendor rule, and build with the vendored sources using the build-vendored rule. When installing files, use the rootdir and prefix variables to change installation paths.

just vendor
just build-vendored
just rootdir=debian/cosmic-settings prefix=/usr install

It is recommended to build a source tarball with the vendored dependencies, which can typically be done by running just vendor on the host system before it enters the build environment. Reference debian/rules to see how we generate debian packages with sbuild.

Developers

Developers should install rustup and configure their editor to use rust-analyzer. Run just check to ensure that the changes you make are free of linter warnings. You may configure your editor to run just check-json as the rust-analyzer check command.

Run the cosmic-settings binary with just run so that logs will be emitted to stderr, and crashes will generate detailed backtraces. Applications shouldn't crash, so when writing code, avoid use of unwrap() and expect(). Instead, log errors with tracing::error!() or tracing::warn!().

To improve compilation times, use Rust >= 1.90.0 and configure sccache for use with Rust.

License

Licensed under the GNU Public License 3.0.

Contribution

Any contribution intentionally submitted for inclusion in the work by you shall be licensed under the GNU Public License 3.0 (GPL-3.0). Each source file should have a SPDX copyright notice at the top of the file:

// SPDX-License-Identifier: GPL-3.0-only