Skip to content

Commit 6a51fd3

Browse files
committed
framework: Add package for official wallpapers
Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent 72674a6 commit 6a51fd3

6 files changed

Lines changed: 174 additions & 0 deletions

File tree

framework/12-inch/common/default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
../../bluetooth.nix
77
../../kmod.nix
88
../../framework-tool.nix
9+
../../wallpapers.nix
910
];
1011

1112
# Fix TRRS headphones missing a mic

framework/13-inch/common/default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
../../bluetooth.nix
77
../../kmod.nix
88
../../framework-tool.nix
9+
../../wallpapers.nix
910
./audio.nix
1011
];
1112

framework/16-inch/common/default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
../../bluetooth.nix
77
../../kmod.nix
88
../../framework-tool.nix
9+
../../wallpapers.nix
910
];
1011

1112
# For fingerprint support

framework/README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,33 @@ On AMD Framework 13 and 16, before kernel 6.10, additional kernel patches are re
6262
properly. Manually setting `hardware.framework.enableKmod = true` will apply the patches, requiring a kernel
6363
recompilation.
6464

65+
## Wallpapers
66+
67+
Framework publishes [wallpaper packs](https://frame.work/wallpapers) for each
68+
laptop and the Framework Desktop. Each pack is opt-in and registers with GNOME
69+
and KDE Plasma's wallpaper pickers. Enable the one(s) matching your hardware:
70+
71+
```nix
72+
# Just the Framework Laptop 13 Pro (Intel Core Ultra Series 3) pack
73+
hardware.framework.wallpapers.laptop13pro.enable = true;
74+
75+
# Or install every pack
76+
hardware.framework.wallpapers.enableAll = true;
77+
```
78+
79+
Available packs: `desktop`, `laptop12`, `laptop13`, `laptop13pro`, `laptop16`.
80+
81+
Once enabled, the wallpapers appear in GNOME's *Settings → Appearance* and
82+
KDE Plasma's wallpaper picker. To set one as the default in GNOME, add a
83+
GSettings override, e.g.:
84+
85+
```nix
86+
services.desktopManager.gnome.extraGSettingsOverrides = ''
87+
[org.gnome.desktop.background]
88+
picture-uri='file:///run/current-system/sw/share/backgrounds/framework-laptop13pro-wallpapers/framework-laptop13pro-1.png'
89+
'';
90+
```
91+
6592
## Support Tools
6693

6794
### fw-ectool

framework/desktop/amd-ai-max-300-series/default.nix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
../../../common/gpu/amd
1212
../../../common/pc/ssd
1313
../../framework-tool.nix
14+
../../wallpapers.nix
1415
];
1516

1617
# 6.14 and above have good GPU support

framework/wallpapers.nix

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# Framework-branded wallpaper packs, installed system-wide so GNOME and
2+
# KDE Plasma wallpaper pickers can find them.
3+
#
4+
# Each pack is opt-in; pick the ones that match your hardware, for example:
5+
# hardware.framework.wallpapers.laptop13pro.enable = true;
6+
#
7+
# Or enable every pack at once:
8+
# hardware.framework.wallpapers.enableAll = true;
9+
#
10+
# To set one as the default in GNOME, add a GSettings override, e.g.:
11+
# services.desktopManager.gnome.extraGSettingsOverrides = ''
12+
# [org.gnome.desktop.background]
13+
# picture-uri='file:///run/current-system/sw/share/backgrounds/framework-laptop13pro-wallpapers/framework-laptop13pro-1.png'
14+
# '';
15+
{
16+
config,
17+
lib,
18+
pkgs,
19+
...
20+
}:
21+
let
22+
cfg = config.hardware.framework.wallpapers;
23+
24+
mkPack =
25+
{
26+
id,
27+
url,
28+
hash
29+
}:
30+
pkgs.stdenvNoCC.mkDerivation {
31+
pname = "framework-${id}-wallpapers";
32+
version = "2026-04-24";
33+
src = pkgs.fetchzip {
34+
inherit url hash;
35+
stripRoot = false;
36+
};
37+
38+
dontConfigure = true;
39+
dontBuild = true;
40+
41+
installPhase = ''
42+
runHook preInstall
43+
44+
bg_dir="$out/share/backgrounds/framework-${id}-wallpapers"
45+
mkdir -p "$bg_dir" "$out/share/gnome-background-properties"
46+
47+
xml="$out/share/gnome-background-properties/framework-${id}.xml"
48+
{
49+
echo '<?xml version="1.0" encoding="UTF-8"?>'
50+
echo '<!DOCTYPE wallpapers SYSTEM "gnome-wp-list.dtd">'
51+
echo '<wallpapers>'
52+
} > "$xml"
53+
54+
i=1
55+
while IFS= read -r -d "" f; do
56+
base=$(basename "$f")
57+
ext="''${base##*.}"
58+
name="''${base%.*}"
59+
slug="framework-${id}-$i"
60+
dest="$bg_dir/$slug.$ext"
61+
cp "$f" "$dest"
62+
63+
{
64+
echo ' <wallpaper deleted="false">'
65+
echo " <name>$name</name>"
66+
echo " <filename>$dest</filename>"
67+
echo ' <options>zoom</options>'
68+
echo ' <shade_type>solid</shade_type>'
69+
echo ' <pcolor>#000000</pcolor>'
70+
echo ' <scolor>#000000</scolor>'
71+
echo ' </wallpaper>'
72+
} >> "$xml"
73+
74+
kde_dir="$out/share/wallpapers/$slug/contents/images"
75+
mkdir -p "$kde_dir"
76+
ln -s "$dest" "$kde_dir/$slug.$ext"
77+
{
78+
echo '[Desktop Entry]'
79+
echo "Name=$name"
80+
echo "X-KDE-PluginInfo-Name=$slug"
81+
} > "$out/share/wallpapers/$slug/metadata.desktop"
82+
83+
i=$((i + 1))
84+
done < <(find "$src" -type f \( -iname '*.png' -o -iname '*.jpg' \) -print0 | sort -z)
85+
86+
echo '</wallpapers>' >> "$xml"
87+
88+
runHook postInstall
89+
'';
90+
91+
meta = {
92+
description = "Framework ${id} wallpaper pack";
93+
homepage = "https://frame.work/wallpapers";
94+
platforms = lib.platforms.all;
95+
};
96+
};
97+
98+
packs = {
99+
desktop = mkPack {
100+
id = "desktop";
101+
url = "https://downloads.frame.work/assets/framework-desktop-wallpaper-pack.zip";
102+
hash = "sha256-MRCBf+8lWJMf6xys3aV4a5yeJOfrqU0ntoEGV7QAGe4=";
103+
};
104+
laptop12 = mkPack {
105+
id = "laptop12";
106+
url = "https://downloads.frame.work/assets/framework-laptop12-wallpaper-pack.zip";
107+
hash = "sha256-r6VCLMBd0HtR9YzDg94UB7FuuNa4PTsjvpPCR3MHKRA=";
108+
};
109+
laptop13 = mkPack {
110+
id = "laptop13";
111+
url = "https://downloads.frame.work/assets/framework-laptop13-wallpaper-pack.zip";
112+
hash = "sha256-biTp0uoEFScCyulszGSwdceC97xouOMQgoivB43vZpo=";
113+
};
114+
laptop13pro = mkPack {
115+
id = "laptop13pro";
116+
url = "https://downloads.frame.work/assets/framework-laptop13pro-wallpaper-pack.zip";
117+
hash = "sha256-BHo7glMjORE5IPRPTfScJ4QBXqiu/+Ga7oruH6rHYms=";
118+
};
119+
laptop16 = mkPack {
120+
id = "laptop16";
121+
url = "https://downloads.frame.work/assets/framework-laptop16-wallpaper-pack.zip";
122+
hash = "sha256-u+zWlIVZ/Gqk71F6r35Y1akLCwcVxcP/CzDZWcmsSU8=";
123+
};
124+
};
125+
in
126+
{
127+
options.hardware.framework.wallpapers = {
128+
enableAll = lib.mkEnableOption "all Framework wallpaper packs";
129+
desktop.enable = lib.mkEnableOption "the Framework Desktop wallpaper pack";
130+
laptop12.enable = lib.mkEnableOption "the Framework Laptop 12 wallpaper pack";
131+
laptop13.enable = lib.mkEnableOption "the Framework Laptop 13 wallpaper pack";
132+
laptop13pro.enable = lib.mkEnableOption "the Framework Laptop 13 Pro wallpaper pack";
133+
laptop16.enable = lib.mkEnableOption "the Framework Laptop 16 wallpaper pack";
134+
};
135+
136+
config.environment.systemPackages = lib.concatLists [
137+
(lib.optional (cfg.enableAll || cfg.desktop.enable) packs.desktop)
138+
(lib.optional (cfg.enableAll || cfg.laptop12.enable) packs.laptop12)
139+
(lib.optional (cfg.enableAll || cfg.laptop13.enable) packs.laptop13)
140+
(lib.optional (cfg.enableAll || cfg.laptop13pro.enable) packs.laptop13pro)
141+
(lib.optional (cfg.enableAll || cfg.laptop16.enable) packs.laptop16)
142+
];
143+
}

0 commit comments

Comments
 (0)