Merge remote-tracking branch 'ni/master'

This commit is contained in:
lassulus 2018-11-30 20:42:01 +01:00
commit f6b5bbc305
17 changed files with 256 additions and 159 deletions

View File

@ -1,19 +1,12 @@
import <nixpkgs/nixos/lib/eval-config.nix> {
modules = [
(import <nixpkgs/nixos/lib/from-env.nix> "NIXOS_CONFIG" <nixos-config>)
];
}
//
{
import <nixpkgs/nixos> {} // rec {
lib = import ./lib;
systems = with import ./lib; let
ns = getEnv "LOGNAME";
systems = with lib; let
namespace = getEnv "LOGNAME";
systemsDir = <stockholm> + "/${namespace}/1systems";
in
genAttrs
(attrNames (filterAttrs (_: eq "directory") (readDir (<stockholm> + "/${ns}/1systems"))))
(name: let
config = import (<stockholm> + "/${ns}/1systems/${name}/config.nix");
in import <nixpkgs/nixos/lib/eval-config.nix> {
modules = [ config ];
(attrNames (filterAttrs (_: eq "directory") (readDir systemsDir)))
(name: import <nixpkgs/nixos> {
configuration = import (systemsDir + "/${name}/config.nix");
});
}

View File

@ -15,10 +15,4 @@ let
else override;
in
listToAttrs
(map
(name: nameValuePair (removeSuffix ".nix" name)
(callPackage (./. + "/${name}") {}))
(filter
(name: name != "default.nix" && !hasPrefix "." name)
(attrNames (readDir ./.))))
mapNixDir (path: callPackage path {}) ./.

View File

@ -1,13 +1,6 @@
with import <stockholm/lib>;
let
overrides = self: super:
listToAttrs
(map
(name: nameValuePair (removeSuffix ".nix" name)
(self.callPackage (./. + "/${name}") {}))
(filter
(name: name != "default.nix" && !hasPrefix "." name)
(attrNames (readDir ./.))));
overrides = self: super: mapNixDir (path: self.callPackage path {}) ./.;
in
self: super:
{

View File

@ -15,10 +15,4 @@ let
else override;
in
listToAttrs
(map
(name: nameValuePair (removeSuffix ".nix" name)
(callPackage (./. + "/${name}") {}))
(filter
(name: name != "default.nix" && !hasPrefix "." name)
(attrNames (readDir ./.))))
mapNixDir (path: callPackage path {}) ./.

View File

@ -5,6 +5,7 @@ let
evalSource = import ./eval-source.nix;
git = import ./git.nix { inherit lib; };
krops = import ../submodules/krops/lib;
shell = import ./shell.nix { inherit lib; };
types = nixpkgs-lib.types // import ./types.nix { inherit lib; };
@ -44,6 +45,23 @@ let
indent = replaceChars ["\n"] ["\n "];
mapNixDir = f: x: {
list = foldl' mergeAttrs {} (map (mapNixDir1 f) x);
path = mapNixDir1 f x;
}.${typeOf x};
mapNixDir1 = f: dirPath:
listToAttrs
(map
(relPath: let
name = removeSuffix ".nix" relPath;
path = dirPath + "/${relPath}";
in
nameValuePair name (f path))
(filter
(name: name != "default.nix" && !hasPrefix "." name)
(attrNames (readDir dirPath))));
# https://tools.ietf.org/html/rfc5952
normalize-ip6-addr =
let

@ -1 +1 @@
Subproject commit 6f49342b2d5973478f1f5eb6f8d6307059e7bcf7
Subproject commit 4017c60485c4bfff533ff11bdbb5557fa951655f

View File

@ -13,6 +13,20 @@ with import <stockholm/lib>;
shopt -s histappend histreedit histverify
shopt -s no_empty_cmd_completion
complete -d cd
case $UID in
${shell.escape (toString config.krebs.users.tv.uid)})
if test ''${SHLVL-1} = 1; then
case ''${XMONAD_SPAWN_WORKSPACE-} in
stockholm)
cd ~/stockholm
;;
esac
fi
export NIX_PATH="stockholm=$HOME/stockholm:$NIX_PATH"
;;
esac
'';
promptInit = /* sh */ ''
case $UID in
@ -32,14 +46,6 @@ with import <stockholm/lib>;
if test -n "$SSH_AGENT_PID"; then
PS1="ssh-agent[$SSH_AGENT_PID] $PS1"
fi
if test ''${SHLVL-1} = 1; then
case ''${XMONAD_SPAWN_WORKSPACE-} in
stockholm)
cd ~/stockholm
;;
esac
fi
'';
};
}

View File

@ -87,11 +87,6 @@ with import <stockholm/lib>;
export SYSTEM="$1"
exec nix-shell -I stockholm="$PWD" --run 'deploy --system="$SYSTEM"'
'';
reload = "systemctl reload";
restart = "systemctl restart";
start = "systemctl start";
status = "systemctl status";
stop = "systemctl stop";
};
environment.variables = {

View File

@ -57,7 +57,9 @@ in {
systemd.services.display-manager.enable = false;
systemd.services.xmonad = {
systemd.services.xmonad = let
xmonad = "${pkgs.haskellPackages.xmonad-tv}/bin/xmonad";
in {
wantedBy = [ "graphical.target" ];
requires = [ "xserver.service" ];
environment = {
@ -93,6 +95,11 @@ in {
"za" "zh" "zj" "zs"
]);
};
path = [
pkgs.fzmenu
pkgs.pulseaudioLight.out
pkgs.rxvt_unicode
];
serviceConfig = {
SyslogIdentifier = "xmonad";
ExecStartPre = "${pkgs.coreutils}/bin/mkdir -p ${toString [
@ -100,8 +107,8 @@ in {
"\${XMONAD_CONFIG_DIR}"
"\${XMONAD_DATA_DIR}"
]}";
ExecStart = "${pkgs.xmonad-tv}/bin/xmonad-${currentSystem}";
ExecStop = "${pkgs.xmonad-tv}/bin/xmonad-${currentSystem} --shutdown";
ExecStart = "@${xmonad} xmonad-${currentSystem} ";
ExecStop = "@${xmonad} xmonad-${currentSystem} --shutdown";
User = cfg.user.name;
WorkingDirectory = cfg.user.home;
};

View File

@ -0,0 +1,20 @@
with import <stockholm/lib>;
let
overrides = self: super:
mapNixDir (path: self.callPackage path {}) [
<stockholm/krebs/5pkgs/haskell>
./.
];
in
self: super: {
haskell = super.haskell // {
packages = mapAttrs (name: value:
if hasAttr "override" value
then value.override { inherit overrides; }
else value
) super.haskell.packages;
};
haskellPackages = super.haskellPackages.override {
inherit overrides;
};
}

View File

@ -0,0 +1,15 @@
{ mkDerivation, base, containers, directory, extra, stdenv, unix
, X11, xmonad, xmonad-contrib, xmonad-stockholm
}:
mkDerivation {
pname = "xmonad-tv";
version = "1.0.0";
src = ./src;
isLibrary = false;
isExecutable = true;
executableHaskellDepends = [
base containers directory extra unix X11 xmonad xmonad-contrib
xmonad-stockholm
];
license = stdenv.lib.licenses.mit;
}

View File

@ -0,0 +1,78 @@
{ 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/main
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 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
"$xmonad" --shutdown
cp -b "$CACHEDIR"/xmonad.state "$config_XMONAD_CACHE_DIR"/
sudo systemctl start xmonad
)}
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"
'';
})

View File

@ -0,0 +1,15 @@
module Helpers.Path where
import qualified Data.List
import qualified System.Directory
import qualified System.IO.Unsafe
findExecutable :: String -> FilePath
findExecutable =
System.IO.Unsafe.unsafePerformIO . find
where
find name =
maybe failure id <$> System.Directory.findExecutable name
where
failure = error (Data.List.intercalate " " [name, "not found"])

View File

@ -0,0 +1,22 @@
module Paths where
import Helpers.Path
otpmenu :: FilePath
otpmenu = findExecutable "otpmenu"
pactl :: FilePath
pactl = findExecutable "pactl"
passmenu :: FilePath
passmenu = findExecutable "passmenu"
slock :: FilePath
slock = "/run/wrappers/bin/slock"
su :: FilePath
su = "/run/wrappers/bin/su"
urxvtc :: FilePath
urxvtc = findExecutable "urxvtc"

View File

@ -1,23 +1,10 @@
{ pkgs, ... }:
pkgs.writeHaskellPackage "xmonad-tv" {
executables."xmonad-${builtins.currentSystem}" = {
extra-depends = [
"containers"
"extra"
"unix"
"X11"
"xmonad"
"xmonad-contrib"
"xmonad-stockholm"
];
text = /* haskell */ ''
{-# LANGUAGE DeriveDataTypeable #-} -- for XS
{-# LANGUAGE FlexibleContexts #-} -- for xmonad'
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Main where
module Main (main) where
import System.Exit (exitFailure)
@ -31,7 +18,6 @@ import System.Environment (getArgs, getEnv, getEnvironment, lookupEnv)
import System.Posix.Process (executeFile)
import XMonad.Actions.DynamicWorkspaces ( addWorkspacePrompt, renameWorkspace
, removeEmptyWorkspace)
import XMonad.Actions.GridSelect
import XMonad.Actions.CycleWS (toggleWS)
import XMonad.Layout.NoBorders ( smartBorders )
import qualified XMonad.StackSet as W
@ -44,25 +30,21 @@ import XMonad.Hooks.Place (placeHook, smart)
import XMonad.Actions.PerWorkspaceKeys (chooseAction)
import XMonad.Stockholm.Pager
import XMonad.Stockholm.Rhombus
import XMonad.Stockholm.Shutdown
import qualified Paths
amixerPath :: FilePath
amixerPath = "${pkgs.alsaUtils}/bin/amixer"
urxvtcPath :: FilePath
urxvtcPath = "${pkgs.rxvt_unicode}/bin/urxvtc"
myFont :: String
myFont = "-schumacher-*-*-*-*-*-*-*-*-*-*-*-iso10646-*"
main :: IO ()
main = getArgs >>= \case
[] -> mainNoArgs
["--shutdown"] -> shutdown
args -> hPutStrLn stderr ("bad arguments: " <> show args) >> exitFailure
mainNoArgs :: IO ()
mainNoArgs = do
workspaces0 <- getWorkspaces0
@ -70,7 +52,7 @@ mainNoArgs = do
xmonad
$ withUrgencyHook (SpawnUrgencyHook "echo emit Urgency ")
$ def
{ terminal = urxvtcPath
{ terminal = Paths.urxvtc
, modMask = mod4Mask
, keys = myKeys
, workspaces = workspaces0
@ -102,6 +84,7 @@ getWorkspaces0 =
where
warn msg = hPutStrLn stderr ("getWorkspaces0: " ++ msg) >> return []
displaySomeException :: SomeException -> String
displaySomeException = displayException
@ -110,76 +93,52 @@ forkFile :: FilePath -> [String] -> Maybe [(String, String)] -> X ()
forkFile path args env =
xfork (executeFile path False args env) >> return ()
spawnRootTerm :: X ()
spawnRootTerm =
forkFile
urxvtcPath
["-name", "root-urxvt", "-e", "/run/wrappers/bin/su", "-"]
Paths.urxvtc
["-name", "root-urxvt", "-e", Paths.su, "-"]
Nothing
spawnTermAt :: String -> X ()
spawnTermAt ws = do
env <- io getEnvironment
let env' = ("XMONAD_SPAWN_WORKSPACE", ws) : env
forkFile urxvtcPath [] (Just env')
forkFile Paths.urxvtc [] (Just env')
myKeys :: XConfig Layout -> Map (KeyMask, KeySym) (X ())
myKeys conf = Map.fromList $
[ ((_4 , xK_Escape ), forkFile "/run/wrappers/bin/slock" [] Nothing)
[ ((_4 , xK_Escape ), forkFile Paths.slock [] Nothing)
, ((_4S , xK_c ), kill)
, ((_4 , xK_o ), forkFile "${pkgs.fzmenu}/bin/otpmenu" [] Nothing)
, ((_4 , xK_p ), forkFile "${pkgs.fzmenu}/bin/passmenu" [] Nothing)
, ((_4 , xK_o ), forkFile Paths.otpmenu [] Nothing)
, ((_4 , xK_p ), forkFile Paths.passmenu [] Nothing)
, ((_4 , xK_x ), chooseAction spawnTermAt)
, ((_4C , xK_x ), spawnRootTerm)
--, ((_4 , xK_F1 ), withFocused jojo)
--, ((_4 , xK_F1 ), printAllGeometries)
, ((0 , xK_Menu ), gets windowset >>= allWorkspaceNames >>= pager pagerConfig (windows . W.view) )
, ((_S , xK_Menu ), gets windowset >>= allWorkspaceNames >>= pager pagerConfig (windows . W.shift) )
, ((_C , xK_Menu ), toggleWS)
, ((_4 , xK_Menu ), rhombus horseConfig (liftIO . hPutStrLn stderr) ["Correct", "Horse", "Battery", "Staple", "Stuhl", "Tisch"] )
-- %! Rotate through the available layout algorithms
, ((_4 , xK_space ), sendMessage NextLayout)
, ((_4S , xK_space ), setLayout $ XMonad.layoutHook conf) -- reset layout
---- BinarySpacePartition
--, ((_4 , xK_l), sendMessage $ ExpandTowards R)
--, ((_4 , xK_h), sendMessage $ ExpandTowards L)
--, ((_4 , xK_j), sendMessage $ ExpandTowards D)
--, ((_4 , xK_k), sendMessage $ ExpandTowards U)
--, ((_4S , xK_l), sendMessage $ ShrinkFrom R)
--, ((_4S , xK_h), sendMessage $ ShrinkFrom L)
--, ((_4S , xK_j), sendMessage $ ShrinkFrom D)
--, ((_4S , xK_k), sendMessage $ ShrinkFrom U)
--, ((_4 , xK_n), sendMessage Rotate)
--, ((_4S , xK_n), sendMessage Swap)
---- mouseResizableTile
--, ((_4 , xK_u), sendMessage ShrinkSlave)
--, ((_4 , xK_i), sendMessage ExpandSlave)
-- move focus up or down the window stack
--, ((_4 , xK_m ), windows W.focusMaster)
, ((_4 , xK_j ), windows W.focusDown)
, ((_4 , xK_k ), windows W.focusUp)
-- modifying the window order
, ((_4S , xK_m ), windows W.swapMaster)
, ((_4S , xK_j ), windows W.swapDown)
, ((_4S , xK_k ), windows W.swapUp)
-- resizing the master/slave ratio
, ((_4 , xK_h ), sendMessage Shrink) -- %! Shrink the master area
, ((_4 , xK_l ), sendMessage Expand) -- %! Expand the master area
, ((_4 , xK_h ), sendMessage Shrink)
, ((_4 , xK_l ), sendMessage Expand)
-- floating layer support
, ((_4 , xK_t ), withFocused $ windows . W.sink) -- make tiling
, ((_4 , xK_t ), withFocused $ windows . W.sink) -- make tiling
-- increase or decrease number of windows in the master area
, ((_4 , xK_comma ), sendMessage $ IncMasterN 1)
, ((_4 , xK_period ), sendMessage $ IncMasterN (-1))
@ -188,13 +147,10 @@ myKeys conf = Map.fromList $
, ((_4 , xK_Delete ), removeEmptyWorkspace)
, ((_4 , xK_Return ), toggleWS)
--, (0 , xK_Menu ) & \k -> (k, gridselectWorkspace wsGSConfig { gs_navigate = makeGSNav k } W.view)
--, (_4 , xK_v ) & \k -> (k, gridselectWorkspace wsGSConfig { gs_navigate = makeGSNav k } W.view)
--, (_4S , xK_v ) & \k -> (k, gridselectWorkspace wsGSConfig { gs_navigate = makeGSNav k } W.shift)
--, (_4 , xK_b ) & \k -> (k, goToSelected wGSConfig { gs_navigate = makeGSNav k })
, ((noModMask, xF86XK_AudioLowerVolume), amixer ["sset", "Master", "5%-"])
, ((noModMask, xF86XK_AudioRaiseVolume), amixer ["sset", "Master", "5%+"])
, ((noModMask, xF86XK_AudioMute), amixer ["sset", "Master", "toggle"])
, ((0, xF86XK_AudioLowerVolume), audioLowerVolume)
, ((0, xF86XK_AudioRaiseVolume), audioRaiseVolume)
, ((0, xF86XK_AudioMute), audioMute)
]
where
_4 = mod4Mask
@ -207,18 +163,17 @@ myKeys conf = Map.fromList $
_4CM = _4 .|. _C .|. _M
_4SM = _4 .|. _S .|. _M
amixer args = forkFile amixerPath args Nothing
pactl args = forkFile Paths.pactl args Nothing
audioLowerVolume = pactl ["--", "set-sink-volume", "@DEFAULT_SINK@", "-5%"]
audioRaiseVolume = pactl ["--", "set-sink-volume", "@DEFAULT_SINK@", "+5%"]
audioMute = pactl ["--", "set-sink-mute", "@DEFAULT_SINK@", "toggle"]
pagerConfig :: PagerConfig
pagerConfig = def
{ pc_font = myFont
, pc_cellwidth = 64
--, pc_cellheight = 36 -- TODO automatically keep screen aspect
--, pc_borderwidth = 1
--, pc_matchcolor = "#f0b000"
, pc_matchmethod = MatchPrefix
--, pc_colors = pagerWorkspaceColors
, pc_windowColors = windowColors
}
where
@ -229,34 +184,7 @@ pagerConfig = def
then ("#402020", snd y)
else y
horseConfig :: RhombusConfig
horseConfig = def
{ rc_font = myFont
, rc_cellwidth = 64
--, rc_cellheight = 36 -- TODO automatically keep screen aspect
--, rc_borderwidth = 1
--, rc_matchcolor = "#f0b000"
, rc_matchmethod = MatchPrefix
--, rc_colors = pagerWorkspaceColors
--, rc_paint = myPaint
}
wGSConfig :: GSConfig Window
wGSConfig = def
{ gs_cellheight = 20
, gs_cellwidth = 192
, gs_cellpadding = 5
, gs_font = myFont
, gs_navigate = navNSearch
}
(&) :: a -> (a -> c) -> c
(&) = flip ($)
allWorkspaceNames :: W.StackSet i l a sid sd -> X [i]
allWorkspaceNames ws =
return $ map W.tag (W.hidden ws) ++ [W.tag $ W.workspace $ W.current ws]
'';
};
}

View File

@ -0,0 +1,25 @@
name: xmonad-tv
version: 1.0.0
license: MIT
author: tv <tv@krebsco.de>
maintainer: tv <tv@krebsco.de>
build-type: Simple
cabal-version: >=1.10
executable xmonad
main-is: main.hs
build-depends:
base,
containers,
directory,
extra,
unix,
X11,
xmonad,
xmonad-contrib,
xmonad-stockholm
other-modules:
Helpers.Path,
Paths
default-language: Haskell2010
ghc-options: -O2 -Wall -threaded

View File

@ -15,10 +15,4 @@ let
else override;
in
listToAttrs
(map
(name: nameValuePair (removeSuffix ".nix" name)
(callPackage (./. + "/${name}") {}))
(filter
(name: name != "default.nix" && !hasPrefix "." name)
(attrNames (readDir ./.))))
mapNixDir (path: callPackage path {}) ./.