summaryrefslogtreecommitdiff
path: root/awesome/default.nix
blob: 3fedb87f94cfa62482c6dacc9a416d2b511b7f6b (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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
{

  config,


}: rec {

  pkgs = (import ../pkgs.nix).stable {};
  pkgs2305 = (import ../pkgs.nix).stable2305 {};
  pkgsEdge = (import ../pkgs.nix).edge {};

  xorgInnerEnv = pkgs.buildEnv {
    name = "xorg-inner-env";
    paths = [
      pkgs.xorg.xorgserver
      pkgs.xorg.xinit
      pkgs.xorg.xauth
      pkgs.xorg.xset
      pkgs.xorg.xf86inputlibinput
      pkgs.xorg.xrandr
      pkgs.xsel

      (pkgs.runCommand "xorg-conf-inner" {} ''
         mkdir -p "$out"/share/X11/xorg.conf.d/
         cp ${./xorg.conf} "$out"/share/X11/xorg.conf.d/99-loadout.conf
       '')
    ];
  };

  xorgConf = pkgs.runCommand "xorg-conf" {} ''
    cat >>"$out" <<EOF
Section "Files"
    ModulePath "${xorgInnerEnv}/lib/xorg/modules"
EndSection

${config.xorgConfExtra}
EOF

    for f in $(ls ${xorgInnerEnv}/share/X11/xorg.conf.d | sort); do
      cat ${xorgInnerEnv}/share/X11/xorg.conf.d/"$f" >> "$out"
    done
  '';

  startx = pkgs.writeShellScriptBin "startx" ''
    # TODO pass .xinitrc into here, somehow
    export XORGCONFIG=${xorgConf}
    export PATH=${xorgInnerEnv}/bin:$PATH
    exec startx
  '';

  # nativeWrap is used for apps which are not installed via nix which don't play
  # nicely with it.
  nativeWrap = pkgs.writeScriptBin "native-wrap" ''
    #!${pkgs.bash}/bin/bash

    unset XDG_CONFIG_DIRS
    unset XDG_DATA_DIRS
    unset GDK_PIXBUF_MODULE_FILE

    exec "$@"
  '';

  browser = pkgs.writeScriptBin "browser" ''
    #!${pkgs.bash}/bin/bash
    exec ${nativeWrap}/bin/native-wrap ${config.browser} "$@"
  '';

  env = pkgs.buildEnv {
    name = "awesome-env";
    paths = [
      pkgs.awesome
      pkgs.tela-icon-theme

      nativeWrap
      browser

      pkgs.pavucontrol
      pkgs.xdg-utils
      pkgs.arandr

      pkgs.i3lock
      pkgs.scrot
      pkgs.feh
      pkgs.brightnessctl

      pkgs.cbatticon
      pkgs.phwmon

      pkgs2305.libreoffice
      pkgs.gimp
      pkgs.inkscape
      pkgs.vlc
      pkgs.sylpheed
      pkgs.calibre

      pkgsEdge.lagrange
    ];
  };

  wp = ../wallpapers;

  dirsLua = pkgs.writeTextDir "dirs.lua" ''
    home_dir = os.getenv("HOME").."/"
    bin_dir = "${./bin}/"
    share_dir = "${./share}/"
    wp_dir = "${wp}/"
  '';

  awesome = pkgs.writeScriptBin "awesome" ''
    #!${pkgs.bash}/bin/bash

    set -e -x

    export BROWSER=${browser}/bin/browser

    # Turn off powersaving (fuck the environment)
    xset -dpms
    xset s off

    export PATH=${env}/bin:$PATH

    export XDG_CONFIG_DIRS=${./config}

    export XDG_DATA_DIRS=${env}/share
    export XDG_DATA_DIRS=$XDG_DATA_DIRS:/home/mediocregopher/.nix-profile/share

    ${config.awesome.startupExtra}

    # HACK: This sleep is here because phwmon actually creates a separate tray
    # icon for each thing it monitors, and if the process runs at the same time
    # as another process which creates a tray icon they can get interleaved.
    (sleep 5 && phwmon.py) &

    ############################################################################
    # Init awesome

    data_dir="$HOME/.local/share/awesome";
    mkdir -p "$data_dir"

    log_dir="$data_dir"/logs
    mkdir -p $log_dir

    # only keep last N awesome.log files
    ls "$log_dir" | sort -n | head -n -5 | while read f; do rm "$log_dir"/"$f"; done

    ############################################################################
    # Exec

    this_log=$log_dir/awesome.$(date '+%Y%m%d.%H%M%S').log

    echo "New awesome session starting" > $this_log

    exec awesome \
      -c ${./rc.lua} \
      --search ${dirsLua} \
      --search ${./share} \
      --search ${env}/share/awesome/themes \
      2>&1 2>>$this_log
  '';
}