目前的桌面环境界面 niri-desktop

niri和noctalia简介 @

什么是niri @

众所周知Linux桌面主要分为 X11Wayland 两套协议,而niri是Wayland生态里的一个窗口管理器(准确说是合成器compositor),用Rust写的,目前在GitHub上有22k+的star。

niri最大的特点是scrollable tiling——窗口像纸带一样水平排列,打开新窗口不会把现有的挤变小。你可以想象成每个显示器是一条无限长的走廊,窗口一个接一个往右堆。这种设计对程序员挺友好的,特别是需要同时开很多窗口的时候。除此之外,niri还支持多显示器、分数缩放、动态工作区、内置截图,以及基本的浮窗功能,官方说已经可以日常使用。

什么是noctalia @

noctalia则是完全另一个层面的东西。它是一个桌面shell,基于Qt/QML开发。你可以把它理解为「桌面环境的视觉层」——状态栏、通知、锁屏、壁纸、启动器、桌面小部件这些都由它负责,而窗口怎么排列、怎么切换,这些则是niri负责。类似的,你也可以使用其他的shell来实现这些UI层,例如Dank Material Shell (DMS)、Wayle等。

niri和noctalia的关系 @

如果只用niri不加其他东西,你会发现登录后屏幕上啥都没有——没有状态栏、没有壁纸、没有通知、没有dock,没有应用启动器,只能看到黑屏和鼠标。这是因为niri只是一个compositor,它只负责把窗口画出来、处理输入事件、管理多显示器和切换工作区,那些「看得见摸得着」的东西它一样都不管。niri官方文档里也写到:准备好你的waybar和fuzzel再来用它。

所以niri和noctalia的关系是分工合作:niri管窗口,noctalia管UI。完整桌面环境通常包含窗口管理器、状态栏、文件管理器、应用启动器、通知系统、锁屏、设置面板和壁纸这些东西。noctalia作为shell,把大部分视觉组件都整合好了:状态栏、通知、锁屏、壁纸、启动器(可配合wofi或fuzzel)、OSD(调音量时屏幕中间那个进度条),还有各种桌面小部件。它基于Quickshell开发,性能不错,主题也能自定义,不过noctalia不管窗口管理,也不包含文件管理器。窗口管理交给niri,文件管理用系统自带的(比如thunar、nautilus)就行。

因此装了niri + noctalia之后,你基本就拥有了一个完整的「准桌面环境」

niri和noctalia安装 @

首先在flake.nix的input中引入noctalia-shell

inputs = {
    noctalia = {
        url = "github:noctalia-dev/noctalia-shell";
        inputs.nixpkgs.follows = "nixpkgs";
    };
}

在output也一样,传入noctalia,然后再sharedModules中导入noctalia的homeModules,便于给所有用户使用。

  outputs = { 
    self, nixpkgs, home-manager, 
    nix4nvchad, claude-code, noctalia, ...  # 这里添加noctaila
  }@inputs:
  {
    nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
      modules = [
        home-manager.nixosModules.home-manager {
          home-manager.useGlobalPkgs = true;
          home-manager.useUserPackages = true;

          home-manager.sharedModules = [
            inputs.nix4nvchad.homeManagerModules.default
            inputs.noctalia.homeModules.default
          ];
          home-manager.users.lznauy = import ./home/default.nix;
        }
      ];
      specialArgs = { inherit inputs; };
    };
  };

然后记得在你的用户配置,例如我的/home/default.nix中开启niri相关选项。

programs.niri.enable = true;
services.xserver.enable = true;
services.displayManager.gdm.enable = true;
services.displayManager.gdm.wayland = true;

然后可以新建一个文件noctalia.nix用来存储noctalia的配置。

{ config, pkgs, ... }:
{
  programs.noctalia-shell = {
    enable = true;
    systemd.enable = true;
    settings = {
      bar = {
        position = "bottom";
      };
    };
  };
}

接着在/home/default.nix中导入noctalia.nix

imports = [
  ./noctalia.nix
];

然后nixos-rebuild switch更新系统就可以生效啦,是不是很简单?但目前桌面环境还是比较初始化,桌面环境配置只能后续再说啦