aboutsummaryrefslogtreecommitdiff
path: root/tw/home/cern.scm
blob: 878aa29d271fbdb0a52c066a983e556b510d6bac (about) (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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
;; This "home-environment" file can be passed to 'guix home reconfigure'
;; to reproduce the content of your profile.  This is "symbolic": it only
;; specifies package names.  To reproduce the exact same profile, you also
;; need to capture the channels being used, as returned by "guix describe".
;; See the "Replicating Guix" section in the manual.

;; See also, for some tips:
;; https://github.com/alezost/shepherd-config/blob/master/init.scm

(define-module (tw home cern)
  #:use-module ((gnu)
                #:select (use-package-modules))
  #:use-module (gnu home)
  #:use-module (gnu home services)
  #:use-module (gnu home services desktop)
  #:use-module (gnu home services guix)
  #:use-module (gnu home services mcron)
  #:use-module (gnu home services pm)
  #:use-module (gnu home services shepherd)
  #:use-module (gnu packages)
  #:use-module (gnu services)
  #:use-module (gnu services shepherd)
  #:use-module (guix channels)
  #:use-module (guix gexp)
  #:use-module ((nongnu packages messaging)
                #:select (zoom))
  #:use-module (tw home)
  #:use-module (tw home emacs)
  #:use-module (tw packages alice)
  #:use-module (tw packages ci)
  #:use-module (tw packages catppuccin)
  #:use-module (tw packages xorg)
  #:use-module (tw gexp)
  #:use-module (tw theme))

(use-package-modules android calendar compton dav dunst fonts freedesktop games
                     gimp gnome gnome-xyz gnuzilla graphviz image-viewers
                     inkscape kde libreoffice linux mail messaging networking
                     pdf pulseaudio python-xyz syndication tcl terminals tex
                     version-control video web-browsers wm xdisorg xorg)

(define pim-packages
  (list vdirsyncer khal khard aerc lynx))   ; lynx for HTML mail

(define pim-services
  (list
   (simple-service 'pim-config home-xdg-configuration-files-service-type
     `(("khal/config" ,(local-file "files/khal.conf"))
       ("khard/khard.conf" ,(local-file "files/khard.conf"))
       ("aerc" ,(local-file "files/aerc" #:recursive? #t))
       ("vdirsyncer/config" ,(local-file "files/vdirsyncer.conf"))))

   ;; These cron jobs are annoying because they pop up a password prompt every time they run.
   ;; (simple-service 'pim-cronjobs home-mcron-service-type
   ;;   (list #~(job "15 */4 * * *"   ; every four hours at HH:15
   ;;                (string-append #$(file-append vdirsyncer "/bin/vdirsyncer") " metasync"))
   ;;         #~(job "0,30 * * * *"   ; every half hour
   ;;                (string-append #$(file-append vdirsyncer "/bin/vdirsyncer") " sync"))))

   (simple-service 'mail-files home-files-service-type
     `(;; The file from git main is newer than the one bundled with the
       ;; packaged neomutt version and contains a few fixes.
       (".local/bin/mutt_oauth2.py"
        ,(local-file "files/neomutt/contrib/oauth2/mutt_oauth2.py" #:recursive? #t))))))

(define polybar-wrapper
  (program-file
   "polybar-wrapper"
   #~(begin
       ;; This wrapper program checks that the monitor we want to start
       ;; polybar on is actually connected.
       (use-modules (ice-9 popen)
                    (ice-9 rdelim))
       (let* ((connected-str (string-append (getenv "POLYBAR_MONITOR") " connected"))
              (xrandr (open-pipe* OPEN_READ #$(file-append xrandr "/bin/xrandr") "-q"))
              (monitor-connected?
               (let loop ((line (read-line xrandr)))
                 (cond
                  ((eof-object? line) #f)                   ; we didn't find our monitor connected
                  ((string-prefix? connected-str line) #t)  ; the monitor we want is connected
                  (else (loop (read-line xrandr)))))))      ; keep looking
         (close-pipe xrandr)
         (when monitor-connected?
           (execl #$(file-append polybar "/bin/polybar")))))))

(define (polybar-service monitor)
  (shepherd-service
   (documentation (string-append "Polybar desktop bar for monitor " monitor "."))
   (provision (list (symbol-append 'polybar- (string->symbol monitor))))
   (requirement '(xorg-setup))
   (start #~(make-forkexec-constructor
             (list #$polybar-wrapper)
             #:environment-variables
             (cons #$(string-append "POLYBAR_MONITOR=" monitor)
                   (default-environment-variables))))
   (stop #~(make-kill-destructor))))

(define-public %cern-home
  (home-environment
   (packages
    ;; These packages will show up in the home profile, under ~/.guix-home/profile.
    (cons*
     ;; CLI tools
     bsd-games texlive powertop (list git "send-email")

     ;; Work
     s3cmd python-alibuild python-alidistlint
     hashicorp-levant-bin hashicorp-nomad-bin
     hashicorp-consul-bin hashicorp-vault-bin hashicorp-packer-bin

     ;; i3 and Xorg. i3 itself must be installed system-wide for gdm to pick it up.
     ;; acpilight is a drop-in xbacklight replacement, as xbacklight doesn't work on my system.
     acpilight arandr dunst gimp hsetroot inkscape icecat kitty libreoffice imv mpv
     polybar pulsemixer rofi rofi-calc tk xdg-utils xdot xclip xcwd xdotool
     xdpyinfo xev xfd xfontsel xinput xkill xprop xrandr xrdb xsel xset xwininfo
     zoom zathura zathura-ps zathura-pdf-poppler
     dconf dconf-editor  ; required for config by blueman, cozy, ...
     ;; gnome-keyring  ; installed system-wide; see system-configuration.scm
     ;; geoclue  ; for redshift -- installed system-wide
     ;; Fonts
     font-hermit font-inconsolata font-fira-code font-fira-sans font-libertinus
     ;; Fallback fonts
     font-google-noto font-google-noto-emoji font-openmoji  ; for polybar
     ;; Theming
     papirus-icon-theme catppuccin-gtk-theme catppuccin-mocha-dark-cursors

     (append common-packages emacs-packages pim-packages)))

   ;; To search for available home services, run 'guix home search KEYWORD'.
   (services
    (cons*
     ;; Configuration files for terminal-only programs in $XDG_CONFIG_HOME.
     (simple-service 'laptop-config home-xdg-configuration-files-service-type
       `(;; All alibuild needs is an empty file.
         ("alibuild/disable-analytics"
          ,(plain-file "alibuild-disable-analytics" ""))
         ("X11/XCompose" ,(local-file "files/XCompose"))   ; see also: $XCOMPOSEFILE variable
         ("X11/Xresources" ,(local-file "files/Xresources"))))

     ;; This can't be a `service' as that would remove the 'guix channel.
     (simple-service 'nonfree-channels home-channels-service-type
       (list
        (channel
         (name 'nonguix)
         (url "https://gitlab.com/nonguix/nonguix")
         ;; Enable signature verification:
         (introduction
          (make-channel-introduction
           "897c1a470da759236cc11798f4e0a5f7d4d59fbc"
           (openpgp-fingerprint
            "2A39 3FFF 68F4 EF7A 3D29  12AF 6F51 20A0 22FB B2D5"))))))

     ;; Redshift: make the screen turn redder at night.
     (service home-redshift-service-type
       (home-redshift-configuration
        ;; See info '(guix)Desktop Home Services'.
        (location-provider 'manual)
        ;; Approximate location
        (latitude 46.0)
        (longitude 6.0)
        ;; (location-provider 'geoclue2)  ; TODO: currently waits forever for a location -- not sure why geoclue doesn't work
        ;; (daytime-temperature 6500)     ; default 6500
        ;; (nighttime-temperature 4500)   ; default 4500
        (daytime-brightness 1.0)
        (nighttime-brightness 0.7)
        (extra-content "fade=0")))  ; with fade=1, restarting redshift causes flickering for a few secs

     ;; The dbus service doesn't seem to be added automatically.
     (service home-dbus-service-type
       (home-dbus-configuration))

     (simple-service 'gui-services home-shepherd-service-type
       (list
        (shepherd-service
         (documentation "NetworkManager applet; provides a GUI for network connections.")
         (provision '(nm-applet))
         (start #~(make-forkexec-constructor
                   (list #$(file-append network-manager-applet "/bin/nm-applet"))))
         (stop #~(make-kill-destructor)))

        (polybar-service "DP-2")
        (polybar-service "DP-1-8")

        (shepherd-service
         (documentation "Dunst notification daemon; displays desktop notifications.")
         (provision '(dunst))
         (start #~(make-forkexec-constructor
                   (list #$(file-append dunst "/bin/dunst"))))
         (stop #~(make-kill-destructor)))

        (shepherd-service
         (documentation "Picom compositor; enables transparent windows in X.")
         (provision '(picom))
         (start #~(make-forkexec-constructor
                   (list #$(file-append picom "/bin/picom")
                         "--config" #$(local-file "files/picom.conf"))))
         (stop #~(make-kill-destructor)))

        (shepherd-service
         (documentation "Source Xresources on login.")
         (provision '(xrdb))
         (one-shot? #t)
         (start #~(lambda _
                    (invoke #$(file-append xrdb "/bin/xrdb") "-merge"
                            (string-append (getenv "XDG_CONFIG_HOME") "/X11/Xresources")))))

        ;; By default, xdotool gets most of "#@\|~()<>[]{} wrong.  Make
        ;; it use the correct keymap by re-setting the same one again.
        (shepherd-service
         (documentation "Fix X keyboard map on login; passmenu needs this.")
         (provision '(fix-xdotool))
         (one-shot? #t)
         (start #~(lambda _
                    (use-modules (ice-9 rdelim)
                                 (ice-9 regex)
                                 (ice-9 popen))
                    (let ((port (open-pipe* OPEN_READ #$(file-append setxkbmap "/bin/setxkbmap")
                                            "-query")))
                      (let loop ((line (read-line port)))
                        (unless (eof-object? line)
                          (let ((mtch (string-match "^layout:[[:space:]]*" line)))
                            (if mtch
                                (system* #$(file-append setxkbmap "/bin/setxkbmap")
                                         (match:suffix mtch))
                                (loop (read-line port))))))))))

        (shepherd-service
         (documentation "Set up X displays on login.")
         (provision '(xorg-setup))
         (one-shot? #t)
         (start #~(lambda _
                    (system* #$(file-append numlockx "/bin/numlockx") "on")
                    ;; Turn off the monitors if there is no input for 10 minutes.
                    (system* #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
                    (system* #$(file-append xrandr "/bin/xrandr")
                             "--output" "DP-2" "--primary" "--auto")
                    (system* #$(file-append xrandr "/bin/xrandr")
                             ;; This can do 4K but HiDPI is a pain.
                             "--output" "DP-1-8" "--mode" "1920x1080" "--rate" "60.00"
                             "--left-of" "DP-2")
                    ;; Set the desktop background picture. Hopefully doing this just after
                    ;; xrandr works and sets it for both screens.
                    (system* #$(file-append hsetroot "/bin/hsetroot") "-cover"
                             (string-append (getenv "XDG_CONFIG_HOME")
                                            "/X11/ridge-view.jpg")))))))

     ;; Configuration files for GUI programs in $XDG_CONFIG_HOME.
     (simple-service 'gui-config home-xdg-configuration-files-service-type
       `(("dunst/dunstrc" ,(local-file "files/dunstrc"))
         ("dunst/dunstrc.d/50-catppuccin.conf" ,catppuccin-dunstrc)
         ("gtk-2.0/gtkrc" ,(local-file "files/gtk2.ini"))
         ("gtk-3.0/settings.ini" ,(local-file "files/gtk3.ini"))
         ("i3/config" ,(local-file "files/i3.conf"))
         ;; TODO: "kdeglobals" works for some programs (e.g. kdeconnect-app),
         ;; but not for others (e.g. nheko, kdeconnect-settings)...
         ("kdeglobals" ,catppuccin-kdeglobals)
         ("kitty/diff.conf"
          ,(combined-text-file "kitty-diff.conf"
             (plain-file "kitty-diff-custom.conf"
                         "pygments_style bw\n")
             catppuccin-kitty-diff))
         ("kitty/kitty.conf"
          ,(combined-text-file "kitty.conf"
             (local-file "files/kitty.conf")
             catppuccin-kitty))
         ("mimeapps.list" ,(local-file "files/mimeapps.list"))
         ("polybar/config.ini" ,(local-file "files/polybar.ini"))
         ("polybar/catppuccin.ini" ,catppuccin-polybar)
         ("rofi/config.rasi" ,(local-file "files/rofi.rasi"))
         ("rofi/themes/catppuccin.rasi" ,catppuccin-rofi)
         ("zathura/zathurarc" ,(local-file "files/zathurarc"))
         ("zathura/catppuccin" ,catppuccin-zathura)))

     (simple-service 'cursor-theme home-files-service-type
       `((".icons/default/index.theme" ,(local-file "files/cursors.ini"))))

     (simple-service 'gui-environment home-environment-variables-service-type
       `(("TERMINAL" . "kitty")
         ("_JAVA_OPTIONS" .
          ,(string-append
            "$_JAVA_OPTIONS${_JAVA_OPTIONS:+ }-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true "
            "-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel "
            "-Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel"))
         ;; Smooth trackpad scrolling in Firefox/Icecat.
         ;; https://wiki.archlinux.org/index.php/Firefox/Tweaks#Pixel-perfect_trackpad_scrolling
         ("MOZ_USE_XINPUT2" . "1")))

     (simple-service 'gui-scripts home-files-service-type
       `(;; https://sw.kovidgoyal.net/kitty/kittens/diff/
         (".local/bin/kdiff"  ; show a diff
          ,(program-file "kdiff" #~(apply execl #$(file-append kitty "/bin/kitty") "kitty"
                                          "+kitten" "diff" (cdr (command-line)))))
         (".local/bin/icat"   ; kitty's "catimg" equivalent
          ,(program-file "icat" #~(apply execl #$(file-append kitty "/bin/kitty") "kitty"
                                         "+kitten" "icat" (cdr (command-line)))))
         (".local/bin/screenlock"
          ,(program-file
            "screenlock"
            #~(begin  ; Wrapper around i3lock to turn off the screen and pause notifications.
                (system* #$(file-append dunst "/bin/dunstctl") "set-paused" "true")
                (system* #$(file-append xset "/bin/xset") "dpms" "0" "0" "5")
                ;; We mustn't use `file-append' here, as we have to pick up the
                ;; setuid binary for i3lock installed by the system config.
                (system* "i3lock" "-nc" #$catppuccin-background-color)
                (system* #$(file-append xset "/bin/xset") "dpms" "600" "600" "600")
                (system* #$(file-append dunst "/bin/dunstctl") "set-paused" "false"))))
         ;; With #:recursive? #t, Guix keeps the files' permission bits, i.e. makes them executable.
         (".local/bin/sessionmenu" ,(local-file "files/sessionmenu" #:recursive? #t))
         (".local/bin/passmenu" ,(local-file "files/passmenu" #:recursive? #t))
         (".local/bin/volume" ,(local-file "files/volume" #:recursive? #t))
         (".local/share/applications/emacsclient.desktop"
          ,(local-file "files/emacsclient.desktop"))))

     (append (gnupg-services #:gui-pinentry? #t)
             common-services emacs-services pim-services)))))

%cern-home