diff --git a/modules/misc/news.nix b/modules/misc/news.nix index db2aee347..025f69c0e 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -232,12 +232,29 @@ in tool in that NIX_AUTO_INSTALL is not supported. ''; } + { time = "2017-09-28T12:39:36+00:00"; message = '' A new program module is available: 'programs.rofi'; ''; } + + { + 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'. + ''; + } ]; }; } diff --git a/modules/xsession.nix b/modules/xsession.nix index 6a3c589ef..4899ad2ea 100644 --- a/modules/xsession.nix +++ b/modules/xsession.nix @@ -6,6 +6,32 @@ let cfg = config.xsession; + # Hack to support xsession.windowManager.command option. + wmBaseModule = { + options = { + command = mkOption { + type = types.str; + example = literalExample '' + let + xmonad = pkgs.xmonad-with-packages.override { + packages = self: [ self.xmonad-contrib self.taffybar ]; + }; + in + "''${xmonad}/bin/xmonad"; + ''; + description = '' + Window manager start command. + ''; + }; + + usesDeprecated = mkOption { + internal = true; + type = types.bool; + default = false; + }; + }; + }; + in { @@ -16,16 +42,15 @@ in enable = mkEnableOption "X Session"; windowManager = mkOption { - type = types.str; - example = literalExample '' - let - xmonad = pkgs.xmonad-with-packages.override { - packages = self: [ self.xmonad-contrib self.taffybar ]; - }; - in - "''${xmonad}/bin/xmonad"; + type = + types.coercedTo + types.str + (command: { inherit command; usesDeprecated = true; }) + (types.submodule wmBaseModule); + description = '' + Window manager start command. DEPRECATED: Use + xsession.windowManager.command instead. ''; - description = "Path to window manager to exec."; }; initExtra = mkOption { @@ -36,75 +61,84 @@ in }; }; - config = mkIf cfg.enable { - systemd.user.services.setxkbmap = { - Unit = { - Description = "Set up keyboard in X"; - After = [ "graphical-session-pre.target" ]; - PartOf = [ "graphical-session.target" ]; + config = mkIf cfg.enable (mkMerge [ + (mkIf cfg.windowManager.usesDeprecated { + warnings = [ + ("xsession.windowManager is deprecated, " + + "please use xsession.windowManager.command") + ]; + }) + + { + 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}"; + }; }; - Install = { - WantedBy = [ "graphical-session.target" ]; + # 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" ]; + }; }; - 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}"; + home.file.".xsession" = { + mode = "555"; + text = '' + if [[ -e "$HOME/.profile" ]]; then + . "$HOME/.profile" + fi + + # If there are any running services from a previous session. + 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 + + 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 + ''; }; - }; - - # 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.".xsession" = { - mode = "555"; - text = '' - if [[ -e "$HOME/.profile" ]]; then - . "$HOME/.profile" - fi - - # If there are any running services from a previous session. - 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 - - systemctl --user start hm-graphical-session.target - - ${cfg.initExtra} - - ${cfg.windowManager} - - 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 - ''; - }; - }; + } + ]); }