diff --git a/README.md b/README.md index 8c55408..bd989b5 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/config/niri/beyond-glass.kdl b/config/niri/beyond-glass.kdl index 04a7fe8..cd14d4b 100644 --- a/config/niri/beyond-glass.kdl +++ b/config/niri/beyond-glass.kdl @@ -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 { diff --git a/config/nixgl/flake.lock b/config/nixgl/flake.lock new file mode 100644 index 0000000..485e938 --- /dev/null +++ b/config/nixgl/flake.lock @@ -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 +} diff --git a/config/nixgl/flake.nix b/config/nixgl/flake.nix new file mode 100644 index 0000000..84ce93e --- /dev/null +++ b/config/nixgl/flake.nix @@ -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; + }); + }; +} diff --git a/config/systemd/dms.service b/config/systemd/dms.service index 2228ba5..a9e058c 100644 --- a/config/systemd/dms.service +++ b/config/systemd/dms.service @@ -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 diff --git a/install.sh b/install.sh index 6b070ff..1b8cce5 100755 --- a/install.sh +++ b/install.sh @@ -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,25 +168,46 @@ install_dms_runtime() { fi local attempt - for attempt in 1 2 3 4 5; 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" \ - "$dms_flake#dms-shell" \ - "$nixpkgs#quickshell" \ - "$nixpkgs#matugen" \ - "$nixpkgs#dgop" \ - "$nixpkgs#dsearch"; then - break - fi - (( attempt < 5 )) || die "DMS 运行层安装失败,请检查网络后重新运行脚本。" - log "下载中断,正在重试($attempt/5)" - sleep 3 - done + 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" \ + NIX_CONFIG="experimental-features = nix-command flakes" \ + nix profile install --profile "$profile" \ + "$dms_flake#dms-shell" \ + "$nixpkgs#quickshell" \ + "$nixpkgs#matugen" \ + "$nixpkgs#dgop" \ + "$nixpkgs#dsearch"; then + break + fi + (( 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 diff --git a/uninstall.sh b/uninstall.sh index bfac533..5a4a074 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -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"