3
0
Fork 0
forked from mirrors/nixpkgs
nixpkgs/nixos/modules/services
Ivan b90c5cb703
XMonad: configured recompile (#107696)
* nixos/xmonad: xmonad config w/ghc+xmessage

When the "config" option isn't set, we use xmonad-with-packages to
provide xmonad with runtime access to an isolated ghc, ensuring it can
recompile and exec a user's local config (e.g. $HOME/.xmonad/xmonad.hs)
regardless of which ghc (if any) is on PATH.

When the "config" option is set, however, we compile a configured xmonad
executable upfront (during nixos-rebuild), and prior to this commit, it
was not provided with runtime access to an isolated ghc.

As a result, with the "config" option set, it was not possible
to recompile and exec a user's local config unless there was a
compatible version of ghc on PATH with the necessary packages (xmonad,
xmonad-contrib, etc.) in its package database. Adding such a ghc to
environment.systemPackages, e.g.

  (haskellPackages.ghcWithPackages (ps: with ps; [xmonad xmonad-contrib]))

is problematic because it adds both ghc and an unconfigured xmonad to
PATH, e.g.

  $ ls -l $(which xmonad ghc)
  lrwxrwxrwx ... /run/current-system/sw/bin/ghc -> /nix/store/...-ghc-8.10.2-with-packages/bin/ghc
  lrwxrwxrwx ... /run/current-system/sw/bin/xmonad -> /nix/store/...-ghc-8.10.2-with-packages/bin/xmonad

Having the unconfigured xmonad on PATH is particularly bad because
restarting xmonad will dump the user into the unconfigured version, and
if no local config exists (e.g. in $HOME/.xmonad/xmonad.hs), they'll be
left in this unconfigured state.

In this commmit, we give the configured xmonad runtime access to ghc
like xmonad-with-packages does for the unconfigured version. The aim
is to allow the user to switch between the nixos module's config and a
local config (e.g. $HOME/.xmonad/xmonad.hs) at will, so they can try out
config changes without performing a nixos-rebuild.

Since the xmonad on PATH is the configured executable, there's no
danger a user could unwittingly restart into the unconfigured version,
and because xmonad will refuse to recompile when no local config
exists, there's no danger a user could unwittingly recompile into an
unconfigured version.

Given that a local config exists, the recompile/restart behavior depends
on two factors:
- which entry point is used
  * 'XMonad.xmonad' (default)
  * 'XMonad.launch' (recommended in "config" option description)
- what operation is triggered (i.e. via mod+q)
  * `spawn "xmonad --recompile && xmonad --restart"` (default)
  * `restart "xmonad" True`
  * custom function

If the default 'XMonad.xmonad' entrypoint and default mod+q operation
are used, hitting mod+q will compile and exec the local config, which
will remain in use until next time the display manager is restarted.

If the entrypoint is changed to 'XMonad.launch' but mod+q left with its
default operation, hitting mod+q will have no visible effect. The logs
(as seen by running `journalctl --identifier xmonad --follow`) will show
an error,
  X Error of failed request:  BadAccess (attempt to access private resource denied)
which indicates that the shell was unable to start xmonad because
another window manager is already running (namely, the nixos-configured
xmonad).
https://wiki.haskell.org/Xmonad/Frequently_asked_questions#X_Error_of_failed_request:_BadAccess_.28attempt_to_access_private_resource_denied.29

Changing the mod+q operation to `restart "xmonad" True` (as recommended
in the "config" option's description) will allow a restart of the
nixos-configured xmonad to be triggeredy by hitting mod+q.

Finally, if the entrypoint is 'XMonad.launch', mod+q has been
bound to `restart "xmonad" True` and another key bound to a custom
recompile/restart function (e.g. `compileRestart` as shown in the
"config" option example), the user can switch between the nixos module's
config and their local config, with the custom key switching to the
local config and mod+q switching back.

* nixos/xmonad: refactor let binding

* nixos/xmonad: refactor (eliminate duplicate code)

* nixos/xmonad: install man pages

Prior to this commit, man pages were not installed if the "config"
option was set.

* nixos/xmonad: comment grammar fixups

* nixos/xmonad: writeStateToFile in example config

Calling writeStateToFile prior to recompiling and restarting allows
state (workspaces, etc.) to be preserved across the restart.

* nixos/xmonad: add ivanbrennan to maintainers

* nixos/xmonad: adjust compileRestart example

* nixos/xmonad: add missing import to example config
2020-12-28 17:27:36 +01:00
..
admin utillinux: rename to util-linux 2020-11-24 12:42:06 -05:00
amqp
audio nixos/mpd: conditionally provision required directories with StateDirectory 2020-12-11 19:35:43 -05:00
backup utillinux: rename to util-linux 2020-11-24 12:42:06 -05:00
cluster Merge master into staging-next 2020-11-27 15:09:19 +01:00
computing nixos/slurm: fix dbdserver config file handling 2020-12-16 20:34:14 +01:00
continuous-integration utillinux: rename to util-linux 2020-11-24 12:42:06 -05:00
databases nixos/mongodb: fix running initialScript without a set root password 2020-12-19 18:14:29 +01:00
desktops nixos/pipewire: enable volume control via alsa 2020-12-02 22:11:09 +01:00
development nixos/services/hoogle use DynamicUser instead of nobody 2020-11-30 13:36:19 +00:00
editors Fix typo in services/editors/emacs documentation 2020-08-27 16:58:52 -04:00
games nixos/factorio: Don't open firewall ports by default 2020-11-24 23:14:57 +01:00
hardware trezord: TREZOR -> Trezor 2020-12-27 19:48:09 +01:00
logging nixos/vector: add module 2020-11-30 16:22:08 +09:00
mail Merge pull request #105397 from kisik21/mailman-other-mta-support 2020-12-14 09:46:05 +01:00
misc nixos/gitlab: move custom_hooks_dir into gitaly config (#107174) 2020-12-26 22:44:36 +01:00
monitoring nixos: add prometheus_nginxlog_exporter module + test 2020-12-21 21:23:39 +01:00
network-filesystems nixos/samba-wsdd: fix starting 2020-12-17 20:52:30 +03:00
networking nixos/kresd: set .stopIfChanged = false 2020-12-25 09:54:04 +01:00
printing
scheduling nixos/marathon: remove module 2020-08-15 16:59:58 +02:00
search
security nixos/tor: don't do privoxy stuff by default 2020-12-16 12:20:03 +00:00
system utillinux: rename to util-linux 2020-11-24 12:42:06 -05:00
torrent utillinux: rename to util-linux 2020-11-24 12:42:06 -05:00
ttys utillinux: rename to util-linux 2020-11-24 12:42:06 -05:00
video epgstation: 1.7.4 -> 1.7.5 2020-10-21 00:05:48 +09:00
wayland nixos/cage: supply pamEnvironment 2020-08-27 10:11:45 -05:00
web-apps Merge pull request #107064 from aanderse/nixos/zabbixWeb 2020-12-28 00:22:35 -05:00
web-servers nixos/httpd: set lua paths 2020-12-25 22:54:05 +01:00
x11 XMonad: configured recompile (#107696) 2020-12-28 17:27:36 +01:00