Skip to content

Commit

Permalink
wayfire: add module (#6066)
Browse files Browse the repository at this point in the history
Adds a Module for the Wayfire Compositor. Also allows managing the wf-shell configuration.
  • Loading branch information
0x5a4 authored Jan 8, 2025
1 parent 45bcdbc commit 456e599
Show file tree
Hide file tree
Showing 9 changed files with 280 additions and 1 deletion.
15 changes: 14 additions & 1 deletion modules/misc/news.nix
Original file line number Diff line number Diff line change
Expand Up @@ -1861,7 +1861,6 @@ in {
Some plugins require this to be set to 'false' to function correctly.
'';
}

{
time = "2024-12-08T17:22:13+00:00";
condition = let
Expand Down Expand Up @@ -1947,6 +1946,20 @@ in {
speed, features, or native UIs. Ghostty provides all three.
'';
}
{
time = "2025-01-04T15:00:00+00:00";
condition = hostPlatform.isLinux;
message = ''
A new module is available: 'wayland.windowManager.wayfire'.
Wayfire is a 3D Wayland compositor, inspired by Compiz and based on
wlroots. It aims to create a customizable, extendable and lightweight
environment without sacrificing its appearance.
This Home Manager module allows you to configure both wayfire itself,
as well as wf-shell.
'';
}
];
};
}
1 change: 1 addition & 0 deletions modules/modules.nix
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ let
./services/window-managers/i3-sway/swaynag.nix
./services/window-managers/river.nix
./services/window-managers/spectrwm.nix
./services/window-managers/wayfire.nix
./services/window-managers/xmonad.nix
./services/wlsunset.nix
./services/wob.nix
Expand Down
200 changes: 200 additions & 0 deletions modules/services/window-managers/wayfire.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
{ lib, pkgs, config, ... }: {
meta.maintainers = [ lib.maintainers._0x5a4 ];

options.wayland.windowManager.wayfire = let
types = lib.types;

configIniType = with types;
let
primitiveType = either str (either bool number);
sectionType = attrsOf primitiveType;
in attrsOf sectionType;
in {
enable =
lib.mkEnableOption "Wayfire, a wayland compositor based on wlroots";

package = lib.mkPackageOption pkgs "wayfire" {
nullable = true;
extraDescription = ''
Set to `null` to not add any wayfire package to your path.
This should be done if you want to use the NixOS wayfire module to install wayfire.
'';
};

plugins = lib.mkOption {
type = lib.types.listOf lib.types.package;
default = with pkgs.wayfirePlugins; [ wf-shell ];
defaultText =
lib.literalExpression "with pkgs.wayfirePlugins; [ wf-shell ]";
example = lib.literalExpression ''
with pkgs.wayfirePlugins; [
wcm
wf-shell
wayfire-plugins-extra
];
'';
description = ''
Additional plugins to use with wayfire
'';
};

xwayland.enable = lib.mkEnableOption "XWayland" // { default = true; };

settings = lib.mkOption {
type = types.submodule {
freeformType = configIniType;

options.core.plugins = lib.mkOption {
type = types.separatedString " ";
description = "Load the specified plugins";
};
};
default = { };
description = ''
Wayfire configuration written in Nix.
See <https://github.com/WayfireWM/wayfire/wiki/Configuration>
'';
example = lib.literalExpression ''
{
core.plugins = "command expo cube";
command = {
binding_terminal = "alacritty";
command_terminal = "alacritty";
};
}
'';
};

wf-shell = {
enable = lib.mkEnableOption "Manage wf-shell Configuration";

package = lib.mkPackageOption pkgs.wayfirePlugins "wf-shell" { };

settings = lib.mkOption {
type = configIniType;
default = { };
description = ''
Wf-shell configuration written in Nix.
See <https://github.com/WayfireWM/wf-shell/blob/master/wf-shell.ini.example>
'';
example = lib.literalExpression ''
{
panel = {
widgets_left = "menu spacing4 launchers window-list";
autohide = true;
};
}
'';
};
};

systemd = {
enable = lib.mkEnableOption null // {
default = true;
description = ''
Whether to enable {file}`wayfire-session.target` on
wayfire startup. This links to {file}`graphical-session.target`}.
Some important environment variables will be imported to systemd
and D-Bus user environment before reaching the target, including
- `DISPLAY`
- `WAYLAND_DISPLAY`
- `XDG_CURRENT_DESKTOP`
- `NIXOS_OZONE_WL`
- `XCURSOR_THEME`
- `XCURSOR_SIZE`
'';
};

variables = lib.mkOption {
type = types.listOf types.str;
default = [
"DISPLAY"
"WAYLAND_DISPLAY"
"XDG_CURRENT_DESKTOP"
"NIXOS_OZONE_WL"
"XCURSOR_THEME"
"XCURSOR_SIZE"
];
example = [ "-all" ];
description = ''
Environment variables to be imported in the systemd & D-Bus user
environment.
'';
};

extraCommands = lib.mkOption {
type = types.listOf types.str;
default = [
"systemctl --user stop wayfire-session.target"
"systemctl --user start wayfire-session.target"
];
description = "Extra commands to be run after D-Bus activation.";
};
};
};

config = let
cfg = config.wayland.windowManager.wayfire;

variables = builtins.concatStringsSep " " cfg.systemd.variables;
extraCommands = builtins.concatStringsSep " "
(map (f: "&& ${f}") cfg.systemd.extraCommands);
systemdActivation =
"${pkgs.dbus}/bin/dbus-update-activation-environment --systemd ${variables} ${extraCommands}";

finalPackage = pkgs.wayfire-with-plugins.override {
wayfire = cfg.package;
plugins = cfg.plugins;
};
in lib.mkIf cfg.enable {
assertions = [
(lib.hm.assertions.assertPlatform "wayland.windowManager.wayfire" pkgs
lib.platforms.linux)
];

home.packages = lib.mkIf (cfg.package != null) (lib.concatLists [
(lib.singleton finalPackage)
(lib.optional (cfg.xwayland.enable) pkgs.xwayland)
]);

wayland.windowManager.wayfire = {
settings = {
autostart = lib.mkIf cfg.systemd.enable { inherit systemdActivation; };
core = {
plugins = lib.concatStringsSep " " (lib.concatLists [
(lib.optional (cfg.systemd.enable) "autostart")
(lib.optional (cfg.wf-shell.enable) "wayfire-shell")
]);
xwayland = cfg.xwayland.enable;
};
};

plugins = lib.optional cfg.wf-shell.enable cfg.wf-shell.package;
};

xdg.configFile."wayfire.ini".text = lib.generators.toINI { } cfg.settings;

xdg.configFile."wf-shell.ini" = lib.mkIf cfg.wf-shell.enable {
text = lib.generators.toINI { } cfg.wf-shell.settings;
};

systemd.user.targets.wayfire-session = lib.mkIf cfg.systemd.enable {
Unit = {
Description = "wayfire compositor session";
Documentation = [ "man:systemd.special(7)" ];
BindsTo = [ "graphical-session.target" ];
Wants = [ "graphical-session-pre.target" ];
After = [ "graphical-session-pre.target" ];
};
};

systemd.user.targets.tray = {
Unit = {
Description = "Home Manager System Tray";
Requires = [ "graphical-session-pre.target" ];
};
};
};
}
1 change: 1 addition & 0 deletions tests/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ in import nmtSrc {
./modules/services/window-managers/river
./modules/services/window-managers/spectrwm
./modules/services/window-managers/sway
./modules/services/window-managers/wayfire
./modules/services/wlsunset
./modules/services/wob
./modules/services/xsettingsd
Expand Down
10 changes: 10 additions & 0 deletions tests/modules/services/window-managers/wayfire/configuration.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[autostart]
systemdActivation=/nix/store/00000000000000000000000000000000-dbus/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP NIXOS_OZONE_WL XCURSOR_THEME XCURSOR_SIZE && systemctl --user stop wayfire-session.target && systemctl --user start wayfire-session.target

[command]
binding_terminal=alacritty
command_terminal=alacritty

[core]
plugins=command expo cube autostart
xwayland=true
22 changes: 22 additions & 0 deletions tests/modules/services/window-managers/wayfire/configuration.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{ ... }: {
wayland.windowManager.wayfire = {
enable = true;
package = null;
settings = {
core.plugins = "command expo cube";
command = {
binding_terminal = "alacritty";
command_terminal = "alacritty";
};
};
};

nmt.script = ''
wayfireConfig=home-files/.config/wayfire.ini
assertFileExists "$wayfireConfig"
normalizedConfig=$(normalizeStorePaths "$wayfireConfig")
assertFileContent "$normalizedConfig" "${./configuration.ini}"
'';
}
4 changes: 4 additions & 0 deletions tests/modules/services/window-managers/wayfire/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
wayfire-configuration = ./configuration.nix;
wayfire-wf-shell = ./wf-shell.nix;
}
3 changes: 3 additions & 0 deletions tests/modules/services/window-managers/wayfire/wf-shell.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[panel]
autohide=true
widgets_left=menu spacing4 launchers window-list
25 changes: 25 additions & 0 deletions tests/modules/services/window-managers/wayfire/wf-shell.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{ pkgs, ... }: {
wayland.windowManager.wayfire = {
enable = true;
package = null;
wf-shell = {
enable = true;
package = pkgs.mkStubPackage { };
settings = {
panel = {
widgets_left = "menu spacing4 launchers window-list";
autohide = true;
};
};
};
};

nmt.script = ''
wfShellConfig=home-files/.config/wf-shell.ini
assertFileExists "$wfShellConfig"
normalizedConfig=$(normalizeStorePaths "$wfShellConfig")
assertFileContent "$normalizedConfig" "${./wf-shell.ini}"
'';
}

0 comments on commit 456e599

Please sign in to comment.