1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-12-01 06:31:04 +01:00
home-manager/modules/services/window-managers/labwc/default.nix
Austin Horstman 4fca600cb1 treewide: implement auto importing for modules
Reduce maintenance burden and increase efficiency by automatically
importing modules following a specific convention.

Co-authored-by: awwpotato <awwpotato@voidq.com>
Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
2025-06-22 23:58:37 -05:00

277 lines
7.6 KiB
Nix

{
lib,
pkgs,
config,
...
}:
let
function = import ./function.nix {
inherit lib;
};
xmlFormat = pkgs.formats.xml { };
cfg = config.wayland.windowManager.labwc;
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}";
in
{
meta.maintainers = [ lib.hm.maintainers.LesVu ];
options.wayland.windowManager.labwc = {
enable = lib.mkEnableOption "Labwc, a wayland window-stacking compositor";
package = lib.mkPackageOption pkgs "labwc" {
nullable = true;
extraDescription = ''
Set to `null` to use Nixos labwc package.
'';
};
xwayland.enable = lib.mkEnableOption "XWayland" // {
default = true;
};
rc = lib.mkOption {
type = lib.types.submodule {
freeformType = xmlFormat.type;
};
default = { };
description = ''
Config to configure labwc options.
Use "@attributes" for attributes.
See <https://labwc.github.io/labwc-config.5.html> for configuration.
'';
example = lib.literalExpression ''
{
theme = {
name = "nord";
cornerRadius = 8;
font = {
"@name" = "FiraCode";
"@size" = "11";
};
};
keyboard = {
default = true;
keybind = [
# <keybind key="W-Return"><action name="Execute" command="foot"/></keybind>
{
"@key" = "W-Return";
action = {
"@name" = "Execute";
"@command" = "foot";
};
}
# <keybind key="W-Esc"><action name="Execute" command="loot"/></keybind>
{
"@key" = "W-Esc";
action = {
"@name" = "Execute";
"@command" = "loot";
};
}
];
};
}
'';
};
extraConfig = lib.mkOption {
type = lib.types.lines;
default = "";
example = ''
<tablet mapToOutput="" rotate="0" mouseEmulation="no">
<!-- Active area dimensions are in mm -->
<area top="0.0" left="0.0" width="0.0" height="0.0" />
<map button="Tip" to="Left" />
<map button="Stylus" to="Right" />
<map button="Stylus2" to="Middle" />
</tablet>
'';
description = "Extra lines appended to {file}`$XDG_CONFIG_HOME/labwc/rc.xml`.";
};
menu = lib.mkOption {
type = lib.types.listOf xmlFormat.type;
default = [ ];
description = "Config to configure labwc menu";
example = lib.literalExpression ''
[
{
label = "pipemenu";
menuId = "menu";
execute = "/home/user/nix/scripts/pipe.sh";
}
{
menuId = "client-menu";
label = "Client Menu";
icon = "";
items = [
{
label = "Maximize";
icon = "";
action = {
name = "ToggleMaximize";
};
}
{
label = "Fullscreen";
action = {
name = "ToggleFullscreen";
};
}
{
label = "Alacritty";
action = {
name = "Execute";
command = "alacritty";
};
}
{
label = "Move Left";
action = {
name = "SendToDesktop";
to = "left";
};
}
{
separator = { };
}
{
label = "Workspace";
menuId = "workspace";
icon = "";
items = [
{
label = "Move Left";
action = {
name = "SendToDesktop";
to = "left";
};
}
];
}
{
separator = true;
}
];
}
];
'';
};
autostart = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
Command to autostart when labwc start.
'';
example = [
"wayvnc &"
"waybar &"
"swaybg -c '#113344' >/dev/null 2>&1 &"
];
};
environment = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
Environment variable to add when labwc start.
'';
example = [
"XDG_CURRENT_DESKTOP=labwc:wlroots"
"XKB_DEFAULT_LAYOUT=us"
];
};
systemd = {
enable = lib.mkEnableOption null // {
default = true;
description = ''
Whether to enable {file}`labwc-session.target` on
labwc 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`
'';
};
variables = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
"DISPLAY"
"WAYLAND_DISPLAY"
"XDG_CURRENT_DESKTOP"
];
example = [ "-all" ];
description = ''
Environment variables to be imported in the systemd & D-Bus user
environment.
'';
};
extraCommands = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [
"systemctl --user stop labwc-session.target"
"systemctl --user start labwc-session.target"
];
description = "Extra commands to be run after D-Bus activation.";
};
};
};
config = lib.mkIf cfg.enable {
assertions = [
(lib.hm.assertions.assertPlatform "wayland.windowManager.labwc" pkgs lib.platforms.linux)
];
home.packages = lib.mkIf (cfg.package != null) (
[ cfg.package ] ++ lib.optional cfg.xwayland.enable pkgs.xwayland
);
xdg.configFile."labwc/rc.xml" = lib.mkIf (cfg.rc != { }) {
text = function.generateXML "labwc_config" cfg.rc cfg.extraConfig;
};
xdg.configFile."labwc/menu.xml" = lib.mkIf (cfg.menu != [ ]) {
text = function.generateXML "openbox_menu" cfg.menu "";
};
xdg.configFile."labwc/autostart".source = pkgs.writeShellScript "autostart" (
''
### This file was generated with Nix. Don't modify this file directly.
### AUTOSTART SERVICE ###
${lib.concatStringsSep "\n" cfg.autostart}
''
+ (lib.optionalString cfg.systemd.enable ''
### SYSTEMD INTEGRATION ###
${systemdActivation}
'')
);
xdg.configFile."labwc/environment" = lib.mkIf (cfg.environment != [ ]) {
text = lib.concatStringsSep "\n" (
cfg.environment ++ (lib.optionals (!cfg.xwayland.enable) [ "WLR_XWAYLAND=" ])
);
};
systemd.user.targets.labwc-session = lib.mkIf cfg.systemd.enable {
Unit = {
Description = "labwc compositor session";
Documentation = [ "man:systemd.special(7)" ];
BindsTo = [ "graphical-session.target" ];
Wants = [ "graphical-session-pre.target" ];
After = [ "graphical-session-pre.target" ];
};
};
};
}