blob: 917c2b7f0c7815ff7f2a1749b96eb185453d705a (
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
|
{ stdenv, writeTextFile
, ghcWithPackages
, user ? "gkleen"
, libnotify
}:
stdenv.mkDerivation {
name = ''notify-${user}'';
src = writeTextFile { name = ''notify-${user}.hs''; text = ''
{-# LANGUAGE ViewPatterns #-}
import System.FilePath.Glob (glob)
import System.Environment (setEnv, getArgs)
import System.Process (spawnProcess, waitForProcess)
import System.Exit (exitWith, ExitCode(..))
import Data.List (isPrefixOf, dropWhile, dropWhileEnd)
import Data.Char (isSpace)
import Control.Monad (forM_, void)
main = do
envFiles <- glob "/home/${user}/.dbus/session-bus/*"
forM_ envFiles $ \envFile -> do
sessionAddr <- tail . snd . break (== '=') . head . filter ("DBUS_SESSION_BUS_ADDRESS=" `isPrefixOf`) . lines <$> readFile envFile
setEnv "DBUS_SESSION_BUS_ADDRESS" sessionAddr
lines <- lines <$> getContents
case lines of
[] -> exitWith ExitSuccess
((trim -> summary):(trim . unlines -> contents)) -> do
ph <- spawnProcess "${libnotify}/bin/notify-send" =<< (++ [summary, contents]) <$> getArgs
void $ waitForProcess ph
where
trim = dropWhileEnd isSpace . dropWhile isSpace
''; };
phases = [ "buildPhase" "installPhase" ];
buildPhase = ''
${ghcWithPackages (p: with p; [ Glob process ])}/bin/ghc -odir . -hidir . $src -o notify-${user}
'';
installPhase = ''
mkdir -p $out/bin
cp notify-${user} $out/bin
chmod +x $out/bin/notify-${user}
'';
}
|