summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configs/alacritty.nix5
-rw-r--r--configs/bash/default.nix13
-rw-r--r--configs/gitconfig.nix2
-rw-r--r--configs/hw/winmax2.nix10
-rw-r--r--configs/hw/x220.nix25
-rw-r--r--configs/pulse.nix5
-rw-r--r--modules/ejabberd/default.nix11
-rw-r--r--modules/lid-handler.nix (renamed from modules/lidControl.nix)29
-rw-r--r--modules/org.freedesktop.machine1.host-shell.nix28
-rw-r--r--pkgs/haskell/blessings.nix24
-rw-r--r--pkgs/haskell/desktop-pager.nix16
-rw-r--r--pkgs/haskell/mailaids.nix22
-rw-r--r--pkgs/haskell/much.nix33
-rw-r--r--pkgs/haskell/purebred-email/default.nix31
-rw-r--r--pkgs/haskell/purebred-email/untweak-mime-version-header.patch65
-rw-r--r--pkgs/haskell/seq2.nix14
-rw-r--r--pkgs/haskell/terminal-scanner.nix6
-rw-r--r--pkgs/haskell/terminal-utilities.nix13
-rw-r--r--pkgs/haskell/text-wcwidth.nix15
-rw-r--r--pkgs/haskell/xmonad-tv/src/main.hs52
-rwxr-xr-xpkgs/shell/dtach-list32
-rw-r--r--pkgs/simple/alacritty-tv.nix56
-rw-r--r--pkgs/simple/dic.nix37
-rw-r--r--pkgs/simple/editor-input.nix2
-rw-r--r--pkgs/simple/fzmenu/default.nix12
-rw-r--r--pkgs/simple/hc.nix4
-rw-r--r--pkgs/simple/otherutils.nix15
-rw-r--r--pkgs/simple/pinentry-urxvt/default.nix2
-rw-r--r--pkgs/simple/q/default.nix6
-rw-r--r--pkgs/simple/viljetic-pages/index.html1
-rw-r--r--pkgs/simple/with-tmpdir.nix29
-rw-r--r--pkgs/simple/writePolkitRules.nix72
-rw-r--r--pkgs/simple/xextras.nix19
-rw-r--r--pkgs/vim/fzf.nix11
34 files changed, 558 insertions, 159 deletions
diff --git a/configs/alacritty.nix b/configs/alacritty.nix
index 1a8eb92..473592a 100644
--- a/configs/alacritty.nix
+++ b/configs/alacritty.nix
@@ -36,11 +36,6 @@ let
mouse.hide_when_typing = true;
scrolling.multiplier = 8;
};
- configs.root = lib.recursiveUpdate configs.default {
- colors.primary.background = "#230000";
- colors.primary.foreground = "#e0c0c0";
- colors.normal.black = "#800000";
- };
configs.fzmenu = lib.recursiveUpdate configs.default {
colors.primary.background = "#2A172A";
window.dimensions.columns = 70;
diff --git a/configs/bash/default.nix b/configs/bash/default.nix
index 0ec6bf0..70c94da 100644
--- a/configs/bash/default.nix
+++ b/configs/bash/default.nix
@@ -23,18 +23,7 @@
case $UID in
${mylib.shell.escape (toString config.krebs.users.tv.uid)})
if test ''${SHLVL-1} = 1 && test -n "''${DISPLAY-}"; then
- _CURRENT_DESKTOP_NAME=''${_CURRENT_DESKTOP_NAME-$(
- ${pkgs.xorg.xprop}/bin/xprop -notype -root \
- 32i _NET_CURRENT_DESKTOP \
- 8s _NET_DESKTOP_NAMES \
- |
- ${pkgs.gnused}/bin/sed -r 's/.* = //;s/"//g;s/, /\a/g' |
- {
- read -r _NET_CURRENT_DESKTOP
- IFS=$'\a' read -ra _NET_DESKTOP_NAMES
- echo "''${_NET_DESKTOP_NAMES[$_NET_CURRENT_DESKTOP]}"
- }
- )}
+ _CURRENT_DESKTOP_NAME=''${_CURRENT_DESKTOP_NAME-$(${pkgs.xextras}/bin/net-current-desktop)}
case $_CURRENT_DESKTOP_NAME in
hrm)
cd ~/hrm
diff --git a/configs/gitconfig.nix b/configs/gitconfig.nix
index c4111ed..1965427 100644
--- a/configs/gitconfig.nix
+++ b/configs/gitconfig.nix
@@ -6,7 +6,7 @@
markEmptyLines = false
stripLeadingSymbols = false
[pager]
- diff = ${pkgs.gitAndTools.diff-so-fancy}/bin/diff-so-fancy \
+ diff = ${pkgs.diff-so-fancy}/bin/diff-so-fancy \
| ${pkgs.less}/bin/less -FRX
[user]
email = tv@krebsco.de
diff --git a/configs/hw/winmax2.nix b/configs/hw/winmax2.nix
index 8af5511..7edad5a 100644
--- a/configs/hw/winmax2.nix
+++ b/configs/hw/winmax2.nix
@@ -21,10 +21,6 @@
hardware.enableRedistributableFirmware = true;
hardware.graphics.enable = true;
- hardware.graphics.extraPackages = [
- pkgs.amdvlk
- pkgs.rocmPackages.clr
- ];
networking.wireless.enable = true;
networking.wireless.interfaces = [
@@ -36,9 +32,9 @@
services.illum.enable = true;
- services.logind.extraConfig = /* ini */ ''
- HandlePowerKey=ignore
- '';
+ services.logind.settings.Login = {
+ HandlePowerKey = "ignore";
+ };
tv.lidControl.enable = true;
}
diff --git a/configs/hw/x220.nix b/configs/hw/x220.nix
index 323be01..6cd9641 100644
--- a/configs/hw/x220.nix
+++ b/configs/hw/x220.nix
@@ -49,7 +49,12 @@
# Required for Centrino.
hardware.enableRedistributableFirmware = true;
- hardware.graphics.extraPackages = [ pkgs.vaapiIntel pkgs.vaapiVdpau ];
+ hardware.graphics = {
+ extraPackages = [
+ pkgs.intel-vaapi-driver
+ pkgs.libva-vdpau-driver
+ ];
+ };
hardware.trackpoint = {
enable = true;
@@ -67,18 +72,12 @@
WOL_DISABLE = false;
};
-
- services.logind.extraConfig = ''
- HandleHibernateKey=ignore
- HandleLidSwitch=ignore
- HandlePowerKey=ignore
- HandleSuspendKey=ignore
- '';
-
- # because extraConfig is not extra enough:
- services.logind.lidSwitch = "ignore";
- services.logind.lidSwitchDocked = "ignore";
- services.logind.lidSwitchExternalPower = "ignore";
+ services.logind.settings.Login.HandleHibernateKey = "ignore";
+ services.logind.settings.Login.HandleLidSwitch = "ignore";
+ services.logind.settings.Login.HandleLidSwitchDocked = "ignore";
+ services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore";
+ services.logind.settings.Login.HandlePowerKey = "ignore";
+ services.logind.settings.Login.HandleSuspendKey = "ignore";
services.xserver = {
videoDriver = "intel";
diff --git a/configs/pulse.nix b/configs/pulse.nix
index 815c309..1ccbf82 100644
--- a/configs/pulse.nix
+++ b/configs/pulse.nix
@@ -94,11 +94,10 @@ in
};
serviceConfig = {
ExecStart = "${pkg}/bin/pulseaudio --exit-idle-time=-1";
- ExecStartPre = pkgs.writeDash "pulse-start" ''
+ ExecStartPre = "+${pkgs.writeDash "pulse-start" ''
install -o pulse -g pulse -m 0750 -d ${runDir}
install -o pulse -g pulse -m 0700 -d ${runDir}/home
- '';
- PermissionsStartOnly = "true";
+ ''}";
User = "pulse";
};
};
diff --git a/modules/ejabberd/default.nix b/modules/ejabberd/default.nix
index f2da590..9607741 100644
--- a/modules/ejabberd/default.nix
+++ b/modules/ejabberd/default.nix
@@ -142,6 +142,17 @@ in {
ExecStartPre = [
"${pkgs.coreutils}/bin/ln -s \${CREDENTIALS_DIRECTORY} /tmp/credentials"
"${gen-dhparam} ${cfg.stateDir}/dhfile"
+ (pkgs.writeDash "ejabberd-ensure-PREVIOUS.LOG" ''
+ set -efu
+ cd ${cfg.stateDir}
+ if ! test -e PREVIOUS.LOG; then
+ if test -f LATEST.LOG; then
+ ${pkgs.coreutils}/bin/ln LATEST.LOG PREVIOUS.LOG
+ else
+ ${pkgs.coreutils}/bin/touch PREVIOUS.LOG
+ fi
+ fi
+ '')
];
ExecStart = "${cfg.pkgs.ejabberd}/bin/ejabberdctl foreground";
ExecStop = [
diff --git a/modules/lidControl.nix b/modules/lid-handler.nix
index a35e178..d89aced 100644
--- a/modules/lidControl.nix
+++ b/modules/lid-handler.nix
@@ -1,13 +1,13 @@
{ config, lib, pkgs, ... }: {
options = {
- tv.lidControl.enable = lib.mkEnableOption "tv.lidControl";
+ hrm.lid-handler.enable = lib.mkEnableOption "hrm.lid-handler";
};
config = let
- cfg = config.tv.lidControl;
+ cfg = config.hrm.lid-handler;
in lib.mkIf cfg.enable {
services.acpid.enable = true;
services.acpid.lidEventCommands = /* sh */ ''
- set -- $1
+ lid_state=$(${pkgs.gawk}/bin/awk '{print$2}' /proc/acpi/button/lid/*/state)
# usage: vt_is_xserver NUMBER
vt_is_xserver() {
@@ -27,18 +27,31 @@
--uid=$owner \
"$@"
}
- case $3 in
+ case $lid_state in
open)
run_on_display ${pkgs.xorg.xset}/bin/xset dpms force on
;;
- close)
+ closed)
run_on_display ${pkgs.xorg.xset}/bin/xset dpms force off
;;
esac
+ else
+ case $lid_state in
+ open)
+ ${pkgs.brightnessctl}/bin/brightnessctl --restore >/dev/null 2>&1
+ ;;
+ closed)
+ brightness=$(${pkgs.brightnessctl}/bin/brightnessctl --quiet get)
+ if test "$brightness" -gt 0; then
+ ${pkgs.brightnessctl}/bin/brightnessctl --save >/dev/null 2>&1
+ ${pkgs.brightnessctl}/bin/brightnessctl --quiet set 0
+ fi
+ ;;
+ esac
fi
'';
- services.logind.lidSwitch = "ignore";
- services.logind.lidSwitchDocked = "ignore";
- services.logind.lidSwitchExternalPower = "ignore";
+ services.logind.settings.Login.HandleLidSwitch = "ignore";
+ services.logind.settings.Login.HandleLidSwitchDocked = "ignore";
+ services.logind.settings.Login.HandleLidSwitchExternalPower = "ignore";
};
}
diff --git a/modules/org.freedesktop.machine1.host-shell.nix b/modules/org.freedesktop.machine1.host-shell.nix
index 73825a5..3491453 100644
--- a/modules/org.freedesktop.machine1.host-shell.nix
+++ b/modules/org.freedesktop.machine1.host-shell.nix
@@ -1,4 +1,4 @@
-{ config, lib, mylib, ... }: {
+{ config, lib, mylib, pkgs, ... }: {
options.org.freedesktop.machine1.host-shell.access = lib.mkOption {
default = {};
type =
@@ -12,17 +12,21 @@
(name: value: [name] ++ lib.attrNames value)
x)));
};
- config.security.polkit.extraConfig = let
+ config.environment.etc."polkit-1/rules.d/30-hrm-access.rules" = let
cfg = config.org.freedesktop.machine1.host-shell;
+ in {
enable = cfg.access != {};
- in lib.optionalString enable /* js */ ''
- polkit.addRule(function () {
- const access = ${builtins.toJSON cfg.access};
- return function(action, subject) {
- if (action.id === "org.freedesktop.machine1.host-shell"
- && (access[subject.user]||{})[action.lookup("user")])
- return polkit.Result.YES;
- }
- }());
- '';
+ source = pkgs.writePolkitRules "30-hrm-access.rules" /* js */ ''
+ polkit.addRule(function () {
+ const access = ${builtins.toJSON cfg.access};
+ return function (action, subject) {
+ if (action.id === "org.freedesktop.machine1.host-shell") {
+ if ((access[subject.user]||{})[action.lookup("user")]) {
+ return polkit.Result.YES;
+ }
+ }
+ }
+ }());
+ '';
+ };
}
diff --git a/pkgs/haskell/blessings.nix b/pkgs/haskell/blessings.nix
index 65661aa..9ed1664 100644
--- a/pkgs/haskell/blessings.nix
+++ b/pkgs/haskell/blessings.nix
@@ -1,16 +1,18 @@
-{ mkDerivation, base, bytestring, fetchgit, hspec, QuickCheck, lib, mylib, text }:
-
+{ mkDerivation, base, dlist, extra, fetchgit, hspec, lib
+, mono-traversable, QuickCheck, seq2, text
+}:
mkDerivation {
pname = "blessings";
- version = "2.3.0";
+ version = "3.0.0";
src = fetchgit {
- url = http://cgit.ni.krebsco.de/blessings;
- rev = "refs/tags/v2.3.0";
- hash = "sha256-fS79UOHBMfJHyz7E0Rx4lKZSZOD2G99h2zuDT+SOUJQ=";
+ url = "https://cgit.krebsco.de/blessings";
+ sha256 = "1x4wa9v9kgd8z11pxf9clsbk1527bqq86zvk1mp26dzwkbw8kgpk";
+ rev = "2e33bc5ac86c81f0c9ee823b4913bce776ba5a0d";
+ fetchSubmodules = true;
};
- libraryHaskellDepends = [ base bytestring text ];
- testHaskellDepends = [ base hspec QuickCheck ];
- doHaddock = false;
- # WTFPL is the true license, which is unknown to cabal.
- license = lib.licenses.wtfpl;
+ libraryHaskellDepends = [
+ base dlist extra mono-traversable seq2 text
+ ];
+ testHaskellDepends = [ base hspec mono-traversable QuickCheck ];
+ license = lib.licenses.mit;
}
diff --git a/pkgs/haskell/desktop-pager.nix b/pkgs/haskell/desktop-pager.nix
index 8301235..a2f1243 100644
--- a/pkgs/haskell/desktop-pager.nix
+++ b/pkgs/haskell/desktop-pager.nix
@@ -1,15 +1,15 @@
{ mkDerivation, aeson, base, blessings, bytestring, containers
-, data-default, extra, fetchgit, hack, lib, optparse-applicative
-, probability, speculate, split, terminal-scanner, terminal-size
-, text, unix, utf8-string, X11
+, data-default, extra, fetchgit, hack, lib, mono-traversable
+, optparse-applicative, probability, speculate, split
+, terminal-scanner, terminal-size, text, unix, utf8-string, X11
}:
mkDerivation {
pname = "desktop-pager";
- version = "1.0.0";
+ version = "1.0.1";
src = fetchgit {
url = "https://cgit.krebsco.de/desktop-pager";
- sha256 = "1hb8an31szwx9zixzb1m7219jrz3cdz57phf45r4b3n6qrzcn35l";
- rev = "3919fb8adc06134a304d4fcbcd192c8707c06cbd";
+ sha256 = "1144vv5i4hihdyii29xj6dinkidjxr1x39w5ffyff7ls9q17xdms";
+ rev = "cb65a330a178dc75eabc4bf6659da7aac439ae2d";
fetchSubmodules = true;
};
isLibrary = true;
@@ -17,8 +17,8 @@ mkDerivation {
libraryHaskellDepends = [ base extra utf8-string X11 ];
executableHaskellDepends = [
aeson base blessings bytestring containers data-default hack
- optparse-applicative probability speculate split terminal-scanner
- terminal-size text unix X11
+ mono-traversable optparse-applicative probability speculate split
+ terminal-scanner terminal-size text unix X11
];
license = lib.licenses.mit;
}
diff --git a/pkgs/haskell/mailaids.nix b/pkgs/haskell/mailaids.nix
new file mode 100644
index 0000000..815613c
--- /dev/null
+++ b/pkgs/haskell/mailaids.nix
@@ -0,0 +1,22 @@
+{ mkDerivation, aeson, aeson-pretty, base, bytestring
+, case-insensitive, either, fetchgit, lens, lib
+, optparse-applicative, purebred-email, text, vector, word8
+}:
+mkDerivation {
+ pname = "mailaids";
+ version = "1.1.0+parts";
+ src = fetchgit {
+ url = "https://cgit.krebsco.de/mailaids";
+ sha256 = "0xwd196zrgfv2d7x1pgp1yzqj1hrpwr0m54i6mnrmk6022yx46hl";
+ rev = "02d8996bb6aaeb2881e2df33da5167b649edb822";
+ fetchSubmodules = true;
+ };
+ isLibrary = false;
+ isExecutable = true;
+ executableHaskellDepends = [
+ aeson aeson-pretty base bytestring case-insensitive either lens
+ optparse-applicative purebred-email text vector word8
+ ];
+ license = lib.licenses.mit;
+ mainProgram = "mailaid";
+}
diff --git a/pkgs/haskell/much.nix b/pkgs/haskell/much.nix
index 9744a25..6a573fc 100644
--- a/pkgs/haskell/much.nix
+++ b/pkgs/haskell/much.nix
@@ -2,18 +2,19 @@
, blaze-builder, blessings, bytestring, case-insensitive
, containers, data-default, deepseq, directory, either
, email-header, fetchgit, filepath, friendly-time, http-types
-, hyphenation, lib, linebreak, network, old-locale
-, optparse-applicative, process, random, rosezipper, safe
-, servant-server, split, terminal-scanner, terminal-size, text
-, time, transformers, transformers-compat, unix, vector, wai, warp
+, hyphenation, lib, linebreak, mono-traversable, network
+, old-locale, optparse-applicative, process, process-extras, random
+, rosezipper, safe, servant-server, split, terminal-scanner
+, terminal-size, text, text-wcwidth, time, transformers
+, transformers-compat, unix, vector, wai, warp
}:
-mkDerivation rec {
+mkDerivation {
pname = "much";
- version = "1.3.2";
+ version = "1.4.2";
src = fetchgit {
url = "https://cgit.krebsco.de/much";
- sha256 = "001lvn4f3pgxwq0fgxvk0jl33r54gvh908r6wx02fw4s6b3sysc0";
- rev = "3a0fe1da7c33b024128079f5810c6a99b25aebe7";
+ sha256 = "1michcp8j1d84gpcyp5m4jrp2lvs1al38glrixkr3xdgaxrs8iqb";
+ rev = "8ba70458b8f5949db00c5840c76027c317bf6bc4";
fetchSubmodules = true;
};
isLibrary = true;
@@ -22,16 +23,18 @@ mkDerivation rec {
aeson attoparsec base base64-bytestring blaze-builder blessings
bytestring case-insensitive containers data-default deepseq
directory either email-header filepath friendly-time http-types
- hyphenation linebreak network old-locale optparse-applicative
- process random rosezipper safe servant-server split
- terminal-scanner terminal-size text time transformers
- transformers-compat unix vector wai warp
+ hyphenation linebreak mono-traversable network old-locale
+ optparse-applicative process process-extras random rosezipper safe
+ servant-server split terminal-scanner terminal-size text
+ text-wcwidth time transformers transformers-compat unix vector wai
+ warp
];
executableHaskellDepends = [
aeson base blessings bytestring case-insensitive containers
- data-default deepseq directory filepath hyphenation linebreak
- process rosezipper safe terminal-scanner text time transformers
- unix
+ data-default deepseq directory hyphenation linebreak
+ mono-traversable process rosezipper safe terminal-scanner text
+ text-wcwidth time transformers
];
license = lib.licenses.mit;
+ mainProgram = "much";
}
diff --git a/pkgs/haskell/purebred-email/default.nix b/pkgs/haskell/purebred-email/default.nix
new file mode 100644
index 0000000..34c3ed6
--- /dev/null
+++ b/pkgs/haskell/purebred-email/default.nix
@@ -0,0 +1,31 @@
+{ mkDerivation, attoparsec, base, base64-bytestring, bytestring
+, case-insensitive, concise, deepseq, fetchgit, hedgehog, lens, lib
+, QuickCheck, quickcheck-instances, random, semigroupoids
+, stringsearch, tasty, tasty-golden, tasty-hedgehog, tasty-hunit
+, tasty-quickcheck, text, time
+}:
+mkDerivation {
+ pname = "purebred-email";
+ version = "0.6.0.2";
+ src = fetchgit {
+ url = "https://github.com/purebred-mua/purebred-email";
+ hash = "sha256-P9RmQZ4fvQ1LGdQXFAAP/43VR8TZtQASs2cDK/zjHWg=";
+ rev = "23c69d5c923a91581c366e23fc7de3992dd81e27";
+ fetchSubmodules = true;
+ };
+ isLibrary = true;
+ isExecutable = true;
+ libraryHaskellDepends = [
+ attoparsec base base64-bytestring bytestring case-insensitive
+ concise deepseq lens random semigroupoids stringsearch text time
+ ];
+ testHaskellDepends = [
+ attoparsec base bytestring case-insensitive hedgehog lens
+ QuickCheck quickcheck-instances random tasty tasty-golden
+ tasty-hedgehog tasty-hunit tasty-quickcheck text time
+ ];
+ homepage = "https://github.com/purebred-mua/purebred-email";
+ description = "types and parser for email messages (including MIME)";
+ license = lib.licenses.agpl3Plus;
+ jailbreak = true;
+}
diff --git a/pkgs/haskell/purebred-email/untweak-mime-version-header.patch b/pkgs/haskell/purebred-email/untweak-mime-version-header.patch
new file mode 100644
index 0000000..97baf7a
--- /dev/null
+++ b/pkgs/haskell/purebred-email/untweak-mime-version-header.patch
@@ -0,0 +1,65 @@
+diff --git a/src/Data/MIME.hs b/src/Data/MIME.hs
+index 19af53e..be8cbd4 100644
+--- a/src/Data/MIME.hs
++++ b/src/Data/MIME.hs
+@@ -810,7 +810,6 @@ multipart takeTillEnd boundary =
+ -- | Sets the @MIME-Version: 1.0@ header.
+ --
+ instance RenderMessage MIME where
+- tweakHeaders = set (headers . at "MIME-Version") (Just "1.0")
+ buildBody h z = Just $ case z of
+ Part partbody -> Builder.byteString partbody
+ Encapsulated msg -> buildMessage msg
+diff --git a/tests/Generator.hs b/tests/Generator.hs
+index 9e1f166..23bd122 100644
+--- a/tests/Generator.hs
++++ b/tests/Generator.hs
+@@ -64,7 +64,7 @@ exampleMailsParseSuccessfully =
+ textPlain7bit :: MIMEMessage
+ textPlain7bit =
+ let m = createTextPlainMessage "This is a simple mail."
+- in over headers (\(Headers xs) -> Headers $ (CI.mk "Subject", "Hello there") : xs) m
++ in over headers (\(Headers xs) -> Headers $ (CI.mk "MIME-Version", "1.0") : (CI.mk "Subject", "Hello there") : xs) m
+
+ multiPartMail :: MIMEMessage
+ multiPartMail =
+@@ -72,13 +72,16 @@ multiPartMail =
+ to' = Single $ Mailbox Nothing (AddrSpec "bar" (DomainDotAtom $ pure "bar.com"))
+ subject = "Hello there"
+ p = createTextPlainMessage "This is a simple mail."
++ & set (headers . at "MIME-Version") (Just "1.0")
+ a = createAttachment
+ contentTypeApplicationOctetStream
+ (Just "foo.bin")
+ "fileContentsASDF"
++ & set (headers . at "MIME-Version") (Just "1.0")
+ now = UTCTime (ModifiedJulianDay 123) (secondsToDiffTime 123)
+ in createMultipartMixedMessage "asdf" (fromList [p, a])
+- & set (headers . at "From") (Just $ renderMailboxes [from'])
++ & set (headers . at "MIME-Version") (Just "1.0")
++ . set (headers . at "From") (Just $ renderMailboxes [from'])
+ . set (headers . at "To") (Just $ renderAddresses [to'])
+ . set (headers . at "Date") (Just $ renderRFC5422Date now)
+ . set (headers . at "Subject") (Just $ T.encodeUtf8 subject)
+diff --git a/tests/Message.hs b/tests/Message.hs
+index 6711519..3e40397 100644
+--- a/tests/Message.hs
++++ b/tests/Message.hs
+@@ -29,7 +29,7 @@ import Data.Char (isPrint)
+ import Data.Foldable (fold)
+ import Data.List.NonEmpty (NonEmpty(..), intersperse)
+
+-import Control.Lens (set, view)
++import Control.Lens ((&), at, set, view)
+ import qualified Data.ByteString as B
+ import qualified Data.Text as T
+
+@@ -99,7 +99,7 @@ genMessage = Gen.choice [ genTextPlain, genMultipart, encapsulate <$> genMessage
+ prop_messageRoundTrip :: Property
+ prop_messageRoundTrip = property $ do
+ msg <- forAll genMessage
+- parse (message mime) (renderMessage msg) === Right msg
++ parse (message mime) (renderMessage $ msg & set (headers . at "MIME-Version") (Just "1.0")) === Right msg
+
+ prop_messageFromRoundTrip :: Property
+ prop_messageFromRoundTrip = property $ do
diff --git a/pkgs/haskell/seq2.nix b/pkgs/haskell/seq2.nix
new file mode 100644
index 0000000..9d18f92
--- /dev/null
+++ b/pkgs/haskell/seq2.nix
@@ -0,0 +1,14 @@
+{ mkDerivation, base, fetchgit, lib }:
+mkDerivation {
+ pname = "seq2";
+ version = "1.0.0";
+ src = fetchgit {
+ url = "https://cgit.krebsco.de/seq2";
+ sha256 = "03b90b68xpk00v13cc45aw148z1spph8vyqga8vmif9iv5g0lfjn";
+ rev = "6aeb56c36a9a47c9216c8f9252ca26d091506c73";
+ fetchSubmodules = true;
+ };
+ libraryHaskellDepends = [ base ];
+ homepage = "https://cgit.krebsco.de/seq2";
+ license = lib.licenses.mit;
+}
diff --git a/pkgs/haskell/terminal-scanner.nix b/pkgs/haskell/terminal-scanner.nix
index 4801df7..ca16644 100644
--- a/pkgs/haskell/terminal-scanner.nix
+++ b/pkgs/haskell/terminal-scanner.nix
@@ -1,11 +1,11 @@
{ mkDerivation, base, fetchgit, lib }:
mkDerivation {
pname = "terminal-scanner";
- version = "1.0.1";
+ version = "1.1.0";
src = fetchgit {
url = "https://cgit.krebsco.de/terminal-scanner";
- sha256 = "1ic8j2nlhmy76fnqji277wsl1cikd9y4lwqqcxzldjx1vi61r13r";
- rev = "3c5301303230f563214c5ff003f9fc8e2e0a7199";
+ sha256 = "0x37g62km90pgamrn3slr513jw29cb9zmrnb9frs8j8r9yq50fz0";
+ rev = "a77acbcc13f8eb50e1277d07cf2a10004b58af71";
fetchSubmodules = true;
};
libraryHaskellDepends = [ base ];
diff --git a/pkgs/haskell/terminal-utilities.nix b/pkgs/haskell/terminal-utilities.nix
new file mode 100644
index 0000000..eeab32f
--- /dev/null
+++ b/pkgs/haskell/terminal-utilities.nix
@@ -0,0 +1,13 @@
+{ mkDerivation, base, fetchgit, lib }:
+mkDerivation {
+ pname = "terminal-utilities";
+ version = "1.0.0";
+ src = fetchgit {
+ url = "https://cgit.krebsco.de/terminal-utilities";
+ sha256 = "0kpkm87g5ab0s22zly994ql8hfc0gbqc5s7ln4ngav2k91a0wp7j";
+ rev = "e2c0cc11a71c785b268f31f60bed2a79e00a4d61";
+ fetchSubmodules = true;
+ };
+ libraryHaskellDepends = [ base ];
+ license = lib.licenses.mit;
+}
diff --git a/pkgs/haskell/text-wcwidth.nix b/pkgs/haskell/text-wcwidth.nix
new file mode 100644
index 0000000..e6a43d6
--- /dev/null
+++ b/pkgs/haskell/text-wcwidth.nix
@@ -0,0 +1,15 @@
+{ mkDerivation, base, fetchgit, lib, mono-traversable, text
+, wcwidth
+}:
+mkDerivation {
+ pname = "text-wcwidth";
+ version = "1.0.0";
+ src = fetchgit {
+ url = "https://cgit.krebsco.de/text-wcwidth";
+ sha256 = "1x51za2vpxgdz05arks3a98v9mz12s64rcncgg34fmir42f27li1";
+ rev = "d70945bdfcf1bebf3dadb6b6c8ac7c75b4d3e9d0";
+ fetchSubmodules = true;
+ };
+ libraryHaskellDepends = [ base mono-traversable text wcwidth ];
+ license = lib.licenses.mit;
+}
diff --git a/pkgs/haskell/xmonad-tv/src/main.hs b/pkgs/haskell/xmonad-tv/src/main.hs
index 711f9eb..05817af 100644
--- a/pkgs/haskell/xmonad-tv/src/main.hs
+++ b/pkgs/haskell/xmonad-tv/src/main.hs
@@ -9,6 +9,7 @@ import XMonad.Hooks.EwmhDesktops (ewmh)
import XMonad.Hooks.EwmhDesktops.Extra (ewmhExtra)
import XMonad.Hooks.RefocusLast (refocusLastLayoutHook, toggleFocus)
+import Control.Monad (void)
import Control.Monad.Extra (whenJustM)
import qualified Data.Aeson
import qualified Data.ByteString.Char8
@@ -23,10 +24,10 @@ import System.Posix.Process (executeFile)
import XMonad.Actions.DynamicWorkspaces (removeEmptyWorkspace)
import XMonad.Actions.CycleWS (toggleWS)
import XMonad.Layout.Gaps (Direction2D(U,R,D,L), gaps)
-import XMonad.Layout.NoBorders ( smartBorders )
+import XMonad.Layout.FocusTracking (focusTracking)
+import XMonad.Layout.NoBorders (noBorders)
import XMonad.Layout.ResizableTile (ResizableTall(ResizableTall))
import XMonad.Layout.ResizableTile (MirrorResize(MirrorExpand,MirrorShrink))
-import XMonad.Layout.StateFull (pattern StateFull)
import qualified XMonad.StackSet as W
import Data.Map (Map)
import qualified Data.Map as Map
@@ -44,6 +45,11 @@ import XMonad.Hooks.Place (placeHook, smart)
import XMonad.Actions.PerWorkspaceKeys (chooseAction)
import Shutdown (shutdown, newShutdownEventHandler)
+import System.IO.Unsafe (unsafePerformIO)
+
+
+sliceEnvPath :: FilePath
+sliceEnvPath = unsafePerformIO (getEnv "XMONAD_CACHE_DIR") <> "/slice.env"
main :: IO ()
@@ -70,6 +76,7 @@ readEnv' defaultValue name =
mainNoArgs :: IO ()
mainNoArgs = do
+ getEnvironment >>= \env -> writeFile sliceEnvPath $ unlines [ k <> "=" <> v | (k, v) <- env]
myMasterDelta <- readEnv' (1 / 20) "XMONAD_MASTER_DELTA" :: IO Rational
myMasterWidth <- readEnv' (1 / 2) "XMONAD_MASTER_WIDTH" :: IO Rational
myScreenGaps <- readEnv' [] "XMONAD_SCREEN_GAPS" :: IO [Int]
@@ -95,14 +102,13 @@ mainNoArgs = do
, layoutHook =
refocusLastLayoutHook $
gaps (zip [U,R,D,L] myScreenGaps) $
- smartBorders $
- ResizableTall
- 1
- myMasterDelta
- (myMasterWidth + 2 * fromIntegral (borderWidth def) / fromIntegral myScreenWidth)
- []
- |||
- StateFull
+ ResizableTall
+ 1
+ myMasterDelta
+ (myMasterWidth + 2 * fromIntegral (borderWidth def) / fromIntegral myScreenWidth)
+ []
+ |||
+ noBorders (focusTracking Full)
, manageHook =
composeAll
[ appName =? "fzmenu-urxvt" --> doCenterFloat
@@ -134,16 +140,22 @@ handleFocusChangeEvent = \case
forkFile :: FilePath -> [String] -> Maybe [(String, String)] -> X ()
-forkFile path args env =
- xfork (executeFile path True args env) >> return ()
+forkFile path args env = void . xfork $ do
+ environment <- getEnvironment
+ executeFile path True args (env <> Just environment)
-spawnRootTerm :: X ()
-spawnRootTerm =
- forkFile
- {-pkg:alacritty-tv-}"alacritty"
- ["--profile=root", "-e", "/run/wrappers/bin/su", "-"]
- Nothing
+forkFileInSlice :: String -> FilePath -> [String] -> X ()
+forkFileInSlice sliceName path args = void . xfork $
+ executeFile {-pkg:systemd-}"systemd-run" True
+ ( "--collect"
+ : "--user"
+ : "--slice=" <> sliceName
+ : "--property=EnvironmentFile=" <> sliceEnvPath
+ : path
+ : args
+ )
+ Nothing
myKeys :: XConfig Layout -> Map (KeyMask, KeySym) (X ())
@@ -156,8 +168,8 @@ myKeys conf = Map.fromList $
, ((_4 , xK_p ), forkFile {-pkg:fzmenu-}"passmenu" [] Nothing)
, ((_4C , xK_p ), forkFile {-pkg:fzmenu-}"passmenu" ["--phase2-method=copy"] Nothing)
- , ((_4 , xK_x ), forkFile {-pkg:alacritty-tv-}"alacritty" ["--singleton"] Nothing)
- , ((_4C , xK_x ), spawnRootTerm)
+ , ((_4 , xK_x ), forkFileInSlice "alacritty" {-pkg:alacritty-tv-}"alacritty" ["--dtach", "--singleton"])
+ , ((_4C , xK_x ), forkFileInSlice "alacritty" {-pkg:alacritty-tv-}"alacritty" ["--profile=root", "-e", "/run/wrappers/bin/su", "-"])
, ((_C , xK_Menu ), toggleWS)
diff --git a/pkgs/shell/dtach-list b/pkgs/shell/dtach-list
new file mode 100755
index 0000000..1e77a3d
--- /dev/null
+++ b/pkgs/shell/dtach-list
@@ -0,0 +1,32 @@
+#! /bin/sh
+#!buildShellBin path=coreutils:findutils:gawk:gnugrep:gnused:iproute2:psmisc
+#
+# NAME
+# dtach-list - list dtach sessions
+#
+# SYNOPSIS
+# dtach-list
+#
+set -efu
+
+workdir=$(mktemp -d -t dtach-list.XXXXXXXX)
+readonly workdir
+trap 'cd / && rm -r "$workdir"' EXIT
+cd "$workdir"
+
+ss -HQpx > ssclients
+
+ss -HQlpx | sed -nr 's/ +/ /g; s/^u_str LISTEN ([^ ]+) [0-9]+ \* 0 users:\(\("dtach",pid=([0-9]+),fd=3\)\) $/\2 \1/p' | sort -n > sockets
+
+while read -r pid sock; do
+ connections=$(awk -v sock="$sock" '$3==sock{n++}BEGIN{n=0}END{print n}' ssclients)
+ pstree -TUalp "$pid" >pstree
+ if test "$connections" = 0; then
+ sed '
+ 1s/$/ (detached)/
+ s/.*/\x1b[38;5;202m&\x1b[m/
+ ' pstree
+ else
+ cat pstree
+ fi
+done <sockets
diff --git a/pkgs/simple/alacritty-tv.nix b/pkgs/simple/alacritty-tv.nix
index 0d2fe59..ebf609e 100644
--- a/pkgs/simple/alacritty-tv.nix
+++ b/pkgs/simple/alacritty-tv.nix
@@ -5,18 +5,33 @@ pkgs.symlinkJoin {
paths = [
(pkgs.writeDashBin "alacritty" ''
# usage:
- # alacritty [--profile=PROFILE] [--singleton] [ARGS...]
+ # alacritty [--dtach] [--profile=PROFILE] [--singleton] [COMMAND [ARGS...]]