From 8ba34427d36adbb276b4e3d6cd8245574918cdc0 Mon Sep 17 00:00:00 2001 From: Mats Rauhala Date: Fri, 19 Nov 2021 20:15:27 +0200 Subject: [PATCH] Initial commit --- flake.lock | 25 ++++ flake.nix | 8 ++ modules/xmonad/buildXmonad.nix | 31 +++++ modules/xmonad/default.nix | 235 +++++++++++++++++++++++++++++++++ 4 files changed, 299 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 modules/xmonad/buildXmonad.nix create mode 100644 modules/xmonad/default.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..ce283eb --- /dev/null +++ b/flake.lock @@ -0,0 +1,25 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1637345130, + "narHash": "sha256-UoR2tCBvMFdCNxQDSrnc08MbwOMH2mYbQo8ZwZH00I0=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "41aaf69b7dd245611467fa7344dd244eacd915d1", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..03f6b9c --- /dev/null +++ b/flake.nix @@ -0,0 +1,8 @@ +{ + description = "XMonad module"; + + outputs = { self, nixpkgs }: { + + nixosModule = import ./modules/xmonad/default.nix; + }; +} diff --git a/modules/xmonad/buildXmonad.nix b/modules/xmonad/buildXmonad.nix new file mode 100644 index 0000000..5ce4a35 --- /dev/null +++ b/modules/xmonad/buildXmonad.nix @@ -0,0 +1,31 @@ +# Create the xmonad.dhall end result with all the binaries resolved +# +# Use it as such: callPackage ./buildXmonad.nix {} ./xmonad.dhall { inherit teams; } +{ lib, xmonad-masser, dhallPackages, runCommand }: +path: +packages: + +let + xmonadDeps = with dhallPackages; + buildDhallDirectoryPackage { + name = "xmonad-masser"; + src = "${xmonad-masser}/share/x86_64-linux-ghc-8.10.7/xmonad-masser-0.1.0.0/dhall"; + file = "package.dhall"; + source = false; + document = false; + dependencies = [ (Prelude.overridePackage { file = "package.dhall"; }) ]; + }; + xmonadInput = runCommand "packages.dhall" + packages + '' + substituteAll ${path} $out + ''; + xmonadConfig = with dhallPackages; buildDhallPackage { + name = "xmonad.dhall"; + code = xmonadInput; + dependencies = [ Prelude xmonadDeps ]; + source = true; + }; + +in xmonadConfig + diff --git a/modules/xmonad/default.nix b/modules/xmonad/default.nix new file mode 100644 index 0000000..da0b511 --- /dev/null +++ b/modules/xmonad/default.nix @@ -0,0 +1,235 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.programs.xmonad; + + xmonadConfig = with pkgs; callPackage ./buildXmonad.nix {inherit (pkgs.haskellPackages) xmonad-masser; } cfg.dhallConfigPath cfg.packages; + gifs = with pkgs; stdenv.mkDerivation { + name = "gifs"; + src = fetchurl { + url = "https://gateway.pinata.cloud/ipfs/QmQRb5Zt9QRbd6VuUuQ44wfkBaN4BYWfeH9JALpM2DU9dJ/animated.tar.gz"; + sha256 = "14qb9y9zkmz13yl87713ib0wjcri727kgd3dwn0d6jrh94z948sq"; + }; + installPhase = '' + mkdir $out + ls $out + cp -rv *.{gif,mp4} $out/ + ''; + }; + saver_mpv = pkgs.writeScript "saver_mpv" '' + #!${pkgs.bash}/bin/bash + PATH=${makeBinPath [pkgs.mpv pkgs.coreutils pkgs.findutils]}:$PATH + video=`find ${gifs} -type f | sort -R | head -n 1` + mpv \ + --no-input-terminal \ + --really-quiet \ + --scale=oversample \ + --loop \ + --no-stop-screensaver \ + --wid="''${XSCREENSAVER_WINDOW}" \ + --no-audio "$video" & + exec ${pkgs.xsecurelock}/libexec/xsecurelock/saver_blank + ''; + lock = pkgs.writeScript "lock.sh" '' + #!${pkgs.bash}/bin/bash + PATH=${makeBinPath [pkgs.gnupg pkgs.coreutils pkgs.findutils]}:$PATH + + gpg-connect-agent reloadagent /bye + + + export XSECURELOCK_SAVER=${saver_mpv} + export XSECURELOCK_PASSWORD_PROMPT="emoticon" + ${pkgs.xsecurelock}/bin/xsecurelock + ''; + +in { + options = { + programs.xmonad = { + enable = mkEnableOption "Enable xmonad"; + dhallConfigPath = mkOption { + type = types.path; + }; + packages = mkOption { + type = types.attrsOf types.package; + default = {}; + }; + }; + }; + config = mkIf cfg.enable { + home.packages = with pkgs; [ + source-code-pro + dmenu + gnome3.zenity + rofi + haskellPackages.xmobar + xlibs.xmodmap + xlibs.xev + xlibs.xset + xorg.xbacklight + xclip + xcalib + i3lock + ]; + services.screen-locker = { + enable = true; + lockCmd = "${lock}"; + }; + services.random-background = { + enable = true; + enableXinerama = true; + imageDirectory = "%h/backgrounds"; + }; + services.picom = { + enable = true; + activeOpacity = "1.0"; + inactiveOpacity = "0.95"; + backend = "glx"; + fade = true; + fadeDelta = 5; + opacityRule = [ "100:name *= 'i3lock'"]; + }; + xsession = { + enable = true; + windowManager.xmonad = { + enable = true; + enableContribAndExtras = true; + extraPackages = h: [h.xmonad-contrib h.xmonad-masser]; + config = + + let toAppKey = k: _: "${k} :: FilePath"; + toApp = k: v: ''Application {_applicationName = "${k}", _applicationAction = "${v}"}''; + applications = concatStringsSep "\n , " (mapAttrsToList toApp cfg.applications); + orNothingStr = x: if null == x then "Nothing" else ''Just "${x}"''; + quoted = x: ''"${x}"''; + toTopic = k: v: ''TopicRule {_topicRuleName = "${k}", _topicRuleHome = ${orNothingStr v.home}, _topicRuleAction = ${orNothingStr v.action}, _topicRuleClasses = [${concatStringsSep ", " (map quoted v.classes)}]}''; + topics = concatStringsSep "\n , " (mapAttrsToList toTopic cfg.topics); + toSearch = k: v: ''Search {_searchName="${k}", _searchKey="${v.key}", _searchUrl="${v.url}"}''; + searches = concatStringsSep "\n , " (mapAttrsToList toSearch cfg.searches); + in pkgs.writeText "xmonad.hs" + '' + {-# LANGUAGE OverloadedStrings #-} + {-# LANGUAGE NamedFieldPuns #-} + module Main where + -- This is autogenerated file, don't touch + + import XMonad.Config.MasseR + + main :: IO () + main = masser + ''; + }; + initExtra = '' + xmodmap ~/.Xmodmap + ${pkgs.xcape}/bin/xcape -e 'Hyper_L=Tab' + ''; + }; + services.dunst = { + enable = true; + settings = { + global = { + geometry = "300x5-30+20"; + indicate_hidden = "yes"; + sort = "yes"; + word_wrap = "no"; + stack_duplicates = "yes"; + show_indicators = "yes"; + browser = "${pkgs.firefox}/bin/firefox"; + transparency = "0"; + separator_height = "2"; + padding = "8"; + horizontal_padding = 8; + frame_width = "8"; + frame_color = "#aaaaaa"; + separator_color = "frame"; + font = "Monospace 8"; + format = "%s\\n%b"; + }; + urgency_low = { + background = "#222222"; + foreground = "#888888"; + }; + urgency_normal = { + background = "#285577"; + foreground = "#ffffff"; + }; + urgency_critical = { + background = "#900000"; + foreground = "#ffffff"; + frame_color = "#ff0000"; + }; + }; + }; + services.unclutter = { + enable = true; + }; + home.file.".xmonad/xmonad.dhall".source = xmonadConfig + "/source.dhall"; + # programs.xmonad = + # let + # musicToggle = pkgs.writeScript "musictoggle" '' + # ${pkgs.mpc_cli}/bin/mpc toggle + # ''; + # # musicCurrent = with pkgs; writeScript "musiccurrent" '' + # # export PATH=${lib.makeBinPath [sp gawk]} + # # sp current | awk '/^Title/ {$1 = ""; print $0}' + # # ''; + # musicCurrent = with pkgs; writeScript "musiccurrent" '' + # export PATH=${lib.makeBinPath [mpc_cli]} + # mpc --format "%title%" current + # ''; + # xmobarConf = pkgs.writeText "xmobar" '' + # Config { + # font = "xft:Inconsolata-9" + # , bgColor = "#3F3F3F" + # , fgColor = "#DCDCCC" + # , position = Top + # , lowerOnStart = True + # , pickBroadest = True + # , commands = [ + # Run MultiCpu ["-t", "CPU: %"] 30 + # , Run Memory ["-t", "Mem: (M)"] 3600 + # , Run Date "%a %b %_d %Y %H:%M:%S" "date" 20 + # , Run StdinReader + # , Run Battery [ "--template" , "Batt: " + # , "--Low" , "10" -- units: % + # , "--High" , "80" -- units: % + # , "--low" , "darkred" + # , "--normal" , "darkorange" + # , "--high" , "darkgreen" + # + # , "--" -- battery specific options + # -- discharging status + # , "-o" , "% ()" + # -- AC "on" status + # , "-O" , "Charging" + # -- charged status + # , "-i" , "Charged" + # ] 120 + # , Run DynNetwork [ "--template" , ": kB/s|kB/s" + # , "--Low" , "1000" -- units: B/s + # , "--High" , "500000" -- units: B/s + # , "--normal" , "darkorange" + # , "--high" , "darkred" + # ] 30 + # ] + # , sepChar = "%" + # , alignSep = "}{" + # , template = "%StdinReader% }{%dynnetwork% | %battery% | %multicpu% | %memory% | %date%" + # } + # ''; + # # browser = "${pkgs.qutebrowser}/bin/qutebrowser"; + # chromiumApp = name: url: pkgs.writeScriptBin "${name}" '' + # ${pkgs.chromium}/bin/chromium --user-data-dir=~/.config/chromium-${name} --app=${url} + # ''; + # custom_teams = chromiumApp "teams" "https://teams.microsoft.com"; + # flowdock = chromiumApp "flowdock" "https://flowdock.com/app"; + # wiki = chromiumApp "wiki" "https://wiki.relexsolutions.com"; + # xmonadConfig = with pkgs; callPackage ./buildXmonad.nix {} cfg.dhallConfigPath cfg.packages; + # in + # { + # enable = true; + # configPackage = xmonadConfig; + # }; + }; +}