diff --git a/.envrc b/.envrc index 5bf8fc1..894571b 100644 --- a/.envrc +++ b/.envrc @@ -1,3 +1,3 @@ -source_url "https://raw.githubusercontent.com/cachix/devenv/95f329d49a8a5289d31e0982652f7058a189bfca/direnvrc" "sha256-d+8cBpDfDBj41inrADaJt+bDWhOktwslgoP5YiGJ1v0=" +source_url "https://raw.githubusercontent.com/cachix/devenv/82c0147677e510b247d8b9165c54f73d32dfd899/direnvrc" "sha256-7u4iDd1nZpxL4tCzmPG0dQgC5V+/44Ba+tHkPob1v2k=" -use devenv \ No newline at end of file +use devenv diff --git a/README.md b/README.md index 20e1c2b..4f7f464 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,29 @@ # My NixOS configuration - -- system: `"x86_64-linux"` -- host os: `Linux 6.6.44, NixOS, 24.11 (Vicuna), 24.11.20240804.cb9a96f` -- multi-user?: `yes` -- sandbox: `yes` -- version: `nix-env (Nix) 2.18.5` -- channels(root): `"nixos"` -- nixpkgs: `/nix/store/4cpakzyvfw1rmm9v5i3387x6jd2h1v86-source` + - system: `"x86_64-linux"` + - host os: `Linux 6.12.2-zen1, NixOS, 25.05 (Warbler), 25.05.20241229.88195a9` + - multi-user?: `yes` + - sandbox: `yes` + - version: `nix-env (Nix) 2.24.11` + - channels(root): `"nixos"` + - nixpkgs: `/nix/store/8vz84mqgnm1gz5yk7hgnnb5gir5hjxas-source` ## Installation This configuration is dependent on flakes being enabled in the system building the config. +### Build script +Build the default version of this configuration. ``` -sudo nixos-rebuild --flake # switch +wget https://raw.githubusercontent.com/stvnliu/nixos-configuration/refs/heads/main/deploy.sh +chmod +x ./deploy.sh +./deploy.sh https://github.com/stvnliu/nixos-configuration nixos-msi +``` + +or manually: + +```sh +git clone +sudo nixos-rebuild --flake # boot ``` ## Features diff --git a/common/variables.nix b/common/variables.nix index b97ff23..5137b06 100644 --- a/common/variables.nix +++ b/common/variables.nix @@ -1,35 +1,72 @@ +{ config, pkgs, lib, ... }: +let + monitorMaxBrightness = "255"; + # monitorMinBrightness = "32"; + stylixBG = config.lib.stylix.colors.base00; + stylixFG = config.lib.stylix.colors.base07; + stylixPrimaryBG = config.lib.stylix.colors.base12; +in { - config, - pkgs, - lib, - ... -}: { # Type definitions for nix variables used in this configuration options = with lib; - with types; { - myUserName = mkOption {type = str;}; - myHostName = mkOption {type = str;}; - myWallPaperPathString = mkOption {type = str;}; - myDisplayName = mkOption {type = str;}; - myEmail = mkOption {type = str;}; - displayScale = mkOption {type = int;}; - myAutostartCommands = mkOption {type = listOf str;}; - myConfigLocation = mkOption {type = str;}; - }; + with types; { + usingMusicPlayerDaemon = mkOption { type = bool; }; + defaultApplications = { + fileManager = mkOption { type = str; }; + appLauncher = mkOption { type = str; }; + terminal = mkOption { type = str; }; + }; + myWallPaperPath = mkOption { type = path; }; + myUserName = mkOption { type = str; }; + myHostName = mkOption { type = str; }; + myWallPaperPathString = mkOption { type = str; }; + myDisplayName = mkOption { type = str; }; + myEmail = mkOption { type = str; }; + displayScale = mkOption { type = int; }; + myAutostartCommands = mkOption { type = listOf str; }; + myConfigLocation = mkOption { type = str; }; + desktopFont = { + shortName = mkOption { type = str; }; + fullName = mkOption { type = str; }; + package = mkOption { type = package; }; + }; + }; # Default values for this configuration config = rec { myUserName = "stvnliu"; + myWallPaperPath = ../home-manager/${myUserName}/assets/od_neon.png; myHostName = "nixos-msi"; displayScale = 2; - myWallPaperPathString = "/home/${myUserName}/wallpaper.jpg"; + myWallPaperPathString = "/home/${myUserName}/wallpaper.png"; myDisplayName = "Zhongheng Liu"; myEmail = "z.liu@outlook.com.gr"; + /* specialisation."powersave".configuration = { + myAutostartCommands = + [ "${pkgs.brightnessctl}/bin/brightnessctl s ${monitorMinBrightness}" ]; + }; + */ + myConfigLocation = + "/home/${myUserName}/Development/Nix/nixos-configuration"; + desktopFont = { + shortName = "0xProto Nerd Font"; + fullName = "${desktopFont.shortName}:style=Regular"; + package = pkgs.nerd-fonts._0xproto; + }; myAutostartCommands = [ + "${pkgs.brightnessctl}/bin/brightnessctl s ${monitorMaxBrightness}" "fcitx5" + # "${pkgs.foot}/bin/foot --server -f \"${desktopFontFullName}:size=12\" -o colors.alpha=0.85" "${pkgs.udiskie}/bin/udiskie" "${pkgs.pa-notify}/bin/pa-notify" + "${pkgs.networkmanagerapplet}/bin/nm-applet" ]; - myConfigLocation = "/home/${myUserName}/nix-conf"; + defaultApplications = { + terminal = "${pkgs.foot}/bin/footclient"; + fileManager = "${pkgs.nemo}/bin/nemo"; + appLauncher = '' + ${pkgs.wmenu}/bin/wmenu-run -p "Launch a program..." -N ${stylixBG} -n ${stylixFG} -S ${stylixPrimaryBG}''; + }; + usingMusicPlayerDaemon = true; }; } diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..cc2aaf5 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env sh + +# Deploys the configuation to your machine + +TMP_DIRNAME="/tmp/nix-config" +GIT_REMOTE_SRC=$1 +NIX_HOST=$2 +echo "Going to clone $GIT_REMOTE_SRC into $TMP_DIRNAME" +mkdir "$TMP_DIRNAME" + +git clone "$GIT_REMOTE_SRC" "$TMP_DIRNAME" +prev=$PWD +cd "$TMP_DIRNAME" || return +echo "Now going to build nix configuration for $NIX_HOST to switch on next boot" +sudo nixos-rebuild --flake .#"$NIX_HOST" boot + +cd "$prev" || return + diff --git a/devenv.lock b/devenv.lock index c2f426c..1fe7a61 100644 --- a/devenv.lock +++ b/devenv.lock @@ -3,11 +3,10 @@ "devenv": { "locked": { "dir": "src/modules", - "lastModified": 1723156315, + "lastModified": 1732298876, "owner": "cachix", "repo": "devenv", - "rev": "ff5eb4f2accbcda963af67f1a1159e3f6c7f5f91", - "treeHash": "6624b16e4203ef3eae59ce8d5d19005e04741537", + "rev": "741e23a22f3dc9e53075be3eaa795ea9ed6f5129", "type": "github" }, "original": { @@ -24,7 +23,6 @@ "owner": "edolstra", "repo": "flake-compat", "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "treeHash": "2addb7b71a20a25ea74feeaf5c2f6a6b30898ecb", "type": "github" }, "original": { @@ -45,7 +43,6 @@ "owner": "hercules-ci", "repo": "gitignore.nix", "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "treeHash": "ca14199cabdfe1a06a7b1654c76ed49100a689f9", "type": "github" }, "original": { @@ -60,7 +57,6 @@ "owner": "cachix", "repo": "devenv-nixpkgs", "rev": "4267e705586473d3e5c8d50299e71503f16a6fb6", - "treeHash": "6d9f1f7ca0faf1bc2eeb397c78a49623260d3412", "type": "github" }, "original": { @@ -72,11 +68,10 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1722869614, + "lastModified": 1731797254, "owner": "NixOS", "repo": "nixpkgs", - "rev": "883180e6550c1723395a3a342f830bfc5c371f6b", - "treeHash": "e3ce01703c0d0324121e0d3ec6336275025b4ae6", + "rev": "e8c38b73aeb218e27163376a2d617e61a2ad9b59", "type": "github" }, "original": { @@ -96,11 +91,10 @@ "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1723056346, + "lastModified": 1732021966, "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "3c977f1c9930f54066c085305b4b2291385e7a73", - "treeHash": "d6f89338ffb2ca32c20bc0f8d50009e1894ab804", + "rev": "3308484d1a443fc5bc92012435d79e80458fe43c", "type": "github" }, "original": { diff --git a/devenv.nix b/devenv.nix index 475b359..c32313f 100644 --- a/devenv.nix +++ b/devenv.nix @@ -1,23 +1,18 @@ -{ - pkgs, - lib, - config, - inputs, - ... -}: { +{ pkgs, ... }: { # https://devenv.sh/basics/ env.GREET = "devenv"; cachix.enable = false; # https://devenv.sh/packages/ - packages = [pkgs.git]; + packages = [ pkgs.git ]; # https://devenv.sh/languages/ # languages.rust.enable = true; languages.nix.enable = true; pre-commit.hooks = { - alejandra.enable = true; + nixpkgs-fmt.enable = true; shellcheck.enable = true; commitizen.enable = true; + deadnix.enable = true; }; # https://devenv.sh/processes/ # processes.cargo-watch.exec = "cargo-watch"; @@ -29,18 +24,20 @@ scripts.hello.exec = '' echo hello from $GREET ''; + scripts.about.exec = '' + ${pkgs.glow}/bin/glow -p ./README.md + less ./LICENSE + ''; enterShell = '' hello git --version - alejandra --version + nixpkgs-fmt --version ''; # https://devenv.sh/tests/ enterTest = - /* - shell - */ + # shell '' echo "Running tests" git --version | grep --color=auto "${pkgs.git.version}" diff --git a/flake.lock b/flake.lock index 75808ce..5643628 100644 --- a/flake.lock +++ b/flake.lock @@ -5,11 +5,11 @@ "fromYaml": "fromYaml" }, "locked": { - "lastModified": 1708890466, - "narHash": "sha256-LlrC09LoPi8OPYOGPXegD72v+//VapgAqhbOFS3i8sc=", + "lastModified": 1746562888, + "narHash": "sha256-YgNJQyB5dQiwavdDFBMNKk1wyS77AtdgDk/VtU6wEaI=", "owner": "SenchoPens", "repo": "base16.nix", - "rev": "665b3c6748534eb766c777298721cece9453fdae", + "rev": "806a1777a5db2a1ef9d5d6f493ef2381047f2b89", "type": "github" }, "original": { @@ -34,30 +34,14 @@ "type": "github" } }, - "base16-foot": { - "flake": false, - "locked": { - "lastModified": 1696725948, - "narHash": "sha256-65bz2bUL/yzZ1c8/GQASnoiGwaF8DczlxJtzik1c0AU=", - "owner": "tinted-theming", - "repo": "base16-foot", - "rev": "eedbcfa30de0a4baa03e99f5e3ceb5535c2755ce", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-foot", - "type": "github" - } - }, "base16-helix": { "flake": false, "locked": { - "lastModified": 1720809814, - "narHash": "sha256-numb3xigRGnr/deF7wdjBwVg7fpbTH7reFDkJ75AJkY=", + "lastModified": 1736852337, + "narHash": "sha256-esD42YdgLlEh7koBrSqcT7p2fsMctPAcGl/+2sYJa2o=", "owner": "tinted-theming", "repo": "base16-helix", - "rev": "34f41987bec14c0f3f6b2155c19787b1f6489625", + "rev": "03860521c40b0b9c04818f2218d9cc9efc21e7a5", "type": "github" }, "original": { @@ -66,113 +50,46 @@ "type": "github" } }, - "base16-kitty": { - "flake": false, - "locked": { - "lastModified": 1665001328, - "narHash": "sha256-aRaizTYPpuWEcvoYE9U+YRX+Wsc8+iG0guQJbvxEdJY=", - "owner": "kdrag0n", - "repo": "base16-kitty", - "rev": "06bb401fa9a0ffb84365905ffbb959ae5bf40805", - "type": "github" - }, - "original": { - "owner": "kdrag0n", - "repo": "base16-kitty", - "type": "github" - } - }, - "base16-tmux": { - "flake": false, - "locked": { - "lastModified": 1696725902, - "narHash": "sha256-wDPg5elZPcQpu7Df0lI5O8Jv4A3T6jUQIVg63KDU+3Q=", - "owner": "tinted-theming", - "repo": "base16-tmux", - "rev": "c02050bebb60dbb20cb433cd4d8ce668ecc11ba7", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-tmux", - "type": "github" - } - }, "base16-vim": { "flake": false, "locked": { - "lastModified": 1716150083, - "narHash": "sha256-ZMhnNmw34ogE5rJZrjRv5MtG3WaqKd60ds2VXvT6hEc=", + "lastModified": 1732806396, + "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", "owner": "tinted-theming", "repo": "base16-vim", - "rev": "6e955d704d046b0dc3e5c2d68a2a6eeffd2b5d3d", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", "type": "github" }, "original": { "owner": "tinted-theming", "repo": "base16-vim", + "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", "type": "github" } }, - "devshell": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, + "firefox-gnome-theme": { + "flake": false, "locked": { - "lastModified": 1722113426, - "narHash": "sha256-Yo/3loq572A8Su6aY5GP56knpuKYRvM2a1meP9oJZCw=", - "owner": "numtide", - "repo": "devshell", - "rev": "67cce7359e4cd3c45296fb4aaf6a19e2a9c757ae", + "lastModified": 1744642301, + "narHash": "sha256-5A6LL7T0lttn1vrKsNOKUk9V0ittdW0VEqh6AtefxJ4=", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", + "rev": "59e3de00f01e5adb851d824cf7911bd90c31083a", "type": "github" }, "original": { - "owner": "numtide", - "repo": "devshell", + "owner": "rafaelmardojai", + "repo": "firefox-gnome-theme", "type": "github" } }, "flake-compat": { "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "revCount": 57, - "type": "tarball", - "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz" - }, - "original": { - "type": "tarball", - "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" - } - }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", "owner": "edolstra", "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_3": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", "type": "github" }, "original": { @@ -182,6 +99,24 @@ } }, "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1735774679, + "narHash": "sha256-soePLBazJk0qQdDVhdbM98vYdssfs3WFedcq+raipRI=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f2f7418ce0ab4a5309a4596161d154cfc877af66", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { "inputs": { "nixpkgs-lib": [ "nixvim", @@ -189,11 +124,33 @@ ] }, "locked": { - "lastModified": 1722555600, - "narHash": "sha256-XOQkdLafnb/p9ij77byFQjDf5m5QYl9b2REiVClC+x4=", + "lastModified": 1743550720, + "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "8471fe90ad337a8074e957b69ca4d0089218391d", + "rev": "c621e8422220273271f52058f618c94e405bb0f5", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": [ + "stylix", + "nur", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1733312601, + "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", "type": "github" }, "original": { @@ -204,14 +161,14 @@ }, "flake-utils": { "inputs": { - "systems": "systems" + "systems": "systems_2" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -228,11 +185,11 @@ ] }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -244,11 +201,11 @@ "fromYaml": { "flake": false, "locked": { - "lastModified": 1689549921, - "narHash": "sha256-iX0pk/uB019TdBGlaJEWvBCfydT6sRq+eDcGPifVsCM=", + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", "owner": "SenchoPens", "repo": "fromYaml", - "rev": "11fbbbfb32e3289d3c631e0134a23854e7865c84", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", "type": "github" }, "original": { @@ -260,25 +217,21 @@ "git-hooks": { "inputs": { "flake-compat": [ - "nixvim", + "stylix", "flake-compat" ], "gitignore": "gitignore", "nixpkgs": [ - "nixvim", - "nixpkgs" - ], - "nixpkgs-stable": [ - "nixvim", + "stylix", "nixpkgs" ] }, "locked": { - "lastModified": 1724440431, - "narHash": "sha256-9etXEOUtzeMgqg1u0wp+EdwG7RpmrAZ2yX516bMj2aE=", + "lastModified": 1742649964, + "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=", "owner": "cachix", "repo": "git-hooks.nix", - "rev": "c8a54057aae480c56e28ef3e14e4960628ac495b", + "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82", "type": "github" }, "original": { @@ -290,7 +243,7 @@ "gitignore": { "inputs": { "nixpkgs": [ - "nixvim", + "stylix", "git-hooks", "nixpkgs" ] @@ -312,16 +265,16 @@ "gnome-shell": { "flake": false, "locked": { - "lastModified": 1713702291, - "narHash": "sha256-zYP1ehjtcV8fo+c+JFfkAqktZ384Y+y779fzmR9lQAU=", + "lastModified": 1732369855, + "narHash": "sha256-JhUWbcYPjHO3Xs3x9/Z9RuqXbcp5yhPluGjwsdE2GMg=", "owner": "GNOME", "repo": "gnome-shell", - "rev": "0d0aadf013f78a7f7f1dc984d0d812971864b934", + "rev": "dadd58f630eeea41d645ee225a63f719390829dc", "type": "github" }, "original": { "owner": "GNOME", - "ref": "46.1", + "ref": "47.2", "repo": "gnome-shell", "type": "github" } @@ -333,11 +286,11 @@ ] }, "locked": { - "lastModified": 1724435763, - "narHash": "sha256-UNky3lJNGQtUEXT2OY8gMxejakSWPTfWKvpFkpFlAfM=", + "lastModified": 1747021744, + "narHash": "sha256-IDsM/9/tHQBlhG3tXI2fTM84AUN1uRa7JDPT1LMlGes=", "owner": "nix-community", "repo": "home-manager", - "rev": "c2cd2a52e02f1dfa1c88f95abeb89298d46023be", + "rev": "fb061f555f821fe4fb49f8f6f2a0cc3d5728bd52", "type": "github" }, "original": { @@ -347,27 +300,6 @@ } }, "home-manager_2": { - "inputs": { - "nixpkgs": [ - "nixvim", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1724435763, - "narHash": "sha256-UNky3lJNGQtUEXT2OY8gMxejakSWPTfWKvpFkpFlAfM=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "c2cd2a52e02f1dfa1c88f95abeb89298d46023be", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "home-manager_3": { "inputs": { "nixpkgs": [ "stylix", @@ -375,11 +307,11 @@ ] }, "locked": { - "lastModified": 1715930644, - "narHash": "sha256-W9pyM3/vePxrffHtzlJI6lDS3seANQ+Nqp+i58O46LI=", + "lastModified": 1746912617, + "narHash": "sha256-SSw/98B3Htw7iJWCyq08fAEL5w+a/Vj+YbQq0msVFTA=", "owner": "nix-community", "repo": "home-manager", - "rev": "e3ad5108f54177e6520535768ddbf1e6af54b59d", + "rev": "9ef92f1c6b77944198fd368ec805ced842352a1d", "type": "github" }, "original": { @@ -388,34 +320,245 @@ "type": "github" } }, - "nix-darwin": { + "hyprland-qt-support": { + "inputs": { + "hyprlang": [ + "hyprland-qtutils", + "hyprlang" + ], + "nixpkgs": [ + "hyprland-qtutils", + "nixpkgs" + ], + "systems": [ + "hyprland-qtutils", + "systems" + ] + }, + "locked": { + "lastModified": 1737634706, + "narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=", + "owner": "hyprwm", + "repo": "hyprland-qt-support", + "rev": "8810df502cdee755993cb803eba7b23f189db795", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qt-support", + "type": "github" + } + }, + "hyprland-qtutils": { + "inputs": { + "hyprland-qt-support": "hyprland-qt-support", + "hyprlang": "hyprlang", + "hyprutils": [ + "hyprland-qtutils", + "hyprlang", + "hyprutils" + ], + "nixpkgs": "nixpkgs", + "systems": "systems" + }, + "locked": { + "lastModified": 1745951494, + "narHash": "sha256-2dModE32doiyQMmd6EDAQeZnz+5LOs6KXyE0qX76WIg=", + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "rev": "4be1d324faf8d6e82c2be9f8510d299984dfdd2e", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": "hyprutils", + "nixpkgs": [ + "hyprland-qtutils", + "nixpkgs" + ], + "systems": [ + "hyprland-qtutils", + "systems" + ] + }, + "locked": { + "lastModified": 1737634606, + "narHash": "sha256-W7W87Cv6wqZ9PHegI6rH1+ve3zJPiyevMFf0/HwdbCQ=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "f41271d35cc0f370d300413d756c2677f386af9d", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprswitch": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs_2", + "rust-overlay": "rust-overlay" + }, + "locked": { + "lastModified": 1745860672, + "narHash": "sha256-tJKLjWaOcJW4Ttu1noSY+lddlJvyX2eonTrgR5IycZo=", + "owner": "h3rmt", + "repo": "hyprswitch", + "rev": "313e7d5730af2e37ab73fe238b1bd3a2d3e5552f", + "type": "github" + }, + "original": { + "owner": "h3rmt", + "ref": "release", + "repo": "hyprswitch", + "type": "github" + } + }, + "hyprutils": { "inputs": { "nixpkgs": [ + "hyprland-qtutils", + "hyprlang", + "nixpkgs" + ], + "systems": [ + "hyprland-qtutils", + "hyprlang", + "systems" + ] + }, + "locked": { + "lastModified": 1737632363, + "narHash": "sha256-X9I8POSlHxBVjD0fiX1O2j7U9Zi1+4rIkrsyHP0uHXY=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "006620eb29d54ea9086538891404c78563d1bae1", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "ixx": { + "inputs": { + "flake-utils": [ "nixvim", + "nuschtosSearch", + "flake-utils" + ], + "nixpkgs": [ + "nixvim", + "nuschtosSearch", "nixpkgs" ] }, "locked": { - "lastModified": 1724469941, - "narHash": "sha256-+U5152FwmDD9EUOiFi5CFxCK6/yFESyDei9jEIlmUtI=", - "owner": "lnl7", - "repo": "nix-darwin", - "rev": "ea319a737939094b48fda9063fa3201ef2479aac", + "lastModified": 1737371634, + "narHash": "sha256-fTVAWzT1UMm1lT+YxHuVPtH+DATrhYfea3B0MxG/cGw=", + "owner": "NuschtOS", + "repo": "ixx", + "rev": "a1176e2a10ce745ff8f63e4af124ece8fe0b1648", "type": "github" }, "original": { - "owner": "lnl7", - "repo": "nix-darwin", + "owner": "NuschtOS", + "ref": "v0.0.7", + "repo": "ixx", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1724224976, - "narHash": "sha256-Z/ELQhrSd7bMzTO8r7NZgi9g5emh+aRKoCdaAv5fiO0=", + "lastModified": 1737632463, + "narHash": "sha256-38J9QfeGSej341ouwzqf77WIHAScihAKCt8PQJ+NH28=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "0aa475546ed21629c4f5bbf90e38c846a99ec9e9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1735774519, + "narHash": "sha256-CewEm1o2eVAnoqb6Ml+Qi9Gg/EfNAxbRx1lANGVyoLI=", + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/e9b51731911566bbf7e4895475a87fe06961de0b.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://github.com/NixOS/nixpkgs/archive/e9b51731911566bbf7e4895475a87fe06961de0b.tar.gz" + } + }, + "nixpkgs-master": { + "locked": { + "lastModified": 1747056094, + "narHash": "sha256-1EyoK6oi6LKN7z8WUK7E7DDGCGG2O4QEp0CiVavsfzo=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c374d94f1536013ca8e92341b540eba4c22f9c62", + "rev": "496d7ecbe6794172090229169324f0b8fc426dc5", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "master", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1746810718, + "narHash": "sha256-VljtYzyttmvkWUKTVJVW93qAsJsrBbgAzy7DdnJaQfI=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "0c0bf9c057382d5f6f63d54fd61f1abd5e1c2f63", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1735831304, + "narHash": "sha256-92A/Zr8UzZzlFYmkgO3HAgX/Cr53eodgNyvJA+Ibkz0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "0725951bfc4bbc2efff3a537837ca13159b4aec9", + "type": "github" + }, + "original": { + "owner": "nixos", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1746904237, + "narHash": "sha256-3e+AVBczosP5dCLQmMoMEogM57gmZ2qrVSrmq9aResQ=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d89fc19e405cb2d55ce7cc114356846a0ee5e956", "type": "github" }, "original": { @@ -425,42 +568,37 @@ "type": "github" } }, - "nixpkgs_2": { + "nixpkgs_4": { "locked": { - "lastModified": 1714912032, - "narHash": "sha256-clkcOIkg8G4xuJh+1onLG4HPMpbtzdLv4rHxFzgsH9c=", + "lastModified": 1745930157, + "narHash": "sha256-y3h3NLnzRSiUkYpnfvnS669zWZLoqqI6NprtLQ+5dck=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "ee4a6e0f566fe5ec79968c57a9c2c3c25f2cf41d", + "rev": "46e634be05ce9dc6d4db8e664515ba10b78151ae", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixvim": { "inputs": { - "devshell": "devshell", - "flake-compat": "flake-compat", - "flake-parts": "flake-parts", - "git-hooks": "git-hooks", - "home-manager": "home-manager_2", - "nix-darwin": "nix-darwin", + "flake-parts": "flake-parts_2", "nixpkgs": [ "nixpkgs" ], "nuschtosSearch": "nuschtosSearch", - "treefmt-nix": "treefmt-nix" + "systems": "systems_3" }, "locked": { - "lastModified": 1724528976, - "narHash": "sha256-5W13nD/5ySIsxSvDqXHlj4bg2F3tNcYGKCGudWzpNzw=", + "lastModified": 1747032128, + "narHash": "sha256-5t2TrnIB83FZe3rINoD6JYbujL1j4d1ZsVyL1qmMluY=", "owner": "nix-community", "repo": "nixvim", - "rev": "8234ee85eaa2c8b7f2c74f5b4cdf02c4965b07fc", + "rev": "69266437beaac970568d12a46766706c72f361b3", "type": "github" }, "original": { @@ -469,20 +607,44 @@ "type": "github" } }, + "nur": { + "inputs": { + "flake-parts": "flake-parts_3", + "nixpkgs": [ + "stylix", + "nixpkgs" + ], + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1746056780, + "narHash": "sha256-/emueQGaoT4vu0QjU9LDOG5roxRSfdY0K2KkxuzazcM=", + "owner": "nix-community", + "repo": "NUR", + "rev": "d476cd0972dd6242d76374fcc277e6735715c167", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "NUR", + "type": "github" + } + }, "nuschtosSearch": { "inputs": { "flake-utils": "flake-utils", + "ixx": "ixx", "nixpkgs": [ "nixvim", "nixpkgs" ] }, "locked": { - "lastModified": 1723969429, - "narHash": "sha256-BuewfNEXEf11MIkJY+uvWsdLu1dIvgJqntWChvNdALg=", + "lastModified": 1745046075, + "narHash": "sha256-8v4y6k16Ra/fiecb4DxhsoOGtzLKgKlS+9/XJ9z0T2I=", "owner": "NuschtOS", "repo": "search", - "rev": "a05d1805f2a2bc47d230e5e92aecbf69f784f3d0", + "rev": "066afe8643274470f4a294442aadd988356a478f", "type": "github" }, "original": { @@ -494,25 +656,50 @@ "root": { "inputs": { "home-manager": "home-manager", - "nixpkgs": "nixpkgs", + "hyprland-qtutils": "hyprland-qtutils", + "hyprswitch": "hyprswitch", + "nixpkgs": "nixpkgs_3", + "nixpkgs-master": "nixpkgs-master", + "nixpkgs-stable": "nixpkgs-stable", "nixvim": "nixvim", "spicetify-nix": "spicetify-nix", "stylix": "stylix" } }, - "spicetify-nix": { + "rust-overlay": { "inputs": { - "flake-compat": "flake-compat_2", "nixpkgs": [ + "hyprswitch", "nixpkgs" ] }, "locked": { - "lastModified": 1724472954, - "narHash": "sha256-65NfzEvwdJGHsOZA+w4AUFUG10RyfuQltct3h++gsw0=", + "lastModified": 1735784864, + "narHash": "sha256-tIl5p3ueaPw7T5T1UXkLc8ISMk6Y8CI/D/rd0msf73I=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "04d5f1836721461b256ec452883362c5edc5288e", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "spicetify-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems_4" + }, + "locked": { + "lastModified": 1746937129, + "narHash": "sha256-Dx/YpnRridWnxF0Xpz9FUP3kl/m2QAOM2BM3KNls3sk=", "owner": "Gerg-L", "repo": "spicetify-nix", - "rev": "3caf2a241f7af52419ce97c6682b0467219ab914", + "rev": "8f1c5c34cf5f99e1d7197d6d9fa7dd44f00966f0", "type": "github" }, "original": { @@ -525,24 +712,29 @@ "inputs": { "base16": "base16", "base16-fish": "base16-fish", - "base16-foot": "base16-foot", "base16-helix": "base16-helix", - "base16-kitty": "base16-kitty", - "base16-tmux": "base16-tmux", "base16-vim": "base16-vim", - "flake-compat": "flake-compat_3", + "firefox-gnome-theme": "firefox-gnome-theme", + "flake-compat": "flake-compat", "flake-utils": "flake-utils_2", + "git-hooks": "git-hooks", "gnome-shell": "gnome-shell", - "home-manager": "home-manager_3", - "nixpkgs": "nixpkgs_2", - "systems": "systems_2" + "home-manager": "home-manager_2", + "nixpkgs": "nixpkgs_4", + "nur": "nur", + "systems": "systems_5", + "tinted-foot": "tinted-foot", + "tinted-kitty": "tinted-kitty", + "tinted-schemes": "tinted-schemes", + "tinted-tmux": "tinted-tmux", + "tinted-zed": "tinted-zed" }, "locked": { - "lastModified": 1724444244, - "narHash": "sha256-fH1lyJvJjUhZ8xMlmiI18EZNzodDSe74rFuwlZDL0aQ=", + "lastModified": 1747005453, + "narHash": "sha256-78PfIpo3jCuX7pT3k4DkEES+KEy7pnrFGugsQ2w652o=", "owner": "danth", "repo": "stylix", - "rev": "d042af478ce87e188139480922a3085218194106", + "rev": "6b8309550e50358b63366d9bf3edb7ef08b9a7cc", "type": "github" }, "original": { @@ -553,16 +745,16 @@ }, "systems": { "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "lastModified": 1689347949, + "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "repo": "default-linux", + "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", "type": "github" }, "original": { "owner": "nix-systems", - "repo": "default", + "repo": "default-linux", "type": "github" } }, @@ -581,19 +773,147 @@ "type": "github" } }, + "systems_3": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_4": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_5": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "tinted-foot": { + "flake": false, + "locked": { + "lastModified": 1726913040, + "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=", + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-foot", + "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4", + "type": "github" + } + }, + "tinted-kitty": { + "flake": false, + "locked": { + "lastModified": 1716423189, + "narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=", + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-kitty", + "rev": "eb39e141db14baef052893285df9f266df041ff8", + "type": "github" + } + }, + "tinted-schemes": { + "flake": false, + "locked": { + "lastModified": 1744974599, + "narHash": "sha256-Fg+rdGs5FAgfkYNCs74lnl8vkQmiZVdBsziyPhVqrlY=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "28c26a621123ad4ebd5bbfb34ab39421c0144bdd", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, + "tinted-tmux": { + "flake": false, + "locked": { + "lastModified": 1745111349, + "narHash": "sha256-udV+nHdpqgkJI9D0mtvvAzbqubt9jdifS/KhTTbJ45w=", + "owner": "tinted-theming", + "repo": "tinted-tmux", + "rev": "e009f18a01182b63559fb28f1c786eb027c3dee9", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "tinted-tmux", + "type": "github" + } + }, + "tinted-zed": { + "flake": false, + "locked": { + "lastModified": 1725758778, + "narHash": "sha256-8P1b6mJWyYcu36WRlSVbuj575QWIFZALZMTg5ID/sM4=", + "owner": "tinted-theming", + "repo": "base16-zed", + "rev": "122c9e5c0e6f27211361a04fae92df97940eccf9", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "base16-zed", + "type": "github" + } + }, "treefmt-nix": { "inputs": { "nixpkgs": [ - "nixvim", + "stylix", + "nur", "nixpkgs" ] }, "locked": { - "lastModified": 1724338379, - "narHash": "sha256-kKJtaiU5Ou+e/0Qs7SICXF22DLx4V/WhG1P6+k4yeOE=", + "lastModified": 1733222881, + "narHash": "sha256-JIPcz1PrpXUCbaccEnrcUS8jjEb/1vJbZz5KkobyFdM=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "070f834771efa715f3e74cd8ab93ecc96fabc951", + "rev": "49717b5af6f80172275d47a418c9719a31a78b53", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 44e241e..59fc477 100644 --- a/flake.nix +++ b/flake.nix @@ -2,59 +2,69 @@ description = "Your new nix config"; inputs = { + hyprswitch.url = "github:h3rmt/hyprswitch/release"; # Nixpkgs + nixpkgs-master.url = "github:nixos/nixpkgs/master"; nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11"; nixvim = { url = "github:nix-community/nixvim"; inputs.nixpkgs.follows = "nixpkgs"; }; # Home manager - home-manager.url = "github:nix-community/home-manager"; - home-manager.inputs.nixpkgs.follows = "nixpkgs"; - - stylix.url = "github:danth/stylix"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + /* lix-module = { + url = + "https://git.lix.systems/lix-project/nixos-module/archive/2.91.0.tar.gz"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + */ + stylix = { url = "github:danth/stylix"; }; spicetify-nix = { url = "github:Gerg-L/spicetify-nix"; inputs.nixpkgs.follows = "nixpkgs"; }; + hyprland-qtutils.url = "github:hyprwm/hyprland-qtutils"; }; - outputs = { - self, - nixpkgs, - home-manager, - stylix, - spicetify-nix, - ... - } @ inputs: let - inherit (self) outputs; - myHostName = "nixos-msi"; - stevenUserName = "stvnliu"; - in { - # NixOS configuration entrypoint - # Available through 'nixos-rebuild --flake .#your-hostname' - nixosConfigurations = { - "${myHostName}" = nixpkgs.lib.nixosSystem { - specialArgs = {inherit inputs outputs;}; - modules = [ - ./nixos/configuration.nix - ]; + outputs = { self, nixpkgs, home-manager, stylix, spicetify-nix, ... }@inputs: + let + inherit (self) outputs; + myHostName = "nixos-msi"; + stevenUserName = "stvnliu"; + in + { + # NixOS configuration entrypoint + # Available through 'nixos-rebuild --flake .#your-hostname' + nixosConfigurations = { + "${myHostName}" = nixpkgs.lib.nixosSystem { + specialArgs = { inherit inputs outputs; }; + modules = [ + ./nixos/configuration.nix + #lix-module.nixosModules.default + ]; + }; }; - }; - # Standalone home-manager configuration entrypoint - # Available through 'home-manager --flake .#your-username@your-hostname' - homeConfigurations = { - "${stevenUserName}@${myHostName}" = home-manager.lib.homeManagerConfiguration { - pkgs = nixpkgs.legacyPackages.x86_64-linux; # Home-manager requires 'pkgs' instance - extraSpecialArgs = {inherit inputs outputs;}; - modules = [ - ./home-manager/${stevenUserName}/home.nix - inputs.nixvim.homeManagerModules.nixvim - inputs.stylix.homeManagerModules.stylix - inputs.spicetify-nix.homeManagerModules.default - ]; + # Standalone home-manager configuration entrypoint + # Available through 'home-manager --flake .#your-username@your-hostname' + homeConfigurations = { + "${stevenUserName}@${myHostName}" = + home-manager.lib.homeManagerConfiguration { + pkgs = + nixpkgs.legacyPackages.x86_64-linux; # Home-manager requires 'pkgs' instance + extraSpecialArgs = { inherit inputs outputs; }; + modules = [ + ./home-manager/${stevenUserName}/home.nix + stylix.homeManagerModules.stylix + inputs.nixvim.homeManagerModules.nixvim + spicetify-nix.homeManagerModules.default + + ]; + }; }; }; - }; } diff --git a/home-manager/stvnliu/ags/config/config.js b/home-manager/stvnliu/ags/config/config.js index cd36bde..3a492f4 100644 --- a/home-manager/stvnliu/ags/config/config.js +++ b/home-manager/stvnliu/ags/config/config.js @@ -1,7 +1,8 @@ -const hyprland = await Service.import("hyprland") -const network = await Service.import("network") +import { Workspaces } from "./hyprworkspaces.js"; +import { NetworkIndicator } from "./indicators.js"; // const notifications = await Service.import("notifications") -const mpris = await Service.import("mpris") +// const mpris = await Service.import("mpris") +const hyprland = await Service.import("hyprland"); const audio = await Service.import("audio") const battery = await Service.import("battery") const systemtray = await Service.import("systemtray") @@ -12,61 +13,6 @@ const date = Variable("", { // widgets can be only assigned as a child in one container // so to make a reuseable widget, make it a function // then you can simply instantiate one by calling it -const focusedTitle = Widget.Label({ - label: hyprland.active.client.bind('title'), - visible: hyprland.active.client.bind('address') - .as(addr => addr !== "0x"), -}) - -const dispatch = ws => hyprland.messageAsync(`dispatch workspace ${ws}`); - -const Workspaces = () => Widget.EventBox({ - onScrollUp: () => dispatch('+1'), - onScrollDown: () => dispatch('-1'), - child: Widget.Box({ - children: Array.from({ length: 10 }, (_, i) => i + 1).map(i => Widget.Button({ - attribute: i, - label: `${i}`, - onClicked: () => dispatch(i), - - class_name: i === hyprland.active.workspace.id ? "focused" : "" - })), - - // remove this setup hook if you want fixed number of buttons - setup: self => self.hook(hyprland, () => self.children.forEach(btn => { - btn.visible = hyprland.workspaces.some(ws => ws.id === btn.attribute); - })), - }), -}) -function ClientTitle() { - return Widget.Label({ - class_name: "client-title", - label: hyprland.active.client.bind("title").as(title => title.length <= 30 ? title : `${title.substring(0, 29)}...`), - }) -} -const WifiIndicator = () => Widget.Box({ - children: [ - Widget.Icon({ - icon: network.wifi.bind('icon_name'), - }), - Widget.Label({ - label: network.wifi.bind('ssid') - .as(ssid => ssid || 'Unknown'), - }), - ], -}) - -const WiredIndicator = () => Widget.Icon({ - icon: network.wired.bind('icon_name'), -}) - -const NetworkIndicator = () => Widget.Stack({ - children: { - wifi: WifiIndicator(), - wired: WiredIndicator(), - }, - shown: network.bind('primary').as(p => p || 'wifi'), -}) function Clock() { const calendar = Widget.Calendar({ showDayNames: true, @@ -95,27 +41,7 @@ function Clock() { }) } - -// we don't need dunst or any other notification daemon -// because the Notifications module is a notification daemon itself -/*function Notification() { - const popups = notifications.bind("popups") - return Widget.Box({ - class_name: "notification", - visible: popups.as(p => p.length > 0), - children: [ - Widget.Icon({ - icon: "preferences-system-notifications-symbolic", - }), - Widget.Label({ - label: popups.as(p => p[0]?.summary || ""), - }), - ], - }) -}*/ - - -function Media() { +/* function Media() { const label = Utils.watch("", mpris, "player-changed", () => { if (mpris.players[0]) { const { track_artists, track_title } = mpris.players[0] @@ -133,7 +59,7 @@ function Media() { child: Widget.Label({ label }), }) } - +*/ function Volume() { const icons = { @@ -213,7 +139,6 @@ function Left() { spacing: 8, children: [ Workspaces(), - ClientTitle(), ], }) } @@ -287,15 +212,13 @@ const cpuProgress = Widget.Label({ const ramProgress = Widget.Label({ label: ram.bind().as(usage => `${(usage * 100).toPrecision(4)}%`) }) + +const bars = hyprland.monitors.map((value, _index, _arr) => { + return Bar(value.id); +}) App.config({ style: "./style.css", - windows: [ - Bar(), - - // you can call it, for each monitor - // Bar(0), - // Bar(1) - ], + windows: bars, }) export { } diff --git a/home-manager/stvnliu/ags/config/hyprworkspaces.js b/home-manager/stvnliu/ags/config/hyprworkspaces.js new file mode 100644 index 0000000..270a410 --- /dev/null +++ b/home-manager/stvnliu/ags/config/hyprworkspaces.js @@ -0,0 +1,23 @@ +const hyprland = await Service.import("hyprland") + +const dispatch = ws => hyprland.messageAsync(`dispatch workspace ${ws}`); +const wsSymbols = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20"] +const Workspaces = () => Widget.EventBox({ + onScrollUp: () => dispatch('+1'), + onScrollDown: () => dispatch('-1'), + child: Widget.Box({ + children: Array.from({ length: 10 }, (_, i) => i + 1).map(i => Widget.Button({ + attribute: i, + label: `${wsSymbols[i-1]}`, + onClicked: () => dispatch(i), + + class_name: i === hyprland.active.workspace.id ? "focused" : "" + })), + + // remove this setup hook if you want fixed number of buttons + setup: self => self.hook(hyprland, () => self.children.forEach(btn => { + btn.visible = hyprland.workspaces.some(ws => ws.id === btn.attribute); + })), + }), +}) +export { Workspaces }; diff --git a/home-manager/stvnliu/ags/config/indicators.js b/home-manager/stvnliu/ags/config/indicators.js new file mode 100644 index 0000000..0713b31 --- /dev/null +++ b/home-manager/stvnliu/ags/config/indicators.js @@ -0,0 +1,25 @@ +const network = await Service.import("network") +const WifiIndicator = () => Widget.Box({ + children: [ + Widget.Icon({ + icon: network.wifi.bind('icon_name'), + }), + Widget.Label({ + label: network.wifi.bind('ssid') + .as(ssid => ssid || 'Unknown'), + }), + ], +}) + +const WiredIndicator = () => Widget.Icon({ + icon: network.wired.bind('icon_name'), +}) + +const NetworkIndicator = () => Widget.Stack({ + children: { + wifi: WifiIndicator(), + wired: WiredIndicator(), + }, + shown: network.bind('primary').as(p => p || 'wifi'), +}) +export { NetworkIndicator }; diff --git a/home-manager/stvnliu/ags/config/monitorWidget.js b/home-manager/stvnliu/ags/config/monitorWidget.js new file mode 100644 index 0000000..2a7163b --- /dev/null +++ b/home-manager/stvnliu/ags/config/monitorWidget.js @@ -0,0 +1,3 @@ +function MonitorWidget() { + +} diff --git a/home-manager/stvnliu/ags/config/mpris.js b/home-manager/stvnliu/ags/config/mpris.js new file mode 100644 index 0000000..b096a84 --- /dev/null +++ b/home-manager/stvnliu/ags/config/mpris.js @@ -0,0 +1,17 @@ +const mpris = await Service.import('mpris') + +/** + * @param {import('types/service/mpris').MprisPlayer} player + * */ +const Player = (player, count) => Widget.Button({ + onClicked: () => player.playPause(), + child: Widget.Label().hook(player, label => { + const { track_artists, track_title } = player; + label.label = `${count} PLAYING`; + }), +}) + +export const players = Widget.Box({ + children: mpris.bind('players').as(p => p.map( + (this_player, index, array) => { return Player(this_player, array.length) })) +}) diff --git a/home-manager/stvnliu/ags/default.nix b/home-manager/stvnliu/ags/default.nix index 2980486..6518235 100644 --- a/home-manager/stvnliu/ags/default.nix +++ b/home-manager/stvnliu/ags/default.nix @@ -1,7 +1,6 @@ -{ - pkgs, - config, - ... +{ pkgs +, config +, ... }: { config = { home.file = { @@ -9,7 +8,10 @@ source = ./config; }; }; - home.packages = with pkgs; [ags]; + home.packages = with pkgs; [ + ags + brightnessctl + ]; myAutostartCommands = [ #"${pkgs.ags}/bin/ags --init" "${pkgs.ags}/bin/ags" diff --git a/home-manager/stvnliu/assets/deer-wallpaper.jpg b/home-manager/stvnliu/assets/deer-wallpaper.jpg new file mode 100644 index 0000000..e40ce81 Binary files /dev/null and b/home-manager/stvnliu/assets/deer-wallpaper.jpg differ diff --git a/home-manager/stvnliu/assets/gruvbox-wallpaper.png b/home-manager/stvnliu/assets/gruvbox-wallpaper.png deleted file mode 100644 index 6e08ad6..0000000 Binary files a/home-manager/stvnliu/assets/gruvbox-wallpaper.png and /dev/null differ diff --git a/home-manager/stvnliu/assets/nixos-wallpaper.jpg b/home-manager/stvnliu/assets/nixos-wallpaper.jpg deleted file mode 100644 index 96fa2f4..0000000 Binary files a/home-manager/stvnliu/assets/nixos-wallpaper.jpg and /dev/null differ diff --git a/home-manager/stvnliu/assets/od_neon.png b/home-manager/stvnliu/assets/od_neon.png new file mode 100644 index 0000000..562e977 Binary files /dev/null and b/home-manager/stvnliu/assets/od_neon.png differ diff --git a/home-manager/stvnliu/editors.nix b/home-manager/stvnliu/editors.nix index 6399574..febb37a 100644 --- a/home-manager/stvnliu/editors.nix +++ b/home-manager/stvnliu/editors.nix @@ -1,14 +1,22 @@ -{ - lib, - pkgs, - config, - ... -}: { - imports = [ - #./vscode.nix - #./intellij.nix - ]; +{ pkgs, ... }: { programs.nixvim = import ./nixvim; # dependencies for nixvim configuration - home.packages = with pkgs; [ripgrep fd]; + home.packages = with pkgs; [ ripgrep fd ]; + programs.helix = { + enable = true; + settings = { + editor.cursor-shape = { + normal = "block"; + insert = "bar"; + select = "underline"; + }; + }; + languages.language = import ./helix-langs.nix { inherit pkgs; }; + themes = { + autumn_night_transparent = { + "inherits" = "autumn_night"; + "ui.background" = { }; + }; + }; + }; } diff --git a/home-manager/stvnliu/gtk.nix b/home-manager/stvnliu/gtk.nix index c7223c1..c240856 100644 --- a/home-manager/stvnliu/gtk.nix +++ b/home-manager/stvnliu/gtk.nix @@ -1,24 +1,11 @@ -{ - pkgs, - config, - ... +{ pkgs +, ... }: { gtk = { enable = true; iconTheme = { - package = pkgs.gruvbox-plus-icons; - name = "Gruvbox-Plus-Dark"; + package = pkgs.adwaita-icon-theme; + name = "Adwaita"; }; }; - qt = { - enable = true; - platformTheme = "gtk"; - style = { - package = pkgs.libsForQt5.breeze-qt5; - name = "breeze"; - }; - }; - home.packages = with pkgs; [ - libsForQt5.breeze-qt5 - ]; } diff --git a/home-manager/stvnliu/helix-langs.nix b/home-manager/stvnliu/helix-langs.nix new file mode 100644 index 0000000..2adec8e --- /dev/null +++ b/home-manager/stvnliu/helix-langs.nix @@ -0,0 +1,30 @@ +{ pkgs }: [ + { + name = "nix"; + auto-format = true; + formatter.command = "${pkgs.nixfmt}/bin/nixfmt"; + } + { + name = "python"; + auto-format = true; + formatter.command = "${pkgs.black}/bin/black"; + } + { + name = "rust"; + auto-format = true; + formatter.command = "${pkgs.rustfmt}/bin/rustfmt"; + } + { + name = "java"; + auto-format = true; + formatter.command = "${pkgs.jdt-language-server}/bin/jdtls"; + } + { + name = "c"; + auto-format = true; + formatter.command = "${pkgs.astyle}/bin/astyle --squeeze-ws --style=c"; + } + # { } + # { } + # { } +] diff --git a/home-manager/stvnliu/home.nix b/home-manager/stvnliu/home.nix index 6149715..ba30823 100644 --- a/home-manager/stvnliu/home.nix +++ b/home-manager/stvnliu/home.nix @@ -1,53 +1,40 @@ -# his is your home-manager configuration file -# Use this to configure your home environment (it replaces ~/.config/nixpkgs/home.nix) -{ - inputs, - lib, - config, - pkgs, - ... -}: { - # You can import other home-manager modules here +{ config, pkgs, ... }: { imports = [ - # If you want to use home-manager modules from other flakes (such as nix-colors): - # inputs.nix-colors.homeManagerModule - - # You can also split up your configuration and import pieces of it here: - #./swaywm.nix - ./hypr + #./hypr ./shells ../../common/variables.nix - ./mako.nix + ./services ./wechat ./editors.nix ./gtk.nix - ./ags + #./ags ./xdg.nix ./stylix.nix - ./spicetify.nix + #./dwl ./scripts + ./programs + ./packages ]; + #services.pass-secret-service.enable = true; nixpkgs = { # You can add overlays here overlays = [ - # If you want to use overlays exported from other flakes: - # neovim-nightly-overlay.overlays.default - - # Or define it inline, for example: - # (final: prev: { - # hi = final.hello.overrideAttrs (oldAttrs: { - # patches = [ ./change-hello-to-hi.patch ]; - # }); - # }) - (final: prev: { + (_final: prev: { ags = prev.ags.overrideAttrs (old: { - buildInputs = old.buildInputs ++ [pkgs.libdbusmenu-gtk3]; + buildInputs = old.buildInputs ++ [ pkgs.libdbusmenu-gtk3 ]; }); }) ]; # Configure your nixpkgs instance config = { + cudaSupport = true; + permittedInsecurePackages = [ + "dotnet-core-combined" + "dotnet-sdk-6.0.428" + "dotnet-sdk-7.0.410" + "dotnet-sdk-wrapped-6.0.428" + ]; # Disable if you don't want unfree packages allowUnfree = true; # Workaround for https://github.com/nix-community/home-manager/issues/2942 @@ -59,65 +46,42 @@ username = "${config.myUserName}"; homeDirectory = "/home/${config.myUserName}"; # copy wallpaper from assets - file = {"wallpaper.jpg".source = ./assets/nixos-wallpaper.jpg;}; + file = { "wallpaper.jpg".source = config.myWallPaperPath; }; }; home.packages = with pkgs; [ prismlauncher protonvpn-gui - devenv vlc - tree - zed-editor + clash-verge-rev rhythmbox - #clash-verge-rev qq - libreoffice - discord - #zathura - kdePackages.okular shotwell mpv - kdenlive + kdePackages.kdenlive obsidian - pcmanfm - udiskie - android-file-transfer - usbutils - mtpfs - teams-for-linux - sxiv heroic ]; myAutostartCommands = [ - #"${pkgs.clash-verge-rev}/bin/clash-verge" - "${pkgs.firefox}/bin/firefox" - "${pkgs.thunderbird}/bin/thunderbird" + "${pkgs.clash-verge-rev}/bin/clash-verge" ]; programs = { obs-studio = { enable = true; - plugins = [pkgs.obs-studio-plugins.wlrobs]; + plugins = with pkgs.obs-studio-plugins; [ wlrobs input-overlay ]; }; home-manager.enable = true; - firefox.enable = true; + firefox = { + enable = true; + package = with pkgs; + (librewolf.override { + nativeMessagingHosts = [ passff-host ]; + hasMozSystemDirPatch = true; + }); + }; thunderbird = { enable = true; - profiles.default = {isDefault = true;}; - }; - git = { - enable = true; - package = pkgs.gitFull; - userName = config.myDisplayName; - userEmail = config.myEmail; - extraConfig = { - push.autoSetupRemote = true; - commit.gpgsign = true; - gpg.format = "ssh"; - gpg.ssh.allowedSignersFile = "/home/${config.myUserName}/.ssh/allowed_signers"; - user.signingkey = "/home/${config.myUserName}/.ssh/id_ed25519.pub"; - credential.helper = "libsecret"; - }; + profiles.default = { isDefault = true; }; }; }; # Nicely reload system units when changing configs diff --git a/home-manager/stvnliu/hypr/default.nix b/home-manager/stvnliu/hypr/default.nix index b23406f..56152f5 100644 --- a/home-manager/stvnliu/hypr/default.nix +++ b/home-manager/stvnliu/hypr/default.nix @@ -1,11 +1,7 @@ -{ - pkgs, - config, - lib, - ... +{ ... }: { imports = [ - ./hyprland.nix + ./hyprland ./hyprpaper.nix ./hypridle.nix ./hyprlock.nix diff --git a/home-manager/stvnliu/hypr/hypridle.nix b/home-manager/stvnliu/hypr/hypridle.nix index 5439a41..8d227e8 100644 --- a/home-manager/stvnliu/hypr/hypridle.nix +++ b/home-manager/stvnliu/hypr/hypridle.nix @@ -1,6 +1,8 @@ -{pkgs, ...}: let +{ ... }: +let timeoutSeconds = 600; -in { +in +{ services.hypridle = { enable = true; settings = { diff --git a/home-manager/stvnliu/hypr/hyprland.nix b/home-manager/stvnliu/hypr/hyprland.nix deleted file mode 100644 index 19fbc48..0000000 --- a/home-manager/stvnliu/hypr/hyprland.nix +++ /dev/null @@ -1,102 +0,0 @@ -{ - config, - pkgs, - ... -}: { - home.packages = with pkgs; [foot]; - wayland.windowManager.hyprland = { - # Whether to enable Hyprland wayland compositor - enable = true; - # The hyprland package to use - package = pkgs.hyprland; - plugins = with pkgs.hyprlandPlugins; [ - hyprfocus - csgo-vulkan-fix - ]; - # Whether to enable XWayland - xwayland.enable = true; - settings = { - xwayland = {force_zero_scaling = true;}; - monitor = [ - #"eDP-1, 1920x1080@165,0x0,1" - ",preferred, auto, ${builtins.toString config.displayScale}" - ]; - input = { - # xset rate 250 50 replacement on wayland... - # FAST MODE LET'S GOOO - repeat_rate = 50; - repeat_delay = 250; - }; - exec-once = - config.myAutostartCommands - ++ [ - "[workspace special silent] ${pkgs.foot}/bin/foot -f 'BlexMono Nerd Font:size=12' -o colors.alpha=0.85 ${config.myShells.defaultShell}" - ]; - misc = { - disable_hyprland_logo = true; - disable_splash_rendering = true; - font_family = "monospace"; - }; - "$mod" = "SUPER"; - binde = [ - ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+" - - # Example volume button that will activate even while an input inhibitor is active - ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" - ]; - bind = let - terminalCmd = "${pkgs.foot}/bin/foot -f 'BlexMono Nerd Font:size=12' -o colors.alpha=0.85 ${config.myShells.defaultShell}"; - screenshotLocation = "/home/${config.myUserName}/Screenshots/$(date '+%Y-%m-%d-%H-%M-%S').png"; - in - [ - "$mod SHIFT, L, exec, ${pkgs.hyprlock}/bin/hyprlock --immediate" - - "$mod SHIFT, Print, exec, ${pkgs.grimblast}/bin/grimblast copysave output ${screenshotLocation}" - "$mod, Print, exec, ${pkgs.grimblast}/bin/grimblast copysave area ${screenshotLocation}" - ", Print, exec, ${pkgs.grimblast}/bin/grimblast copy area" - - # special workspace keybinds - "$mod, S, togglespecialworkspace" - "$mod SHIFT, S, movetoworkspace, special" - - # keysyms for util functions - # Example volume button that allows press and hold, volume limited to 150% - "$mod, Q, killactive" - "$mod, D, exec, ${pkgs.fuzzel}/bin/fuzzel" - # firefox quickstart - "$mod, F, exec, ${pkgs.firefox}/bin/firefox" - "$mod, E, exec, ${pkgs.pcmanfm}/bin/pcmanfm" - # foot terminal - "$mod, Return, exec, ${terminalCmd}" - "$mod SHIFT, Return, exec, [float] ${terminalCmd}" - - # vimkeys navigation - "$mod, H, movefocus, l" - "$mod, J, movefocus, d" - "$mod, K, movefocus, u" - "$mod, L, movefocus, r" - ] - ++ ( - # workspaces - # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} - builtins.concatLists (builtins.genList (x: let - ws = let c = (x + 1) / 10; in builtins.toString (x + 1 - (c * 10)); - in [ - "$mod, ${ws}, workspace, ${toString (x + 1)}" - "$mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}" - ]) - 10) - ); - bindm = [ - # mouse movements - "$mod, mouse:272, movewindow" - "$mod, mouse:273, resizewindow" - "$mod ALT, mouse:272, resizewindow" - ]; - }; - # Optional - # Whether to enable hyprland-session.target on hyprland startup - systemd = {enable = true;}; - }; - # ... -} diff --git a/home-manager/stvnliu/hypr/hyprland/binds.nix b/home-manager/stvnliu/hypr/hyprland/binds.nix new file mode 100644 index 0000000..f795983 --- /dev/null +++ b/home-manager/stvnliu/hypr/hyprland/binds.nix @@ -0,0 +1,68 @@ +{ config, pkgs, inputs, ... }: +let + terminalCmd = config.defaultApplications.terminal; + screenshotLocation = + "/home/${config.myUserName}/Screenshots/$(date '+%Y-%m-%d-%H-%M-%S').png"; +in +[ + "$mod SHIFT, L, exec, ${pkgs.wlogout}/bin/wlogout" + + "$mod SHIFT, Print, exec, ${pkgs.grimblast}/bin/grimblast copysave output ${screenshotLocation}" + ", Print, exec, ${pkgs.grimblast}/bin/grimblast copysave area ${screenshotLocation}" + "$mod, Print, exec, ${pkgs.grimblast}/bin/grimblast copy area" + + # special workspace keybinds + "$mod, S, togglespecialworkspace" + "$mod SHIFT, S, movetoworkspace, special" + + "alt, Tab, exec, ${inputs.hyprswitch.packages.x86_64-linux.default}/bin/hyprswitch gui --mod-key alt --key Tab --close mod-key-release --reverse-key=key=grave && hyprswitch dispatch" + + # keysyms for util functions + # Example volume button that allows press and hold, volume limited to 150% + "$mod, Q, killactive" + "$mod, D, exec, ${config.defaultApplications.appLauncher}" + "$mod, F, fullscreen" + "$mod, E, exec, ${config.defaultApplications.fileManager}" + # foot terminal + "$mod, Return, exec, ${terminalCmd} ${config.myShells.defaultShell}" + "$mod SHIFT, Return, exec, ${terminalCmd} --title=floats ${config.myShells.defaultShell}" + + # cmdline utilities + /* NOTE Replaced by network manager applet + nmtui interface is no longer needed + TODO Fix floating window rule + */ + # "$mod, N, exec, [float] ${terminalCmd} ${pkgs.networkmanager}/bin/nmtui" + #"$mod, M, exec, [float] ${terminalCmd} ${pkgs.zenith}/bin/zenith" + + # vimkeys navigation + "$mod, H, movefocus, l" + "$mod, J, movefocus, d" + "$mod, K, movefocus, u" + "$mod, L, movefocus, r" +] ++ (if config.services.mpd.enable then + [ "$mod, M, exec, ${terminalCmd} --title=ncmpc ${pkgs.ncmpcpp}/bin/ncmpcpp" ] +else + [ ]) ++ (if config.services.swaync.enable then + [ "$mod, N, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -t" ] +else + [ ]) ++ ( + # workspaces + # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} + builtins.concatLists (builtins.genList + (x: + let ws = let c = (x + 1) / 10; in builtins.toString (x + 1 - (c * 10)); + in [ + "$mod, ${ws}, workspace, ${toString (x + 1)}" + "$mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}" + ]) 10) + # workspaces + # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} + /* builtins.concatLists (builtins.genList (x: + let ws = let c = (x + 1) / 10; in builtins.toString (x + 1 - (c * 10)); + in [ + "$mod M, ${ws}, workspace, ${toString (x + 10 + 1)}" + "$mod SHIFT M, ${ws}, movetoworkspace, ${toString (x + 10 + 1)}" + ]) 10) + */ +) diff --git a/home-manager/stvnliu/hypr/hyprland/default.nix b/home-manager/stvnliu/hypr/hyprland/default.nix new file mode 100644 index 0000000..2aa63db --- /dev/null +++ b/home-manager/stvnliu/hypr/hyprland/default.nix @@ -0,0 +1,85 @@ +{ inputs, config, pkgs, lib, ... }: +let + bgbordercolor = config.lib.stylix.colors.base01; + fgbordercolor = config.lib.stylix.colors.base02; +in +{ + home.packages = + [ inputs.hyprland-qtutils.packages.x86_64-linux.default pkgs.foot ]; + wayland.windowManager.hyprland = { + # Whether to enable Hyprland wayland compositor + enable = true; + # The hyprland package to use + package = pkgs.hyprland; + plugins = with pkgs.hyprlandPlugins; + [ + # hyprbars + # hyprexpo + # hyprfocus + # hycov + ]; + # Whether to enable XWayland + xwayland.enable = true; + settings = { + plugins = import ./hyprbars.nix { inherit config; }; + # env = [ "AQ_DRM_DEVICES, /dev/dri/card0" ]; + xwayland = { force_zero_scaling = true; }; + monitor = [ + "desc:Xiaomi Corporation Mi 27 NFGL 3215000032603, 1920x1080@75, 2560x0, 1" + "desc:BOE 0x0B40,preferred, auto, ${ + builtins.toString config.displayScale + }" + ", preferred, auto, 1" # wildcard definition + ]; + general = { + "col.inactive_border" = lib.mkForce "rgb(${bgbordercolor})"; + "col.active_border" = lib.mkForce "rgb(${fgbordercolor})"; + border_size = 1; + gaps_in = 2.5; + gaps_out = 5; + allow_tearing = true; + }; + windowrulev2 = import ./window_rules.nix; + decoration = { rounding = 5; }; + input = { + # xset rate 250 50 replacement on wayland... + repeat_rate = 50; + repeat_delay = 250; + accel_profile = "flat"; + }; + exec-once = config.myAutostartCommands ++ (import ./hypr_autostart.nix { + inherit config; + inherit pkgs; + inherit inputs; + }); + cursor = { + # Fixes https://github.com/hyprwm/Hyprland/issues/9324 + # Needed because by default, Hyprland enabled Nvidia hardware cursors. + no_hardware_cursors = true; + }; + misc = { + disable_hyprland_logo = true; + disable_splash_rendering = true; + font_family = "monospace"; + focus_on_activate = true; + }; + "$mod" = "SUPER"; + binde = import ./xf86_binds.nix { inherit pkgs; }; + bind = import ./binds.nix { + inherit config; + inherit pkgs; + inherit inputs; + }; + bindm = [ + # mouse movements + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + "$mod ALT, mouse:272, resizewindow" + ]; + }; + # Optional + # Whether to enable hyprland-session.target on hyprland startup + systemd = { enable = true; }; # set to false due to UWSM + }; + # ... +} diff --git a/home-manager/stvnliu/hypr/hyprland/hypr_autostart.nix b/home-manager/stvnliu/hypr/hyprland/hypr_autostart.nix new file mode 100644 index 0000000..cc41210 --- /dev/null +++ b/home-manager/stvnliu/hypr/hyprland/hypr_autostart.nix @@ -0,0 +1,7 @@ +{ config, pkgs, inputs }: [ + "${config.programs.thunderbird.package}/bin/thunderbird" + "${pkgs.mpris-notifier}/bin/mpris-notifier" + "${pkgs.mpd-discord-rpc}/bin/mpd-discord-rpc" + "${pkgs.easyeffects}/bin/easyeffects --gapplication-service" + "${inputs.hyprswitch.packages.x86_64-linux.default}/bin/hyprswitch init --show-title --size-factor 5.5 --workspaces-per-row 5" +] diff --git a/home-manager/stvnliu/hypr/hyprland/hyprbars.nix b/home-manager/stvnliu/hypr/hyprland/hyprbars.nix new file mode 100644 index 0000000..ef79e37 --- /dev/null +++ b/home-manager/stvnliu/hypr/hyprland/hyprbars.nix @@ -0,0 +1,16 @@ +{ config }: { + hyprbars = { + bar_height = 38; + bar_color = "rgb(1e1e1e)"; + "col.text" = "ffffff"; + bar_text_size = 12; + bar_text_font = config.desktopFont.fullName; + bar_button_padding = 12; + bar_padding = 10; + bar_precedence_over_border = true; + hyprbars-button = [ + "rgb(ffffff), 20, 󰅖, hyprctl dispatch killactive;" + "rgb(ffffff), 20, 󰊓, hyprctl dispatch fullscreen 2;" + ]; + }; +} diff --git a/home-manager/stvnliu/hypr/hyprland/window_rules.nix b/home-manager/stvnliu/hypr/hyprland/window_rules.nix new file mode 100644 index 0000000..e481482 --- /dev/null +++ b/home-manager/stvnliu/hypr/hyprland/window_rules.nix @@ -0,0 +1,7 @@ +[ + "workspace special silent, class:^(foot.*)$, title:autorun" + "float, title:floats" + "float, title:ncmpc" + "size 50% 50%, title:ncmpc" + "immediate, class:^(cs2)$" +] diff --git a/home-manager/stvnliu/hypr/hyprland/xf86_binds.nix b/home-manager/stvnliu/hypr/hyprland/xf86_binds.nix new file mode 100644 index 0000000..566e55b --- /dev/null +++ b/home-manager/stvnliu/hypr/hyprland/xf86_binds.nix @@ -0,0 +1,11 @@ +{ pkgs +, +}: [ + ", XF86AudioPlay, exec, ${pkgs.playerctl}/bin/playerctl play-pause" + ", XF86AudioStop, exec, ${pkgs.playerctl}/bin/playerctl stop" + ", XF86AudioNext, exec, ${pkgs.playerctl}/bin/playerctl next" + ", XF86AudioPrev, exec, ${pkgs.playerctl}/bin/playerctl previous" + ", XF86AudioRaiseVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioMute, exec, ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 0%" +] diff --git a/home-manager/stvnliu/hypr/hyprlock.nix b/home-manager/stvnliu/hypr/hyprlock.nix index e93263b..bbcfc3c 100644 --- a/home-manager/stvnliu/hypr/hyprlock.nix +++ b/home-manager/stvnliu/hypr/hyprlock.nix @@ -1,10 +1,5 @@ -{ - pkgs, - config, - lib, - ... -}: { - programs.hyprlock = { +{ config, lib, ... }: { + programs.hyprlock = lib.mkForce { enable = true; settings = { general = { @@ -14,29 +9,25 @@ no_fade_in = false; }; - background = [ - { - path = "screenshot"; - blur_passes = 3; - blur_size = 8; - } - ]; + background = [{ + path = "screenshot"; + blur_passes = 3; + blur_size = 8; + }]; - input-field = [ - { - size = "200, 50"; - position = "0, -80"; - monitor = ""; - dots_center = true; - fade_on_empty = false; - font_color = "rgb(202, 211, 245)"; - inner_color = "rgb(91, 96, 120)"; - outer_color = "rgb(24, 25, 38)"; - outline_thickness = 5; - #placeholder_text = '\'Password...'\'; - shadow_passes = 2; - } - ]; + input-field = [{ + size = "400, 50"; + position = "0, -80"; + monitor = ""; + dots_center = true; + fade_on_empty = false; + font_color = "rgb(${config.lib.stylix.colors.base07})"; + inner_color = "rgb(${config.lib.stylix.colors.base02})"; + outer_color = "rgb(${config.lib.stylix.colors.base03})"; + outline_thickness = 1; + placeholder_text = ''Password...''; + shadow_passes = 2; + }]; }; }; } diff --git a/home-manager/stvnliu/hypr/hyprpaper.nix b/home-manager/stvnliu/hypr/hyprpaper.nix index b82c20f..47f338f 100644 --- a/home-manager/stvnliu/hypr/hyprpaper.nix +++ b/home-manager/stvnliu/hypr/hyprpaper.nix @@ -1,15 +1,15 @@ -{ - pkgs, - config, - ... +{ config +, ... }: { services.hyprpaper = { enable = true; settings = { ipc = "on"; splash = false; - preload = [config.myWallPaperPathString]; - wallpaper = [",${config.myWallPaperPathString}"]; + preload = [ config.myWallPaperPathString ]; + wallpaper = [ ",${config.myWallPaperPathString}" ]; + #preload = [/home/stvnliu/Downloads/mao-zedong.jpg]; + #wallpaper = [",/home/stvnliu/Downloads/mao-zedong.jpg"]; }; }; } diff --git a/home-manager/stvnliu/kanshi.nix b/home-manager/stvnliu/kanshi.nix deleted file mode 100644 index ea86c62..0000000 --- a/home-manager/stvnliu/kanshi.nix +++ /dev/null @@ -1,49 +0,0 @@ -{ - pkgs, - config, - ... -}: { - services.kanshi = { - enable = true; - profiles = { - undocked = { - outputs = [ - { - criteria = "eDP-1"; - scale = 1.0; - status = "enable"; - } - ]; - }; - docked_office_cn = { - outputs = [ - { - criteria = "AOC 2619 M1194JA002428"; - position = "0,0"; - mode = "1920x1200@59.94Hz"; - } - { - criteria = "eDP-1"; - position = "0,0"; - status = "disable"; - } - ]; - }; - docked_office_gr = { - outputs = [ - { - criteria = "HDMI-A-1"; - position = "0,0"; - mode = "1920x1080@60.00Hz"; - } - { - criteria = "eDP-1"; - position = "0,0"; - status = "disable"; - } - ]; - }; - }; - systemdTarget = "hyprland-session.target"; - }; -} diff --git a/home-manager/stvnliu/mako.nix b/home-manager/stvnliu/mako.nix index 5b22460..a59dd34 100644 --- a/home-manager/stvnliu/mako.nix +++ b/home-manager/stvnliu/mako.nix @@ -1,10 +1,9 @@ -{ - pkgs, - lib, - ... -}: let +{ ... +}: +let defaultTimeoutMillis = 5 * 1000; -in { +in +{ services.mako = { enable = true; defaultTimeout = defaultTimeoutMillis; diff --git a/home-manager/stvnliu/nixvim/auto-pairs.nix b/home-manager/stvnliu/nixvim/auto-pairs.nix index c57a48b..f8a479c 100644 --- a/home-manager/stvnliu/nixvim/auto-pairs.nix +++ b/home-manager/stvnliu/nixvim/auto-pairs.nix @@ -1 +1 @@ -{plugins.nvim-autopairs = {enable = true;};} +{ plugins.nvim-autopairs = { enable = true; }; } diff --git a/home-manager/stvnliu/nixvim/autosave.nix b/home-manager/stvnliu/nixvim/autosave.nix index b2d375a..d8386e1 100644 --- a/home-manager/stvnliu/nixvim/autosave.nix +++ b/home-manager/stvnliu/nixvim/autosave.nix @@ -1,6 +1,6 @@ { plugins.auto-save = { enable = true; - enableAutoSave = true; + settings.enabled = true; }; } diff --git a/home-manager/stvnliu/nixvim/bufferline.nix b/home-manager/stvnliu/nixvim/bufferline.nix index 628aaa6..9039f66 100644 --- a/home-manager/stvnliu/nixvim/bufferline.nix +++ b/home-manager/stvnliu/nixvim/bufferline.nix @@ -1 +1 @@ -{plugins.bufferline = {enable = true;};} +{ plugins.bufferline = { enable = true; }; } diff --git a/home-manager/stvnliu/nixvim/cmp.nix b/home-manager/stvnliu/nixvim/cmp.nix index 865859a..260de1f 100644 --- a/home-manager/stvnliu/nixvim/cmp.nix +++ b/home-manager/stvnliu/nixvim/cmp.nix @@ -2,45 +2,49 @@ { plugins = { luasnip.enable = true; - copilot-lua = { + /* + copilot-lua = { enable = true; suggestion.enabled = false; panel.enabled = false; - }; - - cmp-buffer = {enable = true;}; - - cmp-emoji = {enable = true;}; - - cmp-nvim-lsp = {enable = true;}; - - cmp-path = {enable = true;}; - - cmp_luasnip = {enable = true;}; - + }; + */ cmp = { enable = true; - settings = { + autoEnableSources = true; + experimental = { ghost_text = false; }; + performance = { + debounce = 60; + fetchingTimeout = 200; + maxViewEntries = 30; + }; + snippet = { expand = "luasnip"; }; + cmp-buffer = { enable = true; }; + cmp-emoji = { enable = true; }; + cmp-nvim-lsp = { enable = true; }; + cmp-path = { enable = true; }; + cmp_luasnip = { enable = true; }; + + /* snippet.expand = '' function(args) require('luasnip').lsp_expand(args.body) end ''; + */ sources = [ - {name = "nvim_lsp";} - {name = "luasnip";} + { name = "nvim_lsp"; } + { name = "luasnip"; } { name = "buffer"; option.get_bufnrs.__raw = "vim.api.nvim_list_bufs"; } - {name = "nvim_lua";} - {name = "path";} - {name = "copilot";} + { name = "nvim_lua"; } + { name = "path"; } ]; - formatting = { - fields = ["abbr" "kind" "menu"]; + fields = [ "abbr" "kind" "menu" ]; format = # lua '' @@ -100,11 +104,11 @@ winhighlight = "FloatBorder:CmpBorder,Normal:CmpPmenu,CursorLine:CmpSel,Search:PmenuSel"; scrollbar = false; sidePadding = 0; - border = ["╭" "─" "╮" "│" "╯" "─" "╰" "│"]; + border = [ "╭" "─" "╮" "│" "╯" "─" "╰" "│" ]; }; settings.documentation = { - border = ["╭" "─" "╮" "│" "╯" "─" "╰" "│"]; + border = [ "╭" "─" "╮" "│" "╯" "─" "╰" "│" ]; winhighlight = "FloatBorder:CmpBorder,Normal:CmpPmenu,CursorLine:CmpSel,Search:PmenuSel"; }; }; diff --git a/home-manager/stvnliu/nixvim/coq.nix b/home-manager/stvnliu/nixvim/coq.nix new file mode 100644 index 0000000..fc4388a --- /dev/null +++ b/home-manager/stvnliu/nixvim/coq.nix @@ -0,0 +1,6 @@ +{ + plugins.coq-nvim = { + enable = true; + installArtifacts = true; + }; +} diff --git a/home-manager/stvnliu/nixvim/custom/binds.nix b/home-manager/stvnliu/nixvim/custom/binds.nix new file mode 100644 index 0000000..63e9262 --- /dev/null +++ b/home-manager/stvnliu/nixvim/custom/binds.nix @@ -0,0 +1,8 @@ +[ + { + mode = "n"; + key = "ree"; + action = "RustLsp explainError"; + options.desc = "Explain this Rust error (custom)"; + } +] diff --git a/home-manager/stvnliu/nixvim/default.nix b/home-manager/stvnliu/nixvim/default.nix index be0731b..eef2ecd 100644 --- a/home-manager/stvnliu/nixvim/default.nix +++ b/home-manager/stvnliu/nixvim/default.nix @@ -1,15 +1,12 @@ -{ - pkgs, - config, - ... -}: { +{ ... }: { imports = [ ./auto-pairs.nix ./autosave.nix - ./bufferline.nix + #./bufferline.nix ./cmp.nix + #./coq.nix ./git.nix - ./ionide.nix + #./ionide.nix ./lualine.nix ./lsp.nix ./none-ls.nix @@ -23,131 +20,146 @@ ./which_key.nix ./wilder.nix ./virt-column.nix + ./devicons.nix + ./tagbar.nix + ./wrapping.nix + ./twilight.nix ]; enable = true; enableMan = true; defaultEditor = true; globals.mapleader = " "; - colorschemes.gruvbox = {enable = true;}; - keymaps = [ - # Global - # Default mode is "" which means normal-visual-op - { - mode = "n"; - key = "bg"; - action = "TransparentToggle"; - options.desc = "Toggle background transparency"; - } - { - key = ""; - action = "NvimTreeToggle"; - options.desc = "Toggle NvimTree"; - } + colorschemes.gruvbox = { enable = true; }; + performance = { + byteCompileLua.enable = true; + combinePlugins = { + enable = true; + /*standalonePlugins = [ + "nvim-treesitter" + ];*/ + }; + }; + keymaps = + [ + # Global + # Default mode is "" which means normal-visual-op + { + mode = "n"; + key = "bg"; + action = "TransparentToggle"; + options.desc = "Toggle background transparency"; + } + { + key = ""; + action = "NvimTreeToggle"; + options.desc = "Toggle NvimTree"; + } - # File - { - mode = "n"; - key = "f"; - action = "+find/file"; - } - { - # Format file - key = "fm"; - action = "lua vim.lsp.buf.format()"; - options.desc = "Format the current buffer"; - } + # File + { + mode = "n"; + key = "f"; + action = "+find/file"; + } + { + # Format file + key = "fm"; + action = "lua vim.lsp.buf.format()"; + options.desc = "Format the current buffer"; + } - # Git - { - mode = "n"; - key = "g"; - action = "+git"; - } - { - mode = "n"; - key = "gt"; - action = "+toggles"; - } - { - key = "gtb"; - action = "Gitsigns toggle_current_line_blame"; - options.desc = "Gitsigns current line blame"; - } - { - key = "gtd"; - action = "Gitsigns toggle_deleted"; - options.desc = "Gitsigns deleted"; - } - { - key = "gd"; - action = "Gitsigns diffthis"; - options.desc = "Gitsigns diff this buffer"; - } + # Git + { + mode = "n"; + key = "g"; + action = "+git"; + } + { + mode = "n"; + key = "gt"; + action = "+toggles"; + } + { + key = "gtb"; + action = "Gitsigns toggle_current_line_blame"; + options.desc = "Gitsigns current line blame"; + } + { + key = "gtd"; + action = "Gitsigns toggle_deleted"; + options.desc = "Gitsigns deleted"; + } + { + key = "gd"; + action = "Gitsigns diffthis"; + options.desc = "Gitsigns diff this buffer"; + } - # Tabs - { - mode = "n"; - key = "t"; - action = "+tab"; - } - { - mode = "n"; - key = "tn"; - action = "tabnew"; - options.desc = "Create new tab"; - } - { - mode = "n"; - key = "td"; - action = "tabclose"; - options.desc = "Close tab"; - } - { - mode = "n"; - key = "ts"; - action = "tabnext"; - options.desc = "Go to the sub-sequent tab"; - } - { - mode = "n"; - key = "tp"; - action = "tabprevious"; - options.desc = "Go to the previous tab"; - } + # Tabs + { + mode = "n"; + key = "t"; + action = "+tab"; + } + { + mode = "n"; + key = "tn"; + action = "tabnew"; + options.desc = "Create new tab"; + } + { + mode = "n"; + key = "td"; + action = "tabclose"; + options.desc = "Close tab"; + } + { + mode = "n"; + key = "ts"; + action = "tabnext"; + options.desc = "Go to the sub-sequent tab"; + } + { + mode = "n"; + key = "tp"; + action = "tabprevious"; + options.desc = "Go to the previous tab"; + } - # Terminal - { - # Escape terminal mode using ESC - mode = "t"; - key = ""; - action = ""; - options.desc = "Escape terminal mode"; - } + # Terminal + { + # Escape terminal mode using ESC + mode = "t"; + key = ""; + action = ""; + options.desc = "Escape terminal mode"; + } - # Trouble - { - mode = "n"; - key = "d"; - action = "+diagnostics/debug"; - } - { - key = "dt"; - action = "TroubleToggle"; - options.desc = "Toggle trouble"; - } + # Trouble + { + mode = "n"; + key = "d"; + action = "+diagnostics/debug"; + } + { + key = "dt"; + action = "TroubleToggle"; + options.desc = "Toggle trouble"; + } - # Rust - { - mode = "n"; - key = "r"; - action = "+rust"; - } - { - # Start standalone rust-analyzer (fixes issues when opening files from nvim tree) - mode = "n"; - key = "rs"; - action = "RustStartStandaloneServerForBuffer"; - options.desc = "Start standalone rust-analyzer"; - } - ]; + # Rust + { + mode = "n"; + key = "r"; + action = "+rust"; + } + { + # Start standalone rust-analyzer (fixes issues when opening files from nvim tree) + mode = "n"; + key = "rs"; + action = "RustStartStandaloneServerForBuffer"; + options.desc = "Start standalone rust-analyzer"; + } + ] + ++ (import ./custom/binds.nix); } diff --git a/home-manager/stvnliu/nixvim/devicons.nix b/home-manager/stvnliu/nixvim/devicons.nix new file mode 100644 index 0000000..5265533 --- /dev/null +++ b/home-manager/stvnliu/nixvim/devicons.nix @@ -0,0 +1,3 @@ +{ + plugins.web-devicons.enable = true; +} diff --git a/home-manager/stvnliu/nixvim/ionide.nix b/home-manager/stvnliu/nixvim/ionide.nix index db3d3fc..3de2422 100644 --- a/home-manager/stvnliu/nixvim/ionide.nix +++ b/home-manager/stvnliu/nixvim/ionide.nix @@ -1,4 +1,4 @@ -{pkgs, ...}: { +{ pkgs, ... }: { extraPlugins = with pkgs.vimPlugins; [ Ionide-vim ]; diff --git a/home-manager/stvnliu/nixvim/lsp.nix b/home-manager/stvnliu/nixvim/lsp.nix index 2f552c8..73124a1 100644 --- a/home-manager/stvnliu/nixvim/lsp.nix +++ b/home-manager/stvnliu/nixvim/lsp.nix @@ -1,20 +1,51 @@ -{ +{ ... }: { plugins = { + lsp-signature.enable = true; + lsp-status.enable = true; lsp = { enable = true; servers = { + # For Python pylsp.enable = true; - bashls.enable = true; + #pylyzer.enable = true; + #ruff.enable = true; + #ruff_lsp.enable = true; + + rust_analyzer = { + enable = true; + installCargo = false; + installRustc = false; + }; + # For CXX clangd.enable = true; + + # Misc + bashls.enable = true; fsautocomplete.enable = true; gopls.enable = true; - nil_ls.enable = true; - #nixd.enable = true; - rust-analyzer = { + + #nushell.enable = true; + + # For Nix + #nil_ls.enable = true; + nixd = { enable = true; - installRustc = true; + extraOptions = { + home-manager = { + expr = '' + (builtins.getFlake "/home/stvnliu/nix-conf/").homeConfigurations."stvnliu@nixos-msi".options''; + }; + }; }; - tsserver.enable = true; + + # Haskell + hls = { + enable = true; + installGhc = false; + }; + + # For TypeScript + ts_ls.enable = true; }; keymaps.lspBuf = { "gd" = "definition"; @@ -24,10 +55,12 @@ "K" = "hover"; }; }; - lsp-lines = { - enable = true; - currentLine = true; - }; - rust-tools.enable = true; + #lsp-lines.enable = true; + + #rustaceanvim = { + # enable = true; + # # rust-tools.enable = true; + #}; }; + diagnostics.virtual_lines.only_current_line = true; } diff --git a/home-manager/stvnliu/nixvim/lspkind.nix b/home-manager/stvnliu/nixvim/lspkind.nix new file mode 100644 index 0000000..73f2b1c --- /dev/null +++ b/home-manager/stvnliu/nixvim/lspkind.nix @@ -0,0 +1,12 @@ +{ + plugins.lspkind = { + enable = true; + symbolMap = { + Copilot = " "; + }; + extraOptions = { + maxwidth = 50; + ellipsis_char = "..."; + }; + }; +} diff --git a/home-manager/stvnliu/nixvim/options.nix b/home-manager/stvnliu/nixvim/options.nix index 5243cf9..231c131 100644 --- a/home-manager/stvnliu/nixvim/options.nix +++ b/home-manager/stvnliu/nixvim/options.nix @@ -3,7 +3,7 @@ updatetime = 100; # Faster completion number = true; - relativenumber = false; + relativenumber = true; autoindent = true; clipboard = "unnamedplus"; diff --git a/home-manager/stvnliu/nixvim/tagbar.nix b/home-manager/stvnliu/nixvim/tagbar.nix new file mode 100644 index 0000000..2c7c1b0 --- /dev/null +++ b/home-manager/stvnliu/nixvim/tagbar.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: + +{ + + dependencies.ctags.package = pkgs.universal-ctags; + plugins.tagbar = { + enable = true; + settings = { + autoclose = false; + autofocus = false; + autoshowtag = true; + foldlevel = 2; + iconchars = [ "" "" ]; + position = "right"; + visibility_symbols = { + private = "󰛑 "; + protected = "󱗤 "; + public = "󰡭 "; + }; + }; + }; +} diff --git a/home-manager/stvnliu/nixvim/telescope.nix b/home-manager/stvnliu/nixvim/telescope.nix index 989ff58..95e672f 100644 --- a/home-manager/stvnliu/nixvim/telescope.nix +++ b/home-manager/stvnliu/nixvim/telescope.nix @@ -10,6 +10,6 @@ }; }; }; - extensions.fzf-native = {enable = true;}; + extensions.fzf-native = { enable = true; }; }; } diff --git a/home-manager/stvnliu/nixvim/transparent.nix b/home-manager/stvnliu/nixvim/transparent.nix index f81c39b..b392fb8 100644 --- a/home-manager/stvnliu/nixvim/transparent.nix +++ b/home-manager/stvnliu/nixvim/transparent.nix @@ -1 +1 @@ -{plugins.transparent.enable = true;} +{ plugins.transparent.enable = true; } diff --git a/home-manager/stvnliu/nixvim/treesitter.nix b/home-manager/stvnliu/nixvim/treesitter.nix index b611273..d101cb7 100644 --- a/home-manager/stvnliu/nixvim/treesitter.nix +++ b/home-manager/stvnliu/nixvim/treesitter.nix @@ -1,10 +1,11 @@ -{ +{ pkgs, ... }: { plugins = { treesitter = { enable = true; nixGrammars = true; nixvimInjections = true; # enables language injection in nixvim - indent = true; + settings.indent.enable = true; + grammarPackages = pkgs.vimPlugins.nvim-treesitter.passthru.allGrammars; }; treesitter-context.enable = true; rainbow-delimiters.enable = true; diff --git a/home-manager/stvnliu/nixvim/twilight.nix b/home-manager/stvnliu/nixvim/twilight.nix new file mode 100644 index 0000000..5443b00 --- /dev/null +++ b/home-manager/stvnliu/nixvim/twilight.nix @@ -0,0 +1,6 @@ +{ ... }: { + plugins = { + zen-mode = { enable = true; }; + twilight = { enable = true; }; + }; +} diff --git a/home-manager/stvnliu/nixvim/virt-column.nix b/home-manager/stvnliu/nixvim/virt-column.nix index 0daf880..ef15de2 100644 --- a/home-manager/stvnliu/nixvim/virt-column.nix +++ b/home-manager/stvnliu/nixvim/virt-column.nix @@ -1,7 +1,7 @@ { plugins.virt-column = { enable = true; - settings.char = ["┃"]; + settings.char = [ "┃" ]; settings.virtcolumn = "80"; }; } diff --git a/home-manager/stvnliu/nixvim/which_key.nix b/home-manager/stvnliu/nixvim/which_key.nix index 1b73707..bf4f909 100644 --- a/home-manager/stvnliu/nixvim/which_key.nix +++ b/home-manager/stvnliu/nixvim/which_key.nix @@ -1 +1 @@ -{plugins.which-key = {enable = true;};} +{ plugins.which-key = { enable = true; }; } diff --git a/home-manager/stvnliu/nixvim/wilder.nix b/home-manager/stvnliu/nixvim/wilder.nix index 84d2a31..1cca351 100644 --- a/home-manager/stvnliu/nixvim/wilder.nix +++ b/home-manager/stvnliu/nixvim/wilder.nix @@ -1,6 +1,6 @@ { plugins.wilder = { enable = true; - modes = [":" "/" "?"]; + modes = [ ":" "/" "?" ]; }; } diff --git a/home-manager/stvnliu/nixvim/wrapping.nix b/home-manager/stvnliu/nixvim/wrapping.nix new file mode 100644 index 0000000..2648e62 --- /dev/null +++ b/home-manager/stvnliu/nixvim/wrapping.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + plugins.wrapping = { + enable = true; + }; +} diff --git a/home-manager/stvnliu/packages/default.nix b/home-manager/stvnliu/packages/default.nix new file mode 100644 index 0000000..de0169f --- /dev/null +++ b/home-manager/stvnliu/packages/default.nix @@ -0,0 +1,13 @@ +{ ... +}: { + imports = [ + ./util-programs.nix + ./office-programs.nix + ./discord.nix + ./wayland-utils.nix + ./pentesting.nix + ./dev.nix + ./gaming.nix + ./hypr.nix + ]; +} diff --git a/home-manager/stvnliu/packages/dev.nix b/home-manager/stvnliu/packages/dev.nix new file mode 100644 index 0000000..c0af3a6 --- /dev/null +++ b/home-manager/stvnliu/packages/dev.nix @@ -0,0 +1,9 @@ +{ pkgs +, ... +}: { + home.packages = with pkgs; [ + wget + vscodium-fhs + devenv + ]; +} diff --git a/home-manager/stvnliu/packages/discord.nix b/home-manager/stvnliu/packages/discord.nix new file mode 100644 index 0000000..b0de476 --- /dev/null +++ b/home-manager/stvnliu/packages/discord.nix @@ -0,0 +1,13 @@ +{ pkgs +, ... +}: { + home.packages = with pkgs; [ discord vesktop cinny-desktop ]; + /*xdg.desktopEntries.discord = { + exec = "${pkgs.vesktop}/bin/vesktop"; + terminal = false; + mimeType = [ "x-scheme-handler/discord" ]; + name = "Discord - Vesktop"; + genericName = "Discord but substituted with Vesktop"; + type = "Application"; + };*/ +} diff --git a/home-manager/stvnliu/packages/gaming.nix b/home-manager/stvnliu/packages/gaming.nix new file mode 100644 index 0000000..325d877 --- /dev/null +++ b/home-manager/stvnliu/packages/gaming.nix @@ -0,0 +1,4 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ bottles zeroad ]; +} diff --git a/home-manager/stvnliu/packages/hypr.nix b/home-manager/stvnliu/packages/hypr.nix new file mode 100644 index 0000000..db9a1d9 --- /dev/null +++ b/home-manager/stvnliu/packages/hypr.nix @@ -0,0 +1,4 @@ +{ inputs, ... }: +{ + home.packages = [ inputs.hyprswitch.packages.x86_64-linux.default ]; +} diff --git a/home-manager/stvnliu/packages/office-programs.nix b/home-manager/stvnliu/packages/office-programs.nix new file mode 100644 index 0000000..8863f59 --- /dev/null +++ b/home-manager/stvnliu/packages/office-programs.nix @@ -0,0 +1,13 @@ +{ pkgs +, ... +}: { + home.packages = with pkgs; [ + libreoffice + kdePackages.okular + evolution + evolution-ews + # proton mail + protonmail-bridge + protonmail-bridge-gui + ]; +} diff --git a/home-manager/stvnliu/packages/pentesting.nix b/home-manager/stvnliu/packages/pentesting.nix new file mode 100644 index 0000000..ea49f97 --- /dev/null +++ b/home-manager/stvnliu/packages/pentesting.nix @@ -0,0 +1,9 @@ +{ pkgs +, ... +}: { + home.packages = with pkgs; [ + openvpn + inetutils + nmap + ]; +} diff --git a/home-manager/stvnliu/packages/util-programs.nix b/home-manager/stvnliu/packages/util-programs.nix new file mode 100644 index 0000000..0d002c7 --- /dev/null +++ b/home-manager/stvnliu/packages/util-programs.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + bottom + libnotify + tree + android-file-transfer + mtpfs + usbutils + glow + tmux + ranger + lazygit + mmv + cheat + thefuck + pcmanfm + udiskie + sxiv + transmission_4-gtk + ]; +} diff --git a/home-manager/stvnliu/packages/vscodium.nix b/home-manager/stvnliu/packages/vscodium.nix new file mode 100644 index 0000000..e1cb7fa --- /dev/null +++ b/home-manager/stvnliu/packages/vscodium.nix @@ -0,0 +1,4 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ vscodium-fhs ]; + xdg.desktopEntries.codium = { }; +} diff --git a/home-manager/stvnliu/packages/wayland-utils.nix b/home-manager/stvnliu/packages/wayland-utils.nix new file mode 100644 index 0000000..92b46ab --- /dev/null +++ b/home-manager/stvnliu/packages/wayland-utils.nix @@ -0,0 +1,5 @@ +{ pkgs +, ... +}: { + home.packages = with pkgs; [ wl-clipboard ]; +} diff --git a/home-manager/stvnliu/programs/default.nix b/home-manager/stvnliu/programs/default.nix new file mode 100644 index 0000000..74081b5 --- /dev/null +++ b/home-manager/stvnliu/programs/default.nix @@ -0,0 +1,10 @@ +{ ... +}: { + imports = [ + ./git.nix + ./rofi.nix + ./tmux.nix + ./foot.nix + #./walker.nix + ]; +} diff --git a/home-manager/stvnliu/programs/foot.nix b/home-manager/stvnliu/programs/foot.nix new file mode 100644 index 0000000..8562138 --- /dev/null +++ b/home-manager/stvnliu/programs/foot.nix @@ -0,0 +1,15 @@ +{ lib +, ... +}: { + programs.foot = { + enable = true; + settings = { + main = { + term = "xterm-256color"; + dpi-aware = lib.mkForce "no"; + }; + mouse = { hide-when-typing = "yes"; }; + }; + server.enable = true; + }; +} diff --git a/home-manager/stvnliu/programs/git.nix b/home-manager/stvnliu/programs/git.nix new file mode 100644 index 0000000..688902e --- /dev/null +++ b/home-manager/stvnliu/programs/git.nix @@ -0,0 +1,13 @@ +{ pkgs +, config +, ... +}: { + programs.git = { + enable = true; + lfs.enable = true; + package = pkgs.gitFull; + userName = config.myDisplayName; + userEmail = config.myEmail; + extraConfig = import ./git_config.nix; + }; +} diff --git a/home-manager/stvnliu/programs/git_config.nix b/home-manager/stvnliu/programs/git_config.nix new file mode 100644 index 0000000..15011a0 --- /dev/null +++ b/home-manager/stvnliu/programs/git_config.nix @@ -0,0 +1,13 @@ +{ + core.autocrlf = "input"; + push = { + autoSetupRemote = true; + followTags = true; + }; + commit.gpgsign = true; + #gpg.format = "ssh"; + #gpg.ssh.allowedSignersFile = "/home/${config.myUserName}/.ssh/allowed_signers"; + #user.signingkey = "/home/${config.myUserName}/.ssh/id_ed25519.pub"; + user.signingkey = "DC8F48E7B4C40905"; + credential.helper = "libsecret"; +} diff --git a/home-manager/stvnliu/programs/rofi.nix b/home-manager/stvnliu/programs/rofi.nix new file mode 100644 index 0000000..24b07c9 --- /dev/null +++ b/home-manager/stvnliu/programs/rofi.nix @@ -0,0 +1,6 @@ +{ ... +}: { + programs.rofi = { + enable = true; + }; +} diff --git a/home-manager/stvnliu/programs/tmux.nix b/home-manager/stvnliu/programs/tmux.nix new file mode 100644 index 0000000..ab3fe72 --- /dev/null +++ b/home-manager/stvnliu/programs/tmux.nix @@ -0,0 +1,18 @@ +{ pkgs +, config +, ... +}: { + programs.tmux = { + enable = true; + shell = config.myShells.defaultShell; + terminal = "screen-256color"; # Fix for apps not recognising full color + mouse = true; + plugins = with pkgs; [ + tmuxPlugins.cpu + { + plugin = tmuxPlugins.resurrect; + extraConfig = "set -g @resurrect-strategy-nvim 'session'"; + } + ]; + }; +} diff --git a/home-manager/stvnliu/programs/walker.nix b/home-manager/stvnliu/programs/walker.nix new file mode 100644 index 0000000..b0c24c6 --- /dev/null +++ b/home-manager/stvnliu/programs/walker.nix @@ -0,0 +1,18 @@ +{ config +, ... +}: { + programs.walker = { + enable = true; + runAsService = true; + + # All options from the config.json can be used here. + config = { + search.placeholder = "Example"; + list = { height = 200; }; + websearch.prefix = "?"; + switcher.prefix = "/"; + }; + + # If this is not set the default styling is used. + }; +} diff --git a/home-manager/stvnliu/scripts/default.nix b/home-manager/stvnliu/scripts/default.nix index f51f039..4096c43 100644 --- a/home-manager/stvnliu/scripts/default.nix +++ b/home-manager/stvnliu/scripts/default.nix @@ -1,7 +1,16 @@ -{ - config, - pkgs, - ... +{ config +, pkgs +, ... }: { - home.packages = [(import ./heic-to-jpg.script.nix {inherit pkgs;})]; + home.packages = [ + (import ./heic-to-jpg.script.nix { inherit pkgs; }) + (import ./tmux-default.script.nix { + inherit pkgs; + inherit config; + }) + (import ./git-check.script.nix { + inherit pkgs; + inherit config; + }) + ]; } diff --git a/home-manager/stvnliu/scripts/git-check.script.nix b/home-manager/stvnliu/scripts/git-check.script.nix new file mode 100644 index 0000000..b122572 --- /dev/null +++ b/home-manager/stvnliu/scripts/git-check.script.nix @@ -0,0 +1,52 @@ +{ pkgs, config, }: +let + git = config.programs.git.package; + # checks for any Git repositories with uncommitted changes + # used because I am too lazy +in +pkgs.writeShellScriptBin "git-check" '' + #!${pkgs.bash}/bin/bash + cd_err() { + echo "change-directory occurred error. interrupting..." + } + git_check() { + prev=$1 + repo_dir=$2 + #echo "Checking git-cleanliness at $repo_dir, working in $PWD" + cd "$repo_dir" || return + inside_git_repo="$(${git}/bin/git rev-parse --is-inside-work-tree 2>/dev/null)" + result=256 + default_skip=false + if [ "$inside_git_repo" ]; then + if [ "$(${git}/bin/git status --porcelain)" ]; then + result=0 + else + result=1 + fi + #echo "not a git repository" + fi + if [[ $result -eq 0 ]]; then + echo "DIRTY $PWD" + if $default_skip; then return; fi + read -rp "Enter dirty directory? [y/n/N(skip others)] " userinput + if [[ "$userinput" = "y" ]]; then + ${pkgs.lazygit}/bin/lazygit + fi + if [[ "$userinput" = "N" ]]; then + default_skip=true + fi + fi + #echo "going back to $prev" + cd "$prev" || return + } + path=$PWD + scan_path=$PWD + if [ -z "$1" ]; then + scan_path=$PWD + else + scan_path=$1 + fi + for item in $(find $scan_path -maxdepth 1 -type d); do + git_check "$path" "$item" + done +'' diff --git a/home-manager/stvnliu/scripts/heic-to-jpg.script.nix b/home-manager/stvnliu/scripts/heic-to-jpg.script.nix index c247474..a4a4ab8 100644 --- a/home-manager/stvnliu/scripts/heic-to-jpg.script.nix +++ b/home-manager/stvnliu/scripts/heic-to-jpg.script.nix @@ -1,4 +1,4 @@ -{pkgs}: +{ pkgs }: pkgs.writeShellScriptBin "heic-to-jpg" '' mkdir -p ./heic-to-jpg-out ${pkgs.findutils}/bin/find . -type f -print0 | ${pkgs.findutils}/bin/xargs -0 -I "{}" ${pkgs.imagemagick}/bin/magick "{}" -quality 100% ./jpg-out/"{}.conv.jpg" diff --git a/home-manager/stvnliu/scripts/launch-url-firefox.script.nix b/home-manager/stvnliu/scripts/launch-url-firefox.script.nix new file mode 100644 index 0000000..b46d2b1 --- /dev/null +++ b/home-manager/stvnliu/scripts/launch-url-firefox.script.nix @@ -0,0 +1,8 @@ +{ pkgs, }: +let + # browserPath = lib.getExe config.programs.firefox.package; + # dmenuPath = lib.getExe pkgs.wmenu; +in +pkgs.writeShellScriptBin "urlmenu" '' + #!${pkgs.bash}/bin/bash +'' diff --git a/home-manager/stvnliu/scripts/tmux-default.script.nix b/home-manager/stvnliu/scripts/tmux-default.script.nix new file mode 100644 index 0000000..7f28493 --- /dev/null +++ b/home-manager/stvnliu/scripts/tmux-default.script.nix @@ -0,0 +1,19 @@ +{ pkgs +, config +, +}: +let + tmux = config.programs.tmux.package; + windowName = "code-mode"; +in +pkgs.writeShellScriptBin "tmux-code" '' + #!${pkgs.bash}/bin/bash + ${tmux}/bin/tmux has-session -t ${windowName} 2>/dev/null + if [ $? != 0 ]; then + # setting up session + ${tmux}/bin/tmux new -s ${windowName} -d + ${tmux}/bin/tmux send-keys -t ${windowName} 'nvim' Enter + ${tmux}/bin/tmux split-window -h + fi + ${tmux}/bin/tmux attach -t ${windowName} +'' diff --git a/home-manager/stvnliu/services/default.nix b/home-manager/stvnliu/services/default.nix new file mode 100644 index 0000000..c4e81fb --- /dev/null +++ b/home-manager/stvnliu/services/default.nix @@ -0,0 +1,10 @@ +{ ... +}: { + imports = [ + ./swaync.nix + ./mpd.nix + + # DEPRECATED due to switch to KDE + #./waybar.nix + ]; +} diff --git a/home-manager/stvnliu/services/mpd.nix b/home-manager/stvnliu/services/mpd.nix new file mode 100644 index 0000000..d4ce542 --- /dev/null +++ b/home-manager/stvnliu/services/mpd.nix @@ -0,0 +1,18 @@ +{ pkgs, config, lib, ... }: +lib.mkIf config.usingMusicPlayerDaemon { + home.packages = [ pkgs.ncmpc ]; + services = { + mpd = { + enable = true; + network.listenAddress = "any"; + network.port = 6600; + extraConfig = '' + audio_output { + type "pipewire" + name "my pipewire output" + } + ''; + }; + mpd-mpris = { enable = true; }; + }; +} diff --git a/home-manager/stvnliu/services/swaync.nix b/home-manager/stvnliu/services/swaync.nix new file mode 100644 index 0000000..2cf818f --- /dev/null +++ b/home-manager/stvnliu/services/swaync.nix @@ -0,0 +1,6 @@ +{ ... +}: { + services.swaync = { + enable = true; + }; +} diff --git a/home-manager/stvnliu/services/waybar.nix b/home-manager/stvnliu/services/waybar.nix new file mode 100644 index 0000000..ed489fa --- /dev/null +++ b/home-manager/stvnliu/services/waybar.nix @@ -0,0 +1,8 @@ +{ ... }: { + programs.waybar = { + enable = true; + systemd = { enable = true; }; + style = "${import ./waybar_style.nix { }}"; + settings = import ./waybar_config.nix; + }; +} diff --git a/home-manager/stvnliu/services/waybar_config.nix b/home-manager/stvnliu/services/waybar_config.nix new file mode 100644 index 0000000..382e096 --- /dev/null +++ b/home-manager/stvnliu/services/waybar_config.nix @@ -0,0 +1,117 @@ +{ + mainBar = { + layer = "top"; + position = "bottom"; + height = 30; + output = [ "eDP-1" "eDP-2" "HDMI-A-1" ]; + modules-left = [ "hyprland/workspaces" "hyprland/submap" ]; + modules-center = [ "mpd" ]; + modules-right = + [ "clock" "group/trays" "group/monitor" "wireplumber" "temperature" ]; + "battery" = { + "bat" = "BAT1"; + "format" = "BAT {capacity}% @ {power}W"; + }; + "hyprland/workspaces" = { + disable-scroll = true; + all-outputs = true; + }; + "tray" = { + "icon-size" = 18; + "spacing" = 10; + }; + "custom/tray-label" = { "format" = "[TRAY]"; }; + "custom/monitor-label" = { "format" = "[HW]"; }; + "group/trays" = { + "orientation" = "inherit"; + "modules" = [ "custom/tray-label" "tray" ]; + "drawer" = { "click-to-reveal" = true; }; + }; + "group/monitor" = { + "orientation" = "inherit"; + "modules" = [ "custom/monitor-label" "battery" "cpu" "memory" ]; + "drawer" = { "click-to-reveal" = true; }; + }; + "mpd" = { + "artist-len" = 10; + "album-len" = 10; + "title-len" = 20; + "format" = + "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) "; + "format-disconnected" = "Disconnected "; + "format-stopped" = + "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped "; + "interval" = 10; + "consume-icons" = { + "on" = " "; # Icon shows only when "consume" is on + }; + "random-icons" = { + "off" = '' + ''; # Icon grayed out when "random" is off + "on" = " "; + }; + "repeat-icons" = { "on" = " "; }; + "single-icons" = { "on" = " 1 "; }; + "state-icons" = { + "paused" = ""; + "playing" = ""; + }; + "tooltip-format" = "MPD (connected)"; + "tooltip-format-disconnected" = "MPD (disconnected)"; + }; + "wireplumber" = { + "format" = "{volume}% {icon}"; + "format-muted" = ""; + "format-icons" = [ "" "" "" ]; + }; + "cpu" = { + "format" = "CPU {icon}"; + "format-icons" = [ + "" # green + "" # blue + "" # white + "" # white + "" # yellow + "" # yellow + "" # orange + "" # red + ]; + "memory" = { "format" = "MEM {percentage}%"; }; + }; + "clock" = { + "format" = "{:%H:%M}  "; + "format-alt" = "{:%A, %B %d, %Y (%R)}"; + "tooltip-format" = "{calendar}"; + "calendar" = { + "mode" = "year"; + "mode-mon-col" = 3; + "weeks-pos" = "right"; + "on-scroll" = 1; + "format" = { + "months" = "{}"; + "days" = "{}"; + "weeks" = "W{}"; + "weekdays" = "{}"; + "today" = "{}"; + }; + }; + /* "actions" = { + "on-click-right" = "mode"; + "on-scroll-up" = "tz_up"; + "on-scroll-down" = "tz_down"; + "on-scroll-up" = "shift_up"; + "on-scroll-down" = "shift_down"; + }; + */ + }; + /* "custom/hello-from-waybar" = { + format = "hello {}"; + max-length = 40; + interval = "once"; + exec = pkgs.writeShellScript "hello-from-waybar" '' + echo "from within waybar" + ''; + }; + */ + }; +} diff --git a/home-manager/stvnliu/services/waybar_style.nix b/home-manager/stvnliu/services/waybar_style.nix new file mode 100644 index 0000000..2849206 --- /dev/null +++ b/home-manager/stvnliu/services/waybar_style.nix @@ -0,0 +1,4 @@ +{ ... }: '' + * { + font-family: JetBrainsMono Nerd Font; + }'' diff --git a/home-manager/stvnliu/shells/aliases/default.nix b/home-manager/stvnliu/shells/aliases/default.nix index b974333..aa78288 100644 --- a/home-manager/stvnliu/shells/aliases/default.nix +++ b/home-manager/stvnliu/shells/aliases/default.nix @@ -1,10 +1,14 @@ -{pkgs}: { +{ pkgs }: { + gil = "${pkgs.lazygit}/bin/lazygit"; cd = "z"; cdi = "zi"; - ls = "${pkgs.eza}/bin/exa"; cat = "${pkgs.bat}/bin/bat"; + ls = "${pkgs.lsd}/bin/lsd"; ll = "ls -l"; + rm = "${pkgs.trash-cli}/bin/trash"; osupdate = "${pkgs.nh}/bin/nh os switch"; homeupdate = "${pkgs.nh}/bin/nh home switch"; batmon = "watch -n0 upower -i /org/freedesktop/UPower/devices/battery_BAT1"; + inception = "${pkgs.pipx}/bin/pipx run copier copy --trust gh:DataChefHQ/Inception ."; + help = "echo \"No help for u lololololololol\""; } diff --git a/home-manager/stvnliu/shells/default.nix b/home-manager/stvnliu/shells/default.nix index db6c054..bdcc1bb 100644 --- a/home-manager/stvnliu/shells/default.nix +++ b/home-manager/stvnliu/shells/default.nix @@ -1,30 +1,28 @@ -{ - pkgs, - lib, - config, - ... -}: let - cfg = config.myShells; -in - with lib; { - imports = [ - ./zsh.nix - ./fish - ./zoxide.nix - ./direnv.nix - ./starship - ]; +{ lib +, config +, ... +}: +with lib; { + imports = [ + ./zsh.nix + ./fish + ./nushell + ./zoxide.nix + ./direnv.nix + ./starship + ]; - options.myShells = { - defaultShell = with types; mkOption {type = str;}; - enable = mkEnableOption "Enables the shell customisation module."; + options.myShells = { + defaultShell = with types; mkOption { type = str; }; + enable = mkEnableOption "Enables the shell customisation module."; + }; + config = { + myShells = { + zsh.enable = false; + fish.enable = true; + #nushell.enable = true; + defaultShell = "${config.programs.fish.package}/bin/fish"; + prompts.starship.enable = true; }; - config = { - myShells = { - zsh.enable = false; - fish.enable = true; - defaultShell = "fish"; - prompts.starship.enable = true; - }; - }; - } + }; +} diff --git a/home-manager/stvnliu/shells/direnv.nix b/home-manager/stvnliu/shells/direnv.nix index dd5b52f..30e97fa 100644 --- a/home-manager/stvnliu/shells/direnv.nix +++ b/home-manager/stvnliu/shells/direnv.nix @@ -1,4 +1,4 @@ -{...}: { +{ ... }: { programs = { direnv = { enable = true; diff --git a/home-manager/stvnliu/shells/env/default.nix b/home-manager/stvnliu/shells/env/default.nix new file mode 100644 index 0000000..11230f0 --- /dev/null +++ b/home-manager/stvnliu/shells/env/default.nix @@ -0,0 +1,4 @@ +{ ... +}: { + EDITOR = "nvim"; +} diff --git a/home-manager/stvnliu/shells/fish/default.nix b/home-manager/stvnliu/shells/fish/default.nix index c339bb0..4825fe2 100644 --- a/home-manager/stvnliu/shells/fish/default.nix +++ b/home-manager/stvnliu/shells/fish/default.nix @@ -1,62 +1,65 @@ -{ - pkgs, - config, - lib, - ... -}: let +{ pkgs +, config +, lib +, ... +}: +let cfg = config.myShells.fish; in - with lib; { - options = { - myShells.fish = {enable = mkEnableOption "Enables fish and components.";}; +with lib; { + options = { + myShells.fish = { enable = mkEnableOption "Enables fish and components."; }; + }; + config = mkIf cfg.enable { + programs.fish = { + enable = true; + shellInit = '' + ${builtins.readFile ./init/zoxide.fish} + ${builtins.readFile ./init/nh.fish} + ${builtins.readFile ./init/tailscale.fish} + ${builtins.readFile ./init/pass.fish} + function fish_greeting + ${(pkgs.fortune.override {withOffensive = true;})}/bin/fortune -as | ${pkgs.cowsay}/bin/cowsay | ${pkgs.lolcat}/bin/lolcat + end + funcsave -q fish_greeting + + ${pkgs.thefuck}/bin/thefuck --alias | source + ''; + shellAliases = import ../aliases { inherit pkgs; }; + plugins = with pkgs.fishPlugins; [ + { + name = "z"; + src = z.src; + } + { + name = "plugin-git"; + src = plugin-git.src; + } + { + name = "transient-fish"; + src = transient-fish.src; + } + { + name = "done"; + src = done.src; + } + { + name = "gruvbox"; + src = gruvbox.src; + } + { + name = "colored-man-pages"; + src = colored-man-pages.src; + } + { + name = "puffer"; + src = puffer.src; + } + { + name = "pisces"; + src = pisces.src; + } + ]; }; - config = mkIf cfg.enable { - programs.fish = { - enable = true; - shellInit = '' - ${builtins.readFile ./init/zoxide.fish} - ${builtins.readFile ./init/nh.fish} - ${builtins.readFile ./init/tailscale.fish} - function fish_greeting - ${pkgs.fortune}/bin/fortune -a - end - funcsave -q fish_greeting - ''; - shellAliases = import ../aliases {inherit pkgs;}; - plugins = with pkgs.fishPlugins; [ - { - name = "z"; - src = z.src; - } - { - name = "plugin-git"; - src = plugin-git.src; - } - { - name = "transient-fish"; - src = transient-fish.src; - } - { - name = "done"; - src = done.src; - } - { - name = "gruvbox"; - src = gruvbox.src; - } - { - name = "colored-man-pages"; - src = colored-man-pages.src; - } - { - name = "puffer"; - src = puffer.src; - } - { - name = "pisces"; - src = pisces.src; - } - ]; - }; - }; - } + }; +} diff --git a/home-manager/stvnliu/shells/fish/init/pass.fish b/home-manager/stvnliu/shells/fish/init/pass.fish new file mode 100644 index 0000000..44bd6ef --- /dev/null +++ b/home-manager/stvnliu/shells/fish/init/pass.fish @@ -0,0 +1,116 @@ + +# Copyright (C) 2012-2014 Dmitry Medvinsky . All Rights Reserved. +# This file is licensed under the GPLv2+. Please see COPYING for more information. + +set -l PROG 'pass' + +function __fish_pass_get_prefix + if set -q PASSWORD_STORE_DIR + realpath -- "$PASSWORD_STORE_DIR" + else + echo "$HOME/.password-store" + end +end + +function __fish_pass_needs_command + [ (count (commandline -opc)) -eq 1 ] +end + +function __fish_pass_uses_command + set -l cmd (commandline -opc) + if [ (count $cmd) -gt 1 ] + if [ $argv[1] = $cmd[2] ] + return 0 + end + end + return 1 +end + +function __fish_pass_print_gpg_keys + gpg2 --list-keys | grep uid | sed 's/.*<\(.*\)>/\1/' +end + +function __fish_pass_print + set -l ext $argv[1] + set -l strip $argv[2] + set -l prefix (__fish_pass_get_prefix) + set -l matches $prefix/**$ext + printf '%s\n' $matches | sed "s#$prefix/\(.*\)$strip#\1#" +end + +function __fish_pass_print_entry_dirs + __fish_pass_print "/" +end + +function __fish_pass_print_entries + __fish_pass_print ".gpg" ".gpg" +end + +function __fish_pass_print_entries_and_dirs + __fish_pass_print_entry_dirs + __fish_pass_print_entries +end + +function __fish_pass_git_complete + set -l prefix (__fish_pass_get_prefix) + set -l git_cmd (commandline -opc) (commandline -ct) + set -e git_cmd[1 2] # Drop "pass git". + complete -C"git -C $prefix $git_cmd" +end + +complete -c $PROG -f -n '__fish_pass_needs_command' -a help -d 'Command: show usage help' +complete -c $PROG -f -n '__fish_pass_needs_command' -a version -d 'Command: show program version' + +complete -c $PROG -f -n '__fish_pass_needs_command' -a init -d 'Command: initialize new password storage' +complete -c $PROG -f -n '__fish_pass_uses_command init' -s p -l path -d 'Assign gpg-id for specified sub folder of password store' + +complete -c $PROG -f -n '__fish_pass_needs_command' -a ls -d 'Command: list passwords' +complete -c $PROG -f -n '__fish_pass_uses_command ls' -a "(__fish_pass_print_entry_dirs)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a insert -d 'Command: insert new password' +complete -c $PROG -f -n '__fish_pass_uses_command insert' -s e -l echo -d 'Echo the password on console' +complete -c $PROG -f -n '__fish_pass_uses_command insert' -s m -l multiline -d 'Provide multiline password entry' +complete -c $PROG -f -n '__fish_pass_uses_command insert' -s f -l force -d 'Do not prompt before overwritting' +complete -c $PROG -f -n '__fish_pass_uses_command insert' -a "(__fish_pass_print_entry_dirs)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a generate -d 'Command: generate new password' +complete -c $PROG -f -n '__fish_pass_uses_command generate' -s n -l no-symbols -d 'Do not use special symbols' +complete -c $PROG -f -n '__fish_pass_uses_command generate' -s c -l clip -d 'Put the password in clipboard' +complete -c $PROG -f -n '__fish_pass_uses_command generate' -s f -l force -d 'Do not prompt before overwritting' +complete -c $PROG -f -n '__fish_pass_uses_command generate' -s i -l in-place -d 'Replace only the first line with the generated password' +complete -c $PROG -f -n '__fish_pass_uses_command generate' -a "(__fish_pass_print_entry_dirs)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a mv -d 'Command: rename existing password' +complete -c $PROG -f -n '__fish_pass_uses_command mv' -s f -l force -d 'Force rename' +complete -c $PROG -f -n '__fish_pass_uses_command mv' -a "(__fish_pass_print_entries_and_dirs)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a cp -d 'Command: copy existing password' +complete -c $PROG -f -n '__fish_pass_uses_command cp' -s f -l force -d 'Force copy' +complete -c $PROG -f -n '__fish_pass_uses_command cp' -a "(__fish_pass_print_entries_and_dirs)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a rm -d 'Command: remove existing password' +complete -c $PROG -f -n '__fish_pass_uses_command rm' -s r -l recursive -d 'Remove password groups recursively' +complete -c $PROG -f -n '__fish_pass_uses_command rm' -s f -l force -d 'Force removal' +complete -c $PROG -f -n '__fish_pass_uses_command rm' -a "(__fish_pass_print_entries_and_dirs)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a edit -d 'Command: edit password using text editor' +complete -c $PROG -f -n '__fish_pass_uses_command edit' -a "(__fish_pass_print_entries)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a show -d 'Command: show existing password' +complete -c $PROG -f -n '__fish_pass_uses_command show' -s c -l clip -d 'Put password in clipboard' +complete -c $PROG -f -n '__fish_pass_uses_command show' -a "(__fish_pass_print_entries)" +# When no command is given, `show` is defaulted. +complete -c $PROG -f -n '__fish_pass_needs_command' -s c -l clip -d 'Put password in clipboard' +complete -c $PROG -f -n '__fish_pass_needs_command' -a "(__fish_pass_print_entries)" +complete -c $PROG -f -n '__fish_pass_uses_command -c' -a "(__fish_pass_print_entries)" +complete -c $PROG -f -n '__fish_pass_uses_command --clip' -a "(__fish_pass_print_entries)" + +complete -c $PROG -f -n '__fish_pass_needs_command' -a git -d 'Command: execute a git command' +complete -c $PROG -f -n '__fish_pass_uses_command git' -a '(__fish_pass_git_complete)' +complete -c $PROG -f -n '__fish_pass_needs_command' -a find -d 'Command: find a password file or directory matching pattern' +complete -c $PROG -f -n '__fish_pass_needs_command' -a grep -d 'Command: search inside of decrypted password files for matching pattern' +complete -c $PROG -f -n '__fish_pass_uses_command grep' -a '(begin + set -l cmd (commandline -opc) (commandline -ct) + set -e cmd[1 2] # Drop "pass grep". + complete -C"grep $cmd" +end)' diff --git a/home-manager/stvnliu/shells/nushell/default.nix b/home-manager/stvnliu/shells/nushell/default.nix new file mode 100644 index 0000000..0b048e0 --- /dev/null +++ b/home-manager/stvnliu/shells/nushell/default.nix @@ -0,0 +1,26 @@ +{ pkgs +, config +, lib +, ... +}: +let + cfg = config.myShells.nushell; +in +with lib; { + options = { + myShells.nushell = { enable = mkEnableOption "Enables nushell config"; }; + }; + config = mkIf cfg.enable { + programs = { + nushell = { + enable = true; + configFile.source = ./init/config.nu; + shellAliases = import ../aliases/default.nix { inherit pkgs; }; + }; + carapace = { + enable = true; + enableNushellIntegration = true; + }; + }; + }; +} diff --git a/home-manager/stvnliu/shells/nushell/init/config.nu b/home-manager/stvnliu/shells/nushell/init/config.nu new file mode 100644 index 0000000..afbcf84 --- /dev/null +++ b/home-manager/stvnliu/shells/nushell/init/config.nu @@ -0,0 +1,15 @@ +$env.config = { + show_banner: false, + hooks: { + pre_prompt: [{ || + if (which direnv | is-empty) { + return + } + + direnv export json | from json | default {} | load-env + if 'ENV_CONVERSIONS' in $env and 'PATH' in $env.ENV_CONVERSIONS { + $env.PATH = do $env.ENV_CONVERSIONS.PATH.from_string $env.PATH + } + }] + } +} diff --git a/home-manager/stvnliu/shells/starship/default.nix b/home-manager/stvnliu/shells/starship/default.nix index ef91a38..95bb8d6 100644 --- a/home-manager/stvnliu/shells/starship/default.nix +++ b/home-manager/stvnliu/shells/starship/default.nix @@ -1,25 +1,26 @@ -{ - lib, - pkgs, - config, - ... -}: let +{ lib +, config +, ... +}: +let cfg = config.myShells.prompts.starship; in - with lib; { - options = { - myShells.prompts.starship.enable = mkEnableOption "Enables starship prompts."; - myShells.prompts.starship.confPath = mkOption { - type = types.path; - default = ./presets/default.toml; - }; +with lib; { + options = { + myShells.prompts.starship.enable = mkEnableOption "Enables starship prompts."; + myShells.prompts.starship.confPath = mkOption { + type = types.path; + default = ./presets/default.toml; }; - config = mkIf cfg.enable { - programs.starship = { - enable = true; - enableZshIntegration = config.myShells.zsh.enable; - enableFishIntegration = config.myShells.fish.enable; - settings = builtins.fromTOML (builtins.readFile cfg.confPath); - }; + }; + config = mkIf cfg.enable { + myShells.prompts.starship.confPath = ./presets/pure-direnv.toml; + programs.starship = { + enable = true; + enableZshIntegration = config.myShells.zsh.enable; + enableFishIntegration = config.myShells.fish.enable; + enableNushellIntegration = config.myShells.nushell.enable; + settings = builtins.fromTOML (builtins.readFile cfg.confPath); }; - } + }; +} diff --git a/home-manager/stvnliu/shells/starship/presets/pure-direnv.toml b/home-manager/stvnliu/shells/starship/presets/pure-direnv.toml new file mode 100644 index 0000000..3886289 --- /dev/null +++ b/home-manager/stvnliu/shells/starship/presets/pure-direnv.toml @@ -0,0 +1,56 @@ +format = """ +${direnv}\ +$username\ +$hostname\ +$directory\ +$git_branch\ +$git_state\ +$git_status\ +$cmd_duration\ +$line_break\ +$python\ +$character""" + +[direnv] +disabled = false +#command = '[[ $(direnv status) =~ "Found RC allowed false" ]] && echo "=========> missing: direnv allow <============"' # shows output of command +detect_files = ['.envrc'] # can specify filters but wildcards are not supported + +[directory] +style = "blue" +truncate_to_repo = false +truncation_length = 8 +truncation_symbol = ".../" + + +[character] +success_symbol = "[❯](purple)" +error_symbol = "[❯](red)" +vimcmd_symbol = "[❮](green)" + +[git_branch] +format = "[$branch]($style)" +style = "bright-black" + +[git_status] +format = "[[(*$conflicted$untracked$modified$staged$renamed$deleted)](218) ($ahead_behind$stashed)]($style)" +style = "cyan" +conflicted = "!" +untracked = "U" +modified = "*" +staged = "+" +renamed = "R" +deleted = "-" +stashed = "≡" + +[git_state] +format = '\([$state( $progress_current/$progress_total)]($style)\) ' +style = "bright-black" + +[cmd_duration] +format = "[$duration]($style) " +style = "yellow" + +[python] +format = "[$virtualenv]($style) " +style = "bright-black" diff --git a/home-manager/stvnliu/shells/zoxide.nix b/home-manager/stvnliu/shells/zoxide.nix index 9f33410..39b6ab3 100644 --- a/home-manager/stvnliu/shells/zoxide.nix +++ b/home-manager/stvnliu/shells/zoxide.nix @@ -1,8 +1,5 @@ -{ - pkgs, - config, - lib, - ... +{ config +, ... }: { programs.zoxide = { enable = true; diff --git a/home-manager/stvnliu/shells/zsh.nix b/home-manager/stvnliu/shells/zsh.nix index c329684..18c0695 100644 --- a/home-manager/stvnliu/shells/zsh.nix +++ b/home-manager/stvnliu/shells/zsh.nix @@ -1,36 +1,33 @@ -{ - pkgs, - lib, - config, - ... -}: let - cfg = config.shell.zsh; -in - with lib; { - options.myShells.zsh = { - enable = mkEnableOption "Enables zsh and components."; - }; - config = { - programs.zsh = { - enable = true; - syntaxHighlighting.enable = true; - shellAliases = import ./aliases {inherit pkgs;}; - dirHashes = { - docs = "$HOME/Documents"; - dl = "$HOME/Downloads"; - dev = "$HOME/devel"; - screen = "$HOME/Pictures/Screenshots"; - }; - oh-my-zsh = { - enable = true; - plugins = [ - "git" - "rsync" - "zoxide" - ]; - theme = "agnoster"; - }; +{ pkgs +, lib +, config +, ... +}: +with lib; { + options.myShells.zsh = { + enable = mkEnableOption "Enables zsh and components."; + }; + config = { + programs.zsh = { + enable = true; + syntaxHighlighting.enable = true; + shellAliases = import ./aliases { inherit pkgs; }; + dirHashes = { + docs = "$HOME/Documents"; + dl = "$HOME/Downloads"; + dev = "$HOME/devel"; + screen = "$HOME/Pictures/Screenshots"; + }; + oh-my-zsh = { + enable = true; + plugins = [ + "git" + "rsync" + "zoxide" + ]; + theme = "agnoster"; }; - home.packages = with pkgs; [zoxide]; }; - } + home.packages = with pkgs; [ zoxide ]; + }; +} diff --git a/home-manager/stvnliu/spicetify.nix b/home-manager/stvnliu/spicetify.nix deleted file mode 100644 index d8b2d9b..0000000 --- a/home-manager/stvnliu/spicetify.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ - pkgs, - lib, - inputs, - ... -}: let - spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system}; -in { - # allow spotify to be installed if you don't have unfree enabled already - nixpkgs.config.allowUnfreePredicate = pkg: - builtins.elem (lib.getName pkg) [ - "spotify" - ]; - programs.spicetify = { - enable = true; - theme = spicePkgs.themes.onepunch; - colorScheme = "Dark"; - - enabledExtensions = with spicePkgs.extensions; [ - adblock - fullAppDisplay - shuffle # shuffle+ (special characters are sanitized out of ext names) - hidePodcasts - ]; - }; -} diff --git a/home-manager/stvnliu/stylix.nix b/home-manager/stvnliu/stylix.nix index f672668..acef9b6 100644 --- a/home-manager/stvnliu/stylix.nix +++ b/home-manager/stvnliu/stylix.nix @@ -1,17 +1,35 @@ -{pkgs, ...}: { +{ pkgs +, config +, ... +}: +let + globalOpacity = 0.75; +in +{ stylix = { enable = true; - base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-medium.yaml"; - image = ./assets/nixos-wallpaper.jpg; + autoEnable = true; + base16Scheme = "${pkgs.base16-schemes}/share/themes/onedark-dark.yaml"; + image = config.myWallPaperPath; fonts = { - sansSerif = { - name = "Aileron"; - package = pkgs.aileron; - }; + /*sansSerif = { + name = "Helvetica Neue LT Std"; + package = pkgs.helvetica-neue-lt-std; + };*/ monospace = { - name = "BlexMono Nerd Font"; - package = pkgs.nerdfonts.override {fonts = ["IBMPlexMono"];}; + name = config.desktopFont.fullName; + package = config.desktopFont.package; }; + sizes = { + terminal = 16; + applications = 12; + }; + }; + opacity = { + applications = globalOpacity; + desktop = globalOpacity; + popups = globalOpacity; + terminal = globalOpacity; }; }; } diff --git a/home-manager/stvnliu/swaywm.nix b/home-manager/stvnliu/swaywm.nix deleted file mode 100644 index dfe7305..0000000 --- a/home-manager/stvnliu/swaywm.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ - pkgs, - lib, - ... -}: { - wayland.windowManager.sway = { - enable = true; - config = rec { - modifier = "Mod4"; - terminal = "${pkgs.foot}/bin/foot -f 'BlexMono Nerd Font:size=24' zsh"; - }; - }; -} diff --git a/home-manager/stvnliu/variables.nix b/home-manager/stvnliu/variables.nix deleted file mode 100644 index 21ba288..0000000 --- a/home-manager/stvnliu/variables.nix +++ /dev/null @@ -1,20 +0,0 @@ -{ - pkgs, - config, - lib, - ... -}: { - options = with lib; - with types; { - myWallPaperPathString = mkOption {type = str;}; - myUserName = mkOption {type = str;}; - myDisplayName = mkOption {type = str;}; - myEmail = mkOption {type = str;}; - }; - config = rec { - myUserName = "stvnliu"; - myWallPaperPathString = "/home/${config.myUserName}/wallpaper.png"; - myDisplayName = "Zhongheng Liu"; - myEmail = "z.liu@outlook.com.gr"; - }; -} diff --git a/home-manager/stvnliu/wechat/default.nix b/home-manager/stvnliu/wechat/default.nix index c20e301..0362926 100644 --- a/home-manager/stvnliu/wechat/default.nix +++ b/home-manager/stvnliu/wechat/default.nix @@ -1,8 +1,8 @@ -{pkgs, ...}: { +{ pkgs, ... }: { nixpkgs.config.permittedInsecurePackages = [ "openssl-1.1.1w" ]; home.packages = with pkgs; [ - (wechat-uos.override {uosLicense = ./license.tar.gz;}) + wechat-uos ]; } diff --git a/home-manager/stvnliu/wechat/license.tar.gz b/home-manager/stvnliu/wechat/license.tar.gz deleted file mode 100644 index fcef1de..0000000 Binary files a/home-manager/stvnliu/wechat/license.tar.gz and /dev/null differ diff --git a/home-manager/stvnliu/xdg.nix b/home-manager/stvnliu/xdg.nix index 2899822..25cbeed 100644 --- a/home-manager/stvnliu/xdg.nix +++ b/home-manager/stvnliu/xdg.nix @@ -1,6 +1,7 @@ -{pkgs, ...}: { +{ ... }: { xdg = { enable = true; + userDirs.enable = true; mimeApps = { enable = true; defaultApplications = { diff --git a/nixos/ags.nix b/nixos/ags.nix deleted file mode 100644 index 036fee1..0000000 --- a/nixos/ags.nix +++ /dev/null @@ -1,5 +0,0 @@ -{pkgs, ...}: { - environment.systemPackages = [ - pkgs.ags - ]; -} diff --git a/nixos/bootloader.nix b/nixos/bootloader.nix new file mode 100644 index 0000000..ace48f8 --- /dev/null +++ b/nixos/bootloader.nix @@ -0,0 +1,97 @@ +{ pkgs +, ... +}: +let + xenlism-grub-themes = pkgs.stdenv.mkDerivation { + pname = "xenlism-grub-themes"; + version = "1.0"; + src = pkgs.fetchFromGitHub { + owner = "xenlism"; + repo = "Grub-themes"; + rev = "40ac048df9aacfc053c515b97fcd24af1a06762f"; + hash = "sha256-ProTKsFocIxWAFbYgQ46A+GVZ7mUHXxZrvdiPJqZJ6I="; + }; + installPhase = "cp -r xenlism-grub-1080p-nixos/Xenlism-Nixos $out"; + }; +in +{ + environment.systemPackages = with pkgs; [ hack-font ]; + #fileSystems."/mnt/winsys" = { + # device = "/dev/nvme0n1p5"; + # fsType = "ntfs-3g"; + # options = [ "rw" "uid=1000" ]; + #}; + #fileSystems."/mnt/windata" = { + # device = "/dev/nvme0n1p3"; + # fsType = "ntfs-3g"; + # options = [ "rw" "uid=1000" ]; + #}; + boot = { + /*plymouth = { + enable = true; + theme = "rings"; + themePackages = with pkgs; [ + # By default we would install all themes + (adi1090x-plymouth-themes.override { selected_themes = [ "rings" ]; }) + ]; + };*/ + + # Enable "Silent Boot" + consoleLogLevel = 0; + initrd.verbose = false; + kernelParams = [ + "quiet" + "splash" + "boot.shell_on_fail" + "loglevel=3" + "rd.systemd.show_status=false" + "rd.udev.log_level=3" + "udev.log_priority=3" + ]; + # Hide the OS choice for bootloaders. + # It's still possible to open the bootloader list by pressing any key + # It will just not appear on screen unless a key is pressed + supportedFilesystems = [ "ntfs" ]; + loader = { + #timeout = 0; + efi = { canTouchEfiVariables = true; }; + grub = { + enable = true; + efiSupport = true; + device = "nodev"; + fsIdentifier = "label"; + devices = [ "nodev" ]; + extraConfig = '' + function load_video { + if [ x$feature_all_video_module = xy ]; then + insmod all_video + else + insmod efi_gop + insmod efi_uga + insmod ieee1275_fb + insmod vbe + insmod vga + insmod video_bochs + insmod video_cirrus + fi + }''; + extraEntries = '' + + menuentry "UEFI Firmware Settings" { + fwsetup + } + menuentry "Reboot" { + reboot + } + menuentry "Poweroff" { + halt + } + ''; + useOSProber = true; + configurationLimit = 10; + fontSize = 32; + theme = xenlism-grub-themes; + }; + }; + }; +} diff --git a/nixos/configuration.nix b/nixos/configuration.nix index 23387c9..53b156b 100644 --- a/nixos/configuration.nix +++ b/nixos/configuration.nix @@ -1,30 +1,64 @@ # This is your system's configuration file. # Use this to configure your system environment (it replaces /etc/nixos/configuration.nix) -{ - inputs, - lib, - config, - pkgs, - ... -}: { +{ inputs, lib, config, pkgs, ... }: { imports = [ ../common/variables.nix ./greetd.nix - ./grub.nix + ./bootloader.nix ./nvidia.nix ./fonts.nix ./services/laptop.preset.nix ./virtualisation.nix + #./dwm + #./spec.nix ./hardware-configuration.nix + #./custom-hosts.nix ]; - environment.variables = { + # Virtual cam settings: see https://wiki.nixos.org/wiki/OBS_Studio#Using_the_Virtual_Camera + environment.sessionVariables = { GDK_SCALE = config.displayScale; FLAKE = config.myConfigLocation; - GTK_IM_MODULE = lib.mkForce ""; + MANPAGER = "nvim +Man!"; + NVD_BACKEND = "direct"; + NIXOS_OZONE_WL = "1"; + # GTK_IM_MODULE = lib.mkForce ""; }; - security.pam.services.hyprlock = {}; + /* services.jellyfin = { + enable = true; + openFirewall = true; + }; + */ + services.displayManager.sddm.enable = true; + services.displayManager.sddm.wayland.enable = true; + services.desktopManager.plasma6.enable = true; + services.keyd = { + enable = true; + keyboards = { + default = { + ids = [ "*" ]; + settings = { + main = { + capslock = "esc"; + esc = "capslock"; + }; + }; + extraConfig = ""; + }; + }; + }; + programs.gnupg.agent = { + enable = true; + pinentryPackage = pkgs.pinentry-gnome3; + enableSSHSupport = true; + }; + programs.gamescope = { + enable = true; + capSysNice = true; + }; + security.pam.services.hyprlock = { }; i18n.inputMethod = { - enabled = "fcitx5"; + type = "fcitx5"; + enable = true; fcitx5.addons = with pkgs; [ fcitx5-mozc fcitx5-gtk @@ -34,55 +68,77 @@ #enabled = "ibus"; #ibus.engines = with pkgs.ibus-engines; [rime]; }; + #programs.hyprland = { enable = true; }; hardware.bluetooth = { enable = true; powerOnBoot = true; + settings = { General = { Disable = "Handsfree,Headset"; }; }; }; - specialisation = { - in-china.configuration = { - networking.proxy = { - default = "http://127.0.0.1:7897/"; - noProxy = "127.0.0.1,localhost,internal.domain"; - }; - }; - }; + #specialisation = { + # in-china.configuration = { + # networking.proxy = { + # default = "http://127.0.0.1:7897/"; + # noProxy = "127.0.0.1,localhost,internal.domain"; + # }; + # }; + #}; xdg.portal = { enable = true; - extraPortals = with pkgs; [ - xdg-desktop-portal-gtk - ]; - config = { - common.default = ["gtk"]; - }; + extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; + config = { common.default = [ "gtk" ]; }; }; systemd.user.services.mpris-proxy = { description = "Mpris proxy"; - after = ["network.target" "sound.target"]; - wantedBy = ["default.target"]; + after = [ "network.target" "sound.target" ]; + wantedBy = [ "default.target" ]; serviceConfig.ExecStart = "${pkgs.bluez}/bin/mpris-proxy"; }; - programs.steam = { - enable = true; - remotePlay.openFirewall = - true; # Open ports in the firewall for Steam Remote Play - dedicatedServer.openFirewall = - true; # Open ports in the firewall for Source Dedicated Server - localNetworkGameTransfers.openFirewall = - true; # Open ports in the firewall for Steam Local Network Game Transfers + programs = { + steam = { + enable = true; + remotePlay.openFirewall = + true; # Open ports in the firewall for Steam Remote Play + dedicatedServer.openFirewall = + true; # Open ports in the firewall for Source Dedicated Server + localNetworkGameTransfers.openFirewall = + true; # Open ports in the firewall for Steam Local Network Game Transfers + extraCompatPackages = with pkgs; [ proton-ge-bin ]; + }; + gamemode.enable = true; }; - boot = { + extraModulePackages = with config.boot.kernelPackages; [ v4l2loopback ]; + extraModprobeConfig = '' + options v4l2loopback devices=1 video_nr=1 card_label="OBS Cam" exclusive_caps=1 + ''; kernelPackages = pkgs.linuxPackages_zen; - supportedFilesystems = ["ntfs"]; + supportedFilesystems = [ "ntfs" ]; + }; + documentation = { + enable = true; + dev.enable = true; + doc.enable = true; + man.enable = true; }; security.polkit.enable = true; environment.systemPackages = with pkgs; [ + man-pages-posix + man-pages + (pass-wayland.withExtensions (exts: [ exts.pass-otp exts.pass-import ])) + gparted + zed-editor libsForQt5.qt5.qtquickcontrols2 libsForQt5.qt5.qtgraphicaleffects + /* (blender.override { + cudaSupport = true; + }) + */ + trash-cli + #inputs.hyprswitch.packages.x86_64-linux.default ]; # turned off because timedatectl doesn't like it time.hardwareClockInLocalTime = false; - time.timeZone = "Europe/Athens"; + time.timeZone = "Asia/Shanghai"; services = { #displayManager.sddm = { # enable = true; @@ -90,6 +146,8 @@ # theme = "${import ./sddm-theme.nix {inherit pkgs;}}"; #}; #automatic-timezoned.enable = true; + pcscd.enable = true; + openssh = { enable = true; settings = { @@ -104,35 +162,51 @@ # enable = true; # wrapperFeatures.gtk = true; #}; - programs.hyprland.enable = true; # enables Hyprland DM. nixpkgs = { - overlays = []; - config = {allowUnfree = true;}; + overlays = [ ]; + config = { + cudaSupport = true; + allowUnfree = true; + permittedInsecurePackages = [ "dotnet-core-combined" ]; + }; }; - nix = let - flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs; - in { - settings = { - experimental-features = "nix-command flakes"; - flake-registry = ""; - nix-path = config.nix.nixPath; + nix = + let flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs; + in { + settings = { + experimental-features = "nix-command flakes"; + # flake-registry = ""; + nix-path = config.nix.nixPath; + }; + extraOptions = '' + trusted-users = root stvnliu + ''; + channel.enable = false; + registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs; + nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs; }; - channel.enable = false; - registry = lib.mapAttrs (_: flake: {inherit flake;}) flakeInputs; - nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs; - }; + + systemd.network.wait-online.enable = false; networking = { hostName = "${config.myHostName}"; networkmanager.enable = true; + useNetworkd = lib.mkDefault true; + useDHCP = lib.mkDefault true; }; users.users = { "${config.myUserName}" = { initialPassword = "stevenpassword"; isNormalUser = true; - openssh.authorizedKeys.keys = []; - packages = with pkgs; [nh gparted]; - extraGroups = ["wheel" "input" "networkmanager"]; + openssh.authorizedKeys.keys = [ ]; + packages = with pkgs; [ nh ]; + extraGroups = [ "wheel" "input" "networkmanager" ]; + }; + "xi_jinping" = { + initialPassword = "bingchilling"; + isNormalUser = true; + packages = with pkgs; [ git ]; + extraGroups = [ "input" ]; }; }; # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion diff --git a/nixos/custom-hosts.nix b/nixos/custom-hosts.nix new file mode 100644 index 0000000..a0a18b4 --- /dev/null +++ b/nixos/custom-hosts.nix @@ -0,0 +1,20 @@ +{ ... +}: +let + rootDomainName = "stvnliu.me"; + subdomains = [ + "git" + "kellnr" + "www" + "blog" + "files" + "code" + "chat" + ]; +in +{ + networking.extraHosts = '' + # home IP mapping + 192.168.1.100 ${rootDomainName} ${builtins.concatStringsSep " " (map (x: x + "." + rootDomainName) subdomains)} + ''; +} diff --git a/nixos/droidcam.nix b/nixos/droidcam.nix new file mode 100644 index 0000000..5db1483 --- /dev/null +++ b/nixos/droidcam.nix @@ -0,0 +1,26 @@ +# /etc/nixos/configuration.nix +{ config, pkgs, ... }: + +{ + # Virtual cam settings: see https://wiki.nixos.org/wiki/OBS_Studio#Using_the_Virtual_Camera + boot.extraModulePackages = with config.boot.kernelPackages; [ + v4l2loopback + ]; + boot.extraModprobeConfig = '' + options v4l2loopback devices=1 video_nr=1 card_label="OBS Cam" exclusive_caps=1 + ''; + security.polkit.enable = true; + + # Install OBS Studio with droidcam-obs + users.users.foo = { + packages = with pkgs; [ + # ... + (wrapOBS { + plugins = with obs-studio-plugins; [ + droidcam-obs + ]; + }) + # ... + ]; + }; +} diff --git a/nixos/dwm/default.nix b/nixos/dwm/default.nix new file mode 100644 index 0000000..c3f3bdd --- /dev/null +++ b/nixos/dwm/default.nix @@ -0,0 +1,22 @@ +{ pkgs, }: { + #options = { + #dwm.enable = lib.mkEnableOption "Enables dwm."; + #}; + environment.systemPackages = with pkgs; [ st dmenu slstatus pamixer ]; + programs.dconf.enable = true; + services.xserver = { + enable = true; + windowManager = { + dwm = { + enable = true; + package = pkgs.dwm.override { + patches = [ + ./patches/config-20240325.diff + ./patches/dwm-flextile-20210722-138b405.diff + ./patches/dwm-systray-6.4.diff + ]; + }; + }; + }; + }; +} diff --git a/nixos/dwm/patches/accessnthmon.diff b/nixos/dwm/patches/accessnthmon.diff new file mode 100644 index 0000000..a65ec15 --- /dev/null +++ b/nixos/dwm/patches/accessnthmon.diff @@ -0,0 +1,100 @@ +diff --git a/config.def.h b/config.def.h +index 1c0b587..8595a71 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -49,7 +49,10 @@ static const Layout layouts[] = { + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ +- { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, ++ { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, \ ++ { ALTMOD, KEY, focusnthmon, {.i = TAG } }, \ ++ { ALTMOD|ShiftMask, KEY, tagnthmon, {.i = TAG } }, ++ + + /* helper for spawning shell commands in the pre dwm-5.0 fashion */ + #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } +diff --git a/dwm.c b/dwm.c +index b0b3466..96fa0bd 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -161,6 +161,7 @@ static void destroynotify(XEvent *e); + static void detach(Client *c); + static void detachstack(Client *c); + static Monitor *dirtomon(int dir); ++static Monitor *numtomon(int num); + static void drawbar(Monitor *m); + static void drawbars(void); + static void enternotify(XEvent *e); +@@ -168,6 +169,7 @@ static void expose(XEvent *e); + static void focus(Client *c); + static void focusin(XEvent *e); + static void focusmon(const Arg *arg); ++static void focusnthmon(const Arg *arg); + static void focusstack(const Arg *arg); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); +@@ -209,6 +211,7 @@ static void sigchld(int unused); + static void spawn(const Arg *arg); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); ++static void tagnthmon(const Arg *arg); + static void tile(Monitor *); + static void togglebar(const Arg *arg); + static void togglefloating(const Arg *arg); +@@ -693,6 +696,18 @@ dirtomon(int dir) + return m; + } + ++Monitor * ++numtomon(int num) ++{ ++ Monitor *m = NULL; ++ int i = 0; ++ ++ for(m = mons, i=0; m->next && i < num; m = m->next){ ++ i++; ++ } ++ return m; ++} ++ + void + drawbar(Monitor *m) + { +@@ -830,6 +845,21 @@ focusmon(const Arg *arg) + focus(NULL); + } + ++void ++focusnthmon(const Arg *arg) ++{ ++ Monitor *m; ++ ++ if (!mons->next) ++ return; ++ ++ if ((m = numtomon(arg->i)) == selmon) ++ return; ++ unfocus(selmon->sel, 0); ++ selmon = m; ++ focus(NULL); ++} ++ + void + focusstack(const Arg *arg) + { +@@ -1671,6 +1701,14 @@ tagmon(const Arg *arg) + sendmon(selmon->sel, dirtomon(arg->i)); + } + ++void ++tagnthmon(const Arg *arg) ++{ ++ if (!selmon->sel || !mons->next) ++ return; ++ sendmon(selmon->sel, numtomon(arg->i)); ++} ++ + void + tile(Monitor *m) + { diff --git a/nixos/dwm/patches/config-20240325.diff b/nixos/dwm/patches/config-20240325.diff new file mode 100644 index 0000000..0533a97 --- /dev/null +++ b/nixos/dwm/patches/config-20240325.diff @@ -0,0 +1,60 @@ +diff --git a/config.def.h b/config.def.h +index 9efa774..1b543e3 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -1,21 +1,22 @@ + /* See LICENSE file for copyright and license details. */ +- ++#include + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ +-static const int topbar = 1; /* 0 means bottom bar */ +-static const char *fonts[] = { "monospace:size=10" }; +-static const char dmenufont[] = "monospace:size=10"; +-static const char col_gray1[] = "#222222"; +-static const char col_gray2[] = "#444444"; ++static const int topbar = 0; /* 0 means bottom bar */ ++static const char *fonts[] = { "IntoneMonoNerdFont:size=10" }; ++static const char dmenufont[] = "IntoneMonoNerdFont:size=10"; ++static const char col_gray1[] = "#1d1d19"; ++static const char col_gray2[] = "#444440"; + static const char col_gray3[] = "#bbbbbb"; + static const char col_gray4[] = "#eeeeee"; + static const char col_cyan[] = "#005577"; ++static const char col_gruvbox_yellow[] = "#353124"; + static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, +- [SchemeSel] = { col_gray4, col_cyan, col_cyan }, ++ [SchemeSel] = { col_gray4, col_gruvbox_yellow, col_gruvbox_yellow }, + }; + + /* tagging */ +@@ -59,11 +60,24 @@ static const Layout layouts[] = { + static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ + static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; + static const char *termcmd[] = { "st", NULL }; +- ++static const char *lockcmd[] = { "xlock" , "-mode", "space", NULL }; ++static const char *mccmd[] = { "st", "-e", "mc", NULL }; ++static const char *raisevol[] = { "pamixer", "-i", "5", NULL}; ++static const char *lowervol[] = { "pamixer", "-d", "5", NULL}; ++static const char *mutevol[] = {"pamixer", "--set-volume", "0", NULL}; ++static const char *screenshot[] = {"flameshot", "gui", NULL}; ++static const char *btop[] = {"btop", NULL}; + static const Key keys[] = { + /* modifier key function argument */ ++ {0, XF86XK_AudioRaiseVolume, spawn, {.v = raisevol } }, ++ {0, XF86XK_AudioLowerVolume, spawn, {.v = lowervol } }, ++ {0, XF86XK_AudioMute, spawn, {.v = mutevol } }, ++ {0, XK_Print, spawn, {.v = screenshot } }, ++ { MODKEY, XK_e, spawn, {.v = mccmd } }, + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, ++ { MODKEY|ControlMask, XK_m, spawn, {.v = btop } }, ++ {MODKEY|ControlMask, XK_l, spawn, {.v = lockcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, diff --git a/nixos/dwm/patches/config.h b/nixos/dwm/patches/config.h new file mode 100644 index 0000000..4c8dc93 --- /dev/null +++ b/nixos/dwm/patches/config.h @@ -0,0 +1,121 @@ +/* See LICENSE file for copyright and license details. */ +#include +/* appearance */ +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int snap = 32; /* snap pixel */ +static const int showbar = 1; /* 0 means no bar */ +static const int topbar = 0; /* 0 means bottom bar */ +static const char *fonts[] = { "monospace:size=10" }; +static const char dmenufont[] = "monospace:size=10"; +static const char col_gray1[] = "#222222"; +static const char col_gray2[] = "#444444"; +static const char col_gray3[] = "#bbbbbb"; +static const char col_gray4[] = "#eeeeee"; +static const char col_cyan[] = "#005577"; +static const char *colors[][3] = { + /* fg bg border */ + [SchemeNorm] = { col_gray3, col_gray1, col_gray2 }, + [SchemeSel] = { col_gray4, col_cyan, col_cyan }, +}; + +/* tagging */ +static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + +static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class + * WM_NAME(STRING) = title + */ + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, 1, -1 }, + { "Firefox", NULL, NULL, 1 << 8, 0, -1 }, +}; + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, +}; + +/* key definitions */ +#define MODKEY Mod1Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */ +static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; +static const char *termcmd[] = { "st", NULL }; +static const char *mccmd[] = { "st", "-e", "mc", NULL }; +static const char *raisevol[] = { "pamixer", "-i", "5", NULL}; +static const char *lowervol[] = { "pamixer", "-d", "5", NULL}; +static const Key keys[] = { + /* modifier key function argument */ + {0, XF86XK_AudioRaiseVolume, spawn, {.v = raisevol } }, + {0, XF86XK_AudioLowerVolume, spawn, {.v = lowervol } }, + { MODKEY, XK_e, spawn, {.v = mccmd } }, + { MODKEY, XK_p, spawn, {.v = dmenucmd } }, + { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY|ShiftMask, XK_c, killclient, {0} }, + { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_space, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static const Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/nixos/dwm/patches/dwm-flextile-20210722-138b405.diff b/nixos/dwm/patches/dwm-flextile-20210722-138b405.diff new file mode 100644 index 0000000..f6028ee --- /dev/null +++ b/nixos/dwm/patches/dwm-flextile-20210722-138b405.diff @@ -0,0 +1,447 @@ +From cb3d26193fafd0b06217c3bf2d65a6eac74b4941 Mon Sep 17 00:00:00 2001 +From: Max Schillinger +Date: Thu, 22 Jul 2021 23:19:36 +0200 +Subject: [PATCH] flextile layout for dwm commit 138b405 + +--- + config.def.h | 17 +++++- + dwm.c | 123 +++++++++++++++++++------------------- + flextile.h | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 238 insertions(+), 65 deletions(-) + create mode 100644 flextile.h + +diff --git a/config.def.h b/config.def.h +index a2ac963..1330db2 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -21,6 +21,9 @@ static const char *colors[][3] = { + /* tagging */ + static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }; + ++/* include(s) depending on the tags array */ ++#include "flextile.h" ++ + static const Rule rules[] = { + /* xprop(1): + * WM_CLASS(STRING) = instance, class +@@ -33,8 +36,12 @@ static const Rule rules[] = { + + /* layout(s) */ + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +-static const int nmaster = 1; /* number of clients in master area */ + static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ ++static const int layoutaxis[] = { ++ 1, /* layout axis: 1 = x, 2 = y; negative values mirror the layout, setting the master area to the right / bottom instead of left / top */ ++ 2, /* master axis: 1 = x (from left to right), 2 = y (from top to bottom), 3 = z (monocle) */ ++ 2, /* stack axis: 1 = x (from left to right), 2 = y (from top to bottom), 3 = z (monocle) */ ++}; + static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + + static const Layout layouts[] = { +@@ -67,8 +74,8 @@ static Key keys[] = { + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, +- { MODKEY, XK_i, incnmaster, {.i = +1 } }, +- { MODKEY, XK_d, incnmaster, {.i = -1 } }, ++ { MODKEY, XK_i, shiftmastersplit, {.i = +1} }, /* increase the number of tiled clients in the master area */ ++ { MODKEY, XK_d, shiftmastersplit, {.i = -1} }, /* reduce the number of tiled clients in the master area */ + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_Return, zoom, {0} }, +@@ -95,6 +102,10 @@ static Key keys[] = { + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, ++ { MODKEY|ControlMask, XK_t, rotatelayoutaxis, {.i = 0} }, /* 0 = layout axis */ ++ { MODKEY|ControlMask, XK_Tab, rotatelayoutaxis, {.i = 1} }, /* 1 = master axis */ ++ { MODKEY|ControlMask|ShiftMask, XK_Tab, rotatelayoutaxis, {.i = 2} }, /* 2 = stack axis */ ++ { MODKEY|ControlMask, XK_Return, mirrorlayout, {0} }, + }; + + /* button definitions */ +diff --git a/dwm.c b/dwm.c +index 5e4d494..1f1487a 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -111,27 +111,6 @@ typedef struct { + void (*arrange)(Monitor *); + } Layout; + +-struct Monitor { +- char ltsymbol[16]; +- float mfact; +- int nmaster; +- int num; +- int by; /* bar geometry */ +- int mx, my, mw, mh; /* screen size */ +- int wx, wy, ww, wh; /* window area */ +- unsigned int seltags; +- unsigned int sellt; +- unsigned int tagset[2]; +- int showbar; +- int topbar; +- Client *clients; +- Client *sel; +- Client *stack; +- Monitor *next; +- Window barwin; +- const Layout *lt[2]; +-}; +- + typedef struct { + const char *class; + const char *instance; +@@ -175,7 +154,6 @@ static long getstate(Window w); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); +-static void incnmaster(const Arg *arg); + static void keypress(XEvent *e); + static void killclient(const Arg *arg); + static void manage(Window w, XWindowAttributes *wa); +@@ -631,17 +609,32 @@ configurerequest(XEvent *e) + Monitor * + createmon(void) + { ++ unsigned int i; + Monitor *m; + + m = ecalloc(1, sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; + m->mfact = mfact; +- m->nmaster = nmaster; + m->showbar = showbar; + m->topbar = topbar; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); ++ m->ltaxis[0] = layoutaxis[0]; ++ m->ltaxis[1] = layoutaxis[1]; ++ m->ltaxis[2] = layoutaxis[2]; ++ m->msplit = 1; ++ /* init tags, bars, layouts, axes, msplits and mfacts */ ++ m->curtag = m->prevtag = 1; ++ for(i = 0; i < LENGTH(tags) + 1; i++){ ++ m->showbars[i] = m->showbar; ++ m->lts[i] = &layouts[0]; ++ m->mfacts[i] = m->mfact; ++ m->ltaxes[i][0] = m->ltaxis[0]; ++ m->ltaxes[i][1] = m->ltaxis[1]; ++ m->ltaxes[i][2] = m->ltaxis[2]; ++ m->msplits[i] = m->msplit; ++ } + return m; + } + +@@ -964,13 +957,6 @@ grabkeys(void) + } + } + +-void +-incnmaster(const Arg *arg) +-{ +- selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); +- arrange(selmon); +-} +- + #ifdef XINERAMA + static int + isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) +@@ -1504,7 +1490,7 @@ setlayout(const Arg *arg) + if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) + selmon->sellt ^= 1; + if (arg && arg->v) +- selmon->lt[selmon->sellt] = (Layout *)arg->v; ++ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if (selmon->sel) + arrange(selmon); +@@ -1523,7 +1509,7 @@ setmfact(const Arg *arg) + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if (f < 0.05 || f > 0.95) + return; +- selmon->mfact = f; ++ selmon->mfact = selmon->mfacts[selmon->curtag] = f; + arrange(selmon); + } + +@@ -1671,38 +1657,10 @@ tagmon(const Arg *arg) + sendmon(selmon->sel, dirtomon(arg->i)); + } + +-void +-tile(Monitor *m) +-{ +- unsigned int i, n, h, mw, my, ty; +- Client *c; +- +- for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); +- if (n == 0) +- return; +- +- if (n > m->nmaster) +- mw = m->nmaster ? m->ww * m->mfact : 0; +- else +- mw = m->ww; +- for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) +- if (i < m->nmaster) { +- h = (m->wh - my) / (MIN(n, m->nmaster) - i); +- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); +- if (my + HEIGHT(c) < m->wh) +- my += HEIGHT(c); +- } else { +- h = (m->wh - ty) / (n - i); +- resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); +- if (ty + HEIGHT(c) < m->wh) +- ty += HEIGHT(c); +- } +-} +- + void + togglebar(const Arg *arg) + { +- selmon->showbar = !selmon->showbar; ++ selmon->showbar = selmon->showbars[selmon->curtag] = !selmon->showbar; + updatebarpos(selmon); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + arrange(selmon); +@@ -1726,12 +1684,31 @@ void + toggletag(const Arg *arg) + { + unsigned int newtags; ++ unsigned int i; + + if (!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if (newtags) { + selmon->sel->tags = newtags; ++ if(newtags == ~0) { ++ selmon->prevtag = selmon->curtag; ++ selmon->curtag = 0; ++ } ++ if(!(newtags & 1 << (selmon->curtag - 1))) { ++ selmon->prevtag = selmon->curtag; ++ for (i=0; !(newtags & 1 << i); i++); ++ selmon->curtag = i + 1; ++ } ++ selmon->sel->tags = newtags; ++ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag]; ++ selmon->mfact = selmon->mfacts[selmon->curtag]; ++ if (selmon->showbar != selmon->showbars[selmon->curtag]) ++ togglebar(NULL); ++ selmon->ltaxis[0] = selmon->ltaxes[selmon->curtag][0]; ++ selmon->ltaxis[1] = selmon->ltaxes[selmon->curtag][1]; ++ selmon->ltaxis[2] = selmon->ltaxes[selmon->curtag][2]; ++ selmon->msplit = selmon->msplits[selmon->curtag]; + focus(NULL); + arrange(selmon); + } +@@ -2038,11 +2015,33 @@ updatewmhints(Client *c) + void + view(const Arg *arg) + { ++ unsigned int i; ++ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ +- if (arg->ui & TAGMASK) ++ if (arg->ui & TAGMASK) { + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; ++ selmon->prevtag = selmon->curtag; ++ if(arg->ui == ~0) ++ selmon->curtag = 0; ++ else { ++ for (i=0; !(arg->ui & 1 << i); i++); ++ selmon->curtag = i + 1; ++ } ++ } else { ++ selmon->prevtag = selmon->curtag ^ selmon->prevtag; ++ selmon->curtag ^= selmon->prevtag; ++ selmon->prevtag = selmon->curtag ^ selmon->prevtag; ++ } ++ selmon->lt[selmon->sellt] = selmon->lts[selmon->curtag]; ++ selmon->mfact = selmon->mfacts[selmon->curtag]; ++ if(selmon->showbar != selmon->showbars[selmon->curtag]) ++ togglebar(NULL); ++ selmon->ltaxis[0] = selmon->ltaxes[selmon->curtag][0]; ++ selmon->ltaxis[1] = selmon->ltaxes[selmon->curtag][1]; ++ selmon->ltaxis[2] = selmon->ltaxes[selmon->curtag][2]; ++ selmon->msplit = selmon->msplits[selmon->curtag]; + focus(NULL); + arrange(selmon); + } +diff --git a/flextile.h b/flextile.h +new file mode 100644 +index 0000000..edab893 +--- /dev/null ++++ b/flextile.h +@@ -0,0 +1,163 @@ ++/* See LICENSE file for copyright and license details. */ ++/* © 2010 joten */ ++ ++struct Monitor { ++ char ltsymbol[16]; ++ float mfact; ++ double mfacts[LENGTH(tags) + 1]; ++ int ltaxis[3]; ++ int ltaxes[LENGTH(tags) + 1][3]; ++ int num; ++ int curtag; ++ int prevtag; ++ int by; /* bar geometry */ ++ int mx, my, mw, mh; /* screen size */ ++ int wx, wy, ww, wh; /* window area */ ++ unsigned int msplit; ++ unsigned int msplits[LENGTH(tags) + 1]; ++ unsigned int seltags; ++ unsigned int sellt; ++ unsigned int tagset[2]; ++ int showbar; ++ int showbars[LENGTH(tags) + 1]; ++ int topbar; ++ Client *clients; ++ Client *sel; ++ Client *stack; ++ Monitor *next; ++ Window barwin; ++ const Layout *lt[2]; ++ const Layout *lts[LENGTH(tags) + 1]; ++}; ++ ++/* function declarations */ ++static void mirrorlayout(const Arg *arg); ++static void rotatelayoutaxis(const Arg *arg); ++static void shiftmastersplit(const Arg *arg); ++ ++void ++mirrorlayout(const Arg *arg) ++{ ++ if(!selmon->lt[selmon->sellt]->arrange) ++ return; ++ selmon->ltaxis[0] *= -1; ++ selmon->ltaxes[selmon->curtag][0] = selmon->ltaxis[0]; ++ arrange(selmon); ++} ++ ++void ++rotatelayoutaxis(const Arg *arg) ++{ ++ if(!selmon->lt[selmon->sellt]->arrange) ++ return; ++ if(arg->i == 0) { ++ if(selmon->ltaxis[0] > 0) ++ selmon->ltaxis[0] = selmon->ltaxis[0] + 1 > 2 ? 1 : selmon->ltaxis[0] + 1; ++ else ++ selmon->ltaxis[0] = selmon->ltaxis[0] - 1 < -2 ? -1 : selmon->ltaxis[0] - 1; ++ } else ++ selmon->ltaxis[arg->i] = selmon->ltaxis[arg->i] + 1 > 3 ? 1 : selmon->ltaxis[arg->i] + 1; ++ selmon->ltaxes[selmon->curtag][arg->i] = selmon->ltaxis[arg->i]; ++ arrange(selmon); ++} ++ ++void ++shiftmastersplit(const Arg *arg) ++{ ++ unsigned int n; ++ Client *c; ++ ++ for(n = 0, c = nexttiled(selmon->clients); c; c = nexttiled(c->next), n++); ++ if(!arg || !selmon->lt[selmon->sellt]->arrange || selmon->msplit + arg->i < 1 || selmon->msplit + arg->i > n) ++ return; ++ selmon->msplit += arg->i; ++ selmon->msplits[selmon->curtag] = selmon->msplit; ++ arrange(selmon); ++} ++ ++void ++tile(Monitor *m) ++{ ++ char sym1 = 61, sym2 = 93, sym3 = 61, sym; ++ int x1 = m->wx, y1 = m->wy, h1 = m->wh, w1 = m->ww, X1 = x1 + w1, Y1 = y1 + h1; ++ int x2 = m->wx, y2 = m->wy, h2 = m->wh, w2 = m->ww, X2 = x2 + w2, Y2 = y2 + h2; ++ unsigned int i, n, n1, n2; ++ Client *c; ++ ++ for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); ++ if(m->msplit > n) ++ m->msplit = (n == 0) ? 1 : n; ++ /* layout symbol */ ++ if(abs(m->ltaxis[0]) == m->ltaxis[1]) /* explicitly: ((abs(m->ltaxis[0]) == 1 && m->ltaxis[1] == 1) || (abs(m->ltaxis[0]) == 2 && m->ltaxis[1] == 2)) */ ++ sym1 = 124; ++ if(abs(m->ltaxis[0]) == m->ltaxis[2]) ++ sym3 = 124; ++ if(m->ltaxis[1] == 3) ++ sym1 = (n == 0) ? 0 : m->msplit; ++ if(m->ltaxis[2] == 3) ++ sym3 = (n == 0) ? 0 : n - m->msplit; ++ if(m->ltaxis[0] < 0) { ++ sym = sym1; ++ sym1 = sym3; ++ sym2 = 91; ++ sym3 = sym; ++ } ++ if(m->msplit == 1) { ++ if(m->ltaxis[0] > 0) ++ sym1 = 91; ++ else ++ sym3 = 93; ++ } ++ if(m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[2] == 3) ++ snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%d", sym1, sym2, sym3); ++ else if((m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] > 0) || (m->ltaxis[2] == 3 && m->ltaxis[0] < 0)) ++ snprintf(m->ltsymbol, sizeof m->ltsymbol, "%d%c%c", sym1, sym2, sym3); ++ else if((m->ltaxis[2] == 3 && m->ltaxis[0] > 0) || (m->msplit > 1 && m->ltaxis[1] == 3 && m->ltaxis[0] < 0)) ++ snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%d", sym1, sym2, sym3); ++ else ++ snprintf(m->ltsymbol, sizeof m->ltsymbol, "%c%c%c", sym1, sym2, sym3); ++ if(n == 0) ++ return; ++ /* master and stack area */ ++ if(abs(m->ltaxis[0]) == 1 && n > m->msplit) { ++ w1 *= m->mfact; ++ w2 -= w1; ++ x1 += (m->ltaxis[0] < 0) ? w2 : 0; ++ x2 += (m->ltaxis[0] < 0) ? 0 : w1; ++ X1 = x1 + w1; ++ X2 = x2 + w2; ++ } else if(abs(m->ltaxis[0]) == 2 && n > m->msplit) { ++ h1 *= m->mfact; ++ h2 -= h1; ++ y1 += (m->ltaxis[0] < 0) ? h2 : 0; ++ y2 += (m->ltaxis[0] < 0) ? 0 : h1; ++ Y1 = y1 + h1; ++ Y2 = y2 + h2; ++ } ++ /* master */ ++ n1 = (m->ltaxis[1] != 1 || w1 / m->msplit < bh) ? 1 : m->msplit; ++ n2 = (m->ltaxis[1] != 2 || h1 / m->msplit < bh) ? 1 : m->msplit; ++ for(i = 0, c = nexttiled(m->clients); i < m->msplit; c = nexttiled(c->next), i++) { ++ resize(c, x1, y1, ++ (m->ltaxis[1] == 1 && i + 1 == m->msplit) ? X1 - x1 - 2 * c->bw : w1 / n1 - 2 * c->bw, ++ (m->ltaxis[1] == 2 && i + 1 == m->msplit) ? Y1 - y1 - 2 * c->bw : h1 / n2 - 2 * c->bw, False); ++ if(n1 > 1) ++ x1 = c->x + WIDTH(c); ++ if(n2 > 1) ++ y1 = c->y + HEIGHT(c); ++ } ++ /* stack */ ++ if(n > m->msplit) { ++ n1 = (m->ltaxis[2] != 1 || w2 / (n - m->msplit) < bh) ? 1 : n - m->msplit; ++ n2 = (m->ltaxis[2] != 2 || h2 / (n - m->msplit) < bh) ? 1 : n - m->msplit; ++ for(i = 0; c; c = nexttiled(c->next), i++) { ++ resize(c, x2, y2, ++ (m->ltaxis[2] == 1 && i + 1 == n - m->msplit) ? X2 - x2 - 2 * c->bw : w2 / n1 - 2 * c->bw, ++ (m->ltaxis[2] == 2 && i + 1 == n - m->msplit) ? Y2 - y2 - 2 * c->bw : h2 / n2 - 2 * c->bw, False); ++ if(n1 > 1) ++ x2 = c->x + WIDTH(c); ++ if(n2 > 1) ++ y2 = c->y + HEIGHT(c); ++ } ++ } ++} +-- +2.25.1 + diff --git a/nixos/dwm/patches/dwm-systray-6.4.diff b/nixos/dwm/patches/dwm-systray-6.4.diff new file mode 100644 index 0000000..58e4a69 --- /dev/null +++ b/nixos/dwm/patches/dwm-systray-6.4.diff @@ -0,0 +1,746 @@ +diff --git a/config.def.h b/config.def.h +index 9efa774..750529d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,6 +3,11 @@ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ ++static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ ++static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ ++static const unsigned int systrayspacing = 2; /* systray spacing */ ++static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ ++static const int showsystray = 1; /* 0 means no systray */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ + static const char *fonts[] = { "monospace:size=10" }; +@@ -101,8 +106,8 @@ static const Key keys[] = { + /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ + static const Button buttons[] = { + /* click event mask button function argument */ +- { ClkLtSymbol, 0, Button1, setlayout, {0} }, +- { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, ++ { ClkTagBar, MODKEY, Button1, tag, {0} }, ++ { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, +diff --git a/dwm.c b/dwm.c +index 03baf42..4611a03 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -57,12 +57,27 @@ + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++#define SYSTEM_TRAY_REQUEST_DOCK 0 ++/* XEMBED messages */ ++#define XEMBED_EMBEDDED_NOTIFY 0 ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_FOCUS_IN 4 ++#define XEMBED_MODALITY_ON 10 ++#define XEMBED_MAPPED (1 << 0) ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_WINDOW_DEACTIVATE 2 ++#define VERSION_MAJOR 0 ++#define VERSION_MINOR 0 ++#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR ++ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, ++ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ ++enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ + enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ + enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +@@ -141,6 +156,12 @@ typedef struct { + int monitor; + } Rule; + ++typedef struct Systray Systray; ++struct Systray { ++ Window win; ++ Client *icons; ++}; ++ + /* function declarations */ + static void applyrules(Client *c); + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +@@ -172,6 +193,7 @@ static void focusstack(const Arg *arg); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + static long getstate(Window w); ++static unsigned int getsystraywidth(); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); +@@ -189,13 +211,16 @@ static void pop(Client *c); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); ++static void removesystrayicon(Client *i); + static void resize(Client *c, int x, int y, int w, int h, int interact); ++static void resizebarwin(Monitor *m); + static void resizeclient(Client *c, int x, int y, int w, int h); + static void resizemouse(const Arg *arg); ++static void resizerequest(XEvent *e); + static void restack(Monitor *m); + static void run(void); + static void scan(void); +-static int sendevent(Client *c, Atom proto); ++static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); + static void sendmon(Client *c, Monitor *m); + static void setclientstate(Client *c, long state); + static void setfocus(Client *c); +@@ -207,6 +232,7 @@ static void seturgent(Client *c, int urg); + static void showhide(Client *c); + static void sigchld(int unused); + static void spawn(const Arg *arg); ++static Monitor *systraytomon(Monitor *m); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *m); +@@ -224,18 +250,23 @@ static int updategeom(void); + static void updatenumlockmask(void); + static void updatesizehints(Client *c); + static void updatestatus(void); ++static void updatesystray(void); ++static void updatesystrayicongeom(Client *i, int w, int h); ++static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); + static void updatetitle(Client *c); + static void updatewindowtype(Client *c); + static void updatewmhints(Client *c); + static void view(const Arg *arg); + static Client *wintoclient(Window w); + static Monitor *wintomon(Window w); ++static Client *wintosystrayicon(Window w); + static int xerror(Display *dpy, XErrorEvent *ee); + static int xerrordummy(Display *dpy, XErrorEvent *ee); + static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); + + /* variables */ ++static Systray *systray = NULL; + static const char broken[] = "broken"; + static char stext[256]; + static int screen; +@@ -258,9 +289,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, ++ [ResizeRequest] = resizerequest, + [UnmapNotify] = unmapnotify + }; +-static Atom wmatom[WMLast], netatom[NetLast]; ++static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; + static int running = 1; + static Cur *cursor[CurLast]; + static Clr **scheme; +@@ -442,7 +474,7 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - (int)TEXTW(stext)) ++ else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) + click = ClkStatusText; + else + click = ClkWinTitle; +@@ -485,6 +517,13 @@ cleanup(void) + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); ++ ++ if (showsystray) { ++ XUnmapWindow(dpy, systray->win); ++ XDestroyWindow(dpy, systray->win); ++ free(systray); ++ } ++ + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) +@@ -516,9 +555,58 @@ cleanupmon(Monitor *mon) + void + clientmessage(XEvent *e) + { ++ XWindowAttributes wa; ++ XSetWindowAttributes swa; + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + ++ if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { ++ /* add systray icons */ ++ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { ++ if (!(c = (Client *)calloc(1, sizeof(Client)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Client)); ++ if (!(c->win = cme->data.l[2])) { ++ free(c); ++ return; ++ } ++ c->mon = selmon; ++ c->next = systray->icons; ++ systray->icons = c; ++ if (!XGetWindowAttributes(dpy, c->win, &wa)) { ++ /* use sane defaults */ ++ wa.width = bh; ++ wa.height = bh; ++ wa.border_width = 0; ++ } ++ c->x = c->oldx = c->y = c->oldy = 0; ++ c->w = c->oldw = wa.width; ++ c->h = c->oldh = wa.height; ++ c->oldbw = wa.border_width; ++ c->bw = 0; ++ c->isfloating = True; ++ /* reuse tags field as mapped status */ ++ c->tags = 1; ++ updatesizehints(c); ++ updatesystrayicongeom(c, wa.width, wa.height); ++ XAddToSaveSet(dpy, c->win); ++ XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); ++ XReparentWindow(dpy, c->win, systray->win, 0, 0); ++ /* use parents background color */ ++ swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ /* FIXME not sure if I have to send these events, too */ ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ XSync(dpy, False); ++ resizebarwin(selmon); ++ updatesystray(); ++ setclientstate(c, NormalState); ++ } ++ return; ++ } ++ + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { +@@ -571,7 +659,7 @@ configurenotify(XEvent *e) + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); +- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); ++ resizebarwin(m); + } + focus(NULL); + arrange(NULL); +@@ -656,6 +744,11 @@ destroynotify(XEvent *e) + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); ++ else if ((c = wintosystrayicon(ev->window))) { ++ removesystrayicon(c); ++ resizebarwin(selmon); ++ updatesystray(); ++ } + } + + void +@@ -699,7 +792,7 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, tw = 0; ++ int x, w, tw = 0, stw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; +@@ -708,13 +801,17 @@ drawbar(Monitor *m) + if (!m->showbar) + return; + ++ if(showsystray && m == systraytomon(m) && !systrayonleft) ++ stw = getsystraywidth(); ++ + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); +- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); ++ tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */ ++ drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); + } + ++ resizebarwin(m); + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) +@@ -735,7 +832,7 @@ drawbar(Monitor *m) + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + +- if ((w = m->ww - tw - x) > bh) { ++ if ((w = m->ww - tw - stw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); +@@ -746,7 +843,7 @@ drawbar(Monitor *m) + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } +- drw_map(drw, m->barwin, 0, 0, m->ww, bh); ++ drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); + } + + void +@@ -783,8 +880,11 @@ expose(XEvent *e) + Monitor *m; + XExposeEvent *ev = &e->xexpose; + +- if (ev->count == 0 && (m = wintomon(ev->window))) ++ if (ev->count == 0 && (m = wintomon(ev->window))) { + drawbar(m); ++ if (m == selmon) ++ updatesystray(); ++ } + } + + void +@@ -870,14 +970,32 @@ getatomprop(Client *c, Atom prop) + unsigned char *p = NULL; + Atom da, atom = None; + +- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, ++ /* FIXME getatomprop should return the number of items and a pointer to ++ * the stored data instead of this workaround */ ++ Atom req = XA_ATOM; ++ if (prop == xatom[XembedInfo]) ++ req = xatom[XembedInfo]; ++ ++ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; ++ if (da == xatom[XembedInfo] && dl == 2) ++ atom = ((Atom *)p)[1]; + XFree(p); + } + return atom; + } + ++unsigned int ++getsystraywidth() ++{ ++ unsigned int w = 0; ++ Client *i; ++ if(showsystray) ++ for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; ++ return w ? w + systrayspacing : 1; ++} ++ + int + getrootptr(int *x, int *y) + { +@@ -1018,7 +1136,8 @@ killclient(const Arg *arg) + { + if (!selmon->sel) + return; +- if (!sendevent(selmon->sel, wmatom[WMDelete])) { ++ ++ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); +@@ -1105,6 +1224,13 @@ maprequest(XEvent *e) + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + ++ Client *i; ++ if ((i = wintosystrayicon(ev->window))) { ++ sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++ + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) + return; + if (!wintoclient(ev->window)) +@@ -1226,6 +1352,17 @@ propertynotify(XEvent *e) + Window trans; + XPropertyEvent *ev = &e->xproperty; + ++ if ((c = wintosystrayicon(ev->window))) { ++ if (ev->atom == XA_WM_NORMAL_HINTS) { ++ updatesizehints(c); ++ updatesystrayicongeom(c, c->w, c->h); ++ } ++ else ++ updatesystrayiconstate(c, ev); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++ + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) +@@ -1276,6 +1413,19 @@ recttomon(int x, int y, int w, int h) + return r; + } + ++void ++removesystrayicon(Client *i) ++{ ++ Client **ii; ++ ++ if (!showsystray || !i) ++ return; ++ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); ++ if (ii) ++ *ii = i->next; ++ free(i); ++} ++ + void + resize(Client *c, int x, int y, int w, int h, int interact) + { +@@ -1283,6 +1433,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) + resizeclient(c, x, y, w, h); + } + ++void ++resizebarwin(Monitor *m) { ++ unsigned int w = m->ww; ++ if (showsystray && m == systraytomon(m) && !systrayonleft) ++ w -= getsystraywidth(); ++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); ++} ++ + void + resizeclient(Client *c, int x, int y, int w, int h) + { +@@ -1298,6 +1456,19 @@ resizeclient(Client *c, int x, int y, int w, int h) + XSync(dpy, False); + } + ++void ++resizerequest(XEvent *e) ++{ ++ XResizeRequestEvent *ev = &e->xresizerequest; ++ Client *i; ++ ++ if ((i = wintosystrayicon(ev->window))) { ++ updatesystrayicongeom(i, ev->width, ev->height); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++} ++ + void + resizemouse(const Arg *arg) + { +@@ -1444,26 +1615,37 @@ setclientstate(Client *c, long state) + } + + int +-sendevent(Client *c, Atom proto) ++sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) + { + int n; +- Atom *protocols; ++ Atom *protocols, mt; + int exists = 0; + XEvent ev; + +- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { +- while (!exists && n--) +- exists = protocols[n] == proto; +- XFree(protocols); ++ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { ++ mt = wmatom[WMProtocols]; ++ if (XGetWMProtocols(dpy, w, &protocols, &n)) { ++ while (!exists && n--) ++ exists = protocols[n] == proto; ++ XFree(protocols); ++ } ++ } ++ else { ++ exists = True; ++ mt = proto; + } ++ + if (exists) { + ev.type = ClientMessage; +- ev.xclient.window = c->win; +- ev.xclient.message_type = wmatom[WMProtocols]; ++ ev.xclient.window = w; ++ ev.xclient.message_type = mt; + ev.xclient.format = 32; +- ev.xclient.data.l[0] = proto; +- ev.xclient.data.l[1] = CurrentTime; +- XSendEvent(dpy, c->win, False, NoEventMask, &ev); ++ ev.xclient.data.l[0] = d0; ++ ev.xclient.data.l[1] = d1; ++ ev.xclient.data.l[2] = d2; ++ ev.xclient.data.l[3] = d3; ++ ev.xclient.data.l[4] = d4; ++ XSendEvent(dpy, w, False, mask, &ev); + } + return exists; + } +@@ -1477,7 +1659,7 @@ setfocus(Client *c) + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } +- sendevent(c, wmatom[WMTakeFocus]); ++ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); + } + + void +@@ -1566,6 +1748,10 @@ setup(void) + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); ++ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); ++ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); ++ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); ++ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); +@@ -1573,6 +1759,9 @@ setup(void) + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); ++ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); ++ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); ++ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); +@@ -1581,6 +1770,8 @@ setup(void) + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); ++ /* init system tray */ ++ updatesystray(); + /* init bars */ + updatebars(); + updatestatus(); +@@ -1711,7 +1902,18 @@ togglebar(const Arg *arg) + { + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); +- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); ++ resizebarwin(selmon); ++ if (showsystray) { ++ XWindowChanges wc; ++ if (!selmon->showbar) ++ wc.y = -bh; ++ else if (selmon->showbar) { ++ wc.y = 0; ++ if (!selmon->topbar) ++ wc.y = selmon->mh - bh; ++ } ++ XConfigureWindow(dpy, systray->win, CWY, &wc); ++ } + arrange(selmon); + } + +@@ -1807,11 +2009,18 @@ unmapnotify(XEvent *e) + else + unmanage(c, 0); + } ++ else if ((c = wintosystrayicon(ev->window))) { ++ /* KLUDGE! sometimes icons occasionally unmap their windows, but do ++ * _not_ destroy them. We map those windows back */ ++ XMapRaised(dpy, c->win); ++ updatesystray(); ++ } + } + + void + updatebars(void) + { ++ unsigned int w; + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, +@@ -1822,10 +2031,15 @@ updatebars(void) + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; +- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), ++ w = m->ww; ++ if (showsystray && m == systraytomon(m)) ++ w -= getsystraywidth(); ++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); ++ if (showsystray && m == systraytomon(m)) ++ XMapRaised(dpy, systray->win); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +@@ -2002,6 +2216,125 @@ updatestatus(void) + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); ++ updatesystray(); ++} ++ ++ ++void ++updatesystrayicongeom(Client *i, int w, int h) ++{ ++ if (i) { ++ i->h = bh; ++ if (w == h) ++ i->w = bh; ++ else if (h == bh) ++ i->w = w; ++ else ++ i->w = (int) ((float)bh * ((float)w / (float)h)); ++ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); ++ /* force icons into the systray dimensions if they don't want to */ ++ if (i->h > bh) { ++ if (i->w == i->h) ++ i->w = bh; ++ else ++ i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); ++ i->h = bh; ++ } ++ } ++} ++ ++void ++updatesystrayiconstate(Client *i, XPropertyEvent *ev) ++{ ++ long flags; ++ int code = 0; ++ ++ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || ++ !(flags = getatomprop(i, xatom[XembedInfo]))) ++ return; ++ ++ if (flags & XEMBED_MAPPED && !i->tags) { ++ i->tags = 1; ++ code = XEMBED_WINDOW_ACTIVATE; ++ XMapRaised(dpy, i->win); ++ setclientstate(i, NormalState); ++ } ++ else if (!(flags & XEMBED_MAPPED) && i->tags) { ++ i->tags = 0; ++ code = XEMBED_WINDOW_DEACTIVATE; ++ XUnmapWindow(dpy, i->win); ++ setclientstate(i, WithdrawnState); ++ } ++ else ++ return; ++ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, ++ systray->win, XEMBED_EMBEDDED_VERSION); ++} ++ ++void ++updatesystray(void) ++{ ++ XSetWindowAttributes wa; ++ XWindowChanges wc; ++ Client *i; ++ Monitor *m = systraytomon(NULL); ++ unsigned int x = m->mx + m->mw; ++ unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; ++ unsigned int w = 1; ++ ++ if (!showsystray) ++ return; ++ if (systrayonleft) ++ x -= sw + lrpad / 2; ++ if (!systray) { ++ /* init systray */ ++ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); ++ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); ++ wa.event_mask = ButtonPressMask | ExposureMask; ++ wa.override_redirect = True; ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XSelectInput(dpy, systray->win, SubstructureNotifyMask); ++ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, ++ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); ++ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); ++ XMapRaised(dpy, systray->win); ++ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); ++ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { ++ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); ++ XSync(dpy, False); ++ } ++ else { ++ fprintf(stderr, "dwm: unable to obtain system tray.\n"); ++ free(systray); ++ systray = NULL; ++ return; ++ } ++ } ++ for (w = 0, i = systray->icons; i; i = i->next) { ++ /* make sure the background color stays the same */ ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); ++ XMapRaised(dpy, i->win); ++ w += systrayspacing; ++ i->x = w; ++ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); ++ w += i->w; ++ if (i->mon != m) ++ i->mon = m; ++ } ++ w = w ? w + systrayspacing : 1; ++ x -= w; ++ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); ++ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; ++ wc.stack_mode = Above; wc.sibling = m->barwin; ++ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); ++ XMapWindow(dpy, systray->win); ++ XMapSubwindows(dpy, systray->win); ++ /* redraw background */ ++ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); ++ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); ++ XSync(dpy, False); + } + + void +@@ -2069,6 +2402,16 @@ wintoclient(Window w) + return NULL; + } + ++Client * ++wintosystrayicon(Window w) { ++ Client *i = NULL; ++ ++ if (!showsystray || !w) ++ return i; ++ for (i = systray->icons; i && i->win != w; i = i->next) ; ++ return i; ++} ++ + Monitor * + wintomon(Window w) + { +@@ -2122,6 +2465,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) + return -1; + } + ++Monitor * ++systraytomon(Monitor *m) { ++ Monitor *t; ++ int i, n; ++ if(!systraypinning) { ++ if(!m) ++ return selmon; ++ return m == selmon ? m : NULL; ++ } ++ for(n = 1, t = mons; t && t->next; n++, t = t->next) ; ++ for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; ++ if(systraypinningfailfirst && n < systraypinning) ++ return mons; ++ return t; ++} ++ + void + zoom(const Arg *arg) + { diff --git a/nixos/fonts.nix b/nixos/fonts.nix index 64d065b..4de6abf 100644 --- a/nixos/fonts.nix +++ b/nixos/fonts.nix @@ -1,29 +1,27 @@ -{pkgs, ...}: { - fonts.packages = with pkgs; [ - helvetica-neue-lt-std - aileron - corefonts - vistafonts - vistafonts-chs - noto-fonts - noto-fonts-cjk - noto-fonts-emoji - liberation_ttf - mplus-outline-fonts.githubRelease - dina-font - #proggyfonts - #glasstty-ttf - ( - nerdfonts.override { - fonts = [ - "FiraCode" - "IBMPlexMono" - "IntelOneMono" - "CascadiaMono" - "CommitMono" - "JetBrainsMono" - ]; - } - ) - ]; +{ pkgs, ... }: { + fonts.packages = with pkgs; + [ + helvetica-neue-lt-std + aileron + corefonts + vistafonts + vistafonts-chs + noto-fonts + noto-fonts-cjk-sans + noto-fonts-emoji + liberation_ttf + mplus-outline-fonts.githubRelease + dina-font + + #proggyfonts + #glasstty-ttf + ] + ++ (with nerd-fonts; [ + ubuntu-mono + jetbrains-mono + intone-mono + fira-code + commit-mono + blex-mono + ]); } diff --git a/nixos/greetd.nix b/nixos/greetd.nix index 212cde7..7222c85 100644 --- a/nixos/greetd.nix +++ b/nixos/greetd.nix @@ -1,16 +1,15 @@ -{ - pkgs, - config, - lib, - ... -}: let +{ pkgs +, ... +}: +let tuigreet = "${pkgs.greetd.tuigreet}/bin/tuigreet"; -in { +in +{ services.greetd = { enable = true; settings = { default_session = { - command = "${tuigreet} --time --remember --cmd Hyprland"; + command = "${tuigreet} --time --remember"; user = "greeter"; }; }; diff --git a/nixos/grub.nix b/nixos/grub.nix deleted file mode 100644 index 5af6773..0000000 --- a/nixos/grub.nix +++ /dev/null @@ -1,64 +0,0 @@ -{ - config, - pkgs, - ... -}: let - distro-grub-themes = pkgs.stdenv.mkDerivation { - pname = "distro-grub-themes"; - version = "3.1"; - src = pkgs.fetchFromGitHub { - owner = "AdisonCavani"; - repo = "distro-grub-themes"; - rev = "v3.1"; - hash = "sha256-ZcoGbbOMDDwjLhsvs77C7G7vINQnprdfI37a9ccrmPs="; - }; - installPhase = "cp -r customize/nixos $out"; - }; - xenlism-grub-themes = pkgs.stdenv.mkDerivation { - pname = "xenlism-grub-themes"; - version = "1.0"; - src = pkgs.fetchFromGitHub { - owner = "xenlism"; - repo = "Grub-themes"; - rev = "40ac048df9aacfc053c515b97fcd24af1a06762f"; - hash = "sha256-ProTKsFocIxWAFbYgQ46A+GVZ7mUHXxZrvdiPJqZJ6I="; - }; - installPhase = "cp -r xenlism-grub-1080p-nixos/Xenlism-Nixos $out"; - }; -in { - environment.systemPackages = with pkgs; [hack-font]; - boot.supportedFilesystems = ["ntfs"]; - #fileSystems."/mnt/winsys" = { - # device = "/dev/nvme0n1p5"; - # fsType = "ntfs-3g"; - # options = [ "rw" "uid=1000" ]; - #}; - #fileSystems."/mnt/windata" = { - # device = "/dev/nvme0n1p3"; - # fsType = "ntfs-3g"; - # options = [ "rw" "uid=1000" ]; - #}; - boot.loader = { - efi = { - canTouchEfiVariables = true; - }; - grub = { - enable = true; - efiSupport = true; - device = "nodev"; - fsIdentifier = "label"; - devices = ["nodev"]; - extraEntries = '' - menuentry "Reboot" { - reboot - } - menuentry "Poweroff" { - halt - } - ''; - useOSProber = true; - configurationLimit = 10; - theme = xenlism-grub-themes; - }; - }; -} diff --git a/nixos/hardware-configuration.nix b/nixos/hardware-configuration.nix index 29eca17..2691edf 100644 --- a/nixos/hardware-configuration.nix +++ b/nixos/hardware-configuration.nix @@ -1,21 +1,19 @@ # Do not modify this file! It was generated by ‘nixos-generate-config’ # and may be overwritten by future invocations. Please make changes # to /etc/nixos/configuration.nix instead. -{ - config, - lib, - pkgs, - modulesPath, - ... +{ config +, lib +, modulesPath +, ... }: { imports = [ (modulesPath + "/installer/scan/not-detected.nix") ]; - boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "usbhid"]; - boot.initrd.kernelModules = []; - boot.kernelModules = ["kvm-amd"]; - boot.extraModulePackages = []; + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "usbhid" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; fileSystems."/" = { device = "/dev/disk/by-uuid/f9ff609f-6e72-43cf-917c-3bd3fde6c410"; @@ -25,15 +23,9 @@ fileSystems."/boot" = { device = "/dev/disk/by-uuid/2E4F-3060"; fsType = "vfat"; - options = ["fmask=0022" "dmask=0022"]; + options = [ "fmask=0022" "dmask=0022" ]; }; - - fileSystems."/games" = { - device = "/dev/disk/by-uuid/492b4058-0507-456d-b694-a340222d35af"; - fsType = "ext4"; - }; - - swapDevices = []; + swapDevices = [ ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's @@ -44,5 +36,6 @@ # networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true; nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.enableAllFirmware = true; hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; } diff --git a/nixos/nvidia.nix b/nixos/nvidia.nix index efc198f..fa603e5 100644 --- a/nixos/nvidia.nix +++ b/nixos/nvidia.nix @@ -1,41 +1,41 @@ -{ - config, - lib, - pkgs, - ... +{ config +, pkgs +, ... }: { - specialisation = { - powersave.configuration = { - hardware.nvidia.prime = { - offload = { - enable = lib.mkForce true; - enableOffloadCmd = lib.mkForce true; - }; - sync.enable = lib.mkForce false; - }; - }; - }; - boot.kernelModules = ["nvidia_uvm"]; + #specialisation = { + # powersave.configuration = { + # hardware.nvidia.prime = { + # offload = { + # enable = lib.mkForce true; + # enableOffloadCmd = lib.mkForce true; + # }; + # sync.enable = lib.mkForce false; + # }; + # }; + #}; + boot.kernelModules = [ "nvidia_uvm" ]; hardware.graphics = { enable = true; extraPackages = with pkgs; [ libvdpau-va-gl ]; }; - services.xserver.videoDrivers = ["nvidia"]; + services.xserver.videoDrivers = [ "nvidia" ]; hardware.nvidia = { + dynamicBoost.enable = true; prime = { offload.enable = false; sync = { enable = true; }; - amdgpuBusId = "PCI:5:0:0"; + amdgpuBusId = "PCI:6:0:0"; nvidiaBusId = "PCI:1:0:0"; }; forceFullCompositionPipeline = true; + powerManagement.enable = true; modesetting.enable = true; - # open = true; + open = true; nvidiaSettings = true; - package = config.boot.kernelPackages.nvidiaPackages.beta; + package = config.boot.kernelPackages.nvidiaPackages.latest; }; } diff --git a/nixos/sddm-theme.nix b/nixos/sddm-theme.nix index 463038d..b285337 100644 --- a/nixos/sddm-theme.nix +++ b/nixos/sddm-theme.nix @@ -1,4 +1,4 @@ -{pkgs, ...}: +{ pkgs, ... }: pkgs.stdenv.mkDerivation { name = "sddm-theme"; src = pkgs.fetchFromGitHub { diff --git a/nixos/services/avahi.service.nix b/nixos/services/avahi.service.nix index 54bf88c..b0bd53f 100644 --- a/nixos/services/avahi.service.nix +++ b/nixos/services/avahi.service.nix @@ -1,7 +1,7 @@ -{...}: { +{ ... }: { services.avahi = { enable = true; - nssmdns = true; + nssmdns4 = true; openFirewall = true; }; } diff --git a/nixos/services/laptop.preset.nix b/nixos/services/laptop.preset.nix index 5b61276..152442b 100644 --- a/nixos/services/laptop.preset.nix +++ b/nixos/services/laptop.preset.nix @@ -1,4 +1,4 @@ -{...}: { +{ ... }: { imports = [ ./nginx.service.nix ./pipewire.service.nix @@ -7,5 +7,9 @@ ./avahi.service.nix ./printing.service.nix ./tailscale.service.nix + ./power_management.service.nix + #./seatd.service.nix + ./logind.service.nix + #./mpd.service.nix ]; } diff --git a/nixos/services/logind.service.nix b/nixos/services/logind.service.nix new file mode 100644 index 0000000..0c8225f --- /dev/null +++ b/nixos/services/logind.service.nix @@ -0,0 +1,10 @@ +{ ... +}: { + services.logind.extraConfig = '' + # don't shutdown in short press + HandlePowerKey=ignore + + # Milliseconds + IdleActionSec=600 + ''; +} diff --git a/nixos/services/misc.service.nix b/nixos/services/misc.service.nix index 6a10eb0..f204f44 100644 --- a/nixos/services/misc.service.nix +++ b/nixos/services/misc.service.nix @@ -1,4 +1,4 @@ -{...}: { +{ ... }: { #specialisation.powersave.configuration = { # services.auto-cpufreq.enable = true; #}; diff --git a/nixos/services/nginx.service.nix b/nixos/services/nginx.service.nix index 798f078..a627b30 100644 --- a/nixos/services/nginx.service.nix +++ b/nixos/services/nginx.service.nix @@ -1,4 +1,5 @@ -{pkgs, ...}: { +{ ... +}: { services.nginx = { enable = true; virtualHosts."localhost" = { @@ -11,11 +12,8 @@ ''; }; }; - listenAddresses = [ - "127.0.0.1" - "[::1]" - ]; + listenAddresses = [ "127.0.0.1" "[::1]" ]; }; }; - networking.firewall.allowedTCPPorts = [80]; + networking.firewall.allowedTCPPorts = [ 80 ]; } diff --git a/nixos/services/pipewire.service.nix b/nixos/services/pipewire.service.nix index 3781405..0cf6a8a 100644 --- a/nixos/services/pipewire.service.nix +++ b/nixos/services/pipewire.service.nix @@ -1,4 +1,5 @@ -{pkgs, ...}: { +{ pkgs, ... }: +{ services.pipewire = { enable = true; alsa = { @@ -8,7 +9,28 @@ pulse.enable = true; jack.enable = true; wireplumber.configPackages = [ - (pkgs.writeTextDir "share/wireplumber/bluetooth.lua.d/51-bluez-config.lua" '' + (pkgs.writeTextDir + "share/wireplumber/wireplumber.conf.d/52-profile-switch.conf" '' + wireplumber.settings = { + bluetooth.autoswitch-to-headset-profile = false + } + + monitor.bluez.properties = { + ## Supported roles: hsp_hs (HSP Headset), + ## hsp_ag (HSP Audio Gateway), + ## hfp_hf (HFP Hands-Free), + ## hfp_ag (HFP Audio Gateway) + ## a2dp_sink (A2DP Audio Sink) + ## a2dp_source (A2DP Audio Source) + ## bap_sink (LE Audio Basic Audio Profile Sink) + ## bap_source (LE Audio Basic Audio Profile Source) + ## -- + ## Only enable A2DP here and disable HFP. See note at the top as to why. + bluez5.roles = [ a2dp_sink a2dp_source ] + } + '') + (pkgs.writeTextDir + "share/wireplumber/bluetooth.lua.d/51-bluez-config.lua" '' bluez_monitor.properties = { ["bluez5.enable-sbc-xq"] = true, ["bluez5.enable-msbc"] = true, @@ -17,5 +39,6 @@ } '') ]; + #extraConfig.pipewire."99-input-denoising" = pw_rnnoise_config; }; } diff --git a/nixos/services/power_management.service.nix b/nixos/services/power_management.service.nix new file mode 100644 index 0000000..3c2cec2 --- /dev/null +++ b/nixos/services/power_management.service.nix @@ -0,0 +1,18 @@ +{ ... +}: { + /*services.tlp = { + enable = true; + settings = { + CPU_SCALING_GOVERNOR_ON_AC = "performance"; + CPU_SCALING_GOVERNOR_ON_BAT = "powersave"; + + CPU_ENERGY_PERF_POLICY_ON_BAT = "power"; + CPU_ENERGY_PERF_POLICY_ON_AC = "performance"; + + CPU_MIN_PERF_ON_AC = 0; + CPU_MAX_PERF_ON_AC = 100; + CPU_MIN_PERF_ON_BAT = 0; + CPU_MAX_PERF_ON_BAT = 20; + }; + };*/ +} diff --git a/nixos/services/printing.service.nix b/nixos/services/printing.service.nix index a89c732..88c01b2 100644 --- a/nixos/services/printing.service.nix +++ b/nixos/services/printing.service.nix @@ -1,6 +1,6 @@ -{...}: { +{ ... }: { services.printing = { enable = true; - drivers = []; + drivers = [ ]; }; } diff --git a/nixos/services/seatd.service.nix b/nixos/services/seatd.service.nix new file mode 100644 index 0000000..d738a79 --- /dev/null +++ b/nixos/services/seatd.service.nix @@ -0,0 +1,6 @@ +{ ... +}: { + services.seatd = { + enable = true; + }; +} diff --git a/nixos/services/syncthing.service.nix b/nixos/services/syncthing.service.nix index 47015e2..e285e0e 100644 --- a/nixos/services/syncthing.service.nix +++ b/nixos/services/syncthing.service.nix @@ -1,8 +1,5 @@ -{ - pkgs, - config, - lib, - ... +{ config +, ... }: { services = { syncthing = { @@ -12,6 +9,6 @@ configDir = "/home/${config.myUserName}/.config/syncthing"; }; }; - networking.firewall.allowedTCPPorts = [8384 22000]; - networking.firewall.allowedUDPPorts = [22000 21027]; + networking.firewall.allowedTCPPorts = [ 8384 22000 ]; + networking.firewall.allowedUDPPorts = [ 22000 21027 ]; } diff --git a/nixos/services/tailscale.service.nix b/nixos/services/tailscale.service.nix index d0fbde1..0b7e27a 100644 --- a/nixos/services/tailscale.service.nix +++ b/nixos/services/tailscale.service.nix @@ -1,7 +1,4 @@ -{ - pkgs, - config, - ... +{ ... }: { services.tailscale = { enable = true; diff --git a/nixos/spec.nix b/nixos/spec.nix new file mode 100644 index 0000000..2df9e6a --- /dev/null +++ b/nixos/spec.nix @@ -0,0 +1,25 @@ +{ pkgs, lib, ... }: { + specialisation = { + wayland = { + configuration = { + programs = { + hyprland = { + enable = true; # enables Hyprland DM. + #withUWSM = true; # NEW Universal Wayland Session Manager + }; + }; + }; + }; + xorg = { + configuration = lib.recursiveUpdate + { + services.xserver.displayManager.startx.enable = true; + } + (import ./dwm { + #inherit config; + inherit pkgs; + #inherit lib; + }); + }; + }; +} diff --git a/nixos/virtualisation.nix b/nixos/virtualisation.nix index dfc8896..0fcadcf 100644 --- a/nixos/virtualisation.nix +++ b/nixos/virtualisation.nix @@ -1,14 +1,20 @@ -{ - pkgs, - lib, - config, - ... +{ config +, pkgs +, ... }: { - virtualisation.libvirtd.enable = true; + virtualisation = { + libvirtd.enable = true; + # waydroid.enable = true; + podman = { + enable = true; + dockerCompat = true; + }; + }; + environment.systemPackages = [ pkgs.distrobox pkgs.distrobox-tui ]; programs.virt-manager.enable = true; #virtualisation.vmware.host.enable = true; #virtualisation.virtualbox.host = { # enable = true; #}; - users.users."${config.myUserName}".extraGroups = ["libvirtd"]; + users.users."${config.myUserName}".extraGroups = [ "libvirtd" ]; }