Bridge DMS rendering through NixGL

This commit is contained in:
wuyang
2026-07-27 17:11:49 +08:00
parent 475b87e903
commit 27da2e9dbe
7 changed files with 132 additions and 26 deletions
+5 -2
View File
@@ -26,8 +26,8 @@ Engine 创意工坊图片,不修改显示器分辨率、缩放和排列。
curl -fsSL https://git.k1412.top/wuyang/niri-beyond-glass/raw/branch/main/install.sh | bash
```
首次安装需要编译 Niri,并下载约 700 MB 的隔离 DMS 运行环境,最终约占用
2.2 GB。脚本会调用 `sudo` 安装依赖,但必须以普通用户运行。完成后注销,在
首次安装需要编译 Niri,并下载隔离 DMS 运行环境与 NixGL 图形驱动桥接
最终约占用 3.3 GB。脚本会调用 `sudo` 安装依赖,但必须以普通用户运行。完成后注销,在
GDM 会话菜单选择 **Niri**
已经运行过旧版安装器但顶栏风格不一致时,直接再次运行同一命令。脚本会跳过
@@ -105,6 +105,8 @@ curl -fsSL https://git.k1412.top/wuyang/niri-beyond-glass/raw/branch/main/uninst
`/usr/local` 编译安装 0.3.0。
- Ubuntu 24.04 的 PPA 没有 DMS/Quickshell 软件包,因此使用 Ubuntu 自带 Nix
作为隔离兼容层;这不把 Ubuntu 转换为 NixOS。
- Quickshell 通过 64 位 NixGL 桥接 Ubuntu 的 OpenGL/Vulkan 驱动;不安装
DMS 不需要的 32 位图形库。
- 不安装 DMS Greeter,登录界面仍由 GDM 管理;DMS 锁屏属于 Niri 会话内部。
- 壁纸和显示器布局不会从作者机器迁移。
- NVIDIA 用户应先确保 Ubuntu 官方驱动在 GNOME Wayland 下工作正常。
@@ -114,6 +116,7 @@ curl -fsSL https://git.k1412.top/wuyang/niri-beyond-glass/raw/branch/main/uninst
- [Niri](https://github.com/niri-wm/niri)
- [DankMaterialShell](https://github.com/AvengeMedia/DankMaterialShell)
- [Quickshell](https://quickshell.org/)
- [NixGL](https://github.com/nix-community/nixGL)
- [Xwayland Satellite](https://github.com/Supreeeme/xwayland-satellite)
## License
-1
View File
@@ -23,7 +23,6 @@ input {
}
spawn-at-startup "xwayland-satellite"
spawn-at-startup "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1"
spawn-sh-at-startup "systemctl --user start dms.service"
hotkey-overlay {
+45
View File
@@ -0,0 +1,45 @@
{
"nodes": {
"nixgl": {
"flake": false,
"locked": {
"lastModified": 1762090880,
"narHash": "sha256-fbRQzIGPkjZa83MowjbD2ALaJf9y6KMDdJBQMKFeY/8=",
"owner": "nix-community",
"repo": "nixGL",
"rev": "b6105297e6f0cd041670c3e8628394d4ee247ed5",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixGL",
"rev": "b6105297e6f0cd041670c3e8628394d4ee247ed5",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1783224372,
"narHash": "sha256-8i/87eeoqiGE4yOTjwSA3Eh/ziJRQEmd/unYU+K27sk=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "d407951447dcd00442e97087bf374aad70c04cea",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "d407951447dcd00442e97087bf374aad70c04cea",
"type": "github"
}
},
"root": {
"inputs": {
"nixgl": "nixgl",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}
+31
View File
@@ -0,0 +1,31 @@
{
description = "64-bit nixGL wrapper for Niri Beyond Glass";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/d407951447dcd00442e97087bf374aad70c04cea";
nixgl = {
url = "github:nix-community/nixGL/b6105297e6f0cd041670c3e8628394d4ee247ed5";
flake = false;
};
};
outputs = { nixpkgs, nixgl, ... }:
let
forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" "aarch64-linux" ];
in {
packages = forAllSystems (system:
let
pkgs = import nixpkgs {
inherit system;
config.allowUnfree = true;
};
wrappers = import "${nixgl}/default.nix" {
inherit pkgs;
enable32bits = false;
enableIntelX86Extensions = system == "x86_64-linux";
};
in {
default = wrappers.auto.nixGLDefault;
});
};
}
+1 -1
View File
@@ -6,7 +6,7 @@ After=graphical-session.target
[Service]
Type=simple
Environment=PATH=%h/.local/bin:%h/.local/state/niri-beyond-glass/nix-profile/bin:/usr/local/bin:/usr/bin:/bin
ExecStart=%h/.local/state/niri-beyond-glass/nix-profile/bin/dms run --session
ExecStart=%h/.local/state/niri-beyond-glass/nix-profile/bin/nixGL %h/.local/state/niri-beyond-glass/nix-profile/bin/dms run --session
ExecReload=/usr/bin/pkill -USR1 -x dms
Restart=on-failure
RestartSec=1.23
+34 -6
View File
@@ -143,11 +143,16 @@ install_dms_runtime() {
local profile="$state_home/$PROJECT/nix-profile"
local dms_flake="github:AvengeMedia/DankMaterialShell/$DMS_REV"
local nixpkgs="github:NixOS/nixpkgs/$NIXPKGS_REV"
local nixgl_flake="$source_dir/config/nixgl"
local core_ready=0
if [[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" &&
-x "$profile/bin/matugen" && -x "$profile/bin/dgop" &&
-x "$profile/bin/dsearch" ]]; then
log "DMS 运行层已经安装,跳过"
core_ready=1
fi
if (( core_ready )) && [[ -x "$profile/bin/nixGL" ]]; then
log "DMS 图形运行层已经安装,跳过"
return
fi
@@ -163,6 +168,7 @@ install_dms_runtime() {
fi
local attempt
if (( ! core_ready )); then
for attempt in 1 2 3 4 5; do
if sudo -u "$USER" -g nix-users env \
HOME="$HOME" USER="$USER" \
@@ -175,13 +181,33 @@ install_dms_runtime() {
"$nixpkgs#dsearch"; then
break
fi
(( attempt < 5 )) || die "DMS 运行层安装失败,请检查网络后重新运行脚本。"
(( attempt < 5 )) ||
die "DMS 运行层安装失败,请检查网络后重新运行脚本。"
log "下载中断,正在重试($attempt/5"
sleep 3
done
fi
[[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" ]] ||
die "DMS 或 Quickshell 安装不完整。"
if [[ ! -x "$profile/bin/nixGL" ]]; then
log "安装与 Quickshell 匹配的 NixGL 驱动桥接"
for attempt in 1 2 3; do
if sudo -u "$USER" -g nix-users env \
HOME="$HOME" USER="$USER" \
NIX_CONFIG="experimental-features = nix-command flakes" \
nix profile install --profile "$profile" --impure \
"$nixgl_flake#default"; then
break
fi
(( attempt < 3 )) ||
die "NixGL 安装失败,请检查网络后重新运行脚本。"
log "NixGL 下载中断,正在重试($attempt/3"
sleep 3
done
fi
[[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" &&
-x "$profile/bin/nixGL" ]] ||
die "DMS、Quickshell 或 NixGL 安装不完整。"
}
install_rust() {
@@ -381,7 +407,7 @@ backup_and_install_config() {
local profile="$state_home/$PROJECT/nix-profile"
local binary
for binary in dms quickshell qs matugen dgop dsearch; do
for binary in dms quickshell qs matugen dgop dsearch nixGL; do
if [[ -x "$profile/bin/$binary" ]]; then
ln -sfn "$profile/bin/$binary" "$HOME/.local/bin/$binary"
fi
@@ -470,6 +496,7 @@ activate_dms() {
log "当前没有可用的 systemd 用户会话;DMS 将在下次 Niri 登录时启动"
return
fi
systemctl --user unset-environment QT_QUICK_BACKEND 2>/dev/null || true
systemctl --user enable dms.service
"$profile/bin/dms" auth resolve-lock --quiet >/dev/null 2>&1 || true
@@ -500,7 +527,8 @@ main() {
install_dms_runtime
else
local profile="${XDG_STATE_HOME:-$HOME/.local/state}/$PROJECT/nix-profile"
[[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" ]] ||
[[ -x "$profile/bin/dms" && -x "$profile/bin/quickshell" &&
-x "$profile/bin/nixGL" ]] ||
die "--config-only 需要先完成一次完整安装。"
fi
+1 -1
View File
@@ -28,7 +28,7 @@ rm -rf \
rm -f "$config_home/systemd/user/dms.service"
rm -rf "$state_home/DankMaterialShell"
for binary in dms quickshell qs matugen dgop dsearch; do
for binary in dms quickshell qs matugen dgop dsearch nixGL; do
link="$HOME/.local/bin/$binary"
if [[ -L "$link" && "$(readlink "$link")" == "$profile/"* ]]; then
rm -f "$link"