diff options
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...]] |
