diff --git a/modules/default.nix b/modules/default.nix index 9b6ad758..c10a4cb5 100644 --- a/modules/default.nix +++ b/modules/default.nix @@ -57,6 +57,7 @@ let ./services/taffybar.nix ./services/tahoe-lafs.nix ./services/udiskie.nix + ./services/window-managers/xmonad.nix ./services/xscreensaver.nix ./systemd.nix ./xresources.nix diff --git a/modules/misc/news.nix b/modules/misc/news.nix index eb25444e..e2bceb92 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -240,22 +240,6 @@ in ''; } - { - time = "2017-09-28T21:39:45+00:00"; - condition = - config.xsession.enable - && config.xsession.windowManager.usesDeprecated; - message = '' - The 'xsession.windowManager' option is now deprecated, - please use 'xsession.windowManager.command' instead. - - This change was made to prepare for window manager modules - under the 'xsession.windowManager' namespace. For example, - 'xsession.windowManager.xmonad' and - 'xsession.windowManager.i3'. - ''; - } - { time = "2017-09-30T09:44:18+00:00"; condition = with config.programs.vim; @@ -339,19 +323,6 @@ in ''; } - { - time = "2017-10-19T09:33:10+00:00"; - condition = - config.xsession.enable - && config.xsession.windowManager.usesDeprecated; - message = '' - The 'xsession.windowManager' option is deprecated and will - be removed on October 31, 2017. To avoid evaluation errors - you must change to using 'xsession.windowManager.command' - before that date. - ''; - } - { time = "2017-10-20T12:15:27+00:00"; condition = with config.systemd.user; diff --git a/modules/services/window-managers/xmonad.nix b/modules/services/window-managers/xmonad.nix index 8105612c..d512cde0 100644 --- a/modules/services/window-managers/xmonad.nix +++ b/modules/services/window-managers/xmonad.nix @@ -1,10 +1,11 @@ -{ pkgs }: { config, lib, ... }: +{ config, lib, pkgs, ... }: with lib; +with import ../../lib/dag.nix { inherit lib; }; let - cfg = config.xmonad; + cfg = config.xsession.windowManager.xmonad; xmonad = pkgs.xmonad-with-packages.override { ghcWithPackages = cfg.haskellPackages.ghcWithPackages; @@ -19,7 +20,7 @@ in { options = { - xmonad = { + xsession.windowManager.xmonad = { enable = mkEnableOption "xmonad window manager"; haskellPackages = mkOption { @@ -80,7 +81,32 @@ in }; }; - config = mkIf cfg.enable { - command = "${xmonad}/bin/xmonad"; - }; + config = mkIf cfg.enable (mkMerge [ + { + xsession.windowManager.command = "${xmonad}/bin/xmonad"; + } + + (mkIf (cfg.config != null) { + home.file.".xmonad/xmonad.hs".source = cfg.config; + + home.activation.checkXmonad = dagEntryBefore [ "linkGeneration" ] '' + if ! cmp --quiet "${cfg.config}" "$HOME/.xmonad/xmonad.hs"; then + xmonadChanged=1 + fi + ''; + + home.activation.applyXmonad = dagEntryAfter [ "linkGeneration" ] '' + if [[ -v xmonadChanged ]]; then + echo "Recompiling xmonad" + ${config.xsession.windowManager.command} --recompile + + # Attempt to restart xmonad if X is running. + if [[ -v DISPLAY ]] ; then + echo "Restarting xmonad" + ${config.xsession.windowManager.command} --restart + fi + fi + ''; + }) + ]); } diff --git a/modules/xsession.nix b/modules/xsession.nix index dde0a7fe..d51bb6b4 100644 --- a/modules/xsession.nix +++ b/modules/xsession.nix @@ -1,16 +1,21 @@ { config, lib, pkgs, ... }: with lib; -with import ./lib/dag.nix { inherit lib; }; let cfg = config.xsession; - # Hack to support xsession.windowManager.command option. - wmBaseModule = { - options = { - command = mkOption { +in + +{ + meta.maintainers = [ maintainers.rycee ]; + + options = { + xsession = { + enable = mkEnableOption "X Session"; + + windowManager.command = mkOption { type = types.str; example = literalExample '' let @@ -25,39 +30,6 @@ let ''; }; - usesDeprecated = mkOption { - internal = true; - type = types.bool; - default = false; - }; - }; - }; - - xmonadModule = import ./services/window-managers/xmonad.nix { - inherit pkgs; - }; - -in - -{ - meta.maintainers = [ maintainers.rycee ]; - - options = { - xsession = { - enable = mkEnableOption "X Session"; - - windowManager = mkOption { - type = - types.coercedTo - types.str - (command: { inherit command; usesDeprecated = true; }) - (types.submodule [ wmBaseModule xmonadModule ]); - description = '' - Window manager start command. DEPRECATED: Use - xsession.windowManager.command instead. - ''; - }; - profileExtra = mkOption { type = types.lines; default = ""; @@ -72,125 +44,88 @@ in }; }; - config = mkIf cfg.enable (mkMerge [ - (mkIf cfg.windowManager.usesDeprecated { - warnings = [ - ("xsession.windowManager is deprecated, " - + "please use xsession.windowManager.command") - ]; - }) + config = mkIf cfg.enable { + systemd.user.services.setxkbmap = { + Unit = { + Description = "Set up keyboard in X"; + After = [ "graphical-session-pre.target" ]; + PartOf = [ "graphical-session.target" ]; + }; - # Hack to support xsession.windowManager as a string. Once that is - # removed this code should go back into the xmonad.nix file. - (mkIf (cfg.windowManager.xmonad.enable - && cfg.windowManager.xmonad.config != null) { - home.file.".xmonad/xmonad.hs".source = cfg.windowManager.xmonad.config; + Install = { + WantedBy = [ "graphical-session.target" ]; + }; - home.activation.checkXmonad = dagEntryBefore [ "linkGeneration" ] '' - if ! cmp --quiet \ - "${cfg.windowManager.xmonad.config}" \ - "$HOME/.xmonad/xmonad.hs"; then - xmonadChanged=1 + Service = { + Type = "oneshot"; + ExecStart = + let + args = concatStringsSep " " ( + [ + "-layout '${config.home.keyboard.layout}'" + "-variant '${config.home.keyboard.variant}'" + ] ++ + (map (v: "-option '${v}'") config.home.keyboard.options) + ); + in + "${pkgs.xorg.setxkbmap}/bin/setxkbmap ${args}"; + }; + }; + + # A basic graphical session target for Home Manager. + systemd.user.targets.hm-graphical-session = { + Unit = { + Description = "Home Manager X session"; + Requires = [ "graphical-session-pre.target" ]; + BindsTo = [ "graphical-session.target" ]; + }; + }; + + home.file.".xprofile".text = '' + if [[ -e "$HOME/.profile" ]]; then + . "$HOME/.profile" fi - ''; - home.activation.applyXmonad = dagEntryAfter [ "linkGeneration" ] '' - if [[ -v xmonadChanged ]]; then - echo "Recompiling xmonad" - ${cfg.windowManager.command} --recompile + # If there are any running services from a previous session. + # Need to run this in xprofile because the NixOS xsession + # script starts up graphical-session.target. + systemctl --user stop graphical-session.target graphical-session-pre.target - # Attempt to restart xmonad if X is running. - if [[ -v DISPLAY ]] ; then - echo "Restarting xmonad" - ${cfg.windowManager.command} --restart - fi + systemctl --user import-environment DBUS_SESSION_BUS_ADDRESS + systemctl --user import-environment DISPLAY + systemctl --user import-environment SSH_AUTH_SOCK + systemctl --user import-environment XAUTHORITY + systemctl --user import-environment XDG_DATA_DIRS + systemctl --user import-environment XDG_RUNTIME_DIR + systemctl --user import-environment XDG_SESSION_ID + + ${cfg.profileExtra} + + export HM_XPROFILE_SOURCED=1 + ''; + + home.file.".xsession" = { + mode = "555"; + text = '' + if [[ ! -v HM_XPROFILE_SOURCED ]]; then + . ~/.xprofile fi + unset HM_XPROFILE_SOURCED + + systemctl --user start hm-graphical-session.target + + ${cfg.initExtra} + + ${cfg.windowManager.command} + + systemctl --user stop graphical-session.target + systemctl --user stop graphical-session-pre.target + + # Wait until the units actually stop. + while [[ -n "$(systemctl --user --no-legend --state=deactivating list-units)" ]]; do + sleep 0.5 + done ''; - }) - - { - systemd.user.services.setxkbmap = { - Unit = { - Description = "Set up keyboard in X"; - After = [ "graphical-session-pre.target" ]; - PartOf = [ "graphical-session.target" ]; - }; - - Install = { - WantedBy = [ "graphical-session.target" ]; - }; - - Service = { - Type = "oneshot"; - ExecStart = - let - args = concatStringsSep " " ( - [ - "-layout '${config.home.keyboard.layout}'" - "-variant '${config.home.keyboard.variant}'" - ] ++ - (map (v: "-option '${v}'") config.home.keyboard.options) - ); - in - "${pkgs.xorg.setxkbmap}/bin/setxkbmap ${args}"; - }; - }; - - # A basic graphical session target for Home Manager. - systemd.user.targets.hm-graphical-session = { - Unit = { - Description = "Home Manager X session"; - Requires = [ "graphical-session-pre.target" ]; - BindsTo = [ "graphical-session.target" ]; - }; - }; - - home.file.".xprofile".text = '' - if [[ -e "$HOME/.profile" ]]; then - . "$HOME/.profile" - fi - - # If there are any running services from a previous session. - # Need to run this in xprofile because the NixOS xsession - # script starts up graphical-session.target. - systemctl --user stop graphical-session.target graphical-session-pre.target - - systemctl --user import-environment DBUS_SESSION_BUS_ADDRESS - systemctl --user import-environment DISPLAY - systemctl --user import-environment SSH_AUTH_SOCK - systemctl --user import-environment XAUTHORITY - systemctl --user import-environment XDG_DATA_DIRS - systemctl --user import-environment XDG_RUNTIME_DIR - systemctl --user import-environment XDG_SESSION_ID - - ${cfg.profileExtra} - - export HM_XPROFILE_SOURCED=1 - ''; - - home.file.".xsession" = { - mode = "555"; - text = '' - if [[ ! -v HM_XPROFILE_SOURCED ]]; then - . ~/.xprofile - fi - unset HM_XPROFILE_SOURCED - - systemctl --user start hm-graphical-session.target - - ${cfg.initExtra} - - ${cfg.windowManager.command} - - systemctl --user stop graphical-session.target - systemctl --user stop graphical-session-pre.target - - # Wait until the units actually stop. - while [[ -n "$(systemctl --user --no-legend --state=deactivating list-units)" ]]; do - sleep 0.5 - done - ''; - }; - } - ]); + }; + }; }