summaryrefslogtreecommitdiffstats
path: root/pkgs/haskell/xmonad-tv/shell.nix
blob: 6ca00bc057116764d54b96390997318bb33e02eb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
{ compiler ? "default" }: let

  stockholm = import <stockholm>;

  inherit (stockholm.systems.${lib.krops.getHostName}) config pkgs;
  inherit (stockholm) lib;

  haskellPackages =
    if compiler == "default"
      then pkgs.haskellPackages
      else pkgs.haskell.packages.${compiler};

  xmonadDrv = haskellPackages.callPackage (import ./.) {};

in

  lib.overrideDerivation xmonadDrv.env (oldAttrs: {
    shellHook = ''
      pkg_name=${lib.shell.escape (lib.baseNameOf (toString ./.))}

      WORKDIR=${toString ./src}
      CACHEDIR=$HOME/tmp/$pkg_name
      HISTFILE=$CACHEDIR/bash_history

      mkdir -p "$CACHEDIR"

      config_XMONAD_CACHE_DIR=${lib.shell.escape
        config.systemd.services.xmonad.environment.XMONAD_CACHE_DIR
      }

      xmonad=$CACHEDIR/xmonad-${lib.currentSystem}

      xmonad_build() {(
        set -efu
        cd "$WORKDIR"
        options=$(
          ${pkgs.cabal-read}/bin/ghc-options "$WORKDIR/$pkg_name.cabal" xmonad
        )
        ghc $options \
            -odir "$CACHEDIR" \
            -hidir "$CACHEDIR" \
            -o "$xmonad" \
            main.hs
      )}

      xmonad_restart() {(
        set -efu
        cd "$WORKDIR"
        if systemctl --quiet is-active xmonad; then
          sudo systemctl stop xmonad
          cp -b "$config_XMONAD_CACHE_DIR"/xmonad.state "$CACHEDIR"/
          echo "xmonad.state: $(cat "$CACHEDIR"/xmonad.state)"
        else
          "$xmonad" --shutdown || :
        fi
        "$xmonad" &
        echo xmonad pid: $! >&2
      )}

      xmonad_yield() {(
        set -efu
        if ! systemctl --quiet is-active xmonad; then
          "$xmonad" --shutdown
          cp -b "$CACHEDIR"/xmonad.state "$config_XMONAD_CACHE_DIR"/
          sudo systemctl start xmonad
        else
          echo "xmonad.service is already running" >&2
          exit -1
        fi
      )}

      export PATH=${config.systemd.services.xmonad.path}:$PATH
      export SHELL=/run/current-system/sw/bin/bash

      export XMONAD_CACHE_DIR="$CACHEDIR"
      export XMONAD_DATA_DIR="$CACHEDIR"
      export XMONAD_CONFIG_DIR=/var/empty

      unset XMONAD_STARTUP_HOOK

      cd "$WORKDIR"
    '';
  })