nixpkgs/nixos/modules/programs/sway.nix

144 lines
4.6 KiB
Nix
Raw Normal View History

2017-10-17 14:09:42 +00:00
{ config, pkgs, lib, ... }:
with lib;
2017-10-25 16:35:00 +00:00
let
cfg = config.programs.sway;
2017-10-25 16:35:00 +00:00
2019-12-08 12:56:56 +00:00
wrapperOptions = types.submodule {
options =
let
mkWrapperFeature = default: description: mkOption {
type = types.bool;
inherit default;
example = !default;
description = "Whether to make use of the ${description}";
};
in {
base = mkWrapperFeature true ''
base wrapper to execute extra session commands and prepend a
dbus-run-session to the sway command.
'';
gtk = mkWrapperFeature false ''
wrapGAppsHook wrapper to execute sway with required environment
variables for GTK applications.
'';
};
};
2019-12-08 12:56:56 +00:00
swayPackage = pkgs.sway.override {
extraSessionCommands = cfg.extraSessionCommands;
extraOptions = cfg.extraOptions;
2019-12-08 12:56:56 +00:00
withBaseWrapper = cfg.wrapperFeatures.base;
withGtkWrapper = cfg.wrapperFeatures.gtk;
isNixOS = true;
2017-10-25 16:35:00 +00:00
};
in {
options.programs.sway = {
enable = mkEnableOption ''
Sway, the i3-compatible tiling Wayland compositor. You can manually launch
Sway by executing "exec sway" on a TTY. Copy /etc/sway/config to
~/.config/sway/config to modify the default configuration. See
https://github.com/swaywm/sway/wiki and "man 5 sway" for more information.
Please have a look at the "extraSessionCommands" example for running
programs natively under Wayland'';
2017-10-25 16:35:00 +00:00
2019-12-08 12:56:56 +00:00
wrapperFeatures = mkOption {
type = wrapperOptions;
default = { };
example = { gtk = true; };
description = ''
Attribute set of features to enable in the wrapper.
'';
};
2017-10-25 16:35:00 +00:00
extraSessionCommands = mkOption {
type = types.lines;
default = "";
2017-10-25 16:35:00 +00:00
example = ''
export SDL_VIDEODRIVER=wayland
# needs qt5.qtwayland in systemPackages
export QT_QPA_PLATFORM=wayland
export QT_WAYLAND_DISABLE_WINDOWDECORATION="1"
# Fix for some Java AWT applications (e.g. Android Studio),
# use this if they aren't displayed properly:
export _JAVA_AWT_WM_NONREPARENTING=1
2017-10-25 16:35:00 +00:00
'';
description = ''
Shell commands executed just before Sway is started.
2017-10-25 16:35:00 +00:00
'';
};
2017-10-17 14:09:42 +00:00
extraOptions = mkOption {
type = types.listOf types.str;
default = [];
example = [
"--verbose"
"--debug"
"--unsupported-gpu"
"--my-next-gpu-wont-be-nvidia"
];
description = ''
Command line arguments passed to launch Sway. Please DO NOT report
issues if you use an unsupported GPU (proprietary drivers).
'';
};
2017-10-25 16:35:00 +00:00
extraPackages = mkOption {
type = with types; listOf package;
2017-10-25 19:29:27 +00:00
default = with pkgs; [
swaylock swayidle alacritty dmenu
rxvt-unicode # For backward compatibility (old default terminal)
2017-10-25 19:29:27 +00:00
];
defaultText = literalExample ''
with pkgs; [ swaylock swayidle rxvt-unicode alacritty dmenu ];
'';
2017-10-25 16:35:00 +00:00
example = literalExample ''
with pkgs; [
xwayland
i3status i3status-rust
termite rofi light
2017-10-25 16:35:00 +00:00
]
'';
description = ''
Extra packages to be installed system wide.
'';
};
2017-10-25 16:35:00 +00:00
};
config = mkIf cfg.enable {
2019-12-08 12:56:56 +00:00
assertions = [
{
assertion = cfg.extraSessionCommands != "" -> cfg.wrapperFeatures.base;
message = ''
The extraSessionCommands for Sway will not be run if
wrapperFeatures.base is disabled.
'';
}
];
environment = {
2019-12-08 12:56:56 +00:00
systemPackages = [ swayPackage ] ++ cfg.extraPackages;
etc = {
"sway/config".source = mkOptionDefault "${swayPackage}/etc/sway/config";
"sway/config.d/nixos.conf".source = pkgs.writeText "nixos.conf" ''
# Import the most important environment variables into the D-Bus and systemd
# user environments (e.g. required for screen sharing and Pinentry prompts):
exec dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP
'';
};
};
security.pam.services.swaylock = {};
2017-10-25 16:35:00 +00:00
hardware.opengl.enable = mkDefault true;
fonts.enableDefaultFonts = mkDefault true;
programs.dconf.enable = mkDefault true;
# To make a Sway session available if a display manager like SDDM is enabled:
2019-12-08 12:56:56 +00:00
services.xserver.displayManager.sessionPackages = [ swayPackage ];
programs.xwayland.enable = mkDefault true;
# For screen sharing (this option only has an effect with xdg.portal.enable):
xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-wlr ];
2017-10-17 14:09:42 +00:00
};
meta.maintainers = with lib.maintainers; [ gnidorah primeos colemickens ];
2017-10-17 14:09:42 +00:00
}