2017-10-17 16:09:42 +02:00
|
|
|
{ config, pkgs, lib, ... }:
|
|
|
|
|
|
|
|
with lib;
|
2017-10-25 18:35:00 +02:00
|
|
|
|
|
|
|
let
|
2019-03-11 17:32:38 +01:00
|
|
|
cfg = config.programs.sway;
|
2017-10-25 18:35:00 +02:00
|
|
|
|
2019-12-08 13:56:56 +01: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-01-01 08:45:26 +01:00
|
|
|
|
2019-12-08 13:56:56 +01:00
|
|
|
swayPackage = pkgs.sway.override {
|
|
|
|
extraSessionCommands = cfg.extraSessionCommands;
|
2019-12-29 07:22:50 +01:00
|
|
|
extraOptions = cfg.extraOptions;
|
2019-12-08 13:56:56 +01:00
|
|
|
withBaseWrapper = cfg.wrapperFeatures.base;
|
|
|
|
withGtkWrapper = cfg.wrapperFeatures.gtk;
|
2017-10-25 18:35:00 +02:00
|
|
|
};
|
2017-12-23 21:03:06 +01:00
|
|
|
in {
|
2019-03-11 17:32:38 +01:00
|
|
|
options.programs.sway = {
|
2017-12-23 21:03:06 +01:00
|
|
|
enable = mkEnableOption ''
|
2019-03-11 17:32:38 +01:00
|
|
|
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 18:35:00 +02:00
|
|
|
|
2019-12-08 13:56:56 +01:00
|
|
|
wrapperFeatures = mkOption {
|
|
|
|
type = wrapperOptions;
|
|
|
|
default = { };
|
|
|
|
example = { gtk = true; };
|
|
|
|
description = ''
|
|
|
|
Attribute set of features to enable in the wrapper.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
2017-10-25 18:35:00 +02:00
|
|
|
extraSessionCommands = mkOption {
|
2017-12-23 21:03:06 +01:00
|
|
|
type = types.lines;
|
|
|
|
default = "";
|
2017-10-25 18:35:00 +02:00
|
|
|
example = ''
|
2019-03-11 17:18:19 +01:00
|
|
|
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 18:35:00 +02:00
|
|
|
'';
|
|
|
|
description = ''
|
2017-12-23 21:03:06 +01:00
|
|
|
Shell commands executed just before Sway is started.
|
2017-10-25 18:35:00 +02:00
|
|
|
'';
|
|
|
|
};
|
2017-10-17 16:09:42 +02:00
|
|
|
|
2019-12-29 07:22:50 +01: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 18:35:00 +02:00
|
|
|
extraPackages = mkOption {
|
|
|
|
type = with types; listOf package;
|
2017-10-25 21:29:27 +02:00
|
|
|
default = with pkgs; [
|
2019-12-08 13:56:56 +01:00
|
|
|
swaylock swayidle
|
2020-01-10 12:26:17 +01:00
|
|
|
xwayland alacritty dmenu
|
2020-02-13 09:36:35 +01:00
|
|
|
rxvt-unicode # For backward compatibility (old default terminal)
|
2017-10-25 21:29:27 +02:00
|
|
|
];
|
2017-12-23 21:03:06 +01:00
|
|
|
defaultText = literalExample ''
|
2020-02-13 09:36:35 +01:00
|
|
|
with pkgs; [ swaylock swayidle xwayland rxvt-unicode dmenu ];
|
2017-12-23 21:03:06 +01:00
|
|
|
'';
|
2017-10-25 18:35:00 +02:00
|
|
|
example = literalExample ''
|
|
|
|
with pkgs; [
|
2019-03-11 17:18:19 +01:00
|
|
|
xwayland
|
|
|
|
i3status i3status-rust
|
|
|
|
termite rofi light
|
2017-10-25 18:35:00 +02:00
|
|
|
]
|
|
|
|
'';
|
|
|
|
description = ''
|
|
|
|
Extra packages to be installed system wide.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
2019-12-08 13:56:56 +01:00
|
|
|
assertions = [
|
|
|
|
{
|
|
|
|
assertion = cfg.extraSessionCommands != "" -> cfg.wrapperFeatures.base;
|
|
|
|
message = ''
|
|
|
|
The extraSessionCommands for Sway will not be run if
|
|
|
|
wrapperFeatures.base is disabled.
|
|
|
|
'';
|
|
|
|
}
|
|
|
|
];
|
2019-03-11 17:32:38 +01:00
|
|
|
environment = {
|
2019-12-08 13:56:56 +01:00
|
|
|
systemPackages = [ swayPackage ] ++ cfg.extraPackages;
|
2019-03-11 17:32:38 +01:00
|
|
|
etc = {
|
2019-04-27 22:38:18 +02:00
|
|
|
"sway/config".source = mkOptionDefault "${swayPackage}/etc/sway/config";
|
|
|
|
#"sway/security.d".source = mkOptionDefault "${swayPackage}/etc/sway/security.d/";
|
|
|
|
#"sway/config.d".source = mkOptionDefault "${swayPackage}/etc/sway/config.d/";
|
2019-03-11 17:32:38 +01:00
|
|
|
};
|
|
|
|
};
|
2017-12-21 17:16:19 +01:00
|
|
|
security.pam.services.swaylock = {};
|
2017-10-25 18:35:00 +02:00
|
|
|
hardware.opengl.enable = mkDefault true;
|
|
|
|
fonts.enableDefaultFonts = mkDefault true;
|
2017-12-21 17:16:19 +01:00
|
|
|
programs.dconf.enable = mkDefault true;
|
2019-12-09 14:11:24 +01:00
|
|
|
# To make a Sway session available if a display manager like SDDM is enabled:
|
2019-12-08 13:56:56 +01:00
|
|
|
services.xserver.displayManager.sessionPackages = [ swayPackage ];
|
2017-10-17 16:09:42 +02:00
|
|
|
};
|
2017-12-23 21:03:06 +01:00
|
|
|
|
2019-03-11 17:18:19 +01:00
|
|
|
meta.maintainers = with lib.maintainers; [ gnidorah primeos colemickens ];
|
2017-10-17 16:09:42 +02:00
|
|
|
}
|