From 026208109467e27b52953382074d24ce8acadd0a Mon Sep 17 00:00:00 2001 From: Kat Inskip Date: Tue, 17 Jun 2025 16:41:48 -0700 Subject: [PATCH] many changes --- discord.css | 15 + flake.lock | 1023 +++++++++-- flake.nix | 17 + home/environments/hyprland/hyprland.nix | 210 +++ home/environments/hyprland/hyprlock.nix | 5 + home/environments/hyprland/waybar.nix | 120 ++ home/environments/hyprland/wlogout.nix | 5 + home/environments/hyprland/wofi.nix | 12 + home/environments/i3/conky/components.lua | 45 +- home/environments/i3/conky/conky.conf | 4 +- home/environments/i3/conky/conky.nix | 4 +- home/environments/kde/kde.nix | 1 + home/environments/kde/konawall.nix | 42 - home/profiles/graphical/discord.nix | 5 +- home/profiles/graphical/floorp/main.nix | 1 + home/profiles/graphical/packages.nix | 5 +- home/profiles/graphical/spotify.nix | 22 + home/profiles/graphical/taskwarrior.nix | 7 + home/profiles/graphical/wezterm.nix | 2 +- home/profiles/neovim/default.nix | 9 +- home/profiles/neovim/init.lua | 7 + nixos/environments/hyprland/hyprland.nix | 5 + nixos/environments/hyprland/xdg-portals.nix | 11 + nixos/environments/i3/xdg.nix | 12 + nixos/profiles/gaming/lutris.nix | 12 + nixos/profiles/gaming/ntsync.nix | 3 + nixos/profiles/gaming/sound.nix | 5 + nixos/profiles/gaming/steam.nix | 6 +- nixos/profiles/gaming/vr.nix | 45 + nixos/profiles/graphical/packages.nix | 6 + nixos/profiles/graphical/sound.nix | 20 +- nixos/servers/weechat/secrets.yaml | 12 +- overlays.nix | 2 +- packages/dorion.nix | 194 ++ packages/lutris.nix | 324 ++++ packages/no-cargo-patch.patch | 32 + packages/umu-launcher-unwrapped.nix | 106 ++ packages/umu-proton-cachyos.patch | 1829 +++++++++++++++++++ systems/goliath.nix | 31 + tree.nix | 6 + vr/arguments | 1 + vr/bs-manager.sh | 1 + vr/wired.sh | 2 + 43 files changed, 4022 insertions(+), 204 deletions(-) create mode 100644 discord.css create mode 100644 home/environments/hyprland/hyprland.nix create mode 100644 home/environments/hyprland/hyprlock.nix create mode 100644 home/environments/hyprland/waybar.nix create mode 100644 home/environments/hyprland/wlogout.nix create mode 100644 home/environments/hyprland/wofi.nix delete mode 100644 home/environments/kde/konawall.nix create mode 100644 home/profiles/graphical/spotify.nix create mode 100644 home/profiles/graphical/taskwarrior.nix create mode 100644 nixos/environments/hyprland/hyprland.nix create mode 100644 nixos/environments/hyprland/xdg-portals.nix create mode 100644 nixos/environments/i3/xdg.nix create mode 100644 nixos/profiles/gaming/ntsync.nix create mode 100644 nixos/profiles/gaming/sound.nix create mode 100644 nixos/profiles/gaming/vr.nix create mode 100644 packages/dorion.nix create mode 100644 packages/lutris.nix create mode 100644 packages/no-cargo-patch.patch create mode 100644 packages/umu-launcher-unwrapped.nix create mode 100644 packages/umu-proton-cachyos.patch create mode 100644 vr/arguments create mode 100755 vr/bs-manager.sh create mode 100755 vr/wired.sh diff --git a/discord.css b/discord.css new file mode 100644 index 00000000..aeb4ad73 --- /dev/null +++ b/discord.css @@ -0,0 +1,15 @@ +@import url("https://aushevahmad.github.io/awesome-css/modules/custom-bar-prompt.css"); +@import url("https://raw.githubusercontent.com/tom22k/discord-css/main/Themes/HideNitroUpsellV2.css"); +@import url("https://minidiscordthemes.github.io/Snippets/AltTextImprovements/main.css"); + +:root { + /* do you want to see your quests/billing/nitro settings? */ + /* yes, I want to see it -> --billing: block !important; */ + /* no, hide it -> --billing: none; */ + --billing: none; + /* do you want to see server boosting/server shop upsell? */ + /* yes, I want to see it -> --boosting: block !important; */ + /* no, hide it -> --boosting: none; */ + --boosting: none; + --prompt-text: "be silly :3"; +} diff --git a/flake.lock b/flake.lock index 1b8fb056..2b5ec673 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,38 @@ { "nodes": { + "aquamarine": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749155310, + "narHash": "sha256-t0HfHg/1+TbSra5s6nNM0o4tnb3uqWedShSpZXsUMYY=", + "owner": "hyprwm", + "repo": "aquamarine", + "rev": "94981cf75a9f11da0b6dd6a1abbd7c50a36ab2d3", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "aquamarine", + "type": "github" + } + }, "arcexprs": { "inputs": { "nixpkgs": "nixpkgs" @@ -75,11 +108,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1745598511, - "narHash": "sha256-GWYB7PngGwTJrp7gr0w6E5nnvwiblPvN2kjRCQw3ZEg=", + "lastModified": 1750013871, + "narHash": "sha256-UQx3rC3QDjD/sIen51+5Juk1rqN3y/sTeMY1WinmhqQ=", "owner": "catppuccin", "repo": "nix", - "rev": "199cb288a85b15ed203089804c024ae5b3eacd7c", + "rev": "fe78fa558d6603481c03eb03a946eadb970d1801", "type": "github" }, "original": { @@ -97,11 +130,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1746029351, - "narHash": "sha256-PG/OGF7G+/3fbXfakaFJ/jJX2WyYcnhQvqWriRgfRfU=", + "lastModified": 1750098200, + "narHash": "sha256-BtCFs/Ixxn6mEE2zGA/wIH+tR+psjobxs8SXVUyEiiI=", "owner": "chaotic-cx", "repo": "nyx", - "rev": "98595cc6a1ef82a96fafb02d29b65940e402c3e6", + "rev": "0d0115e6b3e2dce6d2260c7bb3fe894b1cc6b9a6", "type": "github" }, "original": { @@ -150,11 +183,11 @@ ] }, "locked": { - "lastModified": 1745816321, - "narHash": "sha256-Gyh/fkCDqVNGM0BWvk+4UAS17w2UI6iwnbQQCmc1TDI=", + "lastModified": 1749873626, + "narHash": "sha256-1Mc/D/1RwwmDKY59f4IpDBgcQttxffm+4o0m67lQ8hc=", "owner": "lnl7", "repo": "nix-darwin", - "rev": "4515dacafb0ccd42e5395aacc49fd58a43027e01", + "rev": "2f140d6ac8840c6089163fb43ba95220c230f22b", "type": "github" }, "original": { @@ -177,11 +210,11 @@ ] }, "locked": { - "lastModified": 1727447169, - "narHash": "sha256-3KyjMPUKHkiWhwR91J1YchF6zb6gvckCAY1jOE+ne0U=", + "lastModified": 1749105467, + "narHash": "sha256-hXh76y/wDl15almBcqvjryB50B0BaiXJKk20f314RoE=", "owner": "serokell", "repo": "deploy-rs", - "rev": "aa07eb05537d4cd025e2310397a6adcedfe72c76", + "rev": "6bc76b872374845ba9d645a2f012b764fecd765f", "type": "github" }, "original": { @@ -215,11 +248,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1745995211, - "narHash": "sha256-hf6Xu3KS06WyE/3dqV96iLGx3jIYQq9e68iCEFHrt04=", + "lastModified": 1750056063, + "narHash": "sha256-PGQjkjaj8XUa19tGZi0GHbnCzol4YHurA4pyifmhrs0=", "owner": "nix-community", "repo": "fenix", - "rev": "0db04339c4e4c0fd42dbbaebe3590a67cbd12aa3", + "rev": "879b4b73522a78529778ce2eb6f3374d1016cf8f", "type": "github" }, "original": { @@ -263,11 +296,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1733328505, - "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "lastModified": 1747046372, + "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", "owner": "edolstra", "repo": "flake-compat", - "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", "type": "github" }, "original": { @@ -279,11 +312,11 @@ "flake-compat_2": { "flake": false, "locked": { - "lastModified": 1641205782, - "narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "owner": "edolstra", "repo": "flake-compat", - "rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { @@ -309,6 +342,36 @@ } }, "flake-compat_4": { + "flake": false, + "locked": { + "lastModified": 1641205782, + "narHash": "sha256-4jY7RCWUoZ9cKD8co0/4tFARpWB+57+r1bLLvXNJliY=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "b7547d3eed6f32d06102ead8991ec52ab0a4f1a7", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-compat_5": { + "locked": { + "lastModified": 1733328505, + "narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=", + "rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec", + "revCount": 69, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.1.0/01948eb7-9cba-704f-bbf3-3fa956735b52/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz" + } + }, + "flake-compat_6": { "flake": false, "locked": { "lastModified": 1733328505, @@ -324,7 +387,7 @@ "type": "github" } }, - "flake-compat_5": { + "flake-compat_7": { "flake": false, "locked": { "lastModified": 1650374568, @@ -362,6 +425,24 @@ } }, "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1749398372, + "narHash": "sha256-tYBdgS56eXYaWVW3fsnPQ/nFlgWi/Z2Ymhyu21zVM98=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9305fe4e5c2a6fcf5ba6a3ff155720fbe4076569", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_3": { "inputs": { "nixpkgs-lib": [ "nur", @@ -398,7 +479,7 @@ }, "flake-utils": { "inputs": { - "systems": "systems" + "systems": "systems_2" }, "locked": { "lastModified": 1731533236, @@ -416,7 +497,7 @@ }, "flake-utils-plus": { "inputs": { - "flake-utils": "flake-utils_4" + "flake-utils": "flake-utils_5" }, "locked": { "lastModified": 1715533576, @@ -465,7 +546,25 @@ }, "flake-utils_4": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "inputs": { + "systems": "systems_4" }, "locked": { "lastModified": 1694529238, @@ -559,6 +658,28 @@ } }, "gitignore": { + "inputs": { + "nixpkgs": [ + "hyprland", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "gitignore_2": { "inputs": { "nixpkgs": [ "lanzaboote", @@ -583,16 +704,16 @@ "harfbuzz": { "flake": false, "locked": { - "lastModified": 1719502711, - "narHash": "sha256-2ieCf3ftNk851FZBDPVl+7QHWBqD729KiUxUyxi26Yg=", + "lastModified": 1747068667, + "narHash": "sha256-VxN0lsFnW0vHnIXZ806Lg2NU0/ESnE6z249mXPhfas8=", "owner": "harfbuzz", "repo": "harfbuzz", - "rev": "9c03576c49db6e7207d9bcdfe3abd170a809157f", + "rev": "33a3f8de60dcad7535f14f07d6710144548853ac", "type": "github" }, "original": { "owner": "harfbuzz", - "ref": "9.0.0", + "ref": "11.2.1", "repo": "harfbuzz", "type": "github" } @@ -605,11 +726,11 @@ ] }, "locked": { - "lastModified": 1745987135, - "narHash": "sha256-8Up4QPuMZEJBU0eefAY+nUe7DYKQQzvaHnMpNdwRgKA=", + "lastModified": 1750033262, + "narHash": "sha256-TcFN78w6kPspxpbPsxW/8vQ1GAtY8Y3mjBaC+oB8jo4=", "owner": "nix-community", "repo": "home-manager", - "rev": "d2b3e6c83d457aa0e7f9344c61c3fed32bad0f7e", + "rev": "66523b0efe93ce5b0ba96dcddcda15d36673c1f0", "type": "github" }, "original": { @@ -625,11 +746,11 @@ ] }, "locked": { - "lastModified": 1746134275, - "narHash": "sha256-sxfY7TIP59o2hcueanoRAtg833PiNroZkQDwlKJxGvs=", + "lastModified": 1750127463, + "narHash": "sha256-K2xFtlD3PcKAZriOE3LaBLYmVfGQu+rIF4Jr1RFYR0Q=", "owner": "nix-community", "repo": "home-manager", - "rev": "015f1913109d44c36e683b55f0e47e283b383caa", + "rev": "28eef8722d1af18ca13e687dbf485e1c653a0402", "type": "github" }, "original": { @@ -639,6 +760,265 @@ "type": "github" } }, + "hyprcursor": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749155331, + "narHash": "sha256-XR9fsI0zwLiFWfqi/pdS/VD+YNorKb3XIykgTg4l1nA=", + "owner": "hyprwm", + "repo": "hyprcursor", + "rev": "45fcc10b4c282746d93ec406a740c43b48b4ef80", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprcursor", + "type": "github" + } + }, + "hyprgraphics": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749238452, + "narHash": "sha256-8qiKEWcxUrjpUpK+WyFNg/72C8rp70LUuyTD23T+SdQ=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "c7225d73755a6c4c7c72f4d4f3925ea426e325a8", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", + "type": "github" + } + }, + "hyprland": { + "inputs": { + "aquamarine": "aquamarine", + "hyprcursor": "hyprcursor", + "hyprgraphics": "hyprgraphics", + "hyprland-protocols": "hyprland-protocols", + "hyprland-qtutils": "hyprland-qtutils", + "hyprlang": "hyprlang", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "nixpkgs": "nixpkgs_4", + "pre-commit-hooks": "pre-commit-hooks", + "systems": "systems", + "xdph": "xdph" + }, + "locked": { + "lastModified": 1750106438, + "narHash": "sha256-zaTFR6NLaXkveEGl2kdl4UlvT7eHm3cYSbgSkibCO+M=", + "owner": "hyprwm", + "repo": "Hyprland", + "rev": "0ece4af36a988ad06b28ed666011d84372d9e4dc", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "Hyprland", + "type": "github" + } + }, + "hyprland-protocols": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749046714, + "narHash": "sha256-kymV5FMnddYGI+UjwIw8ceDjdeg7ToDVjbHCvUlhn14=", + "owner": "hyprwm", + "repo": "hyprland-protocols", + "rev": "613878cb6f459c5e323aaafe1e6f388ac8a36330", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-protocols", + "type": "github" + } + }, + "hyprland-qt-support": { + "inputs": { + "hyprlang": [ + "hyprland", + "hyprland-qtutils", + "hyprlang" + ], + "nixpkgs": [ + "hyprland", + "hyprland-qtutils", + "nixpkgs" + ], + "systems": [ + "hyprland", + "hyprland-qtutils", + "systems" + ] + }, + "locked": { + "lastModified": 1749154592, + "narHash": "sha256-DO7z5CeT/ddSGDEnK9mAXm1qlGL47L3VAHLlLXoCjhE=", + "owner": "hyprwm", + "repo": "hyprland-qt-support", + "rev": "4c8053c3c888138a30c3a6c45c2e45f5484f2074", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qt-support", + "type": "github" + } + }, + "hyprland-qtutils": { + "inputs": { + "hyprland-qt-support": "hyprland-qt-support", + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprland-qtutils", + "hyprlang", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749155776, + "narHash": "sha256-t1PM0wxQLQwv2F2AW23uA7pm5giwmcgYEWbNIRct9r4=", + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "rev": "396e8aa1c06274835b69da7f9a015fff9a9b7522", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprland-qtutils", + "type": "github" + } + }, + "hyprlang": { + "inputs": { + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749145882, + "narHash": "sha256-qr0KXeczF8Sma3Ae7+dR2NHhvG7YeLBJv19W4oMu6ZE=", + "owner": "hyprwm", + "repo": "hyprlang", + "rev": "1bfb84f54d50c7ae6558c794d3cfd5f6a7e6e676", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprlang", + "type": "github" + } + }, + "hyprutils": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749819919, + "narHash": "sha256-7F/KG8dwSH9JXdlpOVrEEArS+PJSn0iEnx5eVCk89/I=", + "owner": "hyprwm", + "repo": "hyprutils", + "rev": "57ab2a867d8b554ad89f29060c15efd11631db91", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprutils", + "type": "github" + } + }, + "hyprwayland-scanner": { + "inputs": { + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749145760, + "narHash": "sha256-IHaGWpGrv7seFWdw/1A+wHtTsPlOGIKMrk1TUIYJEFI=", + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "rev": "817918315ea016cc2d94004bfb3223b5fd9dfcc6", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, "infrastructure": { "inputs": { "arcexprs": [ @@ -703,11 +1083,11 @@ ] }, "locked": { - "lastModified": 1745487384, - "narHash": "sha256-WvQ4XXi0vMtEpPqhfo8ztxjeaeHkbW5tfR4O5+w8r5U=", + "lastModified": 1749627191, + "narHash": "sha256-bUv8CDE6Uyxak4UkOvRjx5xj6+msEHSpYGeAjkuTnTs=", "owner": "Jovian-Experiments", "repo": "Jovian-NixOS", - "rev": "0168e4a65c9d43c22ac38ff27f5fa31c7d535148", + "rev": "f31df4cb6b2eeef6cf0113edb687297be72a69df", "type": "github" }, "original": { @@ -797,11 +1177,11 @@ ] }, "locked": { - "lastModified": 1746151214, - "narHash": "sha256-rwimRjWUa4EgjWo8YU8GWL/D4ZDBHkE32y/DtBP0RwE=", + "lastModified": 1750126013, + "narHash": "sha256-l6WppJJoSfQrca/lhxpK1lmsQomYcMCNfyXi8AKLe0Q=", "owner": "Infinidoge", "repo": "nix-minecraft", - "rev": "a97ba80db972f4a9ebb86948644d9c7cd95fc546", + "rev": "e8084a739aa33d9c72540cc6b4623c779f84176f", "type": "github" }, "original": { @@ -810,14 +1190,33 @@ "type": "github" } }, + "naersk": { + "inputs": { + "nixpkgs": "nixpkgs_13" + }, + "locked": { + "lastModified": 1717067539, + "narHash": "sha256-oIs5EF+6VpHJRvvpVWuqCYJMMVW/6h59aYUv9lABLtY=", + "owner": "nix-community", + "repo": "naersk", + "rev": "fa19d8c135e776dc97f4dcca08656a0eeb28d5c0", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "master", + "repo": "naersk", + "type": "github" + } + }, "neorg": { "flake": false, "locked": { - "lastModified": 1746047774, - "narHash": "sha256-xm2+uqmQB8tP5/zIwbOicEBNLSEftmgu96squLRSY3c=", + "lastModified": 1749805422, + "narHash": "sha256-q3wIdHnAgCUczum+1WhrcxO2Nf6chN/IeRHjB1v2tI4=", "owner": "nvim-neorg", "repo": "neorg", - "rev": "8fdd9b2986acfb4ce310bebfc338111793862f00", + "rev": "9d75ae8e2625db240636870dd7f029c9a82ab9ef", "type": "github" }, "original": { @@ -831,16 +1230,16 @@ "flake-utils": "flake-utils", "neorg": "neorg", "neorg-telescope": "neorg-telescope", - "nixpkgs": "nixpkgs_4", + "nixpkgs": "nixpkgs_5", "norg": "norg", "norg-meta": "norg-meta" }, "locked": { - "lastModified": 1746155192, - "narHash": "sha256-m/E2vdTLLyfthf2Z71BAYKBq2THX5PY9H6wKr9Jll/g=", + "lastModified": 1749990869, + "narHash": "sha256-+YCYXwiVxmBvoKGzmUrjyIWxQl6/9vnWgpwKDy1NHgQ=", "owner": "nvim-neorg", "repo": "nixpkgs-neorg-overlay", - "rev": "41f1b7625f9b4261f732a457ef8f68c30e8057ff", + "rev": "f6592fb7c723e11dc1de152d5c30be7af1987ced", "type": "github" }, "original": { @@ -865,6 +1264,40 @@ "type": "github" } }, + "nix-filter": { + "locked": { + "lastModified": 1693833173, + "narHash": "sha256-hlMABKrGbEiJD5dwUSfnw1CQ3bG7KKwDV+Nx3bEZd7U=", + "owner": "numtide", + "repo": "nix-filter", + "rev": "ac030bd9ba98e318e1f4c4328d60766ade8ebe8b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "nix-filter", + "type": "github" + } + }, + "nix-gaming": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_8" + }, + "locked": { + "lastModified": 1750125577, + "narHash": "sha256-4c7D0pOt9pPsQ3QADdnta9vPZbzy12X7jIOp6WBi9Lg=", + "owner": "fufexan", + "repo": "nix-gaming", + "rev": "d904fbbf9cc01cc87b9d458134eecf70442b0776", + "type": "github" + }, + "original": { + "owner": "fufexan", + "repo": "nix-gaming", + "type": "github" + } + }, "nix-github-actions": { "inputs": { "nixpkgs": [ @@ -895,11 +1328,11 @@ ] }, "locked": { - "lastModified": 1746054057, - "narHash": "sha256-iR+idGZJ191cY6NBXyVjh9QH8GVWTkvZw/w+1Igy45A=", + "lastModified": 1749960154, + "narHash": "sha256-EWlr9MZDd+GoGtZB4QsDzaLyaDQPGnRY03MFp6u2wSg=", "owner": "Mic92", "repo": "nix-index-database", - "rev": "13ba07d54c6ccc5af30a501df669bf3fe3dd4db8", + "rev": "424a40050cdc5f494ec45e46462d288f08c64475", "type": "github" }, "original": { @@ -908,6 +1341,24 @@ "type": "github" } }, + "nix-proton-cachyos": { + "inputs": { + "nixpkgs": "nixpkgs_9" + }, + "locked": { + "lastModified": 1749595577, + "narHash": "sha256-0unQxKcv581jRN9yQHTRpzN//veQdwsRiTCBaHKf+Ck=", + "owner": "kittywitch", + "repo": "nix-proton-cachyos", + "rev": "77c30b128c6290ec41a9834aea6c2539884c95ba", + "type": "github" + }, + "original": { + "owner": "kittywitch", + "repo": "nix-proton-cachyos", + "type": "github" + } + }, "nix-std": { "locked": { "lastModified": 1701658249, @@ -940,11 +1391,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1745955289, - "narHash": "sha256-mmV2oPhQN+YF2wmnJzXX8tqgYmUYXUj3uUUBSTmYN5o=", + "lastModified": 1750083401, + "narHash": "sha256-ynqbgIYrg7P1fAKYqe8I/PMiLABBcNDYG9YaAP/d/C4=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "72081c9fbbef63765ae82bff9727ea79cc86bd5b", + "rev": "61837d2a33ccc1582c5fabb7bf9130d39fee59ad", "type": "github" }, "original": { @@ -983,6 +1434,21 @@ "type": "github" } }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1748740939, + "narHash": "sha256-rQaysilft1aVMwF14xIdGS3sj1yHlI6oKQNBRTF40cc=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "656a64127e9d791a334452c6b6606d17539476e2", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "nixpkgs-stable": { "locked": { "lastModified": 1730741070, @@ -999,6 +1465,117 @@ "type": "github" } }, + "nixpkgs-xr": { + "inputs": { + "flake-compat": "flake-compat_5", + "flake-utils": "flake-utils_4", + "nixpkgs": "nixpkgs_11", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1750123866, + "narHash": "sha256-6eZtzIbBJtEpEi9/jz3QVLmURpIWDIebDrjj8s1ICWE=", + "owner": "nix-community", + "repo": "nixpkgs-xr", + "rev": "4b3a0f27e719d61b9f94731a1e7cc008cf18cb20", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs-xr", + "type": "github" + } + }, + "nixpkgs_10": { + "locked": { + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_11": { + "locked": { + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_12": { + "locked": { + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_13": { + "locked": { + "lastModified": 0, + "narHash": "sha256-9YrUjdztqi4Gz8n3mBuqvCkMo4ojrA6nASwyIKWMpus=", + "path": "/nix/store/dydg48djlykksz8cxq0xjplyxpa9pvf4-source", + "type": "path" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_14": { + "locked": { + "lastModified": 1724517639, + "narHash": "sha256-3eTrclsS5OYShbw0MRiiF3GJ8emUTwVzAZo96pdD7hM=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "9edd5ddbd2453e22d4c4820992563c7ba0930f7a", + "type": "github" + }, + "original": { + "id": "nixpkgs", + "type": "indirect" + } + }, + "nixpkgs_15": { + "locked": { + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs_2": { "locked": { "lastModified": 1744463964, @@ -1017,11 +1594,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1745930157, - "narHash": "sha256-y3h3NLnzRSiUkYpnfvnS669zWZLoqqI6NprtLQ+5dck=", + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "46e634be05ce9dc6d4db8e664515ba10b78151ae", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", "type": "github" }, "original": { @@ -1033,27 +1610,27 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1746123514, - "narHash": "sha256-UNO+MbVHLl4AkVWYqekk72/gqFNSLYNkBgto7h+7P3U=", + "lastModified": 1749794982, + "narHash": "sha256-Kh9K4taXbVuaLC0IL+9HcfvxsSUx8dPB5s5weJcc9pc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b5dd9efc912ecabeafa4f082d31e19cb1c74266c", + "rev": "ee930f9755f58096ac6e8ca94a1887e0534e2d81", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixpkgs-unstable", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_5": { "locked": { - "lastModified": 1644486793, - "narHash": "sha256-EeijR4guVHgVv+JpOX3cQO+1XdrkJfGmiJ9XVsVU530=", + "lastModified": 1749903597, + "narHash": "sha256-jp0D4vzBcRKwNZwfY4BcWHemLGUs4JrS3X9w5k/JYDA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1882c6b7368fd284ad01b0a5b5601ef136321292", + "rev": "41da1e3ea8e23e094e5e3eeb1e6b830468a7399e", "type": "github" }, "original": { @@ -1081,55 +1658,57 @@ }, "nixpkgs_7": { "locked": { - "lastModified": 1746064326, - "narHash": "sha256-r7IZkN9NhK/IO9/J6D9ih2P1OXb67nr5HaQ1YAte18w=", - "owner": "nixos", + "lastModified": 1644486793, + "narHash": "sha256-EeijR4guVHgVv+JpOX3cQO+1XdrkJfGmiJ9XVsVU530=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "91bf6dffa21c7709607c9fdbf9a6acb44e7a0a5d", + "rev": "1882c6b7368fd284ad01b0a5b5601ef136321292", "type": "github" }, "original": { - "owner": "nixos", - "ref": "nixos-unstable", + "owner": "NixOS", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_8": { "locked": { - "lastModified": 1746064326, - "narHash": "sha256-r7IZkN9NhK/IO9/J6D9ih2P1OXb67nr5HaQ1YAte18w=", - "owner": "nixos", + "lastModified": 1749871736, + "narHash": "sha256-K9yBph93OLTNw02Q6e9CYFGrUhvEXnh45vrZqIRWfvQ=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "91bf6dffa21c7709607c9fdbf9a6acb44e7a0a5d", + "rev": "6afe187897bef7933475e6af374c893f4c84a293", "type": "github" }, "original": { - "owner": "nixos", - "ref": "nixos-unstable", + "owner": "NixOS", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_9": { "locked": { - "lastModified": 1724517639, - "narHash": "sha256-3eTrclsS5OYShbw0MRiiF3GJ8emUTwVzAZo96pdD7hM=", - "owner": "NixOS", + "lastModified": 1730272153, + "narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "9edd5ddbd2453e22d4c4820992563c7ba0930f7a", + "rev": "2d2a9ddbe3f2c00747398f3dc9b05f7f2ebb0f53", "type": "github" }, "original": { - "id": "nixpkgs", - "type": "indirect" + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" } }, "norg": { "inputs": { - "flake-compat": "flake-compat_2", + "flake-compat": "flake-compat_3", "flake-utils": "flake-utils_2", - "nixpkgs": "nixpkgs_5" + "nixpkgs": "nixpkgs_6" }, "locked": { "lastModified": 1672582520, @@ -1148,9 +1727,9 @@ }, "norg-meta": { "inputs": { - "flake-compat": "flake-compat_3", + "flake-compat": "flake-compat_4", "flake-utils": "flake-utils_3", - "nixpkgs": "nixpkgs_6" + "nixpkgs": "nixpkgs_7" }, "locked": { "lastModified": 1713028366, @@ -1168,16 +1747,16 @@ }, "nur": { "inputs": { - "flake-parts": "flake-parts_2", - "nixpkgs": "nixpkgs_8", - "treefmt-nix": "treefmt-nix" + "flake-parts": "flake-parts_3", + "nixpkgs": "nixpkgs_12", + "treefmt-nix": "treefmt-nix_2" }, "locked": { - "lastModified": 1746159549, - "narHash": "sha256-lRsg2m19VH13/MDiGGFDpEVipF2cLwUZHVWKsnCDglg=", + "lastModified": 1750143150, + "narHash": "sha256-6u+bQRGVy4viR8SXljOn32HtSWr4Z+BNlWdy/VJL3l4=", "owner": "nix-community", "repo": "NUR", - "rev": "8dd03dc423f74894bb985828c4d4f905e3efa88f", + "rev": "dddf6ee8c6a0dfc79b242c38e37ed13b2c325755", "type": "github" }, "original": { @@ -1196,11 +1775,11 @@ ] }, "locked": { - "lastModified": 1742765550, - "narHash": "sha256-2vVIh2JrL6GAGfgCeY9e6iNKrBjs0Hw3bGQEAbwVs68=", + "lastModified": 1748196248, + "narHash": "sha256-1iHjsH6/5UOerJEoZKE+Gx1BgAoge/YcnUsOA4wQ/BU=", "owner": "pjones", "repo": "plasma-manager", - "rev": "b70be387276e632fe51232887f9e04e2b6ef8c16", + "rev": "b7697abe89967839b273a863a3805345ea54ab56", "type": "github" }, "original": { @@ -1209,13 +1788,36 @@ "type": "github" } }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat_2", + "gitignore": "gitignore", + "nixpkgs": [ + "hyprland", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1749636823, + "narHash": "sha256-WUaIlOlPLyPgz9be7fqWJA5iG6rHcGRtLERSCfUDne4=", + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "623c56286de5a3193aa38891a6991b28f9bab056", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, "pre-commit-hooks-nix": { "inputs": { "flake-compat": [ "lanzaboote", "flake-compat" ], - "gitignore": "gitignore", + "gitignore": "gitignore_2", "nixpkgs": [ "lanzaboote", "nixpkgs" @@ -1236,10 +1838,35 @@ "type": "github" } }, + "push2talk": { + "inputs": { + "flake-utils": [ + "utils" + ], + "naersk": "naersk", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1718742709, + "narHash": "sha256-Dr0K3NB6HCpdQ4Dm1WzWmlPCn7nq7JRB7sZVXjtVYB8=", + "owner": "cyrinux", + "repo": "push2talk", + "rev": "046aa4ef25b08257e17a31939faed617e5372562", + "type": "github" + }, + "original": { + "owner": "cyrinux", + "ref": "main", + "repo": "push2talk", + "type": "github" + } + }, "rbw-bitw": { "inputs": { "flakelib": "flakelib_2", - "nixpkgs": "nixpkgs_9", + "nixpkgs": "nixpkgs_14", "rust": "rust_2" }, "locked": { @@ -1272,23 +1899,30 @@ "flakelib": "flakelib", "flakelibstd": "flakelibstd", "home-manager": "home-manager_2", + "hyprland": "hyprland", "infrastructure": "infrastructure", "konawall-py": "konawall-py", "lanzaboote": "lanzaboote", "minecraft": "minecraft", "neorg-overlay": "neorg-overlay", + "nix-gaming": "nix-gaming", "nix-index-database": "nix-index-database", + "nix-proton-cachyos": "nix-proton-cachyos", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_7", + "nixpkgs": "nixpkgs_10", + "nixpkgs-xr": "nixpkgs-xr", "nur": "nur", "plasma-manager": "plasma-manager", + "push2talk": "push2talk", "rbw-bitw": "rbw-bitw", "scalpel": "scalpel", "solaar": "solaar", "sops-nix": "sops-nix", "spacebar": "spacebar", + "spicetify-nix": "spicetify-nix", + "split-monitor-workspaces": "split-monitor-workspaces", "std": "std_2", - "systems": "systems_3", + "systems": "systems_6", "tree": "tree_2", "utils": "utils", "wezterm": "wezterm", @@ -1320,11 +1954,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1745949276, - "narHash": "sha256-9ZK31t2HUiGdLLnDafrRnSrrO12JwqcAFbrJ9nRwh0Y=", + "lastModified": 1750005282, + "narHash": "sha256-VXLDkb1iOw7wWhgOgBMP9hTcpW6Eo399YbBif5hlxS8=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "78a488dd5e7e4f17162001519665795e6e68b6f8", + "rev": "a207299344bf7797e4253c3f6130313e33c2ba6f", "type": "github" }, "original": { @@ -1363,11 +1997,11 @@ ] }, "locked": { - "lastModified": 1735871325, - "narHash": "sha256-6Ta5E4mhSfCP6LdkzkG2+BciLOCPeLKuYTJ6lOHW+mI=", + "lastModified": 1747449297, + "narHash": "sha256-veyXchTz6eWwvuW5X49UluHkheHkFcqHJSwGuKBhrmQ=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "a599f011db521766cbaf7c2f5874182485554f00", + "rev": "f44db7d7cea4528288780c6347756173a8248225", "type": "github" }, "original": { @@ -1425,7 +2059,7 @@ }, "snowfall-lib": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": "flake-compat_7", "flake-utils-plus": "flake-utils-plus", "nixpkgs": [ "solaar", @@ -1449,7 +2083,7 @@ }, "solaar": { "inputs": { - "flake-compat": "flake-compat_4", + "flake-compat": "flake-compat_6", "nixpkgs": [ "nixpkgs" ], @@ -1475,11 +2109,11 @@ ] }, "locked": { - "lastModified": 1745310711, - "narHash": "sha256-ePyTpKEJTgX0gvgNQWd7tQYQ3glIkbqcW778RpHlqgA=", + "lastModified": 1750119275, + "narHash": "sha256-Rr7Pooz9zQbhdVxux16h7URa6mA80Pb/G07T4lHvh0M=", "owner": "Mic92", "repo": "sops-nix", - "rev": "5e3e92b16d6fdf9923425a8d4df7496b2434f39c", + "rev": "77c423a03b9b2b79709ea2cb63336312e78b72e2", "type": "github" }, "original": { @@ -1512,6 +2146,46 @@ "type": "github" } }, + "spicetify-nix": { + "inputs": { + "nixpkgs": "nixpkgs_15", + "systems": "systems_5" + }, + "locked": { + "lastModified": 1749961984, + "narHash": "sha256-1Nmycj9cVUIkoDsVEn9k8SGMS9V+BcBUL+rDXNapslw=", + "owner": "Gerg-L", + "repo": "spicetify-nix", + "rev": "c9f12a733e8edcf8d408ccd178c1a11e753ffa08", + "type": "github" + }, + "original": { + "owner": "Gerg-L", + "repo": "spicetify-nix", + "type": "github" + } + }, + "split-monitor-workspaces": { + "inputs": { + "hyprland": [ + "hyprland" + ], + "nix-filter": "nix-filter" + }, + "locked": { + "lastModified": 1749573726, + "narHash": "sha256-Bj11uVqKPHI2sKsXMQdVhdMMbJ403Ps6x4jOcmVfr2Q=", + "owner": "Duckonaut", + "repo": "split-monitor-workspaces", + "rev": "a0015f8ba44bc194916dc797501ea06823c51926", + "type": "github" + }, + "original": { + "owner": "Duckonaut", + "repo": "split-monitor-workspaces", + "type": "github" + } + }, "std": { "inputs": { "nix-std": "nix-std_2" @@ -1591,16 +2265,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" } }, @@ -1634,6 +2308,51 @@ "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" + } + }, + "systems_6": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "tree": { "inputs": { "nixpkgs": [ @@ -1684,6 +2403,27 @@ } }, "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs-xr", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1749194973, + "narHash": "sha256-eEy8cuS0mZ2j/r/FE0/LYBSBcIs/MKOIVakwHVuqTfk=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "a05be418a1af1198ca0f63facb13c985db4cb3c5", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { "inputs": { "nixpkgs": [ "nur", @@ -1740,11 +2480,11 @@ }, "locked": { "dir": "nix", - "lastModified": 1745557788, - "narHash": "sha256-qvdqjJ0WPX0EtXIh2f6WXb+PJb73lpQBJqbVz5Zctr4=", + "lastModified": 1750014871, + "narHash": "sha256-2P4YKeMy9LXy0totnWIWzgW3A0UwB7HY0CfdCt8OOBU=", "owner": "wez", "repo": "wezterm", - "rev": "1439661dc9a8b565a8d9d23aee27d43a9864f676", + "rev": "d6c178f961d3de351ad72b8176f5d05e8ad8e8c6", "type": "github" }, "original": { @@ -1765,11 +2505,11 @@ ] }, "locked": { - "lastModified": 1744290088, - "narHash": "sha256-/X9XVEl0EiyisNbF5srrxXRSVoRqdwExuqyspYqqEjQ=", + "lastModified": 1749574455, + "narHash": "sha256-fm2/8KPOYvvIAnNVtjDlTt/My00lIbZQ+LMrfQIWVzs=", "owner": "nix-community", "repo": "NixOS-WSL", - "rev": "60b4904a1390ac4c89e93d95f6ed928975e525ed", + "rev": "917af390377c573932d84b5e31dd9f2c1b5c0f09", "type": "github" }, "original": { @@ -1778,6 +2518,47 @@ "type": "github" } }, + "xdph": { + "inputs": { + "hyprland-protocols": [ + "hyprland", + "hyprland-protocols" + ], + "hyprlang": [ + "hyprland", + "hyprlang" + ], + "hyprutils": [ + "hyprland", + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprland", + "hyprwayland-scanner" + ], + "nixpkgs": [ + "hyprland", + "nixpkgs" + ], + "systems": [ + "hyprland", + "systems" + ] + }, + "locked": { + "lastModified": 1749490041, + "narHash": "sha256-R9Dn9IyUdPaJHD2Oqd7XJnnxpka6M6UYw4Ld0iA46HM=", + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "rev": "3cf35e178bc192ee51e3fddfd69e531e2c106a30", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "xdg-desktop-portal-hyprland", + "type": "github" + } + }, "zlib": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 81bb6137..d7dda490 100644 --- a/flake.nix +++ b/flake.nix @@ -13,12 +13,21 @@ std = { url = "github:chessai/nix-std"; }; + nix-gaming.url = "github:fufexan/nix-gaming"; + + hyprland.url = "github:hyprwm/Hyprland"; + split-monitor-workspaces = { + url = "github:Duckonaut/split-monitor-workspaces"; + inputs.hyprland.follows = "hyprland"; # <- make sure this line is present for the plugin to work as intended + }; + nix-proton-cachyos.url = "github:kittywitch/nix-proton-cachyos"; # used for overriding unwanted flake inputs empty.url = "github:input-output-hk/empty-flake"; # self-explanatory nixpkgs = { url = "github:nixos/nixpkgs/nixos-unstable"; }; + nixpkgs-xr.url = "github:nix-community/nixpkgs-xr"; infrastructure = { url = "github:gensokyo-zone/infrastructure/main"; inputs = { @@ -51,6 +60,14 @@ flake-compat.follows = "flake-compat"; }; }; + spicetify-nix.url = "github:Gerg-L/spicetify-nix"; + push2talk = { + url = "github:cyrinux/push2talk/main"; + inputs = { + nixpkgs.follows = "nixpkgs"; + flake-utils.follows = "utils"; + }; + }; wezterm = { url = "github:wez/wezterm/main?dir=nix"; inputs = { diff --git a/home/environments/hyprland/hyprland.nix b/home/environments/hyprland/hyprland.nix new file mode 100644 index 00000000..fcfb1377 --- /dev/null +++ b/home/environments/hyprland/hyprland.nix @@ -0,0 +1,210 @@ +{ + std, + pkgs, + inputs, + ... +}: let + inherit (std) list; +in { + home.packages = with pkgs; [ + grimblast + wl-clipboard + wlr-randr + wl-screenrec + slurp + grim + swww + pavucontrol + hyprpicker + brightnessctl + playerctl + glib + ]; + services.swww.enable = true; + wayland.windowManager.hyprland = let + import-gsettings = pkgs.writeShellScriptBin "import-gsettings" '' +# usage: import-gsettings +config="''${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini" +if [ ! -f "$config" ]; then exit 1; fi + +gnome_schema="org.gnome.desktop.interface" +gtk_theme="$(grep 'gtk-theme-name' "$config" | sed 's/.*\s*=\s*//')" +icon_theme="$(grep 'gtk-icon-theme-name' "$config" | sed 's/.*\s*=\s*//')" +cursor_theme="$(grep 'gtk-cursor-theme-name' "$config" | sed 's/.*\s*=\s*//')" +font_name="$(grep 'gtk-font-name' "$config" | sed 's/.*\s*=\s*//')" +${pkgs.glib}/bin/gsettings set "$gnome_schema" gtk-theme "$gtk_theme" +${pkgs.glib}/bin/gsettings set "$gnome_schema" icon-theme "$icon_theme" +${pkgs.glib}/bin/gsettings set "$gnome_schema" cursor-theme "$cursor_theme" +${pkgs.glib}/bin/gsettings set "$gnome_schema" font-name "$font_name" + ''; + in { + enable = true; + systemd = { + enable = true; + variables = ["--all"]; + extraCommands = [ + "systemctl --user stop graphical-session.target" + "systemctl --user start hyprland-session.target" + ]; + }; + xwayland.enable = true; + package = inputs.hyprland.packages.${pkgs.system}.hyprland; + plugins = [ + inputs.split-monitor-workspaces.packages.${pkgs.system}.split-monitor-workspaces + ]; + settings = { + "$mod" = "SUPER"; + input = { + kb_options = "ctrl:nocaps"; + }; + workspace = let + commonOptions = "gapsin:0,gapsout:0,rounding:false"; + in + ["1,monitor:DP-1,default:true,${commonOptions}"] + ++ (list.map ( + workspace: "${toString workspace},monitor:DP-1${commonOptions}" + ) (list.range 2 10)) + ++ [ "11,monitor:DP-2,default:true"] ++ (list.map ( + workspace: "${toString workspace},monitor:DP-2${commonOptions}" + ) (list.range 12 20)); + /*list.concat (list.generate ( + x: let + ws = let + c = (x + 1) / 10; + in + builtins.toString (x + 1 - (c * 10)); + in [ + "${toString x},monitor:DP-1" + "${toString (x + 10)},monitor:DP-2${commonOptions}" + ] + ) + 10); + */ + env = [ + "NVD_BACKEND,direct" + "ELECTRON_OZONE_PLATFORM_HINT,auto" + "LIBVA_DRIVER_NAME,nvidia" + "__GLX_VENDOR_LIBRARY_NAME,nvidia" + "QT_QPA_PLATFORM,wayland" + "__NV_DISABLE_EXPLICIT_SYNC,1" + ]; + exec-once = [ + "${pkgs.swww}/bin/swww init" + "${pkgs.hypridle}/bin/hypridle" + "${pkgs.dbus}/bin/dbus-update-activation-environment --all" + "${pkgs.libsForQt5.polkit-kde-agent}/bin/polkit-kde-agent" + "${pkgs.networkmanagerapplet}/bin/nm-applet" + "${pkgs.mako}/bin/mako" + "${pkgs.udiskie}/bin/udiskie &" + "${pkgs.pasystray}/bin/pasystray" + "${pkgs.systemd}/bin/systemctl restart waybar --user" + "${pkgs.systemd}/bin/systemctl restart konawall-py --user" + ]; + plugin.split-monitor-workspaces = { + count = 10; + keep_focused = 0; + enable_notifications = 0; + enable_persistent_workspaces = 1; + }; + group.groupbar = { + font_family = "Monaspace Krypton"; + font_size = 12; + }; + exec = [ + "${import-gsettings}/bin/import-gsettings" + ]; + xwayland = { + force_zero_scaling = true; + }; + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + "$mod ALT, mouse:272, resizewindow" + ]; + binde = [ + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86MonBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl -c backlight set 5%+" + ", XF86MonBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl -c backlight set 5%-" + ]; + bind = + [ + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + ", XF86AudioPlay, exec, ${pkgs.playerctl}/bin/playerctl play-pause" + ", XF86AudioNext, exec, ${pkgs.playerctl}/bin/playerctl next" + ", XF86AudioPrev, exec, ${pkgs.playerctl}/bin/playerctl prev" + + "$mod, R, exec, wofi -t wezterm -IS drun" + "$mod SHIFT, R, exec, wofi -t wezterm -IS run" + "$mod, Return, exec, wezterm" + ", Print, exec, grimblast copy area" + + "$mod SHIFT, E, exec, pkill Hyprland" + "$mod SHIFT, Q, killactive," + "$mod, F, fullscreen," + "$mod, G, togglegroup," + "$mod SHIFT, N, changegroupactive, f" + "$mod SHIFT, P, changegroupactive, b" + "$mod, T, togglefloating," + "$mod SHIFT, T, togglesplit," + "$mod SHIFT, X, pseudo," + "$mod ALT, ,resizeactive," + "$mod, Escape, exec, wlogout -p layer-shell" + "$mod, L, exec, loginctl lock-session" + + "$mod, left, movefocus, l" + "$mod, right, movefocus, r" + "$mod, up, movefocus, u" + "$mod, down, movefocus, d" + "$mod SHIFT, left, movewindow, l" + "$mod SHIFT, right, movewindow, r" + "$mod SHIFT, up, movewindow, u" + "$mod SHIFT, down, movewindow, d" + "$mod ALT, left, movewindoworgroup, l" + "$mod ALT, right, movewindoworgroup, r" + "$mod ALT, up, movewindoworgroup, u" + "$mod ALT, down, movewindoworgroup, d" + + "$mod, P, exec, ${pkgs.hyprpicker}/bin/hyprpicker -na" + + "CTRL, Print, exec, grimblast --notify --cursor copysave output" + "$mod SHIFT CTRL, R, exec, grimblast --notify --cursor copysave output" + + "ALT, Print, exec, grimblast --notify --cursor copysave screen" + "$mod SHIFT ALT, R, exec, grimblast --notify --cursor copysave screen" + + "$mod, bracketleft, workspace, m-1" + "$mod, bracketright, workspace, m+1" + + "$mod SHIFT, bracketleft, focusmonitor, l" + "$mod SHIFT, bracketright, focusmonitor, r" + + "$mod SHIFT ALT, bracketleft, movecurrentworkspacetomonitor, l" + "$mod SHIFT ALT, bracketright, movecurrentworkspacetomonitor, r" + ] + ++ ( + # workspaces + # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} + list.concat (list.generate ( + 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}, movetoworkspacesilent, ${toString (x + 1)}" + "$mod, F${if ws == "0" then "10" else ws}, workspace, ${toString (x + 11)}" + "$mod SHIFT, F${if ws == "0" then "10" else ws}, movetoworkspacesilent, ${toString (x + 11)}" + + "$mod ALT, ${ws}, split-workspace, ${toString (x + 1)}" + "$mod SHIFT ALT, ${ws}, split-movetoworkspacesilent, ${toString (x + 1)}" + "$mod ALT, F${if ws == "0" then "10" else ws}, split-workspace, ${toString (x + 11)}" + "$mod SHIFT ALT, F${if ws == "0" then "10" else ws}, split-movetoworkspacesilent, ${toString (x + 11)}" + ] + ) + 10) + ); + }; + }; +} diff --git a/home/environments/hyprland/hyprlock.nix b/home/environments/hyprland/hyprlock.nix new file mode 100644 index 00000000..d2ace820 --- /dev/null +++ b/home/environments/hyprland/hyprlock.nix @@ -0,0 +1,5 @@ +_: { + programs.hyprlock = { + enable = true; + }; +} diff --git a/home/environments/hyprland/waybar.nix b/home/environments/hyprland/waybar.nix new file mode 100644 index 00000000..739af1ff --- /dev/null +++ b/home/environments/hyprland/waybar.nix @@ -0,0 +1,120 @@ +_: { + programs.waybar = { + enable = true; + systemd.enable = true; + style = '' +* { + border: none; + border-radius: 0; + font-family: Monaspace Krypton, monospace; + font-size: 13px; + min-height: 0; +} + +window#waybar { + background: @theme_base_color; + border-bottom: 1px solid @unfocused_borders; + color: @theme_text_color; +} + +tooltip { + background: rgba(43, 48, 59, 0.5); + border: 1px solid rgba(100, 114, 125, 0.5); +} +tooltip label { + color: white; +} + +#workspaces button.persistent { + background: shade(@insensitive_bg_color, 0.5); + color: shade(@insensitive_fg_color, 0.5); +} + +#workspaces button { + padding: 0 5px; + background: @theme_unfocused_bg_color; + border-bottom: 3px solid transparent; +} + +#workspaces button.active, #workspaces button.focused { + background: @theme_selected_bg_color; + color: @theme_selected_fg_color; + border-bottom: 3px solid white; +} + +#mode, #clock, #battery, #idle_inhibitor, #tray, #window, #wireplumber, #bluetooth, #mpris { + padding: 0 5px; + margin: 0 5px; +} + +#mode { + background: #64727D; + border-bottom: 3px solid white; +} + +#clock, #mpris { + background-color: #64727D; +} + +#battery { + background-color: #ffffff; + color: black; +} + +#battery.charging { + color: white; + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: black; + } +} + +#battery.warning:not(.charging) { + background: #f53c3c; + color: white; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: steps(12); + animation-iteration-count: infinite; + animation-direction: alternate; +} + ''; + settings.main = { + layer = "top"; + position = "top"; + height = 24; + modules-left = [ + "hyprland/workspaces" + "hyprland/submap" + "hyprland/window" + ]; + + modules-center = [ + "clock" + "mpris" + ]; + + + modules-right = [ + "privacy" + "bluetooth" + "wireplumber" + "idle_inhibitor" + "power-profiles-daemon" + "battery" + "tray" + ]; + + bluetooth = { + on-click = "blueman-manager"; + }; + clock = { + format = "{:%F %H:%M %Z}"; + }; + }; + }; +} diff --git a/home/environments/hyprland/wlogout.nix b/home/environments/hyprland/wlogout.nix new file mode 100644 index 00000000..c7493482 --- /dev/null +++ b/home/environments/hyprland/wlogout.nix @@ -0,0 +1,5 @@ +_: { + programs.wlogout = { + enable = true; + }; +} diff --git a/home/environments/hyprland/wofi.nix b/home/environments/hyprland/wofi.nix new file mode 100644 index 00000000..4329849a --- /dev/null +++ b/home/environments/hyprland/wofi.nix @@ -0,0 +1,12 @@ +_: { + programs.wofi = { + enable = true; + settings = { + insensitive = true; + allow_images = true; + hide_scroll = true; + mode = "dmenu"; + prompt = ""; + }; + }; +} diff --git a/home/environments/i3/conky/components.lua b/home/environments/i3/conky/components.lua index 8a5fc31e..1e4766a5 100644 --- a/home/environments/i3/conky/components.lua +++ b/home/environments/i3/conky/components.lua @@ -54,13 +54,25 @@ function cpu_sct() end +function conky_mem_section() + local mem_tpl = tpl([[ + ${lua fmt h1 RAM} ${hr} + + ${color grey}Usage:$color $mem/$memmax - $memperc% ${membar 4} + ${color grey}Easy-to-free:$color ${memeasyfree} + ]]) +end + +function conky_storage_section() +end + function conky_cpu_section() local cpu_tpl = tpl([[ ${lua fmt h1 CPU} ${hr} ${color grey}Variety:$color {%= cpu_model() %} {%= cpu_sct() %} ${cpugraph} ${color grey}Frequency:$color ${freq_g} GHz -${color grey}Usage:$color $cpu% +${color grey}Usage:$color $cpu% ${cpubar 4} ]]) return conky_parse(cpu_tpl({ cpu_model = cpu_model, cpu_sct = cpu_sct })) end @@ -77,19 +89,20 @@ local query_headers = { "fan.speed", "utilization.gpu", "utilization.memory", + "memory.used", + "clocks.current.graphics", + "clocks.current.memory", + "temperature.gpu", + "clocks.current.sm", + "clocks.current.video", + "memory.total", "utilization.encoder", "utilization.decoder", - "clocks.current.graphics", - "clocks.current.sm", - "clocks.current.memory", - "clocks.current.video", - "memory.used", - "memory.total", - "temperature.gpu", } local gpu_display_templates = { index = "${lua fmt h1 GPU %s} ${hr}", default = "${lua fmt item %s} %s", + hasbar = "${lua fmt item %s} %s ${nvidiabar %s %s}", } local gpu_header_aliases = { ["name"] = "Card", @@ -107,6 +120,15 @@ local gpu_header_aliases = { ["memory.total"] = "Memory Total", ["temperature.gpu"] = "Temperature", }; +local gpu_header_to_nvidiabar = { + --[[["fan.speed"] = "fanlevel", + ["utilization.gpu"] = "gpuutil", + ["utilization.memory"] = "memutil", + ["clocks.current.graphics"] = "gpufreq", + ["clocks.current.memory"] = "memfreq", + ["temperature.gpu"] = "temp", + ["memory.used"] = "mem",]]-- +}; -- Reverse index local query_headers_index = {} for i, header in ipairs(query_headers) do @@ -171,7 +193,12 @@ function gpu_csv_query() if gpu_display_templates[cur_header.clean] ~= nil then display = string.format(gpu_display_templates[cur_header.clean], data_sf) else - display = string.format(gpu_display_templates.default, gpu_header_aliases[cur_header.clean], data_sf) + if gpu_header_to_nvidiabar[cur_header.clean] ~= nil then + local nvidiabar = gpu_header_to_nvidiabar[cur_header.clean] + display = string.format(gpu_display_templates.hasbar, gpu_header_aliases[cur_header.clean], data_sf, nvidiabar, i) + else + display = string.format(gpu_display_templates.default, gpu_header_aliases[cur_header.clean], data_sf) + end end current_gpu[display_idx] = display end diff --git a/home/environments/i3/conky/conky.conf b/home/environments/i3/conky/conky.conf index f5d20cec..de33ad93 100644 --- a/home/environments/i3/conky/conky.conf +++ b/home/environments/i3/conky/conky.conf @@ -29,8 +29,8 @@ conky.config = { out_to_console = false, out_to_ncurses = false, out_to_stderr = false, - out_to_wayland = false, - out_to_x = true, + out_to_wayland = true, + out_to_x = false, own_window = true, own_window_class = 'Conky', own_window_type = 'override', diff --git a/home/environments/i3/conky/conky.nix b/home/environments/i3/conky/conky.nix index 943c953a..23d1205a 100644 --- a/home/environments/i3/conky/conky.nix +++ b/home/environments/i3/conky/conky.nix @@ -1,7 +1,7 @@ { config, pkgs, ... }: { home.packages = with pkgs; [ jq - conky + ]; xdg.configFile.conky = { @@ -22,7 +22,7 @@ Restart = "always"; RestartSec = "3"; ExecStartPre = "${pkgs.coreutils}/bin/sleep 5"; - ExecStart = toString ([ "${pkgs.conky}/bin/conky"]); + ExecStart = toString ([ "${(pkgs.conky.override { nvidiaSupport = true; })}/bin/conky"]); }; Install.WantedBy = [ "graphical-session.target" ]; diff --git a/home/environments/kde/kde.nix b/home/environments/kde/kde.nix index 14631460..a952f692 100644 --- a/home/environments/kde/kde.nix +++ b/home/environments/kde/kde.nix @@ -48,6 +48,7 @@ libksysguard systemsettings kcmutils + pkgs.plasma-applet-commandoutput ]; programs.plasma = { configFile = { diff --git a/home/environments/kde/konawall.nix b/home/environments/kde/konawall.nix deleted file mode 100644 index 8c71d557..00000000 --- a/home/environments/kde/konawall.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ - inputs, - pkgs, - ... -}: let - konawallWithDelay = pkgs.writeShellScriptBin "konawally" '' - sleep 5 && XDG_BACKEND=x11 GDK_BACKEND=x11 ${inputs.konawall-py.packages.${pkgs.system}.konawall-py}/bin/konawall - ''; - desktop_entry = '' - [Desktop Entry] - Exec=${konawallWithDelay}/bin/konawally - Icon= - Name=konawall - Path= - Terminal=False - Type=Application - ''; - konawallConfig = { - interval = 30 * 60; - rotate = true; - source = "konachan"; - tags = [ - #"rating:s" - "touhou" - "score:>=50" - "width:>=1500" - ]; - logging = { - file = "INFO"; - console = "DEBUG"; - }; - }; -in { - home.packages = [ - konawallWithDelay - inputs.konawall-py.packages.${pkgs.system}.konawall-py - ]; - xdg.configFile = { - "konawall/config.toml".source = (pkgs.formats.toml {}).generate "konawall-config" konawallConfig; - "autostart/konawall.desktop".text = desktop_entry; - }; -} diff --git a/home/profiles/graphical/discord.nix b/home/profiles/graphical/discord.nix index f64ef2c8..113875f2 100644 --- a/home/profiles/graphical/discord.nix +++ b/home/profiles/graphical/discord.nix @@ -8,9 +8,10 @@ in { home.packages = with pkgs; [ (discord-krisp.override { withOpenASAR = true; - withVencord = true; # can do this here too + withVencord = false; # can do this here too }) - vesktop + #legcord + dorion #betterdiscordctl ]; } diff --git a/home/profiles/graphical/floorp/main.nix b/home/profiles/graphical/floorp/main.nix index eb0de5fc..18ed3e83 100644 --- a/home/profiles/graphical/floorp/main.nix +++ b/home/profiles/graphical/floorp/main.nix @@ -18,6 +18,7 @@ in { containersForce = true; extensions = { packages = with nur.repos.rycee.firefox-addons; [ + pronoundb sponsorblock link-cleaner canvasblocker diff --git a/home/profiles/graphical/packages.nix b/home/profiles/graphical/packages.nix index 095e39a1..4dbad3c5 100644 --- a/home/profiles/graphical/packages.nix +++ b/home/profiles/graphical/packages.nix @@ -10,9 +10,6 @@ # Mail thunderbird - # Music - spotify - # Chat tdesktop # Telegram dino # XMPP @@ -35,6 +32,8 @@ alsa-utils pwvucontrol veracrypt + deluge gimp + xarchiver ]; } diff --git a/home/profiles/graphical/spotify.nix b/home/profiles/graphical/spotify.nix new file mode 100644 index 00000000..b216750e --- /dev/null +++ b/home/profiles/graphical/spotify.nix @@ -0,0 +1,22 @@ +{pkgs, inputs, ... }: let + spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.stdenv.system}; +in { + programs.spicetify = { + enable = true; + enabledExtensions = with spicePkgs.extensions; [ + volumePercentage + queueTime + groupSession + ]; + experimentalFeatures = true; + windowManagerPatch = true; + colorScheme = "CatppuccinMocha"; + theme = spicePkgs.themes.text // { + additionalCss = '' + :root { + --font-family: 'Monaspace Krypton', monospace; + } + ''; + }; + }; +} diff --git a/home/profiles/graphical/taskwarrior.nix b/home/profiles/graphical/taskwarrior.nix new file mode 100644 index 00000000..c4cbc4a5 --- /dev/null +++ b/home/profiles/graphical/taskwarrior.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: { + programs.taskwarrior = { + enable = true; + package = pkgs.taskwarrior3; + }; + home.packages = [ pkgs.taskwarrior-tui ]; +} diff --git a/home/profiles/graphical/wezterm.nix b/home/profiles/graphical/wezterm.nix index 9c6b9a37..8f515d04 100644 --- a/home/profiles/graphical/wezterm.nix +++ b/home/profiles/graphical/wezterm.nix @@ -24,7 +24,7 @@ }), window_decorations = "TITLE | RESIZE", - enable_wayland = true, + enable_wayland = false, warn_about_missing_glyphs = false, font_size = 12.0, check_for_updates = false, diff --git a/home/profiles/neovim/default.nix b/home/profiles/neovim/default.nix index c7fd2122..caadb119 100644 --- a/home/profiles/neovim/default.nix +++ b/home/profiles/neovim/default.nix @@ -7,16 +7,14 @@ }: let inherit (lib.modules) mkIf; inherit (std) string set; - initLua = pkgs.substituteAll ({ - name = "init.lua"; - src = ./init.lua; + initLua = (pkgs.replaceVars ./init.lua ({ base16ShellPath = config.base16.shell.package; catppuccin_flavour = config.catppuccin.flavor; inherit (config.base16) defaultSchemeName; defaultSchemeSlug = config.base16.defaultScheme.slug; } // set.map (_: col: string.justifyRight 2 "0" (builtins.toString col.ansiIndex)) - (set.filter (var: _: string.hasInfix "base" var) config.base16.defaultScheme)); + (set.filter (var: _: string.hasInfix "base" var) config.base16.defaultScheme))); in { home.sessionVariables = mkIf config.programs.neovim.enable {EDITOR = "nvim";}; programs.neovim = { @@ -60,6 +58,9 @@ in { # tree nui-nvim neo-tree-nvim + # hardtime + hardtime-nvim + nvim-notify # Session management resession-nvim # tree sitter diff --git a/home/profiles/neovim/init.lua b/home/profiles/neovim/init.lua index 568d4e1b..301250c6 100644 --- a/home/profiles/neovim/init.lua +++ b/home/profiles/neovim/init.lua @@ -278,6 +278,13 @@ vim.api.nvim_create_autocmd("VimLeavePre", { end, }) +-- hardtime +vim.notify = require("notify") +--[[require("hardtime").setup({ + disable_mouse = false, + disabled_keys = {}, +})]]-- + -- telescope local telescope = require('telescope.builtin') diff --git a/nixos/environments/hyprland/hyprland.nix b/nixos/environments/hyprland/hyprland.nix new file mode 100644 index 00000000..bd0ad515 --- /dev/null +++ b/nixos/environments/hyprland/hyprland.nix @@ -0,0 +1,5 @@ +_: { + programs.hyprland = { + enable = true; + }; +} diff --git a/nixos/environments/hyprland/xdg-portals.nix b/nixos/environments/hyprland/xdg-portals.nix new file mode 100644 index 00000000..3988e9ac --- /dev/null +++ b/nixos/environments/hyprland/xdg-portals.nix @@ -0,0 +1,11 @@ +{pkgs, ...}: { + xdg = { + portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-wlr + xdg-desktop-portal-hyprland + ]; + }; + }; +} diff --git a/nixos/environments/i3/xdg.nix b/nixos/environments/i3/xdg.nix new file mode 100644 index 00000000..47af71da --- /dev/null +++ b/nixos/environments/i3/xdg.nix @@ -0,0 +1,12 @@ +{pkgs, ...}: { + xdg = { + portal = { + enable = true; + config.common.default = "*"; + extraPortals = with pkgs; [ + xdg-desktop-portal-gtk + ]; + }; + }; +} + diff --git a/nixos/profiles/gaming/lutris.nix b/nixos/profiles/gaming/lutris.nix index b4a109c0..7d5dd7b1 100644 --- a/nixos/profiles/gaming/lutris.nix +++ b/nixos/profiles/gaming/lutris.nix @@ -15,24 +15,36 @@ programs.gamescope = { }; environment.systemPackages = with pkgs; [ (lutris.override { + extraLinkLines = let + proton-cachyos = inputs.nix-proton-cachyos.packages.${pkgs.system}.proton-cachyos; + in ''ln -sf ${proton-cachyos}/share/steam $out/share''; extraPkgs = pkgs: [ pkgs.gamescope pkgs.libnghttp2 pkgs.winetricks pkgs.jansson pkgs.samba + pkgs.gvfs pkgs.mangohud pkgs.vkbasalt + pkgs.umu-launcher + pkgs.xdg-desktop-portal + inputs.nix-proton-cachyos.packages.${pkgs.system}.proton-cachyos ]; extraLibraries = pkgs: [ + pkgs.libunwind + pkgs.xdg-desktop-portal + pkgs.gvfs pkgs.jansson pkgs.samba pkgs.xz + inputs.nix-proton-cachyos.packages.x86_64-linux.proton-cachyos ]; }) vkbasalt mangohud + umu-launcher # support 32-bit only wine diff --git a/nixos/profiles/gaming/ntsync.nix b/nixos/profiles/gaming/ntsync.nix new file mode 100644 index 00000000..7aa17668 --- /dev/null +++ b/nixos/profiles/gaming/ntsync.nix @@ -0,0 +1,3 @@ +_: { + programs.wine.ntsync.enable = true; +} diff --git a/nixos/profiles/gaming/sound.nix b/nixos/profiles/gaming/sound.nix new file mode 100644 index 00000000..dc72ac3a --- /dev/null +++ b/nixos/profiles/gaming/sound.nix @@ -0,0 +1,5 @@ +_: { + services.pipewire.lowLatency = { + enable = true; + }; +} diff --git a/nixos/profiles/gaming/steam.nix b/nixos/profiles/gaming/steam.nix index 85d50a10..e78c3c8d 100644 --- a/nixos/profiles/gaming/steam.nix +++ b/nixos/profiles/gaming/steam.nix @@ -1,6 +1,10 @@ -_: { +{ pkgs, inputs, ... }: { programs.steam = { enable = true; remotePlay.openFirewall = true; + platformOptimizations.enable = true; + extraCompatPackages = [ + inputs.nix-proton-cachyos.packages.${pkgs.system}.proton-cachyos + ]; }; } diff --git a/nixos/profiles/gaming/vr.nix b/nixos/profiles/gaming/vr.nix new file mode 100644 index 00000000..285f9dec --- /dev/null +++ b/nixos/profiles/gaming/vr.nix @@ -0,0 +1,45 @@ +{pkgs, ... }: { + programs.envision = { + enable = true; + openFirewall = true; # This is set true by default + }; + + /*services.wivrn = { + enable = true; + openFirewall = true; + package = pkgs.wivrn.override { cudaSupport = true; }; + defaultRuntime = true; + config = { + enable = true; + json = { + scale = [ 0.5 0.5 ]; + bitrate = 300*1000; + encoders = [ + { + encoder = "nvenc"; + codec = "h265"; + width = 1.0; + height = 1.0; + offset_x = 0.0; + offset_y = 0.0; + } + ]; + tcp_only = false; + #application = [ + # "${pkgs.wlx-overlay-s}/bin/wlx-overlay-s" + #]; + }; + }; + };*/ + + environment.systemPackages = with pkgs; [ + wlx-overlay-s + monado-vulkan-layers + bs-manager + ]; + + networking.firewall = { + allowedTCPPorts = [ 9757 ]; + allowedUDPPorts = [ 9757 ]; + }; +} diff --git a/nixos/profiles/graphical/packages.nix b/nixos/profiles/graphical/packages.nix index 08cc09dd..13bfec76 100644 --- a/nixos/profiles/graphical/packages.nix +++ b/nixos/profiles/graphical/packages.nix @@ -11,6 +11,7 @@ super-slicer-beta nvidia-vaapi-driver nv-codec-headers-12 + inputs.push2talk.defaultPackage.${pkgs.system} ]; programs.obs-studio = { enable = true; @@ -20,6 +21,11 @@ }; plugins = with pkgs.obs-studio-plugins; [ obs-vaapi + obs-tuna + obs-source-clone + obs-pipewire-audio-capture + input-overlay + obs-vkcapture ]; }; services.udev.packages = [ diff --git a/nixos/profiles/graphical/sound.nix b/nixos/profiles/graphical/sound.nix index c986cd57..b01b5bdc 100644 --- a/nixos/profiles/graphical/sound.nix +++ b/nixos/profiles/graphical/sound.nix @@ -1,16 +1,20 @@ {pkgs, ...}: { - environment.systemPackages = with pkgs; [pulsemixer]; + environment.systemPackages = with pkgs; [pulsemixer pwvucontrol]; services.pulseaudio.enable = false; security.rtkit.enable = true; - - services.pipewire.extraConfig.pipewire-pulse."92-subpar-latency" = { - pulse.properties = { - pulse.min.req = "1024/48000"; - pulse.default.req = "1024/48000"; - pulse.min.quantum = "1024/48000"; - }; + services.pipewire.extraConfig.pipewire-pulse."91-discord-latency" = { + pulse.rules = [ + { + matches = [ { "application.process.binary" = "Discord"; } ]; + actions = { + update-props = { + "pulse.min.quantum" = "1024/48000"; + }; + }; + } + ]; }; services.pipewire = { enable = true; diff --git a/nixos/servers/weechat/secrets.yaml b/nixos/servers/weechat/secrets.yaml index a6b7ceb2..acced2b8 100644 --- a/nixos/servers/weechat/secrets.yaml +++ b/nixos/servers/weechat/secrets.yaml @@ -1,14 +1,10 @@ weechat-secret: ENC[AES256_GCM,data:tVl8Bbqx09oiONxR206vQu1V+2uZoIiWZEzrEWZ4H+sdgeZkzu8jvphshpIrRMU9eZ3FYa9mQIdbXXNJaiy7WFFSMoo6rEzPodAidOqMNjGR4X9vevbXg1FbwTkKpwtWiH+XJoj4ijfFhTXzX7fo63WDOoe0SZee3C1PgdFX00pD/G1MHg0J1pevBvQKuMV++zdX7Vd6mLV6LZBVWsUMckvbhzNjP6f5M4OTTRTrsftA0ow4DpB83QGtWcj6IjY1nBFOyDcqeO+0usIX72a4nOMF7bACunXTK2peN3kEDGjlYyhmw3wKPVYMM25Y3JX3BIkznUC/H1BM/XJf5zlFW1+9a5RZMwLDykMbMkEJjARXJ4zkja6jBjU=,iv:KrvHlr/WyBx1ZD50IGpL+oy5p2aOWAN3HSPdwUjLopM=,tag:6GYbQWq0MN6z/lU3TXN8ZA==,type:str] liberachat-cert: ENC[AES256_GCM,data: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,iv:DHnR0ZMEuZtY2Gx2xgomnEWH6F/qzkErJ9KwInGLlIM=,tag:Wx84gTr29eO/BvyRjnXC/A==,type:str] espernet-cert: ENC[AES256_GCM,data:3N91QUBnRUDlK1ndxw0434TzEEkb0Y3qte5UpjH96RyyRN6oeImC8Z0rjGGWGSNTF8Xrd+TPMWj4WpYQQwuZVAANwd5u/Itbs84alQI8ltaM4uvTz9KxNRvwY6FTi7lWrjzVWi4Sc7/wax8gh1ra6B7Q0BhDqWa2Lvucgo0NPU0XMO26W3O+sVzKcveNb/wCuDIgbgH9bJcJkkJ7st/zeEkQhj3cI7FYBXqTixKcN3JVI/1FX72VA9rhMIYlUV4CcJb/sNxZOIMP0XzjH+IcPZJdFz6Kob/dA6BYIwW8e0uVWEeE8RRSrKq/8FhbuN03oSo0z9TgOcldH0qgXF82eC/tmfkI6G6bkyu9sMzOtrQbb9Nl19IhUXYq/BYKosWer/Dnc2q/tR1qsFBirZiA6Gi+9GZxUZrWAlyBYuWTKCWU6hiUk2tGBcKg1VbxGY2H4Md2i6SRedGOS6VA/HJLyEjh8YDej3XR9EYFP02OwLs6+4MNBcrdOEEWmkxW0EEuS5KF2SZ142hhsHZ8NIDnolKsSOwFqRuKhgnAMsB9+IQSzkSSak5MbVcnAsJsmkqhTKvf0idco2tFGaJeJjjXVi1Knr0NXJX0yku/mA1BWvb119KP9vHNxxc2QKaa2MJeqpXR92cB2XBrtR9pSAm8RVTLRyFWCQxtuvKumO+3cPJPfocfuIocK9FRE8SfwnFvHL0frwK9FI9MaJRcMJqOgUv20p/OTGBoEpoKUhHUPmPqaSWVyi+3jEE+Va3idB4HeOgKA9P/FeVhnZf7SP28fEEI3A0805gDVlhcbx7Y1ZPrrNJv8VXAfwG2//H1Z9/TV9oruRjSR2S0tNLqV2vQGpHBPt1ZPF14lZwybAM0pRldZk3DasWEdZuSv9n8bHHv6cGhHsmrZdVb55oGW5uGEksdUGyXB0aRlXVFDkAiM5nTuNqZN8+EWyu+P6xH/em6wSWpeQE5t1tlqLqpaDU5O2tkVuqHcsllSou9k5p8PmY/bf5K1eGSPUVFAt+9v7+gQoofIQ12TpYCadOSYY7uCiukoiEFMYFyAvzY5QIiSWw07MF+jsBmeb3gWPqRH3tCHUBakkpVCV5ICRhItQcnb2Ins7jmthz7tvhD3pvrXDk7/sj5MwqByzfAyn6RqWJVp5D+GymQqYDhigPPInRqln0XBpywpaXMsWRx0UsnmCOGGJn0tFKq/k4SpwVlqf2VhQB73KtyP/K01AXmiVlfd1mbiAMw2N5qu1OpAt7SrfgXgXBTnd9eztamBMwKpMuXsfWdmycjnbzNYvhkCiy76AvQ8vgAT5udQWiliXrxsXubA0uhRAfZ/UGgRjiGPcw5fuBFnh7aB0FCYFhjBaoMwptHx92uTOis2gPEhn4K8Ex2xFMGlWC68RqvKXR/e3PNgVThTeXFN0xo8OObL2/2rtsvt476Aj+hENrAEZwW4Btc4vDJELw9KddnCIH5xeMdiDW+sjIh4Adj+H5C5Nt2U252DQExrprNksNqSTvZ8Coe4qQLB/cjyh5kOjIfNbaeaMXpikfgAV51pfbAGUUHrz5J7Tf36u5GLGHbETt3bTmyeyO0fZfKvw2UqAZaWaLn7C95n3dgkpoq2Gn2dA2LasgqQ+5EBcn93Oa923FKBdxE65UB/MXJPQkCDXBOCBai4I56wXC0QHDXaRlshvl+PQy76fSacyXlcTwcgoRFn7AVUTtlm/jo/4yGCfBzMWvITh6ppEzg5ls8txnm02CWP7ihoJaY317TJdOkon0qvkG2EXSOmdcX5nAJkPDg4Z4s2wVyEBqtRUzPVAQaCaqZRPseUHsfJzBYjcZV85dV0iw+McFQm7uEqjS+yCDXul5fRzx2g4IdslDf11glwb5pA1AVsA57jT41ByiFOXgJszURjvV0ZxP0vLfsQixa4uhYiZsQu+XGkdgDiS+/ENaUhRw9t0YfO+o8kxFKWm5wUgMpv3w8+9BOjlehg5iWR1J65qpk3QwGZ0PNDboNA79VPDYzbDGTR1uELe4hhxBs9xMTPWpXsRPVg19KVJowNIz4IOSxG7qM2H4J/Q7lxxl/f8tJ4IlIvCNp2SdI8eNABSqJDBcl0N4z5h9OweFTZwmkSzoTtHRnJwu0MpSMQQeEcrjqQgdCPhuY06TI8g+F9b35OvCEzUjP04W5VQVdl/TmJiIePsFZEaKlMUbwV47PyTp9Yq+GmPwVco5oIYWlDBId3r6vNuY5TkAtvfblcIqy2D0PCXVd0AWfO4baBZzBxZKu8x/ma2zY0cUon8HsXDkekfhlY5h4UgVwvTXZoprOfBzgEui7a8Hyilb0eUv6H0Lr5K+lLpcF4sKWa2BzyGbKP1gmjjr5tR+Mz11xKIta+mj+sVTuK3DY9xEBxvZpGiBRFrh4A7g4oW3ED+E5+o1uVOCL1zAp6dba9fINHfrvtpjHL5zy6x0snaBy+Bqn18EJg33/Y4slFe1IYJXQGTQ9rLkq1lDB3rHT0UjYrDepDpm/PH1JGa9QV5jvHxSDJhSakOC2/PojrJWk0jUHgXxONqscg1N2USU37iVE595iU6M+YoPStLds/AxZK02Hl+zsypHcF6Yc4h60wmxmRLnOPxMychb/jVJ+DjnKlGgavIg1alOl7nsCPhJfr3DfbZd/RAz9crR5sXkUpJN7uoI6b/MB5BMLIZ7dNKt64tLP6bXfpfT/v4NcfG/yzVXVy0cldKG9CRPGm70vFYqzP2P2IQTXPw0gBxn2SwJ1h2JeVdBkvqcUmcNS67jQsfZIJu+gN1VFinY15JNBxeEbd65+BQFbKGfCcQ2kLo9Q28TRERmc3yJkE8C4Vrzgvm+TDyFU23Zenm+ys5nhT3AlOQ6umEw07xp9cGMoSE0H4K9yPRppa0+UvNeM8suo1MlfTdmAKRmz9NGYGXskhcjwav74XJyvGp9AoA/l0pgQoD+snp+pahjFFlq7Y6rzqjvWattVo/U4OoeItvl69ueys7jdl4egSyRjL1NAsr2k9m8ZEKDDNY8WGQ/8+UXQI89wMQEeQBFUOnEPfsX9u+Djjz78/AfIMxI2ny7aS+idDoPyIomdRQqkL+88ZMSdgfyyUuvR5qfa2ge0bAgp1HskHDBBjjG3bTpL7gZKALpeinIn0+mBmCMlp/XL8akGxqWTpwFckYWB4A0FJ7DHTunjgQpwr+ajgaI52Y1OiPay9YwzUZ1jUFymMX+hNOSfdbqiG9hUAxC6iwck1bqZLkEy/M31KrQFFKfgnQ2ks7LrRgrmgTpiP4RpTzCpKBniYcD/Xz5ERVMbMndzHMzAqYddcSZyI1NplH9lct7q8yU2fcQu+jRdkqTBe8XOPugrwA9a4UP9aGmDWZE4Kxp8NtSgYY3ZDEEsg7O9whSMr0i2fqceNKwt4cwbyo+lnCqF4/lB5yJ82vx7Vcl7YukOEiS168g1prB9RdpnD0dItRM7VHXhc63SLt8j53cqXpDql10z6Q55R6aVej6gGHyPrIVZiFmCSovz5r+/YAoqAKLqxBYGs3ipfW/ZIf6iLkpaHCeyOZ8s/2T/iuFRPQRIr7+DtGeSeBnt3uAjJrEQ/AKn9M3HxVcajTGQBWBG5AKfiiYG6lPHRRz2/KoRM24lSHlS6ASXOuBp3cyKbcDWtdRZ0k7b72Y+c8cuGyiIaMee4Pr5GQed0mWjWm7vj8kN3ng=,iv:QpBIeLDM16NRjI4Atq6PaDrlDm35B2r6kOl/gk1lc0U=,tag:PW1I7HL1QWW0jK8jSZ3sIg==,type:str] -softnet-cert: ENC[AES256_GCM,data:0acY4OVWvOCc/+rh8aOyoA71Si8nLy+4DY0IMa+sTz8+WKQMqXyAs0XviPcVetMJuCVngwl63dWzDIgkuGZiNDachm39cfBllJBZbiK/rlSpGFDvJ/ulKYWA31vjr/SR2drdUpaTVzYfwVSagV6trVihqMOlkbraCliYg5oN6hllcKXTr8wdNOrfJA/Yl2JkPnH89dH6lVC014FQ/XPh31kLNu2YpflrddQBUNzahRYfLkh693LKgYArOl2UexuEyt4Rt/m2vJEWScPUDLn46cH1NI93/zEG0WGjDP7zcRE7lV0NtfmwXWW95cmn/B+Zjnw27XPPi+ME2NvRbZ5URTohxA8rMh1jrajoRQ19ZFwSrK9LZjtp+/UQqci5lLHKp/hGZ+q9bauoooA17iSNrdbbCqMUdNgSCULfFcIKLJemuvF5DsjfjI8UvipuMlwhZ1xWeJhwAChB3dvelJe6zBFdtQLRdj1kzL7Te1V382dLfQZ4qpMKP0fM3hMSzEJpd8oEYsPAN3yjj9TI0aFcejog+E+Lt5N7g+MLz/jnCB5d+2GxAVZZWj6w2/nKY2pmwUfuPuIos4l/iR/IISC8ruhbjm1E50hHrNo2fvWkAafHvW8lHfVxE1lfiXl395ypkGJOTjRFfMzRYCJ/+jDg6urbBEFBlPnDwraHBGQJs49E4xM6oPD2fDQ7KqWSPl/XBjQWgdZ4SZnLNvrOXv1pi2lGj+T6JZj8OuT9+OuS/bXR1+jvxr3PYKUFnymMwy54NGq2107uCKw64obxeLHa+3brtUGuSZ1S0KzBMju3rQIHGnFw9dM7prx6peI1exJMJboIGAkKZmLmcmrACgFchGR2EbS9iyI+WagfSox1J4vk2lH5kWFuxnrZ9bNvP6n8PxrLZKxh9Z+rOQ3HvpAgErx5XfhiRzH4KWFv2Cv4gqTRa+2Eg/5n+KHSQpj0XOa77/AzATOuO0/9YDObKFgYICogkSH9OIl3Jia8onHc47pnfoHoEOyv12XqWJhxKB5t0IdTNBmaconSWWXg7iFYmEZvdSQ7V5PKuMZp7JlnBI9kehAFMRYASXItkYRWHMBarCw=,iv:Lo8RT166ArCg9FhHyrpLHvBf0DPrSoWCb4NnFxnm6DY=,tag:sVbXgO1//JHXvvidyvgUuw==,type:str] +softnet-cert: ENC[AES256_GCM,data:3ZLUV9LnXvzaLzkc/ZVVoc0rmuV2UVfK3q1eOIUv79TNlrwC4mbYRVHbFKLx5nrAvz5faHJWFwJ/LsWnp7y9pt19qmnnpgwBZFpX2g6FqqmQvz/vAM03JsOnzrZT/YDvflab7QU4ZTInir0FJMUqjij90k8fGA1UnKVNnkOu8re33ketLbyV1h5c3eA3ZbLwrC8AAJtECe/N6kcS2ccYvxUwlegKNyS41VRy+ifRhJTybfkehBtexOImc5/7mymO3YXHz5ZP/TLMqefGKYiSxXZ6G/vSXAS8vSp5NG4+z681nctYaDV5PW8Lkdz8MJwbqsiRBEm2oMwIeSZKjZk+MlNXaYaoPTCyd05w1f0jT3KCPtNQ4oDjopf7CcpS3Q0Vh62cSI/J8DvSWMQgvVEXZchb9OOSWL/lVHaRaoTtQT8gzqw1N2TBkHCo3UewqRZOx+JgU/pYFyeY0aOj+LiMAY4A6/mU98QNuP48RpNpo7F+M9Qrv0+F+f9D1Q/UFjEc524AjFKnRPi4BHTx8oaHqEJochli1lE76KbIH2A7Gi+383b2M72cY+7YSYZ9lIEwXD94xi4holBVun7B5V7IpJVyTZh8XoZ/dzd+tPLgEhY1fFMaK0E4tkgr/gFlRNBPg37c/rkxur+wC6bIQVnbCPsmtXAUWknQCzo3hCVHhWvx5LWzAs+p06MhLww/r/p22rJysbGBAoGQ3D3/Z2H2BUkMKIZ9uj/iZvIYVRq7+FKj0S9JynzMpgkOrkdBpFyvIub+NzeAFXQVV4zlVTosHYhLTAxS75qAMfrDcFgzpmu4SYzOMKDSh2xfiYheBuOFDHUcbOgTWaYOiPMTddNxgMWrhLfqP2F2Bb2PTW8B/wBgUrHms+6OFBrpIa3wqID7pnZYdPWYeT53P0c65UCAEmMpkdVa0ZqdFvphm/1L2eAx7L/R+/Oiu316KYZ8YCMY07fncy/s0VFE4uVAbwV7KQhQHJtloUk5hFOihqqzQl+E/07QPhJ6bWYOt/bIqnLRKUgSA0kQ8T4C5TcLa+A1nD422ebzZxwe2y7U3L+ECBTeBEBrZwUtNrzu3qTv+WiXoYA=,iv:K8/1Rk+V0ZWeNBFccROi3LlzzgvACd1SlN/YToLsAkI=,tag:mLqHajYJHg1u7fWna4l2sg==,type:str] removed: ENC[AES256_GCM,data:ou1tCt8doBvf+s6jI6bAxjeuK7rj+nhS2b6XA4EKJgpNxhXeJcYRQOJz5RKO0FszmjX7g3Lozp7tMmcCzHTQOllaVUg2RGzJwQSrKu91EyUXpAOds9FvBeeCRSu9rlrApqofzODdD8yxej+2AjIMbfL4hShaXxxEWCcALrCdEbURnBOvDnIGSKanaa8tNqzAx3ZTceVMNLdQNxK8bV3OeMcocxBZ6KISK65K8aUtoGiBG65iWaQU/EXV1Jo1xI3/2qgMWZ5RXLxGgN0WxJQdlI6n9slSZQIIzB2WFiujdl9azZKarxz+1EPVZH1xFvaZa6PPBgiq7/NkxuxdLgkXIDtNG5c7s70hzbGV2JQL8JYiizq7ZCQwR97R8TyNu1NMHGJ5MZJFQjDEl0MBliQgr3LIU1uvVdACQHPUvkPdE0P+iVN/vyEnZr0jbFRj5jsw65g1/qXIjlTggNIf1cAF42KhXtNB5Jb0J98ohajCorgNCjmzHj5hftwXAO3lfI1yTMGVTKI9cEStykrgfZl+smpGNlLvvodaBNXvHn/CzemzpLBfV0/iRPB1auqVKMMxMjTxPmDtfUyjqRnbEEySx6AnoAkgIGQr/9Hvth9tMeEn67qukBz8tAs0t/k/+azWCAypjXhRRY/oLu1HRwhIFLR73fS13MDJCXptnGbYHRUcqh7ijGIJgazagHffLu3eDsjeYoaBkg1S+My19dQM9bIDf0QaY5Su3rCuBeQU5MRPpthvtqj+7tS04HDyLmTHZlkFxPCgLd2O6FFIOXREyjZLqD7yHMaOuWQuZXncN807VBRSoTmjKIoT1kBrd6IpH9Gk9R+7C2mUHoszgFtaHjQjVZB1JjwSLfiSmU+zFVO4BpnSnEwwzApUEgthhY4UajAwNggM5L3rO3MfgfBrl65dRbHpqaexWtnZIox4XBiSBbWHfb0YqsuBmfcz763V9k2hQBLnS14bsU63rdvh8OiFjgLD9Ra9+Gx5WyHTxZfrXbm6xhRgjWLx5DVDKu6Jonkg/A==,iv:5ikaalISsPJ+4YON2IxIQkD++32jqBi5c13rcUQpE44=,tag:t9pS04MxQwQLlFt5PNi3jA==,type:str] sops: shamir_threshold: 1 - kms: [] - gcp_kms: [] - azure_kv: [] - hc_vault: [] age: - recipient: age1n4kdchmkk3rfkaknxhveqr2ftprdpgwckutt23y6u8639lazzuks77tgav enc: | @@ -82,8 +78,8 @@ sops: K281Ulg1RjMrS0E4eG0yeEwwaXFNbGcKrzch38oAb0h5Rl4yfXe36yHz7+s+hzLt v1sXcKMMDn7x19P8Bv6sus1KDwcEzdf+mNG9qTzIfTlW3lgWKPJAEQ== -----END AGE ENCRYPTED FILE----- - lastmodified: "2024-10-07T23:24:18Z" - mac: ENC[AES256_GCM,data:qMoo60ydezJZoQX2LYmzwwvQpKvfxJ5QEBqnCVy5UxNijpfhwmY7qQL7AZy0QNTrCXn/EwpjVScGo10EZwu2hyDyMpzerO2g+I3eCReIZQJmK8b4rsqLqCZFueuFVGDSHixj3M/peCuDx0f70ixurOEm3L8HmBwHGjEfY/jQD/8=,iv:/yHfkEEKOxw12sdmAKWUdOdcC2QqjI9eQ6IwnpV8QFU=,tag:wu5aPYyTy5ZDNKk+ggoTKA==,type:str] + lastmodified: "2025-05-27T20:29:36Z" + mac: ENC[AES256_GCM,data:EROSoDKKxmzxgOiGxW9vRyk5Ik95pfeREOGFk/SwPZOFtoETemVh5199xZT1s3Yzim7+fB5efdBAkooUIGjq1JSRVjpkfnozdvRZMYp3dp0b8fp5kBaepYLNCfKCs4e8guNyywiSIBiUGYhi+XZi/N+q1KG/zB/jhGl0G+9DixY=,iv:Qn1MObCfKca7tQn2hGZIcyiCl1PI0gV4fwJ5fFXo3Mc=,tag:X0Ht901lI6h0Ito3lmDvbQ==,type:str] pgp: - created_at: "2025-02-16T10:33:41Z" enc: |- @@ -106,4 +102,4 @@ sops: -----END PGP MESSAGE----- fp: CD8CE78CB0B3BDD4 unencrypted_suffix: _unencrypted - version: 3.9.0 + version: 3.10.2 diff --git a/overlays.nix b/overlays.nix index e5896610..8e31449f 100644 --- a/overlays.nix +++ b/overlays.nix @@ -6,7 +6,7 @@ inputs.rbw-bitw.overlays.default inputs.arcexprs.overlays.default inputs.darwin.overlays.default - inputs.deploy-rs.overlay + inputs.deploy-rs.overlays.default inputs.neorg-overlay.overlays.default (import tree.packages.default {inherit inputs tree;}) ] diff --git a/packages/dorion.nix b/packages/dorion.nix new file mode 100644 index 00000000..488eda2e --- /dev/null +++ b/packages/dorion.nix @@ -0,0 +1,194 @@ +{ + lib, + fetchFromGitHub, + fetchurl, + rustPlatform, + cmake, + ninja, + wrapGAppsHook4, + glib-networking, + gst_all_1, + libsysprof-capture, + libayatana-appindicator, + nodejs, + openssl, + pkg-config, + yq-go, + pnpm_9, + webkitgtk_4_1, + cargo-tauri, + desktop-file-utils, +}: + +let + webkitgtk_4_1' = webkitgtk_4_1.override { + enableExperimental = true; + }; + + shelter = fetchurl { + url = "https://raw.githubusercontent.com/uwu/shelter-builds/fab6f100bd0ab8583d67f792f66722a7d2a14bd1/shelter.js"; + hash = "sha256-d9vaKLrl8RYNcHnE1iGN49ov6U/Y+9XpEsio+c1Sguc="; + meta = { + homepage = "https://github.com/uwu/shelter"; + sourceProvenance = [ lib.sourceTypes.binaryBytecode ]; # actually, minified JS + license = lib.licenses.cc0; + }; + }; +in + +rustPlatform.buildRustPackage (finalAttrs: { + pname = "dorion"; + version = "6.7.1"; + + src = fetchFromGitHub { + owner = "SpikeHD"; + repo = "Dorion"; + tag = "v${finalAttrs.version}"; + hash = "sha256-d4G3royqhz+te5wPWVLNqqG/w0qOvTd7dKcWSzxUMUo="; + }; + + cargoPatches = [ + ./no-cargo-patch.patch + ]; + + cargoRoot = "src-tauri"; + buildAndTestSubdir = finalAttrs.cargoRoot; + + useFetchCargoVendor = true; + cargoHash = "sha256-1xpAJkS31DjrZCY5WJ4/Z1t1ALED5gz7xYLhVR1Qzww="; + + pnpmDeps = pnpm_9.fetchDeps { + inherit (finalAttrs) pname version src; + hash = "sha256-xBonUzA4+1zbViEsKap6CaG6ZRldW1LjNYIB+FmVRFs="; + }; + + # CMake (webkit extension) + cmakeDir = "."; + cmakeBuildDir = "src-tauri/extension_webkit"; + dontUseCmakeConfigure = true; + dontUseNinjaBuild = true; + dontUseNinjaCheck = true; + dontUseNinjaInstall = true; + # cmake's supposed to set this automatically + # ... but the detection is based on the presence of ninja build hook + cmakeFlags = [ + "-GNinja" + ]; + + nativeBuildInputs = [ + pnpm_9.configHook + cargo-tauri.hook + nodejs + pkg-config + wrapGAppsHook4 + yq-go + desktop-file-utils + cmake + ninja + ]; + + buildInputs = [ + openssl + webkitgtk_4_1' + gst_all_1.gst-plugins-base + gst_all_1.gst-plugins-bad + gst_all_1.gst-plugins-good + gst_all_1.gst-plugins-rs + glib-networking + libsysprof-capture + libayatana-appindicator + ]; + + postPatch = '' + # remove updater + rm -rf updater + + # patch cargo-deps + pushd $cargoDepsCopy/tauri-plugin-shell-* + patch -p1 < /build/source/src-tauri/patches/tauri-plugin-shell+*.patch + popd + + substituteInPlace $cargoDepsCopy/libappindicator-sys-*/src/lib.rs \ + --replace-fail "libayatana-appindicator3.so.1" "${libayatana-appindicator}/lib/libayatana-appindicator3.so.1" + + # disable pre-build script and disable auto-updater + yq -iPo=json ' + .bundle.resources = (.bundle.resources | map(select(. != "updater*"))) + ' src-tauri/tauri.conf.json + + # link shelter injection + ln -s ${shelter} src-tauri/injection/shelter.js + + # link html/frontend data + ln -s /build/source/src /build/source/src-tauri/html + ''; + + configurePhase = '' + cmakeConfigurePhase + pnpmConfigHook + ''; + + buildPhase = '' + ninjaBuildPhase + cd /build/source + tauriBuildHook + ''; + + postInstall = '' + # Set up the resource directories + mkdir -p $out/lib/Dorion + ln -s $out/lib/Dorion $out/lib/dorion + rm -rf $out/lib/Dorion/injection + cp -r src-tauri/injection $out/lib/Dorion + cp -r src $out/lib/Dorion + + # Modify the desktop file + desktop-file-edit \ + --set-comment "Tiny alternative Discord client" \ + --set-key="Exec" --set-value="Dorion %U" \ + --set-key="TryExec" --set-value="Dorion" \ + --set-key="StartupWMClass" --set-value="Dorion" \ + --set-key="StartupNotify" --set-value="true" \ + --set-key="Categories" --set-value="Network;InstantMessaging;Chat;" \ + --set-key="Keywords" --set-value="dorion;discord;vencord;chat;im;vc;ds;dc;dsc;tauri;" \ + --set-key="Terminal" --set-value="false" \ + --set-key="MimeType" --set-value="x-scheme-handler/discord" \ + $out/share/applications/Dorion.desktop + ''; + + # error: failed to run custom build command for `Dorion v6.5.3 (/build/source/src-tauri)` + # Permission denied (os error 13) + doCheck = false; + + env = { + TAURI_RESOURCE_DIR = "${placeholder "out"}/lib"; + }; + + meta = { + homepage = "https://spikehd.github.io/projects/dorion/"; + description = "Tiny alternative Discord client"; + longDescription = '' + Dorion is an alternative Discord client aimed towards lower-spec or + storage-sensitive PCs that supports themes, plugins, and more! + ''; + changelog = "https://github.com/SpikeHD/Dorion/releases/tag/v${finalAttrs.version}"; + downloadPage = "https://github.com/SpikeHD/Dorion/releases/tag/v${finalAttrs.version}"; + license = with lib.licenses; [ + gpl3Only + cc0 # Shelter + ]; + mainProgram = "Dorion"; + maintainers = with lib.maintainers; [ + nyabinary + aleksana + griffi-gh + getchoo + ]; + platforms = lib.platforms.linux; + sourceProvenance = [ + lib.sourceTypes.binaryBytecode # actually, minified JS + lib.sourceTypes.fromSource + ]; + }; +}) + diff --git a/packages/lutris.nix b/packages/lutris.nix new file mode 100644 index 00000000..25fb287a --- /dev/null +++ b/packages/lutris.nix @@ -0,0 +1,324 @@ +{ + lib, + buildFHSEnv, + lutris-unwrapped, + extraLinkLines ? '''', + extraPkgs ? pkgs: [ ], + extraLibraries ? pkgs: [ ], + steamSupport ? true, +}: + +let + + qt5Deps = + pkgs: with pkgs.qt5; [ + qtbase + qtmultimedia + ]; + qt6Deps = pkgs: with pkgs.qt6; [ qtbase ]; + gnomeDeps = + pkgs: with pkgs; [ + zenity + gtksourceview + gnome-desktop + libgnome-keyring + webkitgtk_4_1 + ]; + xorgDeps = + pkgs: with pkgs.xorg; [ + libX11 + libXrender + libXrandr + libxcb + libXmu + libpthreadstubs + libXext + libXdmcp + libXxf86vm + libXinerama + libSM + libXv + libXaw + libXi + libXcursor + libXcomposite + libXfixes + libXtst + libXScrnSaver + libICE + libXt + ]; + gstreamerDeps = + pkgs: with pkgs.gst_all_1; [ + gstreamer + gst-plugins-base + gst-plugins-good + gst-plugins-ugly + gst-plugins-bad + gst-libav + ]; + +in +buildFHSEnv { + pname = "lutris"; + inherit (lutris-unwrapped) version; + + runScript = "lutris"; + + # Many native and WINE games need 32bit + multiArch = true; + + targetPkgs = + pkgs: + with pkgs; + [ + lutris-unwrapped + + # Appimages + fuse + + # Adventure Game Studio + allegro + dumb + + # Battle.net + jansson + + # Curl + libnghttp2 + + # Desmume + lua + agg + soundtouch + openal + desktop-file-utils + atk + + # DGen // TODO: libarchive is broken + + # Dolphin + bluez + ffmpeg_6 + gettext + portaudio + miniupnpc + mbedtls_2 + lzo + sfml + gsm + wavpack + orc + nettle + gmp + pcre + vulkan-loader + zstd + + # DOSBox + SDL_net + SDL_sound + + # GOG + glib-networking + + # Higan // TODO: "higan is not available for the x86_64 architecture" + + # Libretro + fluidsynth + hidapi + libgbm + libdrm + + # MAME + fontconfig + SDL2_ttf + + # Mednafen + libglut + mesa_glu + + # MESS + expat + + # Minecraft + nss + + # Mupen64Plus + boost + dash + + # Overwatch 2 + libunwind + + # PPSSPP + glew + snappy + + # Redream // "redream is not available for the x86_64 architecture" + + # RPCS3 + llvm + e2fsprogs + libgpg-error + + # ScummVM + nasm + sndio + + # ResidualVM is now merged with ScummVM and therefore does not exist anymore + flac + + # Snes9x + libepoxy + minizip + + # Vice + bison + flex + + # WINE + xorg.xrandr + perl + which + p7zip + gnused + gnugrep + psmisc + opencl-headers + + # ZDOOM + soundfont-fluid + bzip2 + game-music-emu + ] + ++ qt5Deps pkgs + ++ qt6Deps pkgs + ++ gnomeDeps pkgs + ++ lib.optional steamSupport pkgs.steam + ++ extraPkgs pkgs; + + multiPkgs = + pkgs: + with pkgs; + [ + # Common + libsndfile + libtheora + libogg + libvorbis + libopus + libGLU + libpcap + libpulseaudio + libao + libevdev + udev + libgcrypt + libxml2 + libusb1 + libpng + libmpeg2 + libv4l + libjpeg + libxkbcommon + libass + libcdio + libjack2 + libsamplerate + libzip + libmad + libaio + libcap + libtiff + libva + libgphoto2 + libxslt + libsndfile + giflib + zlib + glib + alsa-lib + zziplib + bash + dbus + keyutils + zip + cabextract + freetype + unzip + coreutils + readline + gcc + SDL + SDL2 + curl + graphite2 + gtk2 + gtk3 + udev + ncurses + wayland + libglvnd + vulkan-loader + xdg-utils + sqlite + gnutls + p11-kit + libbsd + harfbuzz + + # PCSX2 // TODO: "libgobject-2.0.so.0: wrong ELF class: ELFCLASS64" + + # WINE + cups + lcms2 + mpg123 + cairo + unixODBC + samba4 + sane-backends + openldap + ocl-icd + util-linux + libkrb5 + + # Proton + libselinux + + # Winetricks + fribidi + pango + ] + ++ xorgDeps pkgs + ++ gstreamerDeps pkgs + ++ extraLibraries pkgs; + + extraInstallCommands = '' + mkdir -p $out/share + ln -sf ${lutris-unwrapped}/share/applications $out/share + ln -sf ${lutris-unwrapped}/share/icons $out/share + '' + extraLinkLines; + + # allows for some gui applications to share IPC + # this fixes certain issues where they don't render correctly + unshareIpc = false; + + # Some applications such as Natron need access to MIT-SHM or other + # shared memory mechanisms. Unsharing the pid namespace + # breaks the ability for application to reference shared memory. + unsharePid = false; + + meta = { + inherit (lutris-unwrapped.meta) + homepage + description + platforms + license + maintainers + broken + ; + + mainProgram = "lutris"; + }; +} diff --git a/packages/no-cargo-patch.patch b/packages/no-cargo-patch.patch new file mode 100644 index 00000000..33212097 --- /dev/null +++ b/packages/no-cargo-patch.patch @@ -0,0 +1,32 @@ +diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock +index 13a6b54..f6bd9d6 100644 +--- a/src-tauri/Cargo.lock ++++ b/src-tauri/Cargo.lock +@@ -5049,6 +5049,8 @@ dependencies = [ + [[package]] + name = "tauri-plugin-shell" + version = "2.2.1" ++source = "registry+https://github.com/rust-lang/crates.io-index" ++checksum = "69d5eb3368b959937ad2aeaf6ef9a8f5d11e01ffe03629d3530707bbcb27ff5d" + dependencies = [ + "encoding_rs", + "log", +diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml +index 4dcaa86..daef086 100644 +--- a/src-tauri/Cargo.toml ++++ b/src-tauri/Cargo.toml +@@ -12,13 +12,6 @@ rust-version = "1.84.1" + strip = "debuginfo" + lto = false + +-# Patches +-[package.metadata.patch] +-crates = ["tauri-plugin-shell"] +- +-[patch.crates-io] +-tauri-plugin-shell = { path="./target/patch/tauri-plugin-shell-2.2.1" } +- + [build-dependencies] + tauri-build = { version = "2.0.0", features = [] } + + diff --git a/packages/umu-launcher-unwrapped.nix b/packages/umu-launcher-unwrapped.nix new file mode 100644 index 00000000..1dee3cf4 --- /dev/null +++ b/packages/umu-launcher-unwrapped.nix @@ -0,0 +1,106 @@ +{ + bash, + cargo, + fetchFromGitHub, + hatch, + lib, + nix-update-script, + python3Packages, + rustPlatform, + scdoc, + writableTmpDirAsHomeHook, + withTruststore ? true, + withDeltaUpdates ? true, +}: +python3Packages.buildPythonPackage rec { + pname = "umu-launcher-unwrapped"; + version = "1.2.6"; + + src = fetchFromGitHub { + owner = "Open-Wine-Components"; + repo = "umu-launcher"; + tag = version; + hash = "sha256-DkfB78XhK9CXgN/OpJZTjwHB7IcLC4h2HM/1JW42ZO0="; + }; + + cargoDeps = rustPlatform.fetchCargoVendor { + inherit src; + hash = "sha256-JhNErFDJsM20BhgIgJSUBeNzAst8f+s1NzpLfl2m2es="; + }; + + nativeCheckInputs = [ + writableTmpDirAsHomeHook + python3Packages.pytestCheckHook + ]; + + nativeBuildInputs = [ + cargo + hatch + python3Packages.build + python3Packages.installer + rustPlatform.cargoSetupHook + scdoc + ]; + + patches = [ + ./umu-proton-cachyos.patch + ]; + + pythonPath = + with python3Packages; + [ + pyzstd + urllib3 + xlib + ] + ++ lib.optionals withTruststore [ + truststore + ] + ++ lib.optionals withDeltaUpdates [ + cbor2 + xxhash + ]; + + pyproject = false; + configureScript = "./configure.sh"; + + configureFlags = [ + "--use-system-pyzstd" + "--use-system-urllib" + ]; + + makeFlags = [ + "PYTHONDIR=$(PREFIX)/${python3Packages.python.sitePackages}" + "PYTHON_INTERPRETER=${lib.getExe python3Packages.python}" + # Override RELEASEDIR to avoid running `git describe` + "RELEASEDIR=${pname}-${version}" + "SHELL_INTERPRETER=${lib.getExe bash}" + ]; + + disabledTests = [ + # Broken? Asserts that $STEAM_RUNTIME_LIBRARY_PATH is non-empty + # Fails with AssertionError: '' is not true : Expected two elements in STEAM_RUNTIME_LIBRARY_PATHS + "test_game_drive_empty" + "test_game_drive_libpath_empty" + + # Broken? Tests parse_args with no options (./umu_run.py) + # Fails with AssertionError: SystemExit not raised + "test_parse_args_noopts" + ]; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Unified launcher for Windows games on Linux using the Steam Linux Runtime and Tools"; + changelog = "https://github.com/Open-Wine-Components/umu-launcher/releases/tag/${version}"; + homepage = "https://github.com/Open-Wine-Components/umu-launcher"; + license = lib.licenses.gpl3; + mainProgram = "umu-run"; + maintainers = with lib.maintainers; [ + diniamo + MattSturgeon + fuzen + ]; + platforms = lib.platforms.linux; + }; +} diff --git a/packages/umu-proton-cachyos.patch b/packages/umu-proton-cachyos.patch new file mode 100644 index 00000000..c08718d2 --- /dev/null +++ b/packages/umu-proton-cachyos.patch @@ -0,0 +1,1829 @@ +From f56fde27b47266a5378fe6433b9f0978c82590af Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Sat, 22 Mar 2025 17:33:47 +0200 +Subject: [PATCH 01/13] umu_utils: use contextmanager to redirect stdout to + stderr + +python-xlib has two `print()` statements in Xlib.xauth +* https://github.com/python-xlib/python-xlib/blob/master/Xlib/xauth.py#L92 +* https://github.com/python-xlib/python-xlib/blob/master/Xlib/xauth.py#L95 +which can cause issues when the output in stdout needs to be parsed +later. +--- + umu/umu_util.py | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/umu/umu_util.py b/umu/umu_util.py +index 3915e93..40adb12 100644 +--- a/umu/umu_util.py ++++ b/umu/umu_util.py +@@ -1,7 +1,7 @@ + import os + import sys + from collections.abc import Generator +-from contextlib import contextmanager ++from contextlib import contextmanager, redirect_stdout + from ctypes.util import find_library + from fcntl import LOCK_EX, LOCK_UN, flock + from functools import lru_cache +@@ -219,7 +219,8 @@ def xdisplay(no: str): + d: display.Display | None = None + + try: +- d = display.Display(no) ++ with redirect_stdout(sys.stderr): ++ d = display.Display(no) + yield d + finally: + if d is not None: +-- +2.49.0 + + +From b2a8d3b47af6476ad60e09ba88ed7c795582048f Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Wed, 2 Apr 2025 15:38:03 +0300 +Subject: [PATCH 02/13] umu_run: complete the implemtation of reaper in umu + +--- + umu/umu_run.py | 33 +++++++++++++++++++++++---------- + umu/umu_test.py | 1 + + 2 files changed, 24 insertions(+), 10 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index a69351e..bac2450 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -16,7 +16,6 @@ from pathlib import Path + from pwd import getpwuid + from re import match + from socket import AF_INET, SOCK_DGRAM, socket +-from subprocess import Popen + from typing import Any + + from urllib3 import PoolManager, Retry +@@ -596,7 +595,7 @@ def monitor_windows( + set_steam_game_property(d_secondary, diff, steam_appid) + + +-def run_in_steammode(proc: Popen) -> int: ++def run_in_steammode() -> None: + """Set properties on gamescope windows when running in steam mode. + + Currently, Flatpak apps that use umu as their runtime will not have their +@@ -614,7 +613,9 @@ def run_in_steammode(proc: Popen) -> int: + # TODO: Find a robust way to get gamescope displays both in a container + # and outside a container + try: +- with xdisplay(":0") as d_primary, xdisplay(":1") as d_secondary: ++ main_display = os.environ.get("DISPLAY", ":0") ++ game_display = os.environ.get("STEAM_GAME_DISPLAY_0", ":1") ++ with xdisplay(main_display) as d_primary, xdisplay(game_display) as d_secondary: + gamescope_baselayer_sequence = get_gamescope_baselayer_appid(d_primary) + # Dont do window fuckery if we're not inside gamescope + if ( +@@ -639,20 +640,16 @@ def run_in_steammode(proc: Popen) -> int: + ) + baselayer_thread.daemon = True + baselayer_thread.start() +- return proc.wait() + except DisplayConnectionError as e: + # Case where steamos changed its display outputs as we're currently + # assuming connecting to :0 and :1 is stable + log.exception(e) + +- return proc.wait() +- + + def run_command(command: tuple[Path | str, ...]) -> int: + """Run the executable using Proton within the Steam Runtime.""" + prctl: CFuncPtr + cwd: Path | str +- proc: Popen + ret: int = 0 + prctl_ret: int = 0 + libc: str = get_libc() +@@ -688,9 +685,25 @@ def run_command(command: tuple[Path | str, ...]) -> int: + prctl_ret = prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0, 0) + log.debug("prctl exited with status: %s", prctl_ret) + +- with Popen(command, start_new_session=True, cwd=cwd) as proc: +- ret = run_in_steammode(proc) if is_steammode else proc.wait() +- log.debug("Child %s exited with wait status: %s", proc.pid, ret) ++ pid = os.fork() ++ if pid == -1: ++ log.error("Fork failed") ++ ++ if pid == 0: ++ sys.stdout.flush() ++ sys.stderr.flush() ++ if is_steammode: ++ run_in_steammode() ++ os.chdir(cwd) ++ os.execvp(command[0], command) # noqa: S606 ++ ++ while True: ++ try: ++ wait_pid, wait_status = os.wait() ++ log.debug("Child %s exited with wait status: %s", wait_pid, wait_status) ++ except ChildProcessError as e: ++ log.info(e) ++ break + + return ret + +diff --git a/umu/umu_test.py b/umu/umu_test.py +index 123cd15..03a3264 100644 +--- a/umu/umu_test.py ++++ b/umu/umu_test.py +@@ -1250,6 +1250,7 @@ class TestGameLauncher(unittest.TestCase): + if not libc: + return + ++ self.skipTest("WIP") + os.environ["EXE"] = mock_exe + with ( + patch.object( +-- +2.49.0 + + +From 15e7b4ee4709ad12d19bd9c95282c91c2adc22f3 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Thu, 3 Apr 2025 10:12:17 +0300 +Subject: [PATCH 03/13] umu_runtime: use `exec` to replace the shell in + umu-shim instead of capturing the output + +The idea here is to avoid creating a new process, and instead keep the pid +umu directly knows about for as long as possible. +--- + umu/umu_runtime.py | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/umu/umu_runtime.py b/umu/umu_runtime.py +index e443d19..3862f6b 100644 +--- a/umu/umu_runtime.py ++++ b/umu/umu_runtime.py +@@ -55,12 +55,7 @@ def create_shim(file_path: Path): + "fi\n" + "\n" + "# Execute the passed command\n" +- '"$@"\n' +- "\n" +- "# Capture the exit status\n" +- "status=$?\n" +- 'echo "Command exited with status: $status" >&2\n' +- "exit $status\n" ++ 'exec "$@"\n' + ) + + # Write the script content to the specified file path +-- +2.49.0 + + +From ba0e9acbf2bcbde3fc0839288ad67baaef98ddcc Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Thu, 22 May 2025 09:45:42 +0300 +Subject: [PATCH 04/13] umu_run: run steammode workaround on the main process + +--- + umu/umu_run.py | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index bac2450..8e4324a 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -692,10 +692,10 @@ def run_command(command: tuple[Path | str, ...]) -> int: + if pid == 0: + sys.stdout.flush() + sys.stderr.flush() +- if is_steammode: +- run_in_steammode() + os.chdir(cwd) + os.execvp(command[0], command) # noqa: S606 ++ elif is_steammode: ++ run_in_steammode() + + while True: + try: +-- +2.49.0 + + +From b97df656747de1a7ad6c2941b9fb4a8288b10000 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Tue, 3 Jun 2025 11:45:40 +0300 +Subject: [PATCH 05/13] umu_run: use hardcoded display values for now + +commit for targeted revert +--- + umu/umu_run.py | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index 8e4324a..dc19ad8 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -613,9 +613,7 @@ def run_in_steammode() -> None: + # TODO: Find a robust way to get gamescope displays both in a container + # and outside a container + try: +- main_display = os.environ.get("DISPLAY", ":0") +- game_display = os.environ.get("STEAM_GAME_DISPLAY_0", ":1") +- with xdisplay(main_display) as d_primary, xdisplay(game_display) as d_secondary: ++ with xdisplay(":0") as d_primary, xdisplay(":1") as d_secondary: + gamescope_baselayer_sequence = get_gamescope_baselayer_appid(d_primary) + # Dont do window fuckery if we're not inside gamescope + if ( +-- +2.49.0 + + +From 597d17e41cb3fecee4694b18b34fd5fa35448837 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Thu, 20 Mar 2025 11:57:43 +0200 +Subject: [PATCH 06/13] Reapply "umu_run: handle Protons without an explicit + runtime requirement" + +This reverts commit 6494ecd8007f64d245740e78f71d3008d862214f. +--- + tests/test_config.sh | 1 + + umu/umu_plugins.py | 6 +- + umu/umu_run.py | 111 +++++++++++++++++++++-------------- + umu/umu_runtime.py | 6 -- + umu/umu_test.py | 124 +++++++++++++++++++++++----------------- + umu/umu_test_plugins.py | 37 ++++++------ + 6 files changed, 161 insertions(+), 124 deletions(-) + +diff --git a/tests/test_config.sh b/tests/test_config.sh +index 367f1ac..7bed18f 100644 +--- a/tests/test_config.sh ++++ b/tests/test_config.sh +@@ -19,5 +19,6 @@ store = 'gog' + " >> "$tmp" + + ++# This works only for an existing prefix, the prefix `~/Games/umu/umu-0` is created in the previous workflow steps + RUNTIMEPATH=steamrt3 UMU_LOG=debug GAMEID=umu-1141086411 STORE=gog "$PWD/.venv/bin/python" "$HOME/.local/bin/umu-run" --config "$tmp" 2> /tmp/umu-log.txt && grep -E "INFO: Non-steam game Silent Hill 4: The Room \(umu-1141086411\)" /tmp/umu-log.txt + # Run the 'game' using UMU-Proton9.0-3.2 and ensure the protonfixes module finds its fix in umu-database.csv +diff --git a/umu/umu_plugins.py b/umu/umu_plugins.py +index 8766dfc..5a8f1fd 100644 +--- a/umu/umu_plugins.py ++++ b/umu/umu_plugins.py +@@ -51,9 +51,9 @@ def set_env_toml( + _check_env_toml(toml) + + # Required environment variables +- env["WINEPREFIX"] = toml["umu"]["prefix"] +- env["PROTONPATH"] = toml["umu"]["proton"] +- env["EXE"] = toml["umu"]["exe"] ++ env["WINEPREFIX"] = str(Path(toml["umu"]["prefix"]).expanduser()) ++ env["PROTONPATH"] = str(Path(toml["umu"]["proton"]).expanduser()) ++ env["EXE"] = str(Path(toml["umu"]["exe"]).expanduser()) + # Optional + env["GAMEID"] = toml["umu"].get("game_id", "") + env["STORE"] = toml["umu"].get("store", "") +diff --git a/umu/umu_run.py b/umu/umu_run.py +index dc19ad8..8ff8217 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -41,7 +41,7 @@ from umu.umu_consts import ( + from umu.umu_log import log + from umu.umu_plugins import set_env_toml + from umu.umu_proton import get_umu_proton +-from umu.umu_runtime import setup_umu ++from umu.umu_runtime import create_shim, setup_umu + from umu.umu_util import ( + get_libc, + get_library_paths, +@@ -90,9 +90,7 @@ def setup_pfx(path: str) -> None: + wineuser.symlink_to("steamuser") + + +-def check_env( +- env: dict[str, str], session_pools: tuple[ThreadPoolExecutor, PoolManager] +-) -> dict[str, str] | dict[str, Any]: ++def check_env(env: dict[str, str]) -> tuple[dict[str, str] | dict[str, Any], bool]: + """Before executing a game, check for environment variables and set them. + + GAMEID is strictly required and the client is responsible for setting this. +@@ -124,9 +122,10 @@ def check_env( + + env["WINEPREFIX"] = os.environ.get("WINEPREFIX", "") + ++ do_download = False + # Skip Proton if running a native Linux executable + if os.environ.get("UMU_NO_PROTON") == "1": +- return env ++ return env, do_download + + path: Path = STEAM_COMPAT.joinpath(os.environ.get("PROTONPATH", "")) + if os.environ.get("PROTONPATH") and path.name == "UMU-Latest": +@@ -138,16 +137,28 @@ def check_env( + + # Proton Codename + if os.environ.get("PROTONPATH") in {"GE-Proton", "GE-Latest", "UMU-Latest"}: +- get_umu_proton(env, session_pools) ++ do_download = True + + if "PROTONPATH" not in os.environ: + os.environ["PROTONPATH"] = "" +- get_umu_proton(env, session_pools) ++ do_download = True + + env["PROTONPATH"] = os.environ["PROTONPATH"] + ++ return env, do_download ++ ++ ++def download_proton(download: bool, env: dict[str, str], session_pools: tuple[ThreadPoolExecutor, PoolManager]) -> None: ++ """Check if umu should download proton and check if PROTONPATH is set. ++ ++ I am not gonna lie about it, this only exists to satisfy the tests, because downloading ++ was previously nested in `check_env()` ++ """ ++ if download: ++ get_umu_proton(env, session_pools) ++ + # If download fails/doesn't exist in the system, raise an error +- if not os.environ["PROTONPATH"]: ++ if os.environ.get("UMU_NO_PROTON") != "1" and not os.environ["PROTONPATH"]: + err: str = ( + "Environment variable not set or is empty: PROTONPATH\n" + f"Possible reason: GE-Proton or UMU-Proton not found in '{STEAM_COMPAT}'" +@@ -155,8 +166,6 @@ def check_env( + ) + raise FileNotFoundError(err) + +- return env +- + + def set_env( + env: dict[str, str], args: Namespace | tuple[str, list[str]] +@@ -291,12 +300,17 @@ def enable_steam_game_drive(env: dict[str, str]) -> dict[str, str]: + def build_command( + env: dict[str, str], + local: Path, +- opts: list[str] = [], ++ version: str, ++ opts: list[str] | None = None, + ) -> tuple[Path | str, ...]: + """Build the command to be executed.""" + shim: Path = local.joinpath("umu-shim") + proton: Path = Path(env["PROTONPATH"], "proton") +- entry_point: Path = local.joinpath("umu") ++ entry_point: tuple[Path, str, str, str] | tuple[()] = ( ++ local.joinpath(version, "umu"), "--verb", env["PROTON_VERB"], "--" ++ ) if version != "host" else () ++ if opts is None: ++ opts = [] + + if env.get("UMU_NO_PROTON") != "1" and not proton.is_file(): + err: str = "The following file was not found in PROTONPATH: proton" +@@ -305,7 +319,7 @@ def build_command( + # Exit if the entry point is missing + # The _v2-entry-point script and container framework tools are included in + # the same image, so this can happen if the image failed to download +- if not entry_point.is_file(): ++ if entry_point and not entry_point[0].is_file(): + err: str = ( + f"_v2-entry-point (umu) cannot be found in '{local}'\n" + "Runtime Platform missing or download incomplete" +@@ -317,10 +331,7 @@ def build_command( + # The position of arguments matter for winetricks + # Usage: ./winetricks [options] [command|verb|path-to-verb] ... + return ( +- entry_point, +- "--verb", +- env["PROTON_VERB"], +- "--", ++ *entry_point, + proton, + env["PROTON_VERB"], + env["EXE"], +@@ -332,7 +343,7 @@ def build_command( + # Ideally, for reliability, executables should be compiled within + # the Steam Runtime + if env.get("UMU_NO_PROTON") == "1": +- return (entry_point, "--verb", env["PROTON_VERB"], "--", env["EXE"], *opts) ++ return *entry_point, env["EXE"], *opts + + # Will run the game outside the Steam Runtime w/ Proton + if env.get("UMU_NO_RUNTIME") == "1": +@@ -340,10 +351,7 @@ def build_command( + return proton, env["PROTON_VERB"], env["EXE"], *opts + + return ( +- entry_point, +- "--verb", +- env["PROTON_VERB"], +- "--", ++ *entry_point, + shim, + proton, + env["PROTON_VERB"], +@@ -740,6 +748,9 @@ def resolve_umu_version(runtimes: tuple[RuntimeVersion, ...]) -> RuntimeVersion + path = Path(os.environ["PROTONPATH"], "toolmanifest.vdf").resolve() + if path.is_file(): + version = get_umu_version_from_manifest(path, runtimes) ++ else: ++ err: str = f"PROTONPATH '{os.environ['PROTONPATH']}' is not valid, toolmanifest.vdf not found" ++ raise FileNotFoundError(err) + + return version + +@@ -761,7 +772,7 @@ def get_umu_version_from_manifest( + break + + if not appid: +- return None ++ return "host", "host", "host" + + if appid not in appids: + return None +@@ -849,6 +860,12 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + ) + raise RuntimeError(err) + ++ if isinstance(args, Namespace): ++ env, opts = set_env_toml(env, args) ++ os.environ.update({k: v for k, v in env.items() if bool(v)}) ++ else: ++ opts = args[1] # Reference the executable options ++ + # Resolve the runtime version for PROTONPATH + version = resolve_umu_version(__runtime_versions__) + if not version: +@@ -869,23 +886,36 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + # Default to a strict 5 second timeouts throughout + timeout: Timeout = Timeout(connect=NET_TIMEOUT, read=NET_TIMEOUT) + ++ # ensure base directory exists ++ UMU_LOCAL.mkdir(parents=True, exist_ok=True) ++ + with ( + ThreadPoolExecutor() as thread_pool, + PoolManager(timeout=timeout, retries=retries) as http_pool, + ): + session_pools: tuple[ThreadPoolExecutor, PoolManager] = (thread_pool, http_pool) + # Setup the launcher and runtime files +- future: Future = thread_pool.submit( +- setup_umu, UMU_LOCAL / version[1], version, session_pools +- ) ++ _, do_download = check_env(env) + +- if isinstance(args, Namespace): +- env, opts = set_env_toml(env, args) +- else: +- opts = args[1] # Reference the executable options +- check_env(env, session_pools) ++ if version[1] != "host": ++ UMU_LOCAL.joinpath(version[1]).mkdir(parents=True, exist_ok=True) + +- UMU_LOCAL.joinpath(version[1]).mkdir(parents=True, exist_ok=True) ++ future: Future = thread_pool.submit( ++ setup_umu, UMU_LOCAL / version[1], version, session_pools ++ ) ++ ++ download_proton(do_download, env, session_pools) ++ ++ try: ++ future.result() ++ except (MaxRetryError, NewConnectionError, TimeoutErrorUrllib3, ValueError) as e: ++ if not has_umu_setup(): ++ err: str = ( ++ "umu has not been setup for the user\n" ++ "An internet connection is required to setup umu" ++ ) ++ raise RuntimeError(err) from e ++ log.debug("Network is unreachable") + + # Prepare the prefix + with unix_flock(f"{UMU_LOCAL}/{FileLock.Prefix.value}"): +@@ -894,23 +924,16 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + # Configure the environment + set_env(env, args) + ++ # Restore shim if missing ++ if not UMU_LOCAL.joinpath("umu-shim").is_file(): ++ create_shim(UMU_LOCAL / "umu-shim") ++ + # Set all environment variables + # NOTE: `env` after this block should be read only + for key, val in env.items(): + log.debug("%s=%s", key, val) + os.environ[key] = val + +- try: +- future.result() +- except (MaxRetryError, NewConnectionError, TimeoutErrorUrllib3, ValueError): +- if not has_umu_setup(): +- err: str = ( +- "umu has not been setup for the user\n" +- "An internet connection is required to setup umu" +- ) +- raise RuntimeError(err) +- log.debug("Network is unreachable") +- + # Exit if the winetricks verb is already installed to avoid reapplying it + if env["EXE"].endswith("winetricks") and is_installed_verb( + opts, Path(env["WINEPREFIX"]) +@@ -918,7 +941,7 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + sys.exit(1) + + # Build the command +- command: tuple[Path | str, ...] = build_command(env, UMU_LOCAL / version[1], opts) ++ command: tuple[Path | str, ...] = build_command(env, UMU_LOCAL, version[1], opts) + log.debug("%s", command) + + # Run the command +diff --git a/umu/umu_runtime.py b/umu/umu_runtime.py +index 3862f6b..273706a 100644 +--- a/umu/umu_runtime.py ++++ b/umu/umu_runtime.py +@@ -259,8 +259,6 @@ def _install_umu( + log.debug("Renaming: _v2-entry-point -> umu") + local.joinpath("_v2-entry-point").rename(local.joinpath("umu")) + +- create_shim(local / "umu-shim") +- + # Validate the runtime after moving the files + check_runtime(local, runtime_ver) + +@@ -375,10 +373,6 @@ def _update_umu( + # Update our runtime + _update_umu_platform(local, runtime, runtime_ver, session_pools, resp) + +- # Restore shim if missing +- if not local.joinpath("umu-shim").is_file(): +- create_shim(local / "umu-shim") +- + log.info("%s is up to date", variant) + + +diff --git a/umu/umu_test.py b/umu/umu_test.py +index 03a3264..8e26b10 100644 +--- a/umu/umu_test.py ++++ b/umu/umu_test.py +@@ -1559,7 +1559,8 @@ class TestGameLauncher(unittest.TestCase): + os.environ["WINEPREFIX"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["PROTONPATH"] = "GE-Proton" +- umu_run.check_env(self.env, self.test_session_pools) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, self.test_session_pools) + self.assertEqual( + self.env["PROTONPATH"], + self.test_compat.joinpath( +@@ -1586,7 +1587,8 @@ class TestGameLauncher(unittest.TestCase): + os.environ["WINEPREFIX"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["PROTONPATH"] = "GE-Proton" +- umu_run.check_env(self.env, mock_session_pools) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, mock_session_pools) + self.assertFalse(os.environ.get("PROTONPATH"), "Expected empty string") + + def test_latest_interrupt(self): +@@ -1883,7 +1885,7 @@ class TestGameLauncher(unittest.TestCase): + # Args + args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, self.test_session_pools) ++ result_env, result_dl = umu_run.check_env(self.env) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -1947,7 +1949,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2044,7 +2047,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2120,7 +2124,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result_args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2159,7 +2164,7 @@ class TestGameLauncher(unittest.TestCase): + ) + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) + self.assertIsInstance( + test_command, tuple, "Expected a tuple from build_command" + ) +@@ -2207,7 +2212,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result_args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2246,7 +2252,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ |= self.env + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) + self.assertIsInstance( + test_command, tuple, "Expected a tuple from build_command" + ) +@@ -2285,7 +2291,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result_args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2300,7 +2307,7 @@ class TestGameLauncher(unittest.TestCase): + + # Since we didn't create the proton file, an exception should be raised + with self.assertRaises(FileNotFoundError): +- umu_run.build_command(self.env, self.test_local_share) ++ umu_run.build_command(self.env, self.test_local_share, self.test_runtime_version[1]) + + def test_build_command(self): + """Test build command. +@@ -2318,7 +2325,7 @@ class TestGameLauncher(unittest.TestCase): + Path(self.test_file, "proton").touch() + + # Mock the shim file +- shim_path = Path(self.test_local_share, "umu-shim") ++ shim_path = Path(self.test_local_share_parent, "umu-shim") + shim_path.touch() + + with ( +@@ -2333,7 +2340,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result_args = __main__.parse_args() + # Config +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2373,7 +2381,7 @@ class TestGameLauncher(unittest.TestCase): + ) + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) + self.assertIsInstance( + test_command, tuple, "Expected a tuple from build_command" + ) +@@ -2425,7 +2433,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result = __main__.parse_args() + # Check +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + +@@ -2506,7 +2515,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result = __main__.parse_args() + # Check +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2614,7 +2624,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result = __main__.parse_args() + # Check +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2730,7 +2741,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result = __main__.parse_args() + # Check +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2860,7 +2872,8 @@ class TestGameLauncher(unittest.TestCase): + # Args + result = __main__.parse_args() + # Check +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -3349,12 +3362,11 @@ class TestGameLauncher(unittest.TestCase): + Expects the directory $HOME/Games/umu/$GAMEID to not be created + when UMU_NO_PROTON=1 and GAMEID is set in the host environment. + """ +- result = None ++ result_env, result_dl = None, None + # Mock $HOME + mock_home = Path(self.test_file) + + with ( +- ThreadPoolExecutor() as thread_pool, + # Mock the internal call to Path.home(). Otherwise, some of our + # assertions may fail when running this test suite locally if + # the user already has that dir +@@ -3362,8 +3374,8 @@ class TestGameLauncher(unittest.TestCase): + ): + os.environ["UMU_NO_PROTON"] = "1" + os.environ["GAMEID"] = "foo" +- result = umu_run.check_env(self.env, thread_pool) +- self.assertTrue(result is self.env) ++ result_env, result_dl = umu_run.check_env(self.env) ++ self.assertTrue(result_env is self.env) + path = mock_home.joinpath("Games", "umu", os.environ["GAMEID"]) + # Ensure we did not create the target nor its parents up to $HOME + self.assertFalse(path.exists(), f"Expected {path} to not exist") +@@ -3382,20 +3394,17 @@ class TestGameLauncher(unittest.TestCase): + Expects the WINE prefix directory to not be created when + UMU_NO_PROTON=1 and WINEPREFIX is set in the host environment. + """ +- result = None ++ result_env, result_dl = None, None + +- with ( +- ThreadPoolExecutor() as thread_pool, +- ): +- os.environ["WINEPREFIX"] = "123" +- os.environ["UMU_NO_PROTON"] = "1" +- os.environ["GAMEID"] = "foo" +- result = umu_run.check_env(self.env, thread_pool) +- self.assertTrue(result is self.env) +- self.assertFalse( +- Path(os.environ["WINEPREFIX"]).exists(), +- f"Expected directory {os.environ['WINEPREFIX']} to not exist", +- ) ++ os.environ["WINEPREFIX"] = "123" ++ os.environ["UMU_NO_PROTON"] = "1" ++ os.environ["GAMEID"] = "foo" ++ result_env, result_dl = umu_run.check_env(self.env) ++ self.assertTrue(result_env is self.env) ++ self.assertFalse( ++ Path(os.environ["WINEPREFIX"]).exists(), ++ f"Expected directory {os.environ['WINEPREFIX']} to not exist", ++ ) + + def test_env_proton_nodir(self): + """Test check_env when $PROTONPATH in the case we failed to set it. +@@ -3410,7 +3419,8 @@ class TestGameLauncher(unittest.TestCase): + ): + os.environ["WINEPREFIX"] = self.test_file + os.environ["GAMEID"] = self.test_file +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + + def test_env_wine_empty(self): + """Test check_env when $WINEPREFIX is empty. +@@ -3426,7 +3436,8 @@ class TestGameLauncher(unittest.TestCase): + ): + os.environ["WINEPREFIX"] = "" + os.environ["GAMEID"] = self.test_file +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + + def test_env_gameid_empty(self): + """Test check_env when $GAMEID is empty. +@@ -3442,7 +3453,8 @@ class TestGameLauncher(unittest.TestCase): + ): + os.environ["WINEPREFIX"] = "" + os.environ["GAMEID"] = "" +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + + def test_env_wine_dir(self): + """Test check_env when $WINEPREFIX is not a directory. +@@ -3463,7 +3475,8 @@ class TestGameLauncher(unittest.TestCase): + ) + + with ThreadPoolExecutor() as thread_pool: +- umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + + # After this, the WINEPREFIX and new dirs should be created + self.assertTrue( +@@ -3492,15 +3505,16 @@ class TestGameLauncher(unittest.TestCase): + path_to_tmp, + ) + +- result = None ++ result_env, result_dl = None, None + os.environ["WINEPREFIX"] = unexpanded_path + os.environ["GAMEID"] = self.test_file + os.environ["PROTONPATH"] = unexpanded_path + + with ThreadPoolExecutor() as thread_pool: +- result = umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + +- self.assertTrue(result is self.env, "Expected the same reference") ++ self.assertTrue(result_env is self.env, "Expected the same reference") + self.assertEqual( + self.env["WINEPREFIX"], + unexpanded_path, +@@ -3517,15 +3531,16 @@ class TestGameLauncher(unittest.TestCase): + + def test_env_vars(self): + """Test check_env when setting $WINEPREFIX, $GAMEID and $PROTONPATH.""" +- result = None ++ result_env, result_dl = None, None + os.environ["WINEPREFIX"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["PROTONPATH"] = self.test_file + + with ThreadPoolExecutor() as thread_pool: +- result = umu_run.check_env(self.env, thread_pool) ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) + +- self.assertTrue(result is self.env, "Expected the same reference") ++ self.assertTrue(result_env is self.env, "Expected the same reference") + self.assertEqual( + self.env["WINEPREFIX"], + self.test_file, +@@ -3556,8 +3571,9 @@ class TestGameLauncher(unittest.TestCase): + ): + os.environ["WINEPREFIX"] = self.test_file + os.environ["GAMEID"] = self.test_file +- result = umu_run.check_env(self.env, thread_pool) +- self.assertTrue(result is self.env, "Expected the same reference") ++ result_env, result_dl = umu_run.check_env(self.env) ++ umu_run.download_proton(result_dl, result_env, thread_pool) ++ self.assertTrue(result_env is self.env, "Expected the same reference") + self.assertFalse(os.environ["PROTONPATH"]) + + def test_env_vars_wine(self): +@@ -3565,7 +3581,7 @@ class TestGameLauncher(unittest.TestCase): + + Expects GAMEID and PROTONPATH to be set for the command line: + """ +- result = None ++ result_env, result_dl = None, None + mock_gameid = "umu-default" + mock_protonpath = str(self.test_proton_dir) + +@@ -3578,8 +3594,8 @@ class TestGameLauncher(unittest.TestCase): + # and the GAMEID is 'umu-default' + with patch.object(umu_run, "get_umu_proton", new_callable=mock_get_umu_proton): + os.environ["WINEPREFIX"] = self.test_file +- result = umu_run.check_env(self.env, self.test_session_pools) +- self.assertTrue(result, self.env) ++ result_env, result_dl = umu_run.check_env(self.env) ++ self.assertTrue(result_env, self.env) + self.assertEqual(os.environ["GAMEID"], mock_gameid) + self.assertEqual(os.environ["GAMEID"], self.env["GAMEID"]) + self.assertEqual(os.environ["PROTONPATH"], mock_protonpath) +@@ -3593,7 +3609,7 @@ class TestGameLauncher(unittest.TestCase): + + Expects PROTONPATH, GAMEID, and WINEPREFIX to be set + """ +- result = None ++ result_env, result_dl = None, None + mock_gameid = "umu-default" + mock_protonpath = str(self.test_proton_dir) + mock_wineprefix = "/home/foo/Games/umu/umu-default" +@@ -3613,8 +3629,8 @@ class TestGameLauncher(unittest.TestCase): + patch.object(umu_run, "get_umu_proton", new_callable=mock_get_umu_proton), + patch.object(Path, "mkdir", return_value=mock_set_wineprefix()), + ): +- result = umu_run.check_env(self.env, self.test_session_pools) +- self.assertTrue(result, self.env) ++ result_env, result_dl = umu_run.check_env(self.env) ++ self.assertTrue(result_env, self.env) + self.assertEqual(os.environ["GAMEID"], mock_gameid) + self.assertEqual(os.environ["GAMEID"], self.env["GAMEID"]) + self.assertEqual(os.environ["PROTONPATH"], mock_protonpath) +diff --git a/umu/umu_test_plugins.py b/umu/umu_test_plugins.py +index 7230139..d3463b6 100644 +--- a/umu/umu_test_plugins.py ++++ b/umu/umu_test_plugins.py +@@ -64,11 +64,14 @@ class TestGameLauncherPlugins(unittest.TestCase): + # /usr/share/umu + self.test_user_share = Path("./tmp.jl3W4MtO57") + # ~/.local/share/Steam/compatibilitytools.d +- self.test_local_share = Path("./tmp.WUaQAk7hQJ") + self.test_runtime_version = ("sniper", "steamrt3", "1628350") ++ self.test_local_share_parent = Path("./tmp.WUaQAk7hQJ") ++ self.test_local_share = self.test_local_share_parent.joinpath( ++ self.test_runtime_version[1] ++ ) + + self.test_user_share.mkdir(exist_ok=True) +- self.test_local_share.mkdir(exist_ok=True) ++ self.test_local_share.mkdir(parents=True, exist_ok=True) + self.test_cache.mkdir(exist_ok=True) + self.test_compat.mkdir(exist_ok=True) + self.test_proton_dir.mkdir(exist_ok=True) +@@ -223,7 +226,7 @@ class TestGameLauncherPlugins(unittest.TestCase): + + # Build + with self.assertRaisesRegex(FileNotFoundError, "_v2-entry-point"): +- umu_run.build_command(self.env, self.test_local_share, test_command) ++ umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1], test_command) + + def test_build_command_proton(self): + """Test build_command. +@@ -301,7 +304,7 @@ class TestGameLauncherPlugins(unittest.TestCase): + + # Build + with self.assertRaisesRegex(FileNotFoundError, "proton"): +- umu_run.build_command(self.env, self.test_local_share, test_command) ++ umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1], test_command) + + def test_build_command_toml(self): + """Test build_command. +@@ -326,7 +329,7 @@ class TestGameLauncherPlugins(unittest.TestCase): + Path(toml_path).touch() + + # Mock the shim file +- shim_path = Path(self.test_local_share, "umu-shim") ++ shim_path = Path(self.test_local_share_parent, "umu-shim") + shim_path.touch() + + with Path(toml_path).open(mode="w", encoding="utf-8") as file: +@@ -381,7 +384,7 @@ class TestGameLauncherPlugins(unittest.TestCase): + os.environ[key] = val + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) + + # Verify contents of the command + entry_point, opt1, verb, opt2, shim, proton, verb2, exe = [*test_command] +@@ -619,23 +622,23 @@ class TestGameLauncherPlugins(unittest.TestCase): + # prepare for building the command + self.assertEqual( + self.env["EXE"], +- unexpanded_exe, +- "Expected path not to be expanded", ++ str(Path(unexpanded_exe).expanduser()), ++ "Expected path to be expanded", + ) + self.assertEqual( + self.env["PROTONPATH"], +- unexpanded_path, +- "Expected path not to be expanded", ++ str(Path(unexpanded_path).expanduser()), ++ "Expected path to be expanded", + ) + self.assertEqual( + self.env["WINEPREFIX"], +- unexpanded_path, +- "Expected path not to be expanded", ++ str(Path(unexpanded_path).expanduser()), ++ "Expected path to be expanded", + ) + self.assertEqual( + self.env["GAMEID"], + unexpanded_path, +- "Expectd path not to be expanded", ++ "Expected path to be expanded", + ) + + def test_set_env_toml_opts(self): +@@ -699,12 +702,12 @@ class TestGameLauncherPlugins(unittest.TestCase): + self.assertTrue(self.env["EXE"], "Expected EXE to be set") + self.assertEqual( + self.env["PROTONPATH"], +- self.test_file, ++ str(Path(self.test_file).expanduser()), + "Expected PROTONPATH to be set", + ) + self.assertEqual( + self.env["WINEPREFIX"], +- self.test_file, ++ str(Path(self.test_file).expanduser()), + "Expected WINEPREFIX to be set", + ) + self.assertEqual( +@@ -753,12 +756,12 @@ class TestGameLauncherPlugins(unittest.TestCase): + self.assertTrue(self.env["EXE"], "Expected EXE to be set") + self.assertEqual( + self.env["PROTONPATH"], +- self.test_file, ++ str(Path(self.test_file).expanduser()), + "Expected PROTONPATH to be set", + ) + self.assertEqual( + self.env["WINEPREFIX"], +- self.test_file, ++ str(Path(self.test_file).expanduser()), + "Expected WINEPREFIX to be set", + ) + self.assertEqual( +-- +2.49.0 + + +From 594c54e0c8495f13662145175f72130385ea07c0 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Thu, 20 Mar 2025 14:20:29 +0200 +Subject: [PATCH 07/13] umu_run: only allow no runtime tools if + `UMU_NO_RUNTIME=1` is set + +--- + umu/umu_run.py | 10 ++++------ + 1 file changed, 4 insertions(+), 6 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index 8ff8217..0f7026a 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -345,11 +345,6 @@ def build_command( + if env.get("UMU_NO_PROTON") == "1": + return *entry_point, env["EXE"], *opts + +- # Will run the game outside the Steam Runtime w/ Proton +- if env.get("UMU_NO_RUNTIME") == "1": +- log.warning("Runtime Platform disabled") +- return proton, env["PROTON_VERB"], env["EXE"], *opts +- + return ( + *entry_point, + shim, +@@ -772,7 +767,10 @@ def get_umu_version_from_manifest( + break + + if not appid: +- return "host", "host", "host" ++ if os.environ.get("UMU_NO_RUNTIME", None) == "1": ++ log.warning("Runtime Platform disabled") ++ return "host", "host", "host" ++ return None + + if appid not in appids: + return None +-- +2.49.0 + + +From 806188d0c370d80b890e63be45afc9a6154d4356 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Thu, 20 Mar 2025 14:21:35 +0200 +Subject: [PATCH 08/13] umu_tests: add test to ensure the runtime is used even + if `UMU_NO_RUNTIME=1` is set if the tool requires a runtime + +--- + umu/umu_test.py | 200 ++++++++++++++++++++++++++++++++++++++---------- + 1 file changed, 160 insertions(+), 40 deletions(-) + +diff --git a/umu/umu_test.py b/umu/umu_test.py +index 8e26b10..50be67a 100644 +--- a/umu/umu_test.py ++++ b/umu/umu_test.py +@@ -97,10 +97,14 @@ class TestGameLauncher(unittest.TestCase): + # /usr/share/umu + self.test_user_share = Path("./tmp.BXk2NnvW2m") + # ~/.local/share/Steam/compatibilitytools.d +- self.test_runtime_version = ("sniper", "steamrt3", "1628350") ++ self.test_runtime_versions = ( ++ ("sniper", "steamrt3", "1628350"), ++ ("soldier", "steamrt2", "1391110"), ++ ) ++ self.test_runtime_default = self.test_runtime_versions[0] + self.test_local_share_parent = Path("./tmp.aDl73CbQCP") + self.test_local_share = self.test_local_share_parent.joinpath( +- self.test_runtime_version[1] ++ self.test_runtime_default[1] + ) + # Wine prefix + self.test_winepfx = Path("./tmp.AlfLPDhDvA") +@@ -771,7 +775,7 @@ class TestGameLauncher(unittest.TestCase): + # Mock a new install + with TemporaryDirectory() as file: + # Populate our fake $XDG_DATA_HOME/umu +- mock_subdir = Path(file, self.test_runtime_version[1]) ++ mock_subdir = Path(file, self.test_runtime_default[1]) + mock_subdir.mkdir() + mock_subdir.joinpath("umu").touch() + # Mock the runtime ver +@@ -794,7 +798,7 @@ class TestGameLauncher(unittest.TestCase): + # Mock a new install + with TemporaryDirectory() as file: + # Populate our fake $XDG_DATA_HOME/umu +- mock_subdir = Path(file, self.test_runtime_version[1]) ++ mock_subdir = Path(file, self.test_runtime_default[1]) + mock_subdir.mkdir() + mock_subdir.joinpath("umu").touch() + # Mock the runtime ver +@@ -815,7 +819,7 @@ class TestGameLauncher(unittest.TestCase): + + # Mock a new install + with TemporaryDirectory() as file: +- mock_subdir = Path(file, self.test_runtime_version[1]) ++ mock_subdir = Path(file, self.test_runtime_default[1]) + mock_subdir.mkdir() + mock_subdir.joinpath("umu").touch() + # Mock the runtime ver +@@ -1370,7 +1374,7 @@ class TestGameLauncher(unittest.TestCase): + """ + self.test_user_share.joinpath("pressure-vessel", "bin", "pv-verify").unlink() + result = umu_runtime.check_runtime( +- self.test_user_share, self.test_runtime_version ++ self.test_user_share, self.test_runtime_default + ) + self.assertEqual(result, 1, "Expected the exit code 1") + +@@ -1379,7 +1383,7 @@ class TestGameLauncher(unittest.TestCase): + mock = CompletedProcess(["foo"], 0) + with patch.object(umu_runtime, "run", return_value=mock): + result = umu_runtime.check_runtime( +- self.test_user_share, self.test_runtime_version ++ self.test_user_share, self.test_runtime_default + ) + self.assertEqual(result, 0, "Expected the exit code 0") + +@@ -1397,7 +1401,7 @@ class TestGameLauncher(unittest.TestCase): + mock = CompletedProcess(["foo"], 1) + with patch.object(umu_runtime, "run", return_value=mock): + result = umu_runtime.check_runtime( +- self.test_user_share, self.test_runtime_version ++ self.test_user_share, self.test_runtime_default + ) + self.assertEqual(result, 1, "Expected the exit code 1") + +@@ -1881,7 +1885,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["PROTONPATH"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + args = __main__.parse_args() + # Config +@@ -1945,7 +1949,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["PROTONPATH"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + args = __main__.parse_args() + # Config +@@ -2043,7 +2047,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["PROTONPATH"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + args = __main__.parse_args() + # Config +@@ -2120,7 +2124,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file + os.environ["UMU_NO_PROTON"] = "1" +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result_args = __main__.parse_args() + # Config +@@ -2141,7 +2145,7 @@ class TestGameLauncher(unittest.TestCase): + ): + umu_runtime.setup_umu( + self.test_local_share, +- self.test_runtime_version, ++ self.test_runtime_default, + self.test_session_pools, + ) + copytree( +@@ -2164,7 +2168,7 @@ class TestGameLauncher(unittest.TestCase): + ) + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_default[1]) + self.assertIsInstance( + test_command, tuple, "Expected a tuple from build_command" + ) +@@ -2185,19 +2189,32 @@ class TestGameLauncher(unittest.TestCase): + self.assertEqual(sep, "--", "Expected --") + self.assertEqual(exe, self.env["EXE"], "Expected the EXE") + +- def test_build_command_nopv(self): +- """Test build_command when disabling Pressure Vessel. ++ def test_build_command_nopv_appid(self): ++ """Test build_command when disabling Pressure Vessel but the tool requests a runtime. + +- UMU_NO_RUNTIME=1 disables Pressure Vessel, allowing +- the launcher to run Proton on the host -- Flatpak environment. ++ UMU_NO_RUNTIME=1 disables Pressure Vessel, but the tool needs ++ a runtime, so use the correct runtime disregarding the env variable. + +- Expects the list to contain 3 string elements. ++ Expects the list to contain 8 string elements. + """ + result_args = None + test_command = [] + + # Mock the proton file + Path(self.test_file, "proton").touch() ++ # Mock a runtime toolmanifest.vdf ++ Path(self.test_file, "toolmanifest.vdf").write_text( ++ ''' ++ "manifest" ++ { ++ "version" "2" ++ "commandline" "/proton %verb%" ++ "require_tool_appid" "1628350" ++ "use_sessions" "1" ++ "compatmanager_layer_name" "proton" ++ } ++ ''' ++ ) + + with ( + patch("sys.argv", ["", self.test_exe]), +@@ -2208,12 +2225,14 @@ class TestGameLauncher(unittest.TestCase): + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file + os.environ["UMU_NO_RUNTIME"] = "1" +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ version = umu_run.resolve_umu_version(self.test_runtime_versions) ++ os.environ["RUNTIMEPATH"] = version[1] + # Args + result_args = __main__.parse_args() + # Config +- result_env, result_dl = umu_run.check_env(self.env) +- umu_run.download_proton(result_dl, result_env, thread_pool) ++ _, result_dl = umu_run.check_env(self.env) ++ if version[1] != "host": ++ umu_run.download_proton(result_dl, self.env, thread_pool) + # Prefix + umu_run.setup_pfx(self.env["WINEPREFIX"]) + # Env +@@ -2227,7 +2246,7 @@ class TestGameLauncher(unittest.TestCase): + ): + umu_runtime.setup_umu( + self.test_local_share, +- self.test_runtime_version, ++ self.test_runtime_default, + self.test_session_pools, + ) + copytree( +@@ -2252,16 +2271,16 @@ class TestGameLauncher(unittest.TestCase): + os.environ |= self.env + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, version[1]) + self.assertIsInstance( + test_command, tuple, "Expected a tuple from build_command" + ) + self.assertEqual( + len(test_command), +- 3, ++ 8, + f"Expected 3 elements, received {len(test_command)}", + ) +- proton, verb, exe, *_ = [*test_command] ++ _, _, verb, _, _, proton, _, exe = [*test_command] + self.assertIsInstance(proton, os.PathLike, "Expected proton to be PathLike") + self.assertEqual( + proton, +@@ -2271,6 +2290,107 @@ class TestGameLauncher(unittest.TestCase): + self.assertEqual(verb, "waitforexitandrun", "Expected PROTON_VERB") + self.assertEqual(exe, self.env["EXE"], "Expected EXE") + ++ def test_build_command_nopv_noappid(self): ++ """Test build_command when disabling Pressure Vessel and the tool doesn't request a runtime. ++ ++ UMU_NO_RUNTIME=1 disables Pressure Vessel, and the tool doesn't set ++ a runtime, allow the tool to run using the host's libraries as it expects. ++ ++ Expects the list to contain 4 string elements. ++ """ ++ result_args = None ++ test_command = [] ++ ++ # Mock the proton file ++ Path(self.test_file, "proton").touch() ++ # Mock a non-runtime toolmanifest.vdf ++ Path(self.test_file, "toolmanifest.vdf").write_text( ++ ''' ++ "manifest" ++ { ++ "version" "2" ++ "commandline" "/proton %verb%" ++ "use_sessions" "1" ++ "compatmanager_layer_name" "proton" ++ } ++ ''' ++ ) ++ ++ with ( ++ patch("sys.argv", ["", self.test_exe]), ++ ThreadPoolExecutor() as thread_pool, ++ ): ++ os.environ["WINEPREFIX"] = self.test_file ++ os.environ["PROTONPATH"] = self.test_file ++ os.environ["GAMEID"] = self.test_file ++ os.environ["STORE"] = self.test_file ++ os.environ["UMU_NO_RUNTIME"] = "1" ++ version = umu_run.resolve_umu_version(self.test_runtime_versions) ++ os.environ["RUNTIMEPATH"] = version[1] ++ # Args ++ result_args = __main__.parse_args() ++ # Config ++ _, result_dl = umu_run.check_env(self.env) ++ if version[1] != "host": ++ umu_run.download_proton(result_dl, self.env, thread_pool) ++ # Prefix ++ umu_run.setup_pfx(self.env["WINEPREFIX"]) ++ # Env ++ umu_run.set_env(self.env, result_args) ++ # Game drive ++ umu_run.enable_steam_game_drive(self.env) ++ ++ # Mock setting up the runtime ++ with ( ++ patch.object(umu_runtime, "_install_umu", return_value=None), ++ ): ++ umu_runtime.setup_umu( ++ self.test_local_share, ++ self.test_runtime_default, ++ self.test_session_pools, ++ ) ++ copytree( ++ Path(self.test_user_share, "sniper_platform_0.20240125.75305"), ++ Path(self.test_local_share, "sniper_platform_0.20240125.75305"), ++ dirs_exist_ok=True, ++ symlinks=True, ++ ) ++ copy( ++ Path(self.test_user_share, "run"), ++ Path(self.test_local_share, "run"), ++ ) ++ copy( ++ Path(self.test_user_share, "run-in-sniper"), ++ Path(self.test_local_share, "run-in-sniper"), ++ ) ++ copy( ++ Path(self.test_user_share, "umu"), ++ Path(self.test_local_share, "umu"), ++ ) ++ ++ os.environ |= self.env ++ ++ # Build ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, version[1]) ++ self.assertIsInstance( ++ test_command, tuple, "Expected a tuple from build_command" ++ ) ++ self.assertEqual( ++ len(test_command), ++ 4, ++ f"Expected 3 elements, received {len(test_command)}", ++ ) ++ _, proton, verb, exe, *_ = [*test_command] ++ self.assertIsInstance(proton, os.PathLike, "Expected proton to be PathLike") ++ self.assertEqual( ++ proton, ++ Path(self.env["PROTONPATH"], "proton"), ++ "Expected PROTONPATH", ++ ) ++ self.assertEqual(verb, "waitforexitandrun", "Expected PROTON_VERB") ++ self.assertEqual(exe, self.env["EXE"], "Expected EXE") ++ ++ + def test_build_command_noproton(self): + """Test build_command when $PROTONPATH/proton is not found. + +@@ -2287,7 +2407,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file + os.environ["UMU_NO_RUNTIME"] = "pressure-vessel" +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result_args = __main__.parse_args() + # Config +@@ -2307,7 +2427,7 @@ class TestGameLauncher(unittest.TestCase): + + # Since we didn't create the proton file, an exception should be raised + with self.assertRaises(FileNotFoundError): +- umu_run.build_command(self.env, self.test_local_share, self.test_runtime_version[1]) ++ umu_run.build_command(self.env, self.test_local_share, self.test_runtime_default[1]) + + def test_build_command(self): + """Test build command. +@@ -2336,7 +2456,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["PROTONPATH"] = self.test_file + os.environ["GAMEID"] = self.test_file + os.environ["STORE"] = self.test_file +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result_args = __main__.parse_args() + # Config +@@ -2358,7 +2478,7 @@ class TestGameLauncher(unittest.TestCase): + ): + umu_runtime.setup_umu( + self.test_local_share, +- self.test_runtime_version, ++ self.test_runtime_default, + self.test_session_pools, + ) + copytree( +@@ -2381,7 +2501,7 @@ class TestGameLauncher(unittest.TestCase): + ) + + # Build +- test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_version[1]) ++ test_command = umu_run.build_command(self.env, self.test_local_share_parent, self.test_runtime_default[1]) + self.assertIsInstance( + test_command, tuple, "Expected a tuple from build_command" + ) +@@ -2429,7 +2549,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["GAMEID"] = test_str + os.environ["STORE"] = test_str + os.environ["PROTON_VERB"] = self.test_verb +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result = __main__.parse_args() + # Check +@@ -2511,7 +2631,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["GAMEID"] = umu_id + os.environ["STORE"] = test_str + os.environ["PROTON_VERB"] = self.test_verb +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result = __main__.parse_args() + # Check +@@ -2589,7 +2709,7 @@ class TestGameLauncher(unittest.TestCase): + self.env["PROTONPATH"] + + ":" + + Path.home() +- .joinpath(".local", "share", "umu", self.test_runtime_version[1]) ++ .joinpath(".local", "share", "umu", self.test_runtime_default[1]) + .as_posix(), + "Expected STEAM_COMPAT_TOOL_PATHS to be set", + ) +@@ -2620,7 +2740,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["GAMEID"] = test_str + os.environ["STORE"] = test_str + os.environ["PROTON_VERB"] = self.test_verb +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result = __main__.parse_args() + # Check +@@ -2706,7 +2826,7 @@ class TestGameLauncher(unittest.TestCase): + self.env["PROTONPATH"] + + ":" + + Path.home() +- .joinpath(".local", "share", "umu", self.test_runtime_version[1]) ++ .joinpath(".local", "share", "umu", self.test_runtime_default[1]) + .as_posix(), + "Expected STEAM_COMPAT_TOOL_PATHS to be set", + ) +@@ -2737,7 +2857,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["STORE"] = test_str + os.environ["PROTON_VERB"] = self.test_verb + os.environ["UMU_RUNTIME_UPDATE"] = "0" +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result = __main__.parse_args() + # Check +@@ -2828,7 +2948,7 @@ class TestGameLauncher(unittest.TestCase): + self.env["PROTONPATH"] + + ":" + + Path.home() +- .joinpath(".local", "share", "umu", self.test_runtime_version[1]) ++ .joinpath(".local", "share", "umu", self.test_runtime_default[1]) + .as_posix(), + "Expected STEAM_COMPAT_TOOL_PATHS to be set", + ) +@@ -2868,7 +2988,7 @@ class TestGameLauncher(unittest.TestCase): + os.environ["PROTONPATH"] = test_dir.as_posix() + os.environ["GAMEID"] = test_str + os.environ["PROTON_VERB"] = proton_verb +- os.environ["RUNTIMEPATH"] = self.test_runtime_version[1] ++ os.environ["RUNTIMEPATH"] = self.test_runtime_default[1] + # Args + result = __main__.parse_args() + # Check +@@ -2963,7 +3083,7 @@ class TestGameLauncher(unittest.TestCase): + self.env["PROTONPATH"] + + ":" + + Path.home() +- .joinpath(".local", "share", "umu", self.test_runtime_version[1]) ++ .joinpath(".local", "share", "umu", self.test_runtime_default[1]) + .as_posix(), + "Expected STEAM_COMPAT_TOOL_PATHS to be set", + ) +-- +2.49.0 + + +From f5ba175d9d8ab5aa9f3d40cd953c7acc7c4e984d Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Fri, 21 Mar 2025 00:58:50 +0200 +Subject: [PATCH 09/13] umu_run: do not set fault runtime path if case proton + is using the host libraries + +--- + umu/umu_run.py | 26 ++++++++++++++------------ + 1 file changed, 14 insertions(+), 12 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index 0f7026a..7ea3941 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -235,14 +235,16 @@ def set_env( + env["SteamAppId"] = env["STEAM_COMPAT_APP_ID"] + env["SteamGameId"] = env["SteamAppId"] + ++ runtime_path = f"{UMU_LOCAL}/{os.environ['RUNTIMEPATH']}" if os.environ['RUNTIMEPATH'] != "host" else "" ++ + # PATHS + env["WINEPREFIX"] = str(pfx) + env["PROTONPATH"] = str(protonpath) + env["STEAM_COMPAT_DATA_PATH"] = env["WINEPREFIX"] + env["STEAM_COMPAT_SHADER_PATH"] = f"{env['STEAM_COMPAT_DATA_PATH']}/shadercache" +- env["STEAM_COMPAT_TOOL_PATHS"] = ( +- f"{env['PROTONPATH']}:{UMU_LOCAL}/{os.environ['RUNTIMEPATH']}" +- ) ++ env["STEAM_COMPAT_TOOL_PATHS"] = ":".join( ++ [f"{env['PROTONPATH']}", runtime_path] ++ ) if runtime_path else f"{env['PROTONPATH']}" + env["STEAM_COMPAT_MOUNTS"] = env["STEAM_COMPAT_TOOL_PATHS"] + + # Zenity +@@ -261,7 +263,7 @@ def set_env( + env["UMU_NO_RUNTIME"] = os.environ.get("UMU_NO_RUNTIME") or "" + env["UMU_RUNTIME_UPDATE"] = os.environ.get("UMU_RUNTIME_UPDATE") or "" + env["UMU_NO_PROTON"] = os.environ.get("UMU_NO_PROTON") or "" +- env["RUNTIMEPATH"] = f"{UMU_LOCAL}/{os.environ['RUNTIMEPATH']}" ++ env["RUNTIMEPATH"] = runtime_path + + return env + +@@ -817,7 +819,7 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + } + opts: list[str] = [] + prereq: bool = False +- version: RuntimeVersion | None = None ++ runtime_version: RuntimeVersion | None = None + + log.info("umu-launcher version %s (%s)", __version__, sys.version) + +@@ -865,13 +867,13 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + opts = args[1] # Reference the executable options + + # Resolve the runtime version for PROTONPATH +- version = resolve_umu_version(__runtime_versions__) +- if not version: ++ runtime_version = resolve_umu_version(__runtime_versions__) ++ if not runtime_version: + err: str = ( + f"Failed to match '{os.environ.get('PROTONPATH')}' with a container runtime" + ) + raise ValueError(err) +- os.environ["RUNTIMEPATH"] = version[1] ++ os.environ["RUNTIMEPATH"] = runtime_version[1] + + # Opt to use the system's native CA bundle rather than certifi's + with suppress(ModuleNotFoundError): +@@ -895,11 +897,11 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + # Setup the launcher and runtime files + _, do_download = check_env(env) + +- if version[1] != "host": +- UMU_LOCAL.joinpath(version[1]).mkdir(parents=True, exist_ok=True) ++ if runtime_version[1] != "host": ++ UMU_LOCAL.joinpath(runtime_version[1]).mkdir(parents=True, exist_ok=True) + + future: Future = thread_pool.submit( +- setup_umu, UMU_LOCAL / version[1], version, session_pools ++ setup_umu, UMU_LOCAL / runtime_version[1], runtime_version, session_pools + ) + + download_proton(do_download, env, session_pools) +@@ -939,7 +941,7 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + sys.exit(1) + + # Build the command +- command: tuple[Path | str, ...] = build_command(env, UMU_LOCAL, version[1], opts) ++ command: tuple[Path | str, ...] = build_command(env, UMU_LOCAL, runtime_version[1], opts) + log.debug("%s", command) + + # Run the command +-- +2.49.0 + + +From c05374fd03b4ba8839b776bf30d51b479fe06759 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Fri, 21 Mar 2025 01:03:08 +0200 +Subject: [PATCH 10/13] umu_run: make message clearer + +--- + umu/umu_run.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index 7ea3941..2afcc15 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -770,7 +770,10 @@ def get_umu_version_from_manifest( + + if not appid: + if os.environ.get("UMU_NO_RUNTIME", None) == "1": +- log.warning("Runtime Platform disabled") ++ log.warning( ++ "Runtime Platform disabled. This mode is UNSUPPORTED by umu and remains only for convenience. " ++ "Issues created while using this mode will be automatically closed." ++ ) + return "host", "host", "host" + return None + +-- +2.49.0 + + +From 5fe0d2d097a5b9f7d29f26a587dae1a772b6da2b Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Fri, 21 Mar 2025 20:05:49 +0200 +Subject: [PATCH 11/13] doc: add documentation around UMU_NO_RUNTIME + +--- + README.md | 7 +++++++ + docs/umu.1.scd | 7 +++++++ + 2 files changed, 14 insertions(+) + +diff --git a/README.md b/README.md +index 8b89827..287c7aa 100644 +--- a/README.md ++++ b/README.md +@@ -84,6 +84,13 @@ Borderlands 3 from EGS store. + 3. In our umu unified database, we create a 'title' column, 'store' column, 'codename' column, 'umu-ID' column. We add a line for Borderlands 3 and fill in the details for each column. + 4. Now the launcher can search 'Catnip' and 'egs' as the codename and store in the database and correlate it with Borderlands 3 and umu-12345. It can then feed umu-12345 to the `umu-run` script. + ++## Reporting issues ++ ++When reporting issues for games that fail to run, be sure to attach a log with your issue report. To acquire a log from umu, add `UMU_LOG=1` to your environment variables for verbose logging. Furthermore, you can use `PROTON_LOG=1` for proton to create a verbose log in your `$HOME` directory. The log will be named `steam-.log`, where `` will be `default` if you haven't set a `GAMEID` or a number, depending on what you have set for `GAMEID`. ++ ++Do **NOT** report issues when using `UMU_NO_RUNTIME=1`, this option is provided for convenience for compatibility tools that do not set their runtime requirements, such as Proton < `5.13`, and they do not work with any of the supported runtimes. ++This mode does not make use of a container runtime, and issues while using it are irrelevant to umu-launcher in general. Thus such issues will be automatically closed. ++ + ## Building + + Building umu-launcher currently requires `bash`, `make`, and `scdoc` for distribution, as well as the following Python build tools: [build](https://github.com/pypa/build), [hatchling](https://github.com/pypa/hatch), [installer](https://github.com/pypa/installer), and [pip](https://github.com/pypa/pip). +diff --git a/docs/umu.1.scd b/docs/umu.1.scd +index b1f557b..9bb5475 100644 +--- a/docs/umu.1.scd ++++ b/docs/umu.1.scd +@@ -186,6 +186,13 @@ _UMU_NO_PROTON_ + + Set _1_ to run the executable natively within the SLR. + ++_UMU_NO_RUNTIME_ ++ Optional. Allows for the configured compatibility tool to run outside of the Steam Linux Runtime. ++ This option is effective only if the compatibility tool doesn't require a runtime through its configuration. ++ On compatibility tools that require a runtime, this option is ignored. ++ ++ Set _1_ to silence umu's error that it couldn't resolve a runtime to use, and run using the host's libraries. ++ + # SEE ALSO + + _umu_(5), _winetricks_(1), _zenity_(1) +-- +2.49.0 + + +From 7ababfe0d88d77d8d1258bda4c15f508ebe7bd11 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Wed, 9 Apr 2025 11:22:33 +0300 +Subject: [PATCH 12/13] umu_run: unpack runtime_version tuple instead of + accessing by index + +--- + umu/umu_run.py | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index 2afcc15..1845815 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -876,7 +876,9 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + f"Failed to match '{os.environ.get('PROTONPATH')}' with a container runtime" + ) + raise ValueError(err) +- os.environ["RUNTIMEPATH"] = runtime_version[1] ++ # runtime_name, runtime_variant, runtime_appid ++ _, runtime_variant, _ = runtime_version ++ os.environ["RUNTIMEPATH"] = runtime_variant + + # Opt to use the system's native CA bundle rather than certifi's + with suppress(ModuleNotFoundError): +@@ -900,11 +902,11 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + # Setup the launcher and runtime files + _, do_download = check_env(env) + +- if runtime_version[1] != "host": +- UMU_LOCAL.joinpath(runtime_version[1]).mkdir(parents=True, exist_ok=True) ++ if runtime_variant != "host": ++ UMU_LOCAL.joinpath(runtime_variant).mkdir(parents=True, exist_ok=True) + + future: Future = thread_pool.submit( +- setup_umu, UMU_LOCAL / runtime_version[1], runtime_version, session_pools ++ setup_umu, UMU_LOCAL / runtime_variant, runtime_version, session_pools + ) + + download_proton(do_download, env, session_pools) +@@ -944,7 +946,7 @@ def umu_run(args: Namespace | tuple[str, list[str]]) -> int: + sys.exit(1) + + # Build the command +- command: tuple[Path | str, ...] = build_command(env, UMU_LOCAL, runtime_version[1], opts) ++ command: tuple[Path | str, ...] = build_command(env, UMU_LOCAL, runtime_variant, opts) + log.debug("%s", command) + + # Run the command +-- +2.49.0 + + +From df7e7b68363fc31fc01321589ed3cfaf5f7ad4d1 Mon Sep 17 00:00:00 2001 +From: Stelios Tsampas +Date: Sat, 7 Jun 2025 03:13:48 +0300 +Subject: [PATCH 13/13] umu_run: don't require UMU_NO_RUNTIME to allow tools + without a runtime to work + +--- + umu/umu_run.py | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/umu/umu_run.py b/umu/umu_run.py +index 1845815..b54e0f5 100755 +--- a/umu/umu_run.py ++++ b/umu/umu_run.py +@@ -769,13 +769,8 @@ def get_umu_version_from_manifest( + break + + if not appid: +- if os.environ.get("UMU_NO_RUNTIME", None) == "1": +- log.warning( +- "Runtime Platform disabled. This mode is UNSUPPORTED by umu and remains only for convenience. " +- "Issues created while using this mode will be automatically closed." +- ) +- return "host", "host", "host" +- return None ++ os.environ["UMU_RUNTIME_UPDATE"] = "0" ++ return "host", "host", "host" + + if appid not in appids: + return None +-- +2.49.0 + diff --git a/systems/goliath.nix b/systems/goliath.nix index a59a6f7c..44c5d7ef 100644 --- a/systems/goliath.nix +++ b/systems/goliath.nix @@ -46,6 +46,7 @@ _: let ]) ++ (with tree.nixos.environments; [ i3 + hyprland ]); home-manager.users.kat.imports = @@ -54,10 +55,39 @@ _: let ]) ++ (with tree.home.environments; [ i3 + hyprland ]); networking.hostId = "c3b94e85"; + home-manager.users.kat.wayland.windowManager.hyprland.settings.monitor = [ + "DP-2, 3840x2160, 0x0, 1" + "HDMI-A-1, 1920x1080, auto-right, 1" + ]; + + programs.ssh.extraConfig = '' + Host daiyousei-build + HostName 140.238.156.121 + User root + IdentityAgent /run/user/1000/gnupg/S.gpg-agent.ssh + ''; + nix = { + buildMachines = [ + { + hostName = "daiyousei-build"; + system = "aarch64-linux"; + protocol = "ssh-ng"; + maxJobs = 100; + speedFactor = 1; + supportedFeatures = ["benchmark" "big-parallel" "kvm"]; + mandatoryFeatures = []; + } + ]; + distributedBuilds = true; + extraOptions = '' + builders-use-substitutes = true + ''; + }; services.xserver.videoDrivers = ["nvidia"]; hardware.nvidia = { @@ -98,6 +128,7 @@ _: let ]; environment.systemPackages = with pkgs; [ + kdePackages.qttools ledfx openrgb nvtopPackages.nvidia diff --git a/tree.nix b/tree.nix index 1d77d326..f4c1cb76 100644 --- a/tree.nix +++ b/tree.nix @@ -83,6 +83,11 @@ solaar.nixosModules.default catppuccin.nixosModules.catppuccin chaotic.nixosModules.default + nixpkgs-xr.nixosModules.nixpkgs-xr + spicetify-nix.nixosModules.spicetify + inputs.nix-gaming.nixosModules.ntsync + inputs.nix-gaming.nixosModules.pipewireLowLatency + inputs.nix-gaming.nixosModules.platformOptimizations ]; }; }; @@ -105,6 +110,7 @@ catppuccin.homeManagerModules.catppuccin inputs.sops-nix.homeManagerModules.sops chaotic.homeManagerModules.default + spicetify-nix.homeManagerModules.spicetify ] ++ (with (import (inputs.arcexprs + "/modules")).home-manager; [ i3gopher diff --git a/vr/arguments b/vr/arguments new file mode 100644 index 00000000..f08e5ad1 --- /dev/null +++ b/vr/arguments @@ -0,0 +1 @@ +PRESSURE_VESSEL_FILESYSTEMS_RW=$XDG_RUNTIME_DIR/wivrn/comp_ipc diff --git a/vr/bs-manager.sh b/vr/bs-manager.sh new file mode 100755 index 00000000..a2e25b1b --- /dev/null +++ b/vr/bs-manager.sh @@ -0,0 +1 @@ +steam-run env WINEPREFIX=$STEAM_DIR/steamapps/compatdata/620980/pfx bs-manager diff --git a/vr/wired.sh b/vr/wired.sh new file mode 100755 index 00000000..090f3cb2 --- /dev/null +++ b/vr/wired.sh @@ -0,0 +1,2 @@ +adb reverse tcp:9757 tcp:9757 +adb shell am start -a android.intent.action.VIEW -d "wivrn+tcp://localhost" org.meumeu.wivrn