Skip to content

Commit f2fb25f

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

6 files changed

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

0 commit comments

Comments
 (0)