diff options
| author | Natasha Moongrave <natasha@256phi.eu> | 2026-04-10 19:20:58 +0200 |
|---|---|---|
| committer | Natasha Moongrave <natasha@256phi.eu> | 2026-04-10 19:20:58 +0200 |
| commit | adcc6ca839c4780a8adb82de712ec3c9e4da33f3 (patch) | |
| tree | cafb7b744316ad79aef2bb2c899f920c4ae2cc83 | |
| parent | a414126dbda913dcc33d5f9546a9f99859d1557f (diff) | |
| parent | 84d39cf904e7008434c1e5ed8257cf09b1875bea (diff) | |
Merge branch 'schrott-extract-rice'
39 files changed, 2035 insertions, 35 deletions
@@ -70,11 +70,11 @@ }, "crane": { "locked": { - "lastModified": 1775236976, - "narHash": "sha256-gCgX+AXN7K1gAIEqcLcZHxmC+QoZcwn9m6Z9r2Az+N8=", + "lastModified": 1775790182, + "narHash": "sha256-pG2RWVQY0Pe+rmmXJx+Jpyi+JcgjWzS18m7fcD1B64Q=", "owner": "ipetkov", "repo": "crane", - "rev": "6c23998526351a53ce734f0ac84940da988ccef1", + "rev": "534982f1c41834b101e381b07b1121a4f065a374", "type": "github" }, "original": { @@ -91,11 +91,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1775547409, - "narHash": "sha256-dNIhLmwrR7N78amgliAJvFx58RjrhDWorV9B9Kiayeo=", + "lastModified": 1775807984, + "narHash": "sha256-Redoe3D9zGN5I9QPHWL9vfMVQBehY1fKsMiRXQ83X3w=", "owner": "nix-community", "repo": "fenix", - "rev": "a260dea172f86c7afa65cec0c6e6a9dd91530017", + "rev": "fcf90c0c4d368b2ca917a7afa6d08e98a397e5fd", "type": "github" }, "original": { @@ -199,11 +199,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1775305101, - "narHash": "sha256-/74n1oQPtKG52Yw41cbToxspxHbYz6O3vi+XEw16Qe8=", + "lastModified": 1775595990, + "narHash": "sha256-OEf7YqhF9IjJFYZJyuhAypgU+VsRB5lD4DuiMws5Ltc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "36a601196c4ebf49e035270e10b2d103fe39076b", + "rev": "4e92bbcdb030f3b4782be4751dc08e6b6cb6ccf2", "type": "github" }, "original": { @@ -215,11 +215,11 @@ }, "nixpkgs-unstable": { "locked": { - "lastModified": 1775423009, - "narHash": "sha256-vPKLpjhIVWdDrfiUM8atW6YkIggCEKdSAlJPzzhkQlw=", + "lastModified": 1775710090, + "narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=", "owner": "nixos", "repo": "nixpkgs", - "rev": "68d8aa3d661f0e6bd5862291b5bb263b2a6595c9", + "rev": "4c1018dae018162ec878d42fec712642d214fdfa", "type": "github" }, "original": { @@ -267,11 +267,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1775499626, - "narHash": "sha256-6PyDFl9fJu12xfdjgEiQKEVjX6/cdkN1DeKRLKwUz44=", + "lastModified": 1775745684, + "narHash": "sha256-8MbfLwd60FNa8dRFkjE+G3TT/x21G3Rsplm1bMBQUtU=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "129f6167ab924c42fb16d4e3d1b31b6e725c7523", + "rev": "64ddb549bc9a70d011328746fa46a8883f937b6b", "type": "github" }, "original": { @@ -95,8 +95,8 @@ }; in { nixosConfigurations = { - kronos = mkSystem "kronos" "nord-blue"; - herra = mkSystem "herra" "plasma6"; + kronos = mkSystem "kronos" "schrottkatze"; + herra = mkSystem "herra" "schrottkatze"; mystra = mkSystem "mystra" "nord-blue"; }; }; diff --git a/home/mun/default.nix b/home/mun/default.nix index b109dac..f6b419d 100644 --- a/home/mun/default.nix +++ b/home/mun/default.nix @@ -7,7 +7,8 @@ ./programs/zsh.nix ./programs/ssh.nix ./programs/git.nix - ]; + ./programs/nvim.nix +]; home = { username = "mun"; @@ -34,6 +35,7 @@ openrocket kicad evolution + signal-desktop # Utilities pay-respects diff --git a/home/mun/programs/nvim.nix b/home/mun/programs/nvim.nix new file mode 100644 index 0000000..9677c57 --- /dev/null +++ b/home/mun/programs/nvim.nix @@ -0,0 +1,279 @@ +{pkgs, ...}: { + home.packages = with pkgs; [ + zathura + ripgrep + fd + lazygit + stylua + alejandra + black + shfmt + + # Language servers + lua-language-server + nil + rust-analyzer + pyright + bash-language-server + texlab + ]; + + programs.neovim = { + enable = true; + defaultEditor = true; + viAlias = true; + vimAlias = true; + + plugins = with pkgs.vimPlugins; [ + # UI + catppuccin-nvim + nvim-web-devicons + which-key-nvim + gitsigns-nvim + + # Syntax + (nvim-treesitter.withPlugins (p: [ + p.lua + p.nix + p.rust + p.python + p.bash + p.latex + p.c + ])) + + # LSP + nvim-lspconfig + + # Completion / snippets + nvim-cmp + cmp-nvim-lsp + cmp_luasnip + luasnip + friendly-snippets + nvim-autopairs + + # Formatting + conform-nvim + comment-nvim + + # Navigation + telescope-nvim + plenary-nvim + nvim-tree-lua + + # Terminal + toggleterm-nvim + + # Writing + vimtex + orgmode + + # Start screen + { + plugin = vim-startify; + config = "let g:startify_change_to_vcs_root = 0"; + } + ]; + + extraLuaConfig = '' + ------------------------------------------------- + -- LEADER + ------------------------------------------------- + vim.g.mapleader = " " + + ------------------------------------------------- + -- BASIC OPTIONS + ------------------------------------------------- + vim.opt.number = true + vim.opt.relativenumber = true + vim.opt.clipboard = "unnamedplus" + vim.opt.showtabline = 2 + vim.o.timeout = true + vim.o.timeoutlen = 300 + + ------------------------------------------------- + -- THEME + ------------------------------------------------- + require("catppuccin").setup({ + flavour = "mocha", + }) + vim.cmd.colorscheme("catppuccin") + + ------------------------------------------------- + -- GITSIGNS + ------------------------------------------------- + require("gitsigns").setup() + + ------------------------------------------------- + -- TREESITTER + ------------------------------------------------- + require("nvim-treesitter.configs").setup({ + highlight = { enable = true }, + indent = { enable = true }, + }) + + vim.opt.foldmethod = "expr" + vim.opt.foldexpr = "nvim_treesitter#foldexpr()" + vim.opt.foldenable = false + + ------------------------------------------------- + -- SNIPPETS + ------------------------------------------------- + require("luasnip.loaders.from_vscode").lazy_load() + + ------------------------------------------------- + -- COMPLETION + ------------------------------------------------- + local cmp = require("cmp") + local luasnip = require("luasnip") + + cmp.setup({ + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = cmp.mapping.preset.insert({ + ["<C-Space>"] = cmp.mapping.complete(), + ["<CR>"] = cmp.mapping.confirm({ select = true }), + }), + sources = { + { name = "nvim_lsp" }, + { name = "luasnip" }, + }, + }) + + require("nvim-autopairs").setup({}) + + ------------------------------------------------- + -- LSP + ------------------------------------------------- + local capabilities = require("cmp_nvim_lsp").default_capabilities() + + local servers = { + "lua_ls", + "nil_ls", + "rust_analyzer", + "pyright", + "bashls", + "texlab", + } + + for _, server in ipairs(servers) do + vim.lsp.config(server, { + capabilities = capabilities + }) + vim.lsp.enable(server) + end + + ------------------------------------------------- + -- LSP KEYMAPS + ------------------------------------------------- + vim.keymap.set("n", "<leader>ld", vim.lsp.buf.definition) + vim.keymap.set("n", "<leader>lD", vim.lsp.buf.declaration) + vim.keymap.set("n", "<leader>li", vim.lsp.buf.implementation) + vim.keymap.set("n", "<leader>lr", vim.lsp.buf.references) + vim.keymap.set("n", "lh", vim.lsp.buf.hover) + vim.keymap.set("n", "ln", vim.lsp.buf.rename) + vim.keymap.set("n", "la", vim.lsp.buf.code_action) + vim.keymap.set("n", "lf", function() vim.lsp.buf.format() end) + + ------------------------------------------------- + -- DIAGNOSTICS + ------------------------------------------------- + vim.keymap.set("n", "lj", vim.diagnostic.goto_next) + vim.keymap.set("n", "lk", vim.diagnostic.goto_prev) + vim.keymap.set("n", "le", vim.diagnostic.open_float) + + ------------------------------------------------- + -- FORMATTER + ------------------------------------------------- + require("conform").setup({ + format_on_save = { + timeout_ms = 500, + lsp_format = "fallback", + }, + formatters_by_ft = { + lua = { "stylua" }, + nix = { "alejandra" }, + rust = { "rustfmt" }, + python = { "black" }, + bash = { "shfmt" }, + }, + }) + + require("Comment").setup() + + ------------------------------------------------- + -- TELESCOPE + ------------------------------------------------- + local builtin = require("telescope.builtin") + + require("telescope").setup({ + defaults = { + layout_strategy = "horizontal", + sorting_strategy = "ascending", + file_ignore_patterns = { "node_modules", ".git/" }, + }, + }) + + vim.keymap.set("n", "<leader><leader>", builtin.find_files) + vim.keymap.set("n", "<leader>fg", builtin.live_grep) + vim.keymap.set("n", "<leader>fb", builtin.buffers) + + ------------------------------------------------- + -- WHICH KEY + ------------------------------------------------- + local wk = require("which-key") + wk.add({ + { "<leader>l", desc = "LSP" } + }) + + ------------------------------------------------- + -- NVIM TREE + ------------------------------------------------- + require("nvim-tree").setup({}) + vim.keymap.set("n", "<leader>e", "<cmd>NvimTreeToggle<CR>") + + ------------------------------------------------- + -- TERMINAL + ------------------------------------------------- + require("toggleterm").setup({ + direction = "float", + }) + + local Terminal = require("toggleterm.terminal").Terminal + + local lazygit = Terminal:new({ + cmd = "lazygit", + hidden = true, + direction = "float", + }) + + vim.keymap.set("n", "<leader>gg", function() + lazygit:toggle() + end) + + ------------------------------------------------- + -- ORGMODE + ------------------------------------------------- + local projects = { + "~/Documents/2_Writing/0_SOC/**/*.org", + "~/Documents/2_Writing/2_Notes/**/*.org", + "~/Documents/1_Projects/6_CRC-Altura/**/*.org", + "~/ORG/**/*.org" + } + + require("orgmode").setup({ + org_agenda_files = projects, + org_default_notes_file = "~/INBOX.org" + }) + + ------------------------------------------------- + -- VIMTEX + ------------------------------------------------- + vim.g.vimtex_view_method = "zathura" + ''; + }; +} diff --git a/home/rices/schrottkatze/browser.nix b/home/rices/schrottkatze/browser.nix new file mode 100644 index 0000000..c2d979d --- /dev/null +++ b/home/rices/schrottkatze/browser.nix @@ -0,0 +1,399 @@ +{pkgs, ...}: { + home.file = { + ".tridactylrc" = { + text = '' + set editorcmd kitty hx %f +%l + set newtab about:blank + ''; + }; + }; + programs.firefox = { + enable = true; + package = pkgs.firefox.override { + nativeMessagingHosts = [ + pkgs.tridactyl-native + ]; + }; + policies = { + DefaultDownloadDirectory = "\${home}/Downloads"; + Extensions.Install = map (name: "https://addons.mozilla.org/firefox/downloads/latest/${name}") [ + "bitwarden-password-manager" + "darkreader" + "indie-wiki-buddy" + "kagi-search-for-firefox" + "multi-account-containers" + "privacy-badger17" + "return-youtube-dislikes" + "sponsorblock" + "styl-us" + "tabby-cat-friend" + "torproject-snowflake" + "tridactyl-vim" + "ublock-origin" + "web-clipper-obsidian" + "web-scrobbler" + ]; + Extensions.Uninstall = [ + "ddg@search.mozilla.org" + "google@search.mozilla.org" + "bing@search.mozilla.org" + "amazondotcom@search.mozilla.org" + "ebay@search.mozilla.org" + "twitter@search.mozilla.org" + ]; + "DisableFirefoxStudies" = true; + "DisableTelemetry" = true; + "DisableFeedbackCommands" = true; + "DisablePocket" = true; + }; + profiles.mun = { + search = { + force = true; + default = "Kagi"; + engines = { + "Kagi".urls = [ + { + template = "https://kagi.com/search"; + params = [ + { + name = "q"; + value = "{searchTerms}"; + } + ]; + } + ]; + "duckduckbleh" = { + urls = [ + { + template = "https://noai.duckduckgo.com/"; + params = [ + { + name = "q"; + value = "{searchTerms}"; + } + ]; + } + ]; + definedAliases = [ + "duck" + "d" + "ddg" + ]; + }; + "Nix Packages" = { + urls = [ + { + template = "https://search.nixos.org/packages"; + params = [ + { + name = "query"; + value = "{searchTerms}"; + } + ]; + } + ]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["pkgs"]; + }; + "Nix Options" = { + urls = [ + { + template = "https://search.nixos.org/options"; + params = [ + { + name = "query"; + value = "{searchTerms}"; + } + ]; + } + ]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["opts"]; + }; + "Home manager Options" = { + urls = [ + { + template = "https://home-manager-options.extranix.com/"; + params = [ + { + name = "query"; + value = "{searchTerms}"; + } + { + name = "release"; + value = "master"; + } + ]; + } + ]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["hm"]; + }; + "NixOS Wiki" = { + urls = [ + { + template = "https://nixos.wiki/index.php"; + params = [ + { + name = "search"; + value = "{searchTerms}"; + } + ]; + } + ]; + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = ["nxwk"]; + }; + "Noogle" = { + urls = [ + { + template = "https://noogle.dev/q"; + params = [ + { + name = "term"; + value = "{searchTerms}"; + } + ]; + } + ]; + definedAliases = ["ngl"]; + }; + "lib.rs" = { + urls = [ + { + template = "https://lib.rs/search"; + params = [ + { + name = "q"; + value = "{searchTerms}"; + } + ]; + } + ]; + definedAliases = ["libs"]; + }; + "rust docs" = { + urls = [ + { + template = "https://docs.rs/releases/search"; + params = [ + { + name = "query"; + value = "{searchTerms}"; + } + ]; + } + ]; + definedAliases = ["docs"]; + }; + "rust docs direct open" = { + urls = [ + { + template = "https://docs.rs/{searchTerms}"; + } + ]; + definedAliases = [ + "rd" + ]; + }; + "rust std docs" = { + urls = [ + { + template = "https://docs.rust-lang.org/std/index.html"; + params = [ + { + name = "search"; + value = "{searchTerms}"; + } + ]; + } + ]; + definedAliases = ["std"]; + }; + "MDN" = { + urls = [ + { + template = "https://developer.mozilla.org/search"; + params = [ + { + name = "q"; + value = "{searchTerms}"; + } + ]; + } + ]; + }; + "bing".metaData.hidden = true; + "google".metaData.hidden = true; + "Amazon.de".metaData.hidden = true; + }; + }; + settings = { + "devtools.editor.keymap" = "vim"; + "devtools.toolbox.host" = "right"; + "devtools.theme" = "dark"; + "webgl.disabled" = false; + "browser.urlbar.decodeURLsOnCopy" = true; + "browser.urlbar.unitConversion.enabled" = true; + "browser.urlbar.suggest.calculator" = true; + "browser.compactmode.show" = true; + "browser.uidensity" = 1; + "screenshots.browser.component.enabled" = true; + "browser.aboutConfig.showWarning" = false; + "browser.aboutwelcome.showModal" = false; + "browser.aboutwelcome.enabled" = false; + "browser.preferences.moreFromMozilla" = false; + "browser.menu.showViewImageInfo" = true; + "browser.shopping.experience2023.active" = false; + "browser.shopping.experience2023.survey.enabled" = false; + + "identity.fxaccounts.enabled" = true; + "browser.tabs.firefox-view" = true; + "browser.tabs.firefox-view-next" = true; + "browser.newtabpage.activity-stream.showSponsored" = false; + "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; + "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts" = false; + "privacy.trackingprotection.emailtracking.enabled" = true; + "privacy.trackingprotection.enabled" = true; + "privacy.trackingprotection.socialtracking.enabled" = true; + + "browser.ml.chat.enabled" = false; + "browser.ml.chat.hideLocalhost" = false; + "browser.ml.chat.prompt.prefix" = ""; + "browser.ml.chat.prompts.0" = ""; + "browser.ml.chat.prompts.1" = ""; + "browser.ml.chat.prompts.2" = ""; + "browser.ml.chat.prompts.3" = ""; + "browser.ml.chat.provider" = ""; + "browser.ml.chat.shortcuts" = false; + "browser.ml.chat.shortcuts.custom" = false; + "browser.ml.chat.shortcuts.longPress" = ""; + "browser.ml.chat.sidebar" = false; + + "geo.provider.network.logging.enabled" = true; + "extensions.getAddons.showPane" = false; + "extensions.htmlaboutaddons.recommendations.enabled" = false; + "browser.discovery.enabled" = false; + "browser.shopping.experience2023.enabled" = false; + "datareporting.policy.dataSubmissionEnabled" = false; + "datareporting.healthreport.uploadEnabled" = false; + "toolkit.telemetry.unified" = false; + "toolkit.telemetry.enabled" = false; + "toolkit.telemetry.server" = "data:,"; + "toolkit.telemetry.archive.enabled" = false; + "toolkit.telemetry.newProfilePing.enabled" = false; + "toolkit.telemetry.shutdownPingSender.enabled" = false; + "toolkit.telemetry.updatePing.enabled" = false; + "toolkit.telemetry.bhrPing.enabled" = false; + "toolkit.telemetry.firstShutdownPing.enabled" = false; + "toolkit.telemetry.coverage.opt-out" = true; + "toolkit.coverage.opt-out" = true; + "toolkit.coverage.endpoint.base" = ""; + "browser.ping-centre.telemetry" = false; + "browser.newtabpage.activity-stream.feeds.telemetry" = false; + "browser.newtabpage.activity-stream.telemetry" = false; + "app.shield.optoutstudies.enabled" = false; + "app.normandy.enabled" = false; + "app.normandy.api_url" = ""; + "dom.private-attribution.submission.enabled" = false; + "browser.newtabpage.activity-stream.feeds.showWeather" = false; + "browser.newtabpage.activity-stream.feeds.weatherfeed" = false; + + "browser.safebrowsing.malware.enabled" = false; + "browser.safebrowsing.phishing.enabled" = false; + "browser.safebrowsing.downloads.enabled" = false; + "browser.safebrowsing.downloads.remote.enabled" = false; + "browser.safebrowsing.downloads.remote.url" = ""; + "browser.safebrowsing.downloads.remote.block_potentially_unwanted" = false; + "browser.safebrowsing.downloads.remote.block_uncommon" = false; + "browser.safebrowsing.allowOverride" = false; + + "network.prefetch-next" = false; + "network.dns.disablePrefetch" = true; + "network.dns.disablePrefetchFromHTTPS" = true; + "network.predictor.enabled" = false; + "network.predictor.enable-prefetch" = false; + "network.http.speculative-parallel-limit" = 0; + "browser.places.speculativeConnect.enabled" = false; + "browser.send_pings" = false; + + "browser.urlbar.pocket.featureGate" = false; + "browser.urlbar.weather.featureGate" = false; + "browser.urlbar.speculativeConnect.enabled" = false; + "browser.urlbar.suggest.quicksuggest.nonsponsored" = false; + "browser.urlbar.suggest.quicksuggest.sponsored" = false; + "browser.search.suggest.enabled" = false; + "browser.urlbar.suggest.searches" = false; + "browser.urlbar.trending.featureGate" = false; + + "security.ssl.require_safe_negotiation" = true; + "security.remote_settings.crlite_filters.enabled" = true; + "security.pki.crlite_mode" = 2; + + "dom.security.https_only_mode" = true; + "dom.security.https_only_mode_pbm" = true; + "security.ssl.treat_unsafe_negotiation_as_broken" = true; + "browser.xul.error_pages.expert_bad_cert" = true; + "network.http.referer.XOriginTrimmingPolicy" = 2; + + "privacy.userContext.enabled" = true; + "privacy.userContext.ui.enabled" = true; + "privacy.userContext.newTabContainerOnLeftClick.enabled" = true; + + "dom.disable_window_move_resize" = true; + + "browser.uitour.enabled" = false; + "browser.uitour.url" = ""; + "permissions.manager.defaultsUrl" = ""; + "webchannel.allowObject.urlWhitelist" = ""; + + "network.IDN_show_punycode" = true; + "pdfjs.disabled" = false; + "pdfjs.enableScripting" = false; + "browser.tabs.searchclipboardfor.middleclick" = false; + "browser.download.useDownloadDir" = false; + "browser.download.alwaysOpenPanel" = false; + + "browser.download.manager.addToRecentDocs" = false; + + "browser.download.always_ask_before_handling_new_types" = true; + "privacy.resistFingerprinting" = true; + "privacy.resistFingerprinting.pbmode" = true; + "privacy.resistFingerprinting.exemptedDomains" = + let + domains = [ + "bahn.expert" + "flugzeug.expert" + "traewelling.de" + "katzen.cafe" + "catgirl.cloud" + "nekover.se" + "zug.network" + "girlcock.club" + "hamburg.ccc.de" + "codeberg.org" + ]; + in + domains ++ (map (domain: "*." + domain) domains); + "privacy.window.maxInnerWidth" = 1600; + "privacy.window.maxInnerHeight" = 900; + "privacy.resistFingerprinting.block_mozAddonManager" = true; + "privacy.resistFingerprinting.letterboxing" = false; + "widget.non-native-theme.enabled" = true; + "browser.link.open_newwindow" = 3; + "browser.link.open_newwindow.restriction" = 0; + "signon.rememberSignons" = false; + "dom.popup_allowed_events" = "click dblclick mousedown pointerdown"; + "browser.pagethumbnails.capturing_disabled" = true; + + "geo.enabled" = false; + "full-screen-api.enabled" = false; + "permissions.default.geo" = 0; + "permissions.default.camera" = 0; + "permissions.default.microphone" = 0; + "permissions.default.desktop-notification" = 0; + "permissions.default.xr" = 0; + }; + }; + }; +} diff --git a/home/rices/schrottkatze/default.nix b/home/rices/schrottkatze/default.nix new file mode 100644 index 0000000..6b7865d --- /dev/null +++ b/home/rices/schrottkatze/default.nix @@ -0,0 +1,4 @@ +{ + system = import ./system.nix; + home = import ./home.nix; +} diff --git a/home/rices/schrottkatze/eww.nix b/home/rices/schrottkatze/eww.nix new file mode 100644 index 0000000..599738a --- /dev/null +++ b/home/rices/schrottkatze/eww.nix @@ -0,0 +1,6 @@ +{...}: { + programs.eww = { + enable = true; + configDir = ./eww/configDir; + }; +} diff --git a/home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck b/home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck new file mode 100644 index 0000000..d955d31 --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/bottomBar/bottomBar.yuck @@ -0,0 +1,77 @@ +(include "bottomBar/workspaces.yuck") +(include "bottomBar/traveldings.yuck") + +(defwindow bottomBar + :monitor 0 + :stacking "fg" + :wm-ignore true + :exclusive true + :geometry (geometry + :width "100%" + :height "33px" + :anchor "bottom center") + (bottomBar)) + +(defwidget bottomBar [] + (overlay + :class "bottomBar" + (transform + :translate-y "1.5px" + (centerbox + (box + :halign "start" + (workspaceWidget) + ) + (box + :halign "center" + (traveldings) + ) + (box + :halign "end" + ; (label :text "${iceData.speed}km/h") + (mullvadThing) + ) + ) + ) + (box + :class "lesbianFlag" + :height 1 + ( flagEl :flipped true :color "#D52D00") + ( flagEl :flipped true :color "#EF7627") + ( flagEl :flipped true :color "#FF9A56") + ( flagEl :flipped true :color "#FFFFFF") + ( flagEl :flipped true :color "#D162A4") + ( flagEl :flipped true :color "#B55690") + ( flagEl :flipped true :color "#A30262") + ) + ) +) + +(deflisten mullvad + :initial "{\"state\":\"init\"}" + `mullvad status -j listen` +) + +(defwidget mullvadThing [] + (box + :class "container" + (button + :height 16 + :width 16 + :class "mullvad-state-${mullvad.state}" + ) + ) +) + +(defwidget iceTacho [] + (box + :class "iceTacho" + :tooltip "Tz${iceTachoData.tzn} (BR ${iceTachoData.br})" + (label :text "${iceTachoData.speed} km/h") + ) +) + +(deflisten iceTachoData + :initial "null" + { "~/.config/eww/scripts/iceTacho.nu" } +) diff --git a/home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck b/home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck new file mode 100644 index 0000000..62de26e --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/bottomBar/traveldings.yuck @@ -0,0 +1,37 @@ +(defwidget traveldings [] + (revealer + :class "traveldings" + :transition "crossfade" + :reveal { traveldings_data != "null" } + (traveldingsBarWidget) + ) +) + +(defwidget traveldingsBarWidget [] + (overlay + (box + :width 640 + (label + :halign "start" + :text "${traveldings_data.line} -> ${strlength(traveldings_data.arrival_station) > 24 ? "${substring(traveldings_data.arrival_station, 0, 24)}…" : traveldings_data.arrival_station}${traveldings_data.arrival_platform_data_available ? " (Gl. ${traveldings_data.arrival_platform_real})" : ""}" + ) + (label + :halign "end" + :text { traveldings_data.time_left >= 3600 ? formattime(traveldings_data.time_left, "noch %-Hh %-Mmin", "Etc/UTC") : formattime(traveldings_data.time_left, "noch %-Mmin", "Etc/UTC") } + ) + ) + (box + (progress + :class { traveldings_data.live ? "traveldings_live" : "traveldings_disconnected" } + :value {traveldings_data.progress * 100} + :orientation "horizontal" + ) + ) + ) +) + + +(deflisten traveldings_data + :initial "null" + "traveldings current" +) diff --git a/home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck b/home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck new file mode 100644 index 0000000..2709e1b --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/bottomBar/workspaces.yuck @@ -0,0 +1,18 @@ +(defwidget workspaceWidget [] + (box + :class "workspaces" + (for workspace in workspaces + (button + :style "border-bottom: 4px solid ${workspace.color}${workspace.active ? "; background-color: #3c3836" : ""}" + :class "${workspace.focused ? "focused" : ""}" + :onclick "niri msg action focus-workspace ${workspace.idx}" + (label :text "${workspace.icon ?: workspace.idx}") + ) + ) + ) +) + +(deflisten workspaces + :initial "[]" + "bar-ws-monitor" +) diff --git a/home/rices/schrottkatze/eww/configDir/eww.css b/home/rices/schrottkatze/eww/configDir/eww.css new file mode 100644 index 0000000..2ce2ac5 --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/eww.css @@ -0,0 +1,58 @@ +label { + font: 14pt "Departure Mono Nerd Font"; +} + +button { + border-radius: 0px; + padding: 0; +} + +.background { + background-color: #1d2021; +} + +.workspaces button { + border: 0px; + padding: 5px 4px 0 4px; +} + +.workspaces button.focused { + background-color: #504935; +} + +.traveldings progressbar trough { + border: none; + background-color: #3c3836; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} + +.traveldings progressbar.traveldings_live progress { + background-color: #79740e; + border-bottom-left-radius: 0; +} + +.traveldings progressbar.traveldings_disconnected progress { + background-color: #cc241d; +} + + +.traveldingsWindow { + border-radius: 15px; +} + +.mullvad-state-connected { + background-color: #98971a +} + +.mullvad-state-connecting { + background-color: #d79921 +} + +.mullvad-state-disconnected { + background-color: #cc241d +} + +.mullvad-state-init { + background-color: #458588 +} diff --git a/home/rices/schrottkatze/eww/configDir/eww.yuck b/home/rices/schrottkatze/eww/configDir/eww.yuck new file mode 100644 index 0000000..f6f20f5 --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/eww.yuck @@ -0,0 +1,36 @@ +(include "topBar/topBar.yuck") +(include "bottomBar/bottomBar.yuck") + +(include "topBar/time.yuck") + +(defwindow streamUi + :monitor 0 + :stacking "fg" + :wm-ignore true + :exclusive true + :geometry (geometry + :width "640px" + :height "100%" + :anchor "center right") + (centerbox + :style "padding: 0 3px" + :orientation "vertical" + (label :text "hi") + (label :text "hi") + (centerbox + :valign "end" + (box + :halign "start" + (systray + :icon-size 18 + :spacing 3 + ) + ) + (box) + (box + :halign "end" + (time) + ) + ) + ) +) diff --git a/home/rices/schrottkatze/eww/configDir/scripts/bat.nu b/home/rices/schrottkatze/eww/configDir/scripts/bat.nu new file mode 100755 index 0000000..fd34c50 --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/scripts/bat.nu @@ -0,0 +1,78 @@ +#!/usr/bin/env nu + +const ICONS = [ + [ normal charging]; + [ ] + [ ] + [ ] + [ ] + [ ] + [ ] + [ ] + [ ] + [ ] + [ ] + [ ] +]; + +const DELAY = 2sec; + +def "main auto" [] { + loop { + let paths = ls "/sys/class/power_supply" + | each {|it| $it.name | path basename} + | filter {|it| $it starts-with "BAT"}; + + if ($paths | is-not-empty) { + let result = $paths + | each {|it| get_and_format $it} + | str join " | " + | prepend "| " + | str join; + + print $result + } else { + print "" + } + sleep $DELAY; + } +} + +def main [ path: string ] { + loop { + print (get_and_format $path) + sleep $DELAY; + } +} + +def get_and_format [ path: string ] { + let fract = get_bat_charge_fraction $path; + let is_charging = get_bat_charging_status $path; + let percent = ($fract * 100) | math round; + + return $"<span foreground=\"#d65d0e\">(get_bat_icon $fract $is_charging)</span> ($percent)<span foreground=\"#7c6f64\">%</span>"; +} + +def get_bat_charge_fraction [ + path: string +] { + let energy_full = open $"/sys/class/power_supply/($path)/energy_full" | into float; + let energy_now = open $"/sys/class/power_supply/($path)/energy_now" | into float; + + $energy_now / $energy_full +} + +def get_bat_charging_status [ + path: string +] { + let status = open $"/sys/class/power_supply/($path)/status"; + + $status like Charging +} + +def get_bat_icon [ + frac: float + is_charging = false +] { + $ICONS | get (($frac * 10) | math round) | get (if ($is_charging) { "charging" } else { "normal" }) +} diff --git a/home/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu b/home/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu new file mode 100755 index 0000000..5225dc2 --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/scripts/iceTacho.nu @@ -0,0 +1,38 @@ +#!/usr/bin/env nu + +const TABLE = { + 401: 280 + 402: 280 + 403: 330 + 406: 330 + 407: 320 + 408: 320 + 411: 230 + 415: 230 + 412: 265 + 605: 200 +}; + +def main [ ] { + loop { + if ((iw dev wlp4s0 link | lines | filter {|it| $it =~ "WIFIonICE" } | length) == 1) { + let iceData = http get https://iceportal.de/api1/rs/status; + let tzn = $iceData.tzn; + let br = $iceData.series; + let speed = $iceData.speed; + let speedfrac = $speed / ($TABLE | get $br); + + print ({ + tzn: $tzn, + br: $br, + speed: $speed, + frac: $speedfrac + } | to json -r); + + sleep 2sec; + } else { + print "null"; + sleep 5sec; + } + } +} diff --git a/home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck b/home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck new file mode 100644 index 0000000..c37838a --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/topBar/sysinfo.yuck @@ -0,0 +1,22 @@ +(deflisten bat + :initial "<span foreground=\"#cc241d\">BAT0 ERR</span>" + { "~/.config/eww/scripts/bat.nu auto"} +) + +(defwidget cpu [] + (box + :class "cpuIndicator" + (label + :markup "<span foreground=\"#d65d0e\"></span> ${strlength(round(EWW_CPU.avg, 0)) == 1 ? " ${round(EWW_CPU.avg, 0)}" : round(EWW_CPU.avg, 0)}<span foreground=\"#7c6f64\">%</span>" + ) + ) +) + +(defwidget mem [] + (box + :class "memIndicator" + (label + :markup "<span foreground=\"#d65d0e\"> </span> ${round(EWW_RAM.used_mem_perc, 0)}<span foreground=\"#7c6f64\">%</span>" + ) + ) +) diff --git a/home/rices/schrottkatze/eww/configDir/topBar/time.yuck b/home/rices/schrottkatze/eww/configDir/topBar/time.yuck new file mode 100644 index 0000000..ba22883 --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/topBar/time.yuck @@ -0,0 +1,10 @@ +(defwidget time [] + (label + :markup { + formattime( + EWW_TIME, + "<span foreground=\"#d65d0e\"></span> %Y<span foreground=\"#7c6f64\">-</span>%m<span foreground=\"#7c6f64\">-</span>%d <span foreground=\"#d65d0e\"></span> %H<span foreground=\"#7c6f64\">:</span>%M<span foreground=\"#7c6f64\">:</span>%S " + ) + } + ) +) diff --git a/home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck b/home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck new file mode 100644 index 0000000..4aee71f --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/topBar/topBar.yuck @@ -0,0 +1,55 @@ +(include "topBar/time.yuck") +(include "topBar/sysinfo.yuck") +(include "util.yuck") + +(defwindow topBar + :monitor 0 + :stacking "fg" + :wm-ignore true + :exclusive true + :geometry (geometry + :width "100%" + :height "33px" + :anchor "top center") + (topBar)) + +(defwidget topBar [] + (overlay + :class "topBar" + (transform + :translate-y "-1.5px" + (centerbox + (box + :halign "start" + :spacing 12 + :space-evenly false + (label :text " ") + (cpu) + (sep) + (mem) + (label :markup bat) + ) + (box + :halign "center" + (systray + :icon-size 18 + :spacing 3 + ) + ) + (box + :halign "end" + (time) + ) + ) + ) + (box + :class "transFlag" + :height 1 + ( flagEl :flipped false :color "#5BCEFA") + ( flagEl :flipped false :color "#F5A9B8") + ( flagEl :flipped false :color "#FFFFFF") + ( flagEl :flipped false :color "#F5A9B8") + ( flagEl :flipped false :color "#5BCEFA") + ) + ) +) diff --git a/home/rices/schrottkatze/eww/configDir/util.yuck b/home/rices/schrottkatze/eww/configDir/util.yuck new file mode 100644 index 0000000..3df84ab --- /dev/null +++ b/home/rices/schrottkatze/eww/configDir/util.yuck @@ -0,0 +1,10 @@ +(defwidget flagEl [color ?flipped] + (box + :style "border-${flipped ? "top" : "bottom"}: 3px solid ${color}" + :halign "fill" + ) +) + +(defwidget sep [] + (label :text "|") +) diff --git a/home/rices/schrottkatze/fuzzel.nix b/home/rices/schrottkatze/fuzzel.nix new file mode 100644 index 0000000..d31dee7 --- /dev/null +++ b/home/rices/schrottkatze/fuzzel.nix @@ -0,0 +1,26 @@ +{lib, ...}: { + programs.fuzzel = { + enable = true; + settings = { + main = { + font = lib.mkForce "Departure Mono:size=13"; + terminal = "kitty"; + lines = 15; + width = 50; + horizontal-pad = 20; + vertical-pad = 12; + }; + colors = { + background = lib.mkForce "282828ff"; + match = lib.mkForce "d65d0eff"; + selection-match = lib.mkForce "fe8019ff"; + border = lib.mkForce "bab9e5ff"; + }; + border = { + radius = 10; + selection-radius = 3; + width = 3; + }; + }; + }; +} diff --git a/home/rices/schrottkatze/home.nix b/home/rices/schrottkatze/home.nix new file mode 100644 index 0000000..62d9aeb --- /dev/null +++ b/home/rices/schrottkatze/home.nix @@ -0,0 +1,43 @@ +{pkgs, ...}: { + imports = [ + ./terminal.nix + ./notifications.nix + ./fuzzel.nix + ./swayidle.nix + ./browser.nix + ./niri.nix + ./eww.nix + # ./layaway.nix + ./stylix.nix + ]; + + programs.swaylock.enable = true; + services.network-manager-applet.enable = true; + xsession.enable = true; + + home.packages = with pkgs; [ + fluent-reader + obsidian + zsh + hyprpicker + bemoji + librsvg + cairo + xwayland-satellite + ]; + + services.gpg-agent = { + enable = true; + enableSshSupport = true; + }; + + fonts.fontconfig = { + enable = true; + defaultFonts = { + emoji = ["Noto Color Emoji"]; + monospace = []; + sansSerif = ["Atkinson Hyperlegible"]; + serif = []; + }; + }; +} diff --git a/home/rices/schrottkatze/layaway.nix b/home/rices/schrottkatze/layaway.nix new file mode 100644 index 0000000..35db5ee --- /dev/null +++ b/home/rices/schrottkatze/layaway.nix @@ -0,0 +1,24 @@ +{pkgs, lib, ...}: +let + layaway = pkgs.rustPlatform.buildRustPackage rec { + pname = "layaway"; + version = "0.2.0"; + + src = pkgs.fetchFromGitHub { + owner = "MultisampledNight"; + repo = pname; + rev = "v${version}"; + hash = "sha256-SzAuVFEy56svasO3+1p6ysBRrIQd0UZX++/P4ZuwWm0="; + }; + + cargoHash = "sha256-QVxlkE+sq4U048LnshI/tq6HInKiSgjQLAdR+27/wEI="; + + meta = with lib; { + description = "Layout creation for Sway via a relative and human-readable DSL."; + homepage = "https://github.com/MultisampledNight/layaway"; + maintainers = [maintainers.multisn8]; + }; + }; +in { + home.packages = [layaway]; +} diff --git a/home/rices/schrottkatze/niri.nix b/home/rices/schrottkatze/niri.nix new file mode 100644 index 0000000..32e145f --- /dev/null +++ b/home/rices/schrottkatze/niri.nix @@ -0,0 +1,40 @@ +# this file must only be saved via autosave due to the formatter. +# else it will be ugly +{ + pkgs, + lib, + ... +}: { + home.packages = with pkgs; [ + zenity + xwayland-satellite + swaybg + ]; + + xdg.configFile."niri/live.kdl".text = ""; + + home.file."config" = let + kdlfiles = + lib.mapAttrsToList + (filename: _value: "include \"${./niri/kdl}/${filename}\"") + (lib.filterAttrs (key: value: value == "regular") (builtins.readDir ./niri/kdl)); + startups = + map (it: "spawn-at-startup ${it}") + (map (lib.concatStringsSep " ") + (map (map (word: "\"${word}\"")) + [ + ["eww" "open-many" "topBar" "bottomBar"] + ["sh" "-c" "sleep 1 && swaybg -o eDP-1 -i ${../../../assets/wallpapers/insert_coin.jpeg} -m fill"] + ["touch" ".config/niri/live.kdl"] + ])); + other = [ + "include \"live.kdl\"" + "output \"eDP-1\" { scale 1.1; }" + "animations { window-open { duration-ms 3000; curve \"linear\"; custom-shader r\"\n${builtins.readFile ./niri/shaders/arc.frag}\";};}" + "binds {Mod+Shift+I { spawn \"${./niri/scripts/cpdate.sh}\"; }; }" + ]; + in { + target = ".config/niri/config.kdl"; + text = lib.concatLines (startups ++ kdlfiles ++ other); + }; +} diff --git a/home/rices/schrottkatze/niri/kdl/binds.kdl b/home/rices/schrottkatze/niri/kdl/binds.kdl new file mode 100644 index 0000000..e79b3fc --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/binds.kdl @@ -0,0 +1,124 @@ +binds { + // spawn terminal + Mod+Return repeat=false { spawn "kitty"; } + Mod+D repeat=false { spawn "fuzzel"; } + Mod+M repeat=false { spawn "hyprpicker"; } + Mod+I repeat=false { spawn "bemoji" "-n"; } + Mod+N repeat=false { spawn "firefox"; } + Mod+E repeat=false { spawn "kitty" "vi" "~/.config/niri/live.kdl"; } + + Mod+Ctrl+Shift+E { quit; } + Mod+Q { close-window; } + Mod+Ctrl+Shift+P { power-off-monitors; } + + Mod+Shift+Ctrl+Slash allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + Mod+Shift+Slash { show-hotkey-overlay; } + + Mod+Shift+C { set-dynamic-cast-window; } + Mod+Ctrl+C { set-dynamic-cast-monitor; } + Mod+Shift+Ctrl+C { clear-dynamic-cast-target; } + + // window/columns controls (focus: vim keys) + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + // window/columns controls (focus: arrow keys) + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + + // move windows (vim keys) + Mod+Shift+H { move-column-left; } + Mod+Shift+J { move-window-down; } + Mod+Shift+K { move-window-up; } + Mod+Shift+L { move-column-right; } + + // move windows (arrow keys) + Mod+Shift+Left { move-column-left; } + Mod+Shift+Down { move-window-down; } + Mod+Shift+Up { move-window-up; } + Mod+Shift+Right { move-column-right; } + + Mod+R { switch-preset-column-width; } + + Mod+Space { toggle-overview; } + + Mod+V { toggle-window-floating; } + Mod+Shift+V { switch-focus-between-floating-and-tiling; } + + // workspace navigation + Mod+P { focus-workspace-up; } + Mod+Ctrl+P { move-workspace-up; } + Mod+Shift+P { move-column-to-workspace-up; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + + // monitor controls + Mod+Ctrl+H { focus-monitor-left; } + Mod+Ctrl+J { focus-monitor-down; } + Mod+Ctrl+K { focus-monitor-up; } + Mod+Ctrl+L { focus-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + + // column editing stuffs + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + Mod+C { center-column; } + Mod+Minus { set-column-width "-5%"; } + Mod+Equal { set-column-width "+5%"; } + Mod+Shift+Minus { set-window-height "-10%"; } + Mod+Shift+Equal { set-window-height "+10%"; } + Mod+Shift+W { toggle-column-tabbed-display; } + + Mod+F { maximize-column; } + Alt+F { expand-column-to-available-width; } + Mod+Shift+F { maximize-window-to-edges; } + Mod+Ctrl+F { fullscreen-window; } + + Mod+Shift+Ctrl+F { toggle-windowed-fullscreen; } + + // media keys + XF86AudioLowerVolume \ + allow-when-locked=true \ + { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%-"; } + XF86AudioMicMute \ + allow-when-locked=true \ + { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } + XF86AudioMute \ + allow-when-locked=true \ + { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } + XF86AudioRaiseVolume \ + allow-when-locked=true \ + { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%+"; } + + // brightness keys + XF86MonBrightnessUp allow-when-locked=true { spawn "brightnessctl" "set" "5%+"; } + XF86MonBrightnessDown allow-when-locked=true { spawn "brightnessctl" "set" "5%-"; } +} diff --git a/home/rices/schrottkatze/niri/kdl/input.kdl b/home/rices/schrottkatze/niri/kdl/input.kdl new file mode 100644 index 0000000..fa398b2 --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/input.kdl @@ -0,0 +1,22 @@ +input { + keyboard { + xkb { + layout "cz" + options "eurosign:e,caps:escape" + } + + repeat-delay 600 + repeat-rate 25 + track-layout "global" + } + + touchpad { + dwt + dwtp + natural-scroll + } + + mouse { + accel-profile "flat" + } +} diff --git a/home/rices/schrottkatze/niri/kdl/overviews.kdl b/home/rices/schrottkatze/niri/kdl/overviews.kdl new file mode 100644 index 0000000..5cb4443 --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/overviews.kdl @@ -0,0 +1,19 @@ +overview { + backdrop-color "110000" + zoom 0.381966 + workspace-shadow { + offset x=0 y=10 + softness 60 + color "#7f00008f" + } +} + +recent-windows { + debounce-ms 1500 + open-delay-ms 300 + highlight { + active-color "f69ecf" + padding 5 + corner-radius 2.5 + } +} diff --git a/home/rices/schrottkatze/niri/kdl/privacy.kdl b/home/rices/schrottkatze/niri/kdl/privacy.kdl new file mode 100644 index 0000000..1190aeb --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/privacy.kdl @@ -0,0 +1,12 @@ +layer-rule { + match namespace="notifications" + block-out-from "screen-capture" +} + +window-rule { + match app-id="^signal|Element|org.gnome.Evolution$" + match title="^.*(Discord|Beispiel Screenshare block Bug|Bitwarden|Träwelling).*$" + exclude title="^.*((Schrottkatze|Statistics|Leaderboard) - Träwelling|chaos.social|Nekoverse|catgirl.cloud).*$" + exclude is-floating=true + block-out-from "screen-capture" +} diff --git a/home/rices/schrottkatze/niri/kdl/quirks.kdl b/home/rices/schrottkatze/niri/kdl/quirks.kdl new file mode 100644 index 0000000..07fa886 --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/quirks.kdl @@ -0,0 +1,42 @@ +// handle steam grabbing focus 1000 times on startup +window-rule { + match app-id="steam" title="Steam" + open-focused false +} + +// position steam notifs correctly: https://github.com/YaLTeR/niri/wiki/Application-Issues +window-rule { + match app-id="steam" title="^notificationtoasts_[\\d]+_desktop$" + open-focused false + border { off; } + shadow { off; } + baba-is-float false + default-floating-position relative-to="bottom-right" x=0 y=0 +} + +// fix guild wars +window-rule { + match app-id="steam_app_1284210" title="Guild Wars 2" + match app-id="(steam_app_[0-9]+|[Mm]inecraft.*|gamescope)" + border { off; } + shadow { off; } +} + +window-rule { + match app-id="chromium-browser" + geometry-corner-radius 6 6 1 1 +} + +window-rule { + match app-id="vesktop" is-floating=true + geometry-corner-radius 6 +} + +environment { + ELECTRON_OZONE_PLATFORM_HINT "auto" +} + +window-rule { + match app-id="zenity" + geometry-corner-radius 16 +} diff --git a/home/rices/schrottkatze/niri/kdl/screenshot.kdl b/home/rices/schrottkatze/niri/kdl/screenshot.kdl new file mode 100644 index 0000000..5a5966b --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/screenshot.kdl @@ -0,0 +1,6 @@ +screenshot-path "~/Pictures/screenshots/%Y-%m-%dT%H:%M:%S.png" +binds { + Mod+Ctrl+S { screenshot-screen; } + Mod+Shift+S { screenshot; } + Mod+S { screenshot-window; } +} diff --git a/home/rices/schrottkatze/niri/kdl/style.kdl b/home/rices/schrottkatze/niri/kdl/style.kdl new file mode 100644 index 0000000..fccf795 --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/style.kdl @@ -0,0 +1,84 @@ +prefer-no-csd + +cursor { + xcursor-theme "phinger-cursors-dark" + xcursor-size 32 + hide-when-typing + hide-after-inactive-ms 10000 +} + +layout { + gaps 15 + struts { + left 0 + right 0 + top 0 + bottom 0 + } + focus-ring { off; } + border { + on + width 3 + active-gradient angle=135 from="#f69ecf" in="oklch shorter hue" relative-to="window" to="#5bcefa" + inactive-gradient angle=135 from="#f69ecf" in="oklch shorter hue" relative-to="window" to="#ff9a56" + } + tab-indicator { + hide-when-single-tab + gap 2 + width 5 + length total-proportion=0.500000 + position "left" + gaps-between-tabs 0 + corner-radius 3 + active-color "#5bcefa" + inactive-color "#3c3836" + } + default-column-width + center-focused-column "never" +} + +window-rule { + match is-floating=true + exclude app-id="steam_app_[0-9]+" + shadow { + on + offset x=0 y=0 + softness 40 + color "#bab9e5af" + inactive-color "#fa9d99af" + } +} + +window-rule { + geometry-corner-radius 1 + clip-to-geometry true +} + +window-rule { + match is-window-cast-target=true + border { + on + active-gradient angle=135 \ + from="#64de50" \ + in="oklch shorter hue" \ + relative-to="window" \ + to="#5bcefa" + inactive-gradient angle=135 \ + from="#64de50" \ + in="oklch shorter hue" \ + relative-to="window" \ + to="#ff9a56" + } +} + +layer-rule { + match namespace="launcher" + geometry-corner-radius 10 + shadow { + on + offset x=0 y=0 + softness 40 + color "#bab9e5af" + } + baba-is-float true +} diff --git a/home/rices/schrottkatze/niri/kdl/workspaces.kdl.disabled b/home/rices/schrottkatze/niri/kdl/workspaces.kdl.disabled new file mode 100644 index 0000000..e5b51b4 --- /dev/null +++ b/home/rices/schrottkatze/niri/kdl/workspaces.kdl.disabled @@ -0,0 +1,63 @@ +// WS Social +workspace "social" + +spawn-at-startup "signal-desktop" +spawn-at-startup ".evolution-wrapped_" +spawn-at-startup "vesktop" +spawn-at-startup "deltachat" + +window-rule { + match app-id="^(signal|Element|org.gnome.Evolution|discord|steam|DeltaChat)$" + open-on-workspace "social" +} + +// WS Browser +workspace "browser" + +spawn-at-startup "firefox" +spawn-at-startup "obsidian" + +window-rule { + match app-id="^firefox|Chromium-browser|obsidian$" + open-on-workspace "browser" +} + +binds { + Mod+P { focus-workspace-up; } + Mod+N { focus-workspace-down; } + Mod+Ctrl+P { move-workspace-up; } + Mod+Ctrl+N { move-workspace-down; } + Mod+Shift+P { move-column-to-workspace-up; } + Mod+Shift+N { move-column-to-workspace-down; } + + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + + Mod+Q { focus-workspace "social"; } + Mod+W { focus-workspace "browser"; } + Mod+E { focus-workspace 3; } + Mod+Ctrl+Q { move-column-to-workspace "social"; } + Mod+Ctrl+W { move-column-to-workspace "browser"; } + Mod+Ctrl+E { move-column-to-workspace 3; } + + Mod+1 { focus-workspace 4; } + Mod+2 { focus-workspace 5; } + Mod+3 { focus-workspace 6; } + Mod+4 { focus-workspace 7; } + Mod+5 { focus-workspace 8; } + Mod+6 { focus-workspace 9; } + Mod+7 { focus-workspace 10; } + Mod+8 { focus-workspace 11; } + Mod+9 { focus-workspace 12; } + Mod+Ctrl+1 { move-column-to-workspace 4; } + Mod+Ctrl+2 { move-column-to-workspace 5; } + Mod+Ctrl+3 { move-column-to-workspace 6; } + Mod+Ctrl+4 { move-column-to-workspace 7; } + Mod+Ctrl+5 { move-column-to-workspace 8; } + Mod+Ctrl+6 { move-column-to-workspace 9; } + Mod+Ctrl+7 { move-column-to-workspace 10; } + Mod+Ctrl+8 { move-column-to-workspace 11; } + Mod+Ctrl+9 { move-column-to-workspace 12; } +} diff --git a/home/rices/schrottkatze/niri/scripts/cpdate.sh b/home/rices/schrottkatze/niri/scripts/cpdate.sh new file mode 100755 index 0000000..acc2994 --- /dev/null +++ b/home/rices/schrottkatze/niri/scripts/cpdate.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env nu + +const FORMATS = [ + "%F" + "%R" + "%d.%m.%Y" + "%d.%m" + "%T" + "%FT%H" + "%FT%R" + "%F %R" + "%F %T" +]; + +def main [] { + let date = date now; + let len = $FORMATS | length; + + $FORMATS | each {|it| $date | format date $it } | to text | fuzzel -dl $len | str trim | wl-copy +} diff --git a/home/rices/schrottkatze/niri/shaders/arc.frag b/home/rices/schrottkatze/niri/shaders/arc.frag new file mode 100644 index 0000000..301357c --- /dev/null +++ b/home/rices/schrottkatze/niri/shaders/arc.frag @@ -0,0 +1,131 @@ + +#define PI 3.14159 + +#define TAU 6.28319 + +#define WIDTH 3. +#define RADIUS 1. + +#define WIPE_DURATION .2 +#define BORDER_LOOPS 3. +#define FADE_ITS 2. + +vec4 gradi(float pos, vec4 bg, vec4 fg, float fac, float mask) { + if (mask < 0.2) { + return bg; + } + + vec4 trans = vec4(0.); + vec4 purple = vec4(0.45, 0.13, 0.49, 1.0) * vec4(mask); + vec4 blue = vec4(0.25, 0.74, 0.81, 1.0) * vec4(mask); + vec4 white = vec4(mask); + float mult = 4. * fac; + + if (pos <= 0.125) { + return mix(bg, purple, max(0., pos * mult)); + } else if (pos <= 0.25) { + return mix(purple, blue, (pos * mult) - 1.); + } else if (pos <= 0.5) { + return mix(blue, white, (pos * mult) - 2.); + } else { + return fg; + } + +} + +// from niri source code: https://github.com/YaLTeR/niri/blob/f30db163b5748e8cf95c05aba77d0d3736f40543/src/render_helpers/shaders/border.frag#L211-L234 +float rounding_alpha(vec2 coords, vec2 size, vec4 corner_radius) { + vec2 center; + float radius; + + if (coords.x < corner_radius.x && coords.y < corner_radius.x) { + radius = corner_radius.x; + center = vec2(radius, radius); + } else if (size.x - corner_radius.y < coords.x && coords.y < corner_radius.y) { + radius = corner_radius.y; + center = vec2(size.x - radius, radius); + } else if (size.x - corner_radius.z < coords.x && size.y - corner_radius.z < coords.y) { + radius = corner_radius.z; + center = vec2(size.x - radius, size.y - radius); + } else if (coords.x < corner_radius.w && size.y - corner_radius.w < coords.y) { + radius = corner_radius.w; + center = vec2(radius, size.y - radius); + } else { + return 1.0;// + } + + float dist = distance(coords, center); + float half_px = 0.5; + return 1.0 - smoothstep(radius - half_px, radius + half_px, dist); +} + +vec4 open_color(vec3 coords_geo, vec3 size_geo) { + vec4 bg1 = vec4(.1, .1, .18, 1.0); + vec4 bg2 = vec4(.09, .05, .11, 1.0); + + vec3 coords_tex = niri_geo_to_tex * coords_geo; + vec4 color = texture2D(niri_tex, coords_tex.st); + + float pi = radians(180.); + + if (0.0 <= coords_geo.x && coords_geo.x <= 1.0 + && 0.0 <= coords_geo.y && coords_geo.y <= 1.0) + { + float pos = (coords_tex.x - ((1. / WIPE_DURATION) * niri_clamped_progress) * 2.) + 1.; + vec2 coords = (coords_geo.xy - vec2(0.5, 0.5)) * size_geo.xy * 2.0; + vec2 coords_abs = coords_geo.xy * size_geo.xy; + + float border_a = 1.; + + border_a *= rounding_alpha( + coords_abs.xy, + size_geo.xy, + vec4(RADIUS + WIDTH) + ); + + vec4 bg = mix(bg1, bg2, length(coords_tex.xy - vec2(1., 0.))) * border_a; + + color = gradi(pos, color, bg, 2.0, border_a); + + float angle = (atan(coords.y, coords.x) + PI) / TAU; + float spinny_angle = mod((angle + niri_clamped_progress * BORDER_LOOPS), 1.0) / 2.; + + vec2 border = WIDTH / size_geo.xy; + + float temp = border_a; + float round_a = 1. - rounding_alpha( + coords_abs.xy - WIDTH, + size_geo.xy - WIDTH * 2., + vec4(RADIUS) + ); + + if (coords_geo.x <= border.x || coords_geo.x >= (1. - border.x) || + coords_geo.y <= border.y || coords_geo.y >= (1. - border.y)) { + border_a *= round_a; + } + + float rest = 0.; + if (border_a + temp == 1.) { + rest = 1.; + } + + border_a *= round_a; + border_a += rest; + + vec4 grad = gradi( + spinny_angle, + vec4(.48, .37, .5, 1.), + vec4(1., 0., 0., 1.), + 2.0, // DO NOT TOUCH + border_a + ); + + if ((1. - niri_clamped_progress) < FADE_ITS / BORDER_LOOPS) { + border_a *= (1. - niri_clamped_progress) / (FADE_ITS / BORDER_LOOPS); + } + color = mix(color, grad, border_a); + + } + + return color; +} diff --git a/home/rices/schrottkatze/niri/wallpaper.jpg b/home/rices/schrottkatze/niri/wallpaper.jpg Binary files differnew file mode 100644 index 0000000..5b31b96 --- /dev/null +++ b/home/rices/schrottkatze/niri/wallpaper.jpg diff --git a/home/rices/schrottkatze/notifications.nix b/home/rices/schrottkatze/notifications.nix new file mode 100644 index 0000000..37390e9 --- /dev/null +++ b/home/rices/schrottkatze/notifications.nix @@ -0,0 +1,21 @@ +{pkgs, ...}: { + home.packages = [ + pkgs.libnotify + ]; + services.dunst = { + enable = true; + settings = { + global = { + dmenu = "${pkgs.rofi}/bin/rofi -theme gruvbox-dark -dmenu -p dunst"; + browser = "${pkgs.firefox}/bin/firefox"; + mouse_left_click = "context"; + mouse_middle_click = "close_current"; + background = "#282828"; + foreground = "#ebdbb2"; + frame_color = "#504945"; + frame_width = 2; + font = "Atkinson Hyperlegible"; + }; + }; + }; +} diff --git a/home/rices/schrottkatze/stylix.nix b/home/rices/schrottkatze/stylix.nix new file mode 100644 index 0000000..4c9d500 --- /dev/null +++ b/home/rices/schrottkatze/stylix.nix @@ -0,0 +1,24 @@ +{pkgs, ...}: { + stylix.targets = { + firefox.profileNames = ["mun"]; + helix.enable = false; + btop.enable = false; + nushell.enable = false; + starship.enable = false; + kitty.enable = false; + dunst.enable = false; + wofi.enable = false; + }; + gtk = { + enable = true; + cursorTheme = { + package = pkgs.phinger-cursors; + name = "phinger-cursors"; + size = 30; + }; + iconTheme = { + package = pkgs.gruvbox-dark-icons-gtk; + name = "gruvbox-dark-icons"; + }; + }; +} diff --git a/home/rices/schrottkatze/swayidle.nix b/home/rices/schrottkatze/swayidle.nix new file mode 100644 index 0000000..6d8525c --- /dev/null +++ b/home/rices/schrottkatze/swayidle.nix @@ -0,0 +1,15 @@ +{pkgs, ...}: { + services.swayidle = { + enable = true; + events = [ + { + event = "before-sleep"; + command = "${pkgs.swaylock}/bin/swaylock -fF -c 442244"; + } + { + event = "lock"; + command = "swaylock -c 441144"; + } + ]; + }; +} diff --git a/home/rices/schrottkatze/system.nix b/home/rices/schrottkatze/system.nix new file mode 100644 index 0000000..13e1516 --- /dev/null +++ b/home/rices/schrottkatze/system.nix @@ -0,0 +1,123 @@ +{ + pkgs, + lib, + ... +}: { + # Desktop environment - Niri compositor + programs.niri.enable = true; + + # Default session + services.displayManager.defaultSession = "niri"; + + services.xserver.xkb = { + layout = "cz"; + options = "eurosign:e,caps:escape"; + }; + # Polkit fix for Niri + security.polkit.enable = true; + systemd.user.services.niri-flake-polkit.enable = false; + systemd.user.services.polkit-gnome-authentication-agent-1 = { + description = "polkit-gnome-authentication-agent-1"; + wantedBy = ["graphical-session.target"]; + wants = ["graphical-session.target"]; + after = ["graphical-session.target"]; + serviceConfig = { + Type = "simple"; + ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; + Restart = "on-failure"; + RestartSec = 1; + TimeoutStopSec = 10; + }; + }; + + # Audio - Pipewire + programs.noisetorch.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + }; + environment.systemPackages = with pkgs; [ + playerctl + pulsemixer + ]; + + # XDG portals + xdg.portal.extraPortals = [ + pkgs.xdg-desktop-portal-cosmic + ]; + xdg.portal.config.common.default = [ + "gnome" + ]; + + # Fonts + nixpkgs.config.packageOverrides = pkgs: { + google-fonts = pkgs.google-fonts.overrideAttrs (oldAttrs: { + src = pkgs.fetchFromGitHub { + owner = "google"; + repo = "fonts"; + rev = "0bd2d5599819aa0774f5ca64c8ac3f54ae3fd54f"; + sha256 = "sha256-E89GYJKG65Dh7TPI6TVre/4LCxXnxvTAPYS/OPj7nPg="; + }; + installPhase = + oldAttrs.installPhase + + "mv $out/share/fonts/truetype $out/share/fonts/ttf\n" + + "rm $out/share/fonts/ttf/Noto*Emoji*.ttf"; + }); + }; + + fonts = { + packages = with pkgs; [ + nerd-fonts.fira-code + nerd-fonts.departure-mono + google-fonts + noto-fonts-color-emoji + montserrat + atkinson-hyperlegible + arkpandora_ttf + liberation_ttf + caladea + carlito + garamond-libre + ocr-a + amiri + libertine + inter + b612 + departure-mono + yasashisa-gothic + ]; + fontDir.enable = true; + }; + + # Stylix configuration - Gruvbox Dark Hard + stylix = { + enable = true; + polarity = "dark"; + base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml"; + fonts = { + serif = { + package = pkgs.libertine; + name = "Linux Libertine O"; + }; + sansSerif = { + package = pkgs.atkinson-hyperlegible; + name = "Atkinson Hyperlegible"; + }; + monospace = { + package = pkgs.nerd-fonts.departure-mono; + name = "Departure Mono Nerd Font"; + }; + emoji = { + package = pkgs.noto-fonts-color-emoji; + name = "Noto Color Emoji"; + }; + }; + }; + + # Flatpak & misc services + services.flatpak.enable = true; + services.illum.enable = true; + services.upower.enable = true; +} diff --git a/home/rices/schrottkatze/terminal.nix b/home/rices/schrottkatze/terminal.nix new file mode 100644 index 0000000..403449c --- /dev/null +++ b/home/rices/schrottkatze/terminal.nix @@ -0,0 +1,36 @@ +{...}: { + programs.kitty = { + enable = true; + font.size = 12; + font.name = "Departure Mono Nerd Font"; + keybindings = { + "ctrl+shift+n" = "new_os_window_with_cwd"; + }; + settings = rec { + adjust_column_width = "95%"; + color0 = "#282828"; + color8 = "#928374"; + color1 = "#cc241d"; + color9 = "#fb4934"; + color2 = "#98971a"; + color10 = "#b8bb26"; + color3 = "#d79921"; + color11 = "#fabd2f"; + color4 = "#458588"; + color12 = "#83a598"; + color5 = "#b16286"; + color13 = "#d3869b"; + color6 = "#689d6a"; + color14 = "#8ec07c"; + color7 = "#a89984"; + color15 = "#ebdbb2"; + foreground = color15; + background = "#1d2021"; + confirm_os_window_close = 0; + hide_window_decorations = true; + }; + }; + home.sessionVariables = { + TERMINAL = "kitty"; + }; +} diff --git a/hosts/herra/packages.nix b/hosts/herra/packages.nix index 989f7a5..517ceec 100644 --- a/hosts/herra/packages.nix +++ b/hosts/herra/packages.nix @@ -9,23 +9,19 @@ obs-studio easyeffects - # OBS with plugins - (obs-studio.override { - plugins = with pkgs.obs-studio-plugins; [ - distroav - obs-vkcapture - obs-pipewire-audio-capture - # obs-source-switcher - obs-source-record - obs-source-clone - # obs-media-control - # obs-scene-as-transition - # advanced-scene-switcher - obs-retro-effects - obs-dvd-screensaver - obs-composite-blur - ]; - }) + # OBS plugins + #obs-studio-plugins.distroav # Stale upstream hash + obs-studio-plugins.obs-vkcapture + obs-studio-plugins.obs-pipewire-audio-capture + # obs-studio-plugins.obs-source-switcher + obs-studio-plugins.obs-source-record + obs-studio-plugins.obs-source-clone + # obs-studio-plugins.obs-media-control + # obs-studio-plugins.obs-scene-as-transition + # obs-studio-plugins.advanced-scene-switcher + obs-studio-plugins.obs-retro-effects + obs-studio-plugins.obs-dvd-screensaver + obs-studio-plugins.obs-composite-blur # Audio pavucontrol |
