summaryrefslogtreecommitdiffstats
path: root/pkgs/haskell/xmonad-tv/shell.nix
blob: 859d1ea428ae180f027104f042fe548e31deed84 (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
84
85
86
87
88
89
90
91
92
93
94
95
96
{ compiler ? "default" }: let

  inherit (import ~/sync/src/hrm) lib mylib;
  krops.lib = import ~/sync/src/krops/lib;

  hrm = import ~/sync/src/hrm/legacy.nix {};

  hostName = krops.lib.maybeHostName (builtins.throw "no hostname found");

  inherit (hrm.nixosConfigurations.${hostName}) config pkgs;

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

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

in

  lib.overrideDerivation xmonadDrv.env (oldAttrs: {
    shellHook = ''
      display=$(echo "$DISPLAY" | sed -rn 's/^:([0-9]+)(\.[0-9]+)?$/\1/p')
      if test -z "$display"; then
        echo "Error: unsupported display name “$DISPLAY”" >&2
        exit -1
      fi

      pkg_name=${mylib.shell.escape (builtins.baseNameOf (toString ./.))}

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

      mkdir -p "$CACHEDIR"

      service=xmonad@$display.service
      xmonad=$CACHEDIR/xmonad-${builtins.currentSystem}

      service_XMONAD_CACHE_DIR=$(
        systemctl show "$service" --property=Environment |
        tr \  \\n |
        sed -rn 's/^XMONAD_CACHE_DIR=//p'
      )

      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 "$service"; then
          systemctl stop "$service"
          cp -b "$service_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 "$service"; then
          "$xmonad" --shutdown
          cp -b "$CACHEDIR"/xmonad.state "$service_XMONAD_CACHE_DIR"/
          systemctl start "$service"
        else
          echo "$service is already running" >&2
          exit -1
        fi
      )}

      export PATH=${lib.makeBinPath (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"
    '';
  })