diff options
32 files changed, 931 insertions, 297 deletions
diff --git a/config/hypr/hyprland.conf b/config/hypr/hyprland.conf index 2cd79a9..a784a63 120000 --- a/config/hypr/hyprland.conf +++ b/config/hypr/hyprland.conf @@ -1 +1 @@ -/nix/store/kb2ii1nq7qfbs480iz2a1flb6n3kh1l8-home-manager-files/.config/hypr/hyprland.conf
\ No newline at end of file +/nix/store/g8z28wgnffr4vbx940i5h07qpl8w1i5k-home-manager-files/.config/hypr/hyprland.conf
\ No newline at end of file diff --git a/config/nvim/lua/lsp.lua b/config/nvim/lua/lsp.lua index 1056431..5d84e30 100644 --- a/config/nvim/lua/lsp.lua +++ b/config/nvim/lua/lsp.lua @@ -1,145 +1,192 @@ -local cmp = require("cmp") -local nvim_lsp = require("lspconfig") -local cmp_window = require("cmp.utils.window") +-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua -vim.o.completeopt = "menuone,noselect" -vim.o.shortmess = vim.o.shortmess .. "c" +-- Some servers have issues with backup files, see #649 +vim.opt.backup = false +vim.opt.writebackup = false -local function on_attach(client, bufn) - local function map(...) - vim.api.nvim_buf_set_keymap(bufn, ...) - end +-- Having longer updatetime (default is 4000 ms = 4s) leads to noticeable +-- delays and poor user experience +vim.opt.updatetime = 300 - local function buf_set_option(...) - vim.api.nvim_buf_set_option(bufn, ...) - end +-- Always show the signcolumn, otherwise it would shift the text each time +-- diagnostics appeared/became resolved +vim.opt.signcolumn = "yes" - local opts = { noremap = true, silent = true } - map("n", "gD", "<Cmd>lua vim.lsp.buf.declaration()<CR>", opts) - map("n", "gd", "<Cmd>lua vim.lsp.buf.definition()<CR>", opts) - map("n", "K", "<Cmd>lua vim.lsp.buf.hover()<CR>", opts) - map("n", "gi", "<Cmd>lua vim.lsp.buf.implementation()<CR>", opts) - map("n", "<C-k>", "<Cmd>lua vim.lsp.buf.signature_help()<CR>", opts) - map("n", "<leader>D", "<Cmd>lua vim.lsp.buf.type_definition()<CR>", opts) - map("n", "gr", "<Cmd>lua vim.lsp.buf.references()<CR>", opts) - map("n", "<leader>e", "<cmd>lua vim.lsp.diagnostic.show_line_diagnostics()<CR>", opts) - map("n", "[d", "<Cmd>lua vim.lsp.diagnostic.goto_prev()<CR>", opts) - map("n", "]d", "<Cmd>lua vim.lsp.diagnostic.goto_next()<CR>", opts) - map("n", "<leader>q", "<Cmd>lua vim.lsp.diagnostic.set_loclist()<CR>", opts) - map("n", "ga", "<Cmd>lua vim.lsp.buf.code_action()<CR>", opts) +local keyset = vim.keymap.set +-- Autocomplete +function _G.check_back_space() + local col = vim.fn.col('.') - 1 + return col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') ~= nil end -local function has_words_before() - local line, col = unpack(vim.api.nvim_win_get_cursor(0)) - return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match("%s") == nil +-- Use Tab for trigger completion with characters ahead and navigate +-- NOTE: There's always a completion item selected by default, you may want to enable +-- no select by setting `"suggest.noselect": true` in your configuration file +-- NOTE: Use command ':verbose imap <tab>' to make sure Tab is not mapped by +-- other plugins before putting this into your config +local opts = {silent = true, noremap = true, expr = true, replace_keycodes = false} +keyset("i", "<TAB>", 'coc#pum#visible() ? coc#pum#next(1) : v:lua.check_back_space() ? "<TAB>" : coc#refresh()', opts) +keyset("i", "<S-TAB>", [[coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"]], opts) + +-- Make <CR> to accept selected completion item or notify coc.nvim to format +-- <C-g>u breaks current undo, please make your own choice +keyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"]], opts) + +-- Use <c-j> to trigger snippets +keyset("i", "<c-j>", "<Plug>(coc-snippets-expand-jump)") +-- Use <c-space> to trigger completion +keyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true}) + +-- Use `[g` and `]g` to navigate diagnostics +-- Use `:CocDiagnostics` to get all diagnostics of current buffer in location list +keyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true}) +keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true}) + +-- GoTo code navigation +keyset("n", "gd", "<Plug>(coc-definition)", {silent = true}) +keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true}) +keyset("n", "gi", "<Plug>(coc-implementation)", {silent = true}) +keyset("n", "gr", "<Plug>(coc-references)", {silent = true}) + + +-- Use K to show documentation in preview window +function _G.show_docs() + local cw = vim.fn.expand('<cword>') + if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 then + vim.api.nvim_command('h ' .. cw) + elseif vim.api.nvim_eval('coc#rpc#ready()') then + vim.fn.CocActionAsync('doHover') + else + vim.api.nvim_command('!' .. vim.o.keywordprg .. ' ' .. cw) + end end +keyset("n", "K", '<CMD>lua _G.show_docs()<CR>', {silent = true}) -local function feedkey(key, mode) - vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(key, true, true, true), mode, true) -end -local function border(hl_name) - return { - { "╭", hl_name }, - { "─", hl_name }, - { "╮", hl_name }, - { "│", hl_name }, - { "╯", hl_name }, - { "─", hl_name }, - { "╰", hl_name }, - { "│", hl_name }, - } -end +-- Highlight the symbol and its references on a CursorHold event(cursor is idle) +vim.api.nvim_create_augroup("CocGroup", {}) +vim.api.nvim_create_autocmd("CursorHold", { + group = "CocGroup", + command = "silent call CocActionAsync('highlight')", + desc = "Highlight symbol under cursor on CursorHold" +}) -cmp_window.info_ = cmp_window.info -cmp_window.info = function(self) - local info = self:info_() - info.scrollable = false - return info -end -cmp.setup({ - window = { - completion = { - border = border "CmpBorder", - winhighlight = "Normal:CmpPmenu,CursorLine:PmenuSel,Search:None", - }, - documentation = { - border = border "CmpDocBorder" - }, - }, - snippet = { - expand = function(args) - vim.fn["vsnip#anonymous"](args.body) - end, - }, - mapping = cmp.mapping.preset.insert({ - ['<C-b>'] = cmp.mapping.scroll_docs(-4), - ['<C-f>'] = cmp.mapping.scroll_docs(4), - ['<C-Space>'] = cmp.mapping.complete(), - ['<C-e>'] = cmp.mapping.abort(), - ['<CR>'] = cmp.mapping.confirm({select = true}), - ["<Tab>"] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - elseif vim.fn["vsnip#available"](1) == 1 then - feedkey("<Plug>(vsnip-expand-or-jump)", "") - elseif has_words_before() then - cmp.complete() - else - fallback() - end - end, {"i", "s"}), - - ["<S-Tab"] = cmp.mapping(function() - if cmp.visible() then - cmp.select_prev_item() - elseif vim.fn["vsnip#jumpable"](-1) == 1 then - feedkey("<Plug>(vsnip-jump-prev)", "") - end - end, {"i", "s"}), - }), - sources = cmp.config.sources({ - { name = "nvim_lsp" }, - { name = "vsnip" }, - { name = "treesitter" }, - { name = "path", option = { trailing_slash = true }}, - { name = "buffer" } - }), -}) +-- Symbol renaming +keyset("n", "<leader>rn", "<Plug>(coc-rename)", {silent = true}) -cmp.setup.cmdline(":", { - mapping = cmp.mapping.preset.cmdline(), - sources = cmp.config.sources({ - { name = "path" }, - }, { - { name = "cmdline" }, - }), -}) -vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( - vim.lsp.diagnostic.on_publish_diagnostics, { - virtual_text = true, - signs = true, - update_in_insert = true - } -) +-- Formatting selected code +keyset("x", "<leader>f", "<Plug>(coc-format-selected)", {silent = true}) +keyset("n", "<leader>f", "<Plug>(coc-format-selected)", {silent = true}) -local capabilities = require("cmp_nvim_lsp").default_capabilities(vim.lsp.protocol.make_client_capabilities()) -local servers = { "ccls", "bashls", "rnix", "texlab", "lua_ls" } +-- Setup formatexpr specified filetype(s) +vim.api.nvim_create_autocmd("FileType", { + group = "CocGroup", + pattern = "typescript,json", + command = "setl formatexpr=CocAction('formatSelected')", + desc = "Setup formatexpr specified filetype(s)." +}) -for _, lang in pairs(servers) do - nvim_lsp[lang].setup({ - root_dir = vim.loop.cwd, - on_attach = on_attach, - capabilities = capabilities - }) -end +-- Update signature help on jump placeholder +vim.api.nvim_create_autocmd("User", { + group = "CocGroup", + pattern = "CocJumpPlaceholder", + command = "call CocActionAsync('showSignatureHelp')", + desc = "Update signature help on jump placeholder" +}) + +-- Apply codeAction to the selected region +-- Example: `<leader>aap` for current paragraph +local opts = {silent = true, nowait = true} +keyset("x", "<leader>a", "<Plug>(coc-codeaction-selected)", opts) +keyset("n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts) + +-- Remap keys for apply code actions at the cursor position. +keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts) +-- Remap keys for apply source code actions for current file. +keyset("n", "<leader>as", "<Plug>(coc-codeaction-source)", opts) +-- Apply the most preferred quickfix action on the current line. +keyset("n", "<leader>qf", "<Plug>(coc-fix-current)", opts) + +-- Remap keys for apply refactor code actions. +keyset("n", "<leader>re", "<Plug>(coc-codeaction-refactor)", { silent = true }) +keyset("x", "<leader>r", "<Plug>(coc-codeaction-refactor-selected)", { silent = true }) +keyset("n", "<leader>r", "<Plug>(coc-codeaction-refactor-selected)", { silent = true }) + +-- Run the Code Lens actions on the current line +keyset("n", "<leader>cl", "<Plug>(coc-codelens-action)", opts) + + +-- Map function and class text objects +-- NOTE: Requires 'textDocument.documentSymbol' support from the language server +keyset("x", "if", "<Plug>(coc-funcobj-i)", opts) +keyset("o", "if", "<Plug>(coc-funcobj-i)", opts) +keyset("x", "af", "<Plug>(coc-funcobj-a)", opts) +keyset("o", "af", "<Plug>(coc-funcobj-a)", opts) +keyset("x", "ic", "<Plug>(coc-classobj-i)", opts) +keyset("o", "ic", "<Plug>(coc-classobj-i)", opts) +keyset("x", "ac", "<Plug>(coc-classobj-a)", opts) +keyset("o", "ac", "<Plug>(coc-classobj-a)", opts) + + +-- Remap <C-f> and <C-b> to scroll float windows/popups +---@diagnostic disable-next-line: redefined-local +local opts = {silent = true, nowait = true, expr = true} +keyset("n", "<C-f>", 'coc#float#has_scroll() ? coc#float#scroll(1) : "<C-f>"', opts) +keyset("n", "<C-b>", 'coc#float#has_scroll() ? coc#float#scroll(0) : "<C-b>"', opts) +keyset("i", "<C-f>", + 'coc#float#has_scroll() ? "<c-r>=coc#float#scroll(1)<cr>" : "<Right>"', opts) +keyset("i", "<C-b>", + 'coc#float#has_scroll() ? "<c-r>=coc#float#scroll(0)<cr>" : "<Left>"', opts) +keyset("v", "<C-f>", 'coc#float#has_scroll() ? coc#float#scroll(1) : "<C-f>"', opts) +keyset("v", "<C-b>", 'coc#float#has_scroll() ? coc#float#scroll(0) : "<C-b>"', opts) + + +-- Use CTRL-S for selections ranges +-- Requires 'textDocument/selectionRange' support of language server +keyset("n", "<C-s>", "<Plug>(coc-range-select)", {silent = true}) +keyset("x", "<C-s>", "<Plug>(coc-range-select)", {silent = true}) + + +-- Add `:Format` command to format current buffer +vim.api.nvim_create_user_command("Format", "call CocAction('format')", {}) + +-- " Add `:Fold` command to fold current buffer +vim.api.nvim_create_user_command("Fold", "call CocAction('fold', <f-args>)", {nargs = '?'}) + +-- Add `:OR` command for organize imports of the current buffer +vim.api.nvim_create_user_command("OR", "call CocActionAsync('runCommand', 'editor.action.organizeImport')", {}) + +-- Add (Neo)Vim's native statusline support +-- NOTE: Please see `:h coc-status` for integrations with external plugins that +-- provide custom statusline: lightline.vim, vim-airline +vim.opt.statusline:prepend("%{coc#status()}%{get(b:,'coc_current_function','')}") + +-- Mappings for CoCList +-- code actions and coc stuff +---@diagnostic disable-next-line: redefined-local +local opts = {silent = true, nowait = true} +-- Show all diagnostics +keyset("n", "<space>a", ":<C-u>CocList diagnostics<cr>", opts) +-- Manage extensions +keyset("n", "<space>e", ":<C-u>CocList extensions<cr>", opts) +-- Show commands +keyset("n", "<space>c", ":<C-u>CocList commands<cr>", opts) +-- Find symbol of current document +keyset("n", "<space>o", ":<C-u>CocList outline<cr>", opts) +-- Search workspace symbols +keyset("n", "<space>s", ":<C-u>CocList -I symbols<cr>", opts) +-- Do default action for next item +keyset("n", "<space>j", ":<C-u>CocNext<cr>", opts) +-- Do default action for previous item +keyset("n", "<space>k", ":<C-u>CocPrev<cr>", opts) +-- Resume latest coc list +keyset("n", "<space>p", ":<C-u>CocListResume<cr>", opts) require("nvim-treesitter.configs").setup({ highlight = { enable = true, }, }) require("gitsigns").setup({}) - diff --git a/config/waybar/style.css b/config/waybar/style.css index 0a098e4..7b493d6 100644 --- a/config/waybar/style.css +++ b/config/waybar/style.css @@ -5,10 +5,10 @@ } window#waybar { - background-color: rgba(30, 30, 46, 0.5); - color: #CDD6F4; + background-color: #2B2B30; + color: #CDCDDD; transition-property: background-color; - transition-duration: .5s; + transition-duration: .25s; } window#waybar.hidden { @@ -58,7 +58,7 @@ button:hover { } #workspaces button.active { - background-color: #64727D; + background-color: #7B7B90; box-shadow: inset 0 -3px #ffffff; } @@ -94,6 +94,7 @@ button:hover { #window, #workspaces { margin: 0 4px; + background-color: #2B2B2B; } /* If workspaces is the leftmost module, omit left margin */ @@ -107,7 +108,7 @@ button:hover { } #clock { - background-color: #64727D; + background-color: #4b4b5b; } #battery { @@ -142,16 +143,15 @@ label:focus { } #cpu { - background-color: #2ecc71; - color: #000000; + background-color: #4b4b5b; } #memory { - background-color: #9b59b6; + background-color: #4b4b5b; } #disk { - background-color: #964B00; + background-color: #4b4b5b; } #backlight { @@ -159,7 +159,7 @@ label:focus { } #network { - background-color: #2980b9; + background-color: #4b4b5b; } #network.disconnected { @@ -167,22 +167,19 @@ label:focus { } #pulseaudio { - background-color: #f1c40f; - color: #000000; + background-color: #4b4b5b; } #pulseaudio.muted { - background-color: #90b1b1; - color: #2a5c45; + background-color: #4b4b5b; } #wireplumber { - background-color: #fff0f5; - color: #000000; + background-color: #4b4b5b; } #wireplumber.muted { - background-color: #f53c3c; + background-color: #4b4b5b; } #custom-media { @@ -200,15 +197,15 @@ label:focus { } #temperature { - background-color: #f0932b; + background-color: #4b4b5b; } #temperature.critical { - background-color: #eb4d4b; + background-color: #4b4b5b; } #tray { - background-color: #2980b9; + background-color: #4b4b5b; } #tray > .passive { @@ -217,7 +214,7 @@ label:focus { #tray > .needs-attention { -gtk-icon-effect: highlight; - background-color: #eb4d4b; + background-color: #4b4b5b; } #idle_inhibitor { diff --git a/default.nix b/default.nix index f223141..f7d4eb1 100644 --- a/default.nix +++ b/default.nix @@ -66,5 +66,5 @@ }; }; - system.stateVersion = "23.11"; + system.stateVersion = "25.05"; } @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1704100519, - "narHash": "sha256-SgZC3cxquvwTN07vrYYT9ZkfvuhS5Y1k1F4+AMsuflc=", + "lastModified": 1750713626, + "narHash": "sha256-uM+hqdMxp+H53d8R7EHn2yY+nLNGgg59pdipIgCZ5yY=", "owner": "nix-community", "repo": "home-manager", - "rev": "6e91c5df192395753d8e6d55a0352109cb559790", + "rev": "86402a17b6c67b07c5536354da5d56c14196de46", "type": "github" }, "original": { @@ -20,16 +20,37 @@ "type": "github" } }, + "lsfg-vk-flake": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1753938292, + "narHash": "sha256-akeUWgvIIi163s/femzvTOuqqOiOB/8US5ioHsNqhYY=", + "owner": "pabloaul", + "repo": "lsfg-vk-flake", + "rev": "081cd66b1369188777ea146a759d35e99ea6b031", + "type": "github" + }, + "original": { + "owner": "pabloaul", + "ref": "main", + "repo": "lsfg-vk-flake", + "type": "github" + } + }, "nix-index-database": { "inputs": { "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1706411424, - "narHash": "sha256-BzziJYucEZvdCE985vjPoo3ztWcmUiSQ1wJ2CoT6jCc=", + "lastModified": 1728790083, + "narHash": "sha256-grMdAd4KSU6uPqsfLzA1B/3pb9GtGI9o8qb0qFzEU/Y=", "owner": "Mic92", "repo": "nix-index-database", - "rev": "c782f2a4f6fc94311ab5ef31df2f1149a1856181", + "rev": "5c54c33aa04df5dd4b0984b7eb861d1981009b22", "type": "github" }, "original": { @@ -40,48 +61,48 @@ }, "nixpkgs": { "locked": { - "lastModified": 1706191920, - "narHash": "sha256-eLihrZAPZX0R6RyM5fYAWeKVNuQPYjAkCUBr+JNvtdE=", - "owner": "nixos", + "lastModified": 1728492678, + "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "ae5c332cbb5827f6b1f02572496b141021de335f", + "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7", "type": "github" }, "original": { - "owner": "nixos", + "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs-unstable": { "locked": { - "lastModified": 1703992652, - "narHash": "sha256-C0o8AUyu8xYgJ36kOxJfXIroy9if/G6aJbNOpA5W0+M=", + "lastModified": 1758035966, + "narHash": "sha256-qqIJ3yxPiB0ZQTT9//nFGQYn8X/PBoJbofA7hRKZnmE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "32f63574c85fbc80e4ba1fbb932cde9619bad25e", + "rev": "8d4ddb19d03c65a36ad8d189d001dc32ffb0306b", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-23.11", + "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1703961334, - "narHash": "sha256-M1mV/Cq+pgjk0rt6VxoyyD+O8cOUiai8t9Q6Yyq4noY=", + "lastModified": 1750400657, + "narHash": "sha256-3vkjFnxCOP6vm5Pm13wC/Zy6/VYgei/I/2DWgW4RFeA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "b0d36bd0a420ecee3bc916c91886caca87c894e9", + "rev": "b2485d56967598da068b5a6946dadda8bfcbcd37", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-unstable", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } @@ -89,9 +110,10 @@ "root": { "inputs": { "home-manager": "home-manager", + "lsfg-vk-flake": "lsfg-vk-flake", "nix-index-database": "nix-index-database", "nixpkgs": "nixpkgs_2", - "nixpkgs-stable": "nixpkgs-stable" + "nixpkgs-unstable": "nixpkgs-unstable" } } }, @@ -2,21 +2,26 @@ description = "Jon's NixOS configuration"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-23.11"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; + lsfg-vk-flake.url = "github:pabloaul/lsfg-vk-flake/main"; + lsfg-vk-flake.inputs.nixpkgs.follows = "nixpkgs"; + nix-index-database.url = "github:Mic92/nix-index-database"; }; outputs = inputs @ { self, nixpkgs, + nixpkgs-unstable, nix-index-database, + lsfg-vk-flake, ... }: let system = "x86_64-linux"; @@ -44,9 +49,10 @@ mkHost = system: path: lib.nixosSystem { inherit system; - specialArgs = {inherit lib inputs system;}; + specialArgs = {inherit lib inputs system; rootPath=./.;}; modules = [ nix-index-database.nixosModules.nix-index + lsfg-vk-flake.nixosModules.default { nixpkgs.pkgs = pkgs; modules.device.name = lib.mkDefault (builtins.baseNameOf path); diff --git a/hosts/jonbox/default.nix b/hosts/jonbox/default.nix index 3cd8d16..1ed69bf 100644 --- a/hosts/jonbox/default.nix +++ b/hosts/jonbox/default.nix @@ -1,9 +1,13 @@ { + config, inputs, + options, lib, pkgs, + rootPath, ... -}: { + }: { + hardware.enableAllFirmware = true; #Filesystems fileSystems."/" = { device = "/dev/disk/by-uuid/83cafaff-8be3-477f-b13c-c47dafdf969d"; @@ -17,17 +21,17 @@ }; fileSystems."/mnt/jonshare" = { - device = "homenas:/var/data/jon"; + device = "192.168.0.145:/var/data/jon"; fsType = "nfs"; }; fileSystems."/mnt/plexshare" = { - device = "homenas:/var/data/plex"; + device = "192.168.0.145:/var/data/plex"; fsType = "nfs"; }; fileSystems."/mnt/share" = { - device = "homenas:/var/data/shared"; + device = "192.168.0.145:/var/data/shared"; fsType = "nfs"; }; @@ -43,9 +47,9 @@ font-awesome liberation_ttf noto-fonts - noto-fonts-cjk + noto-fonts-cjk-sans noto-fonts-emoji - (nerdfonts.override { fonts = [ "FiraCode" ]; } ) + nerd-fonts.fira-code ]; modules = { @@ -61,7 +65,11 @@ browsers.firefox.enable = true; games = { enable = true; + prism.enable = true; steam.enable = true; + vintagestory.enable = true; + openttd.enable = true; + luanti.enable = true; }; editors = { neovim.enable = true; @@ -71,23 +79,71 @@ flatpak.enable = true; newsboat.enable = true; virt-manager.enable = true; + mutt.enable = true; }; }; }; services.printing.enable = true; + services.mullvad-vpn.enable = true; + + networking.nameservers = [ + "1.1.1.1" + "1.0.0.1" + ]; + services.resolved = { + enable = true; + dnssec = "true"; + domains = ["~."]; + fallbackDns = [ + "1.1.1.1" + "1.0.0.1" + ]; + dnsovertls = "true"; + }; + services.avahi = { enable = true; - nssmdns = true; + nssmdns4 = true; openFirewall = true; }; - home.manager.wayland.windowManager.hyprland.extraConfig = '' - monitor=DP-2,1920x1080,0x0,1 - monitor=HDMI-A-2,1920x1080,1920x0,1 - ''; + environment.systemPackages = [ + pkgs.wineWowPackages.staging + pkgs.winetricks + pkgs.wineWowPackages.waylandFull + + pkgs.linuxPackages_latest.perf + pkgs.perf-tools + pkgs.unstable.yafc-ce + ]; + + home.packages = with pkgs; [ + cataclysm-dda + cataclysm-tlg + (callPackage (rootPath + /packages/freeciv/default.nix) {}) + unstable.unciv + ]; + + #services.clamav.daemon.enable = true; + #services.clamav.updater.enable = true; + + home.manager.wayland.windowManager.hyprland.settings = { + cursor = { + no_hardware_cursors = true; + }; + monitor = [ + "HDMI-A-2,1920x1080,0x0,1" + "DP-2,1920x1080,1920x0,1" + ]; + }; programs.nix-ld.enable = true; programs.nix-index.enableZshIntegration = false; programs.nix-index.enableBashIntegration = false; + + services.lsfg-vk = { + enable = false; + ui.enable = false; + }; } diff --git a/hosts/jontop/default.nix b/hosts/jontop/default.nix index b90038b..fc7e373 100644 --- a/hosts/jontop/default.nix +++ b/hosts/jontop/default.nix @@ -30,6 +30,7 @@ noto-fonts-cjk noto-fonts-emoji (nerdfonts.override { fonts = [ "FiraCode" ]; } ) + texlive.combined.scheme-full ]; environment.systemPackages = [ @@ -50,12 +51,13 @@ apps = { browsers.firefox.enable = true; games = { - enable = false; + enable = true; steam.enable = false; }; mpd.enable = false; flatpak.enable = true; newsboat.enable = true; + latex.enable = true; }; }; }; diff --git a/modules/desktop/apps/browsers/firefox.nix b/modules/desktop/apps/browsers/firefox.nix index 3c647f1..2c87bd5 100644 --- a/modules/desktop/apps/browsers/firefox.nix +++ b/modules/desktop/apps/browsers/firefox.nix @@ -34,7 +34,7 @@ in } + "/user.js"); search = { force = true; - default = "DuckDuckGo"; + default = "ddg"; engines = { "Nix Packages" = { urls = [{ @@ -47,8 +47,8 @@ in definedAliases = [ "@np" ]; }; "NixOS Wiki" = { - urls = [{ template = "https://nixos.wiki/index.php?search={searchTerms}"; }]; - iconUpdateURL = "https://nixos.wiki/favicon.png"; + urls = [{ template = "https://wiki.nixos.org/index.php?search={searchTerms}"; }]; + icon = "https://wiki.nixos.org/favicon.png"; updateInterval = 24 * 60 * 60 * 1000; definedAliases = [ "@nw" ]; }; diff --git a/modules/desktop/apps/editors/neovim.nix b/modules/desktop/apps/editors/neovim.nix index ee6424b..f0040e0 100644 --- a/modules/desktop/apps/editors/neovim.nix +++ b/modules/desktop/apps/editors/neovim.nix @@ -1,12 +1,10 @@ { config, - options, lib, pkgs, ... }: let nvimConf = config.modules.desktop.apps.editors.neovim; - configDir = config.nixosConfig.configDir; in { options.modules.desktop.apps.editors.neovim = { enable = lib.mkOption { @@ -24,11 +22,9 @@ in { }; home.packages = [ - pkgs.rnix-lsp - pkgs.ccls - pkgs.nodePackages.bash-language-server + pkgs.clang-tools + pkgs.nil pkgs.texlab - pkgs.sumneko-lua-language-server ]; home.manager.programs.neovim = { @@ -41,31 +37,37 @@ in { luafile /etc/nixos/config/nvim/lua/settings.lua luafile /etc/nixos/config/nvim/lua/lsp.lua ''; + coc.enable = true; + coc.settings = { + "suggest.noselect" = true; + "suggest.enablePreview" = true; + "suggest.enablePreselect" = false; + "suggest.disableKind" = true; + "inlayHint.enable" = false; + + "nix.enableLanguageServer" = true; + "nix.serverPath" = "nil"; + }; plugins = with pkgs.vimPlugins; [ nvim-web-devicons gitsigns-nvim - nvim-tree-lua catppuccin-nvim + vim-commentary + vim-fugitive + + popup-nvim + plenary-nvim + telescope-nvim + nvim-lspconfig - nvim-cmp - cmp-cmdline - cmp-nvim-lsp - cmp-buffer - cmp-path - cmp-vsnip - cmp-treesitter - - vim-nix - vim-vsnip - nvim-treesitter.withAllGrammars - neoformat + nvim-treesitter nvim-treesitter.withAllGrammars - bufferline-nvim - lualine-nvim - alpha-nvim - ]; + coc-clangd + coc-lua + coc-spell-checker + ]; }; }; } diff --git a/modules/desktop/apps/editors/vscode.nix b/modules/desktop/apps/editors/vscode.nix index f2db004..a775be8 100644 --- a/modules/desktop/apps/editors/vscode.nix +++ b/modules/desktop/apps/editors/vscode.nix @@ -18,10 +18,8 @@ in { config = lib.mkIf (codeConf.enable) { home.manager.programs.vscode = { enable = true; - package = pkgs.vscode; - extensions = with pkgs.vscode-extensions; [ - catppuccin.catppuccin-vsc - catppuccin.catppuccin-vsc-icons + profiles.default.extensions = with pkgs.vscode-extensions; [ + catppuccin.catppuccin-vsc catppuccin.catppuccin-vsc-icons ms-dotnettools.csharp ]; }; diff --git a/modules/desktop/apps/games/lunati.nix b/modules/desktop/apps/games/lunati.nix new file mode 100644 index 0000000..1c06b4f --- /dev/null +++ b/modules/desktop/apps/games/lunati.nix @@ -0,0 +1,24 @@ +{ + config, + options, + lib, + pkgs, + rootPath, + ... +}: let + luantiConf = config.modules.desktop.apps.games.luanti; + configDir = config.nixosConfig.configDir; +in { + options.modules.desktop.apps.games.luanti = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf (luantiConf.enable) { + home.packages = with pkgs; [ + luanti + ]; + }; +} diff --git a/modules/desktop/apps/games/openttd.nix b/modules/desktop/apps/games/openttd.nix new file mode 100644 index 0000000..f66ccc0 --- /dev/null +++ b/modules/desktop/apps/games/openttd.nix @@ -0,0 +1,28 @@ +{ + config, + options, + lib, + pkgs, + rootPath, + ... +}: let + openttdConf = config.modules.desktop.apps.games.openttd; + configDir = config.nixosConfig.configDir; +in { + options.modules.desktop.apps.games.openttd = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf (openttdConf.enable) { + home.packages = with pkgs; [ + openttd + ]; + + fonts.packages = with pkgs; [ + openttd-ttf + ]; + }; +} diff --git a/modules/desktop/apps/games/prism.nix b/modules/desktop/apps/games/prism.nix index 4eb0a5f..d3ceee7 100644 --- a/modules/desktop/apps/games/prism.nix +++ b/modules/desktop/apps/games/prism.nix @@ -5,7 +5,7 @@ pkgs, ... }: let - prismConf = config.modules.desktop.apps.games; + prismConf = config.modules.desktop.apps.games.prism; configDir = config.nixosConfig.configDir; in { options.modules.desktop.apps.games.prism = { diff --git a/modules/desktop/apps/games/steam.nix b/modules/desktop/apps/games/steam.nix index 50b5c62..51396f1 100644 --- a/modules/desktop/apps/games/steam.nix +++ b/modules/desktop/apps/games/steam.nix @@ -29,6 +29,11 @@ in { remotePlay.openFirewall = true; dedicatedServer.openFirewall = true; gamescopeSession.enable = true; + protontricks.enable = true; }; + + environment.systemPackages = with pkgs; [ + protonup-qt + ]; }; } diff --git a/modules/desktop/apps/games/vintagestory.nix b/modules/desktop/apps/games/vintagestory.nix index db3d49e..a15935a 100644 --- a/modules/desktop/apps/games/vintagestory.nix +++ b/modules/desktop/apps/games/vintagestory.nix @@ -3,17 +3,29 @@ options, lib, pkgs, + rootPath, ... }: let - gamesConf = config.modules.desktop.apps.games; + vsConf = config.modules.desktop.apps.games.vintagestory; configDir = config.nixosConfig.configDir; in { - config = lib.mkIf (gamesConf.enable) { - environment.systemPackages = [ - pkgs.dotnet-sdk_7 - ]; - environment.sessionVariables = { - DOTNET_ROOT = "${pkgs.dotnet-sdk_7}"; + options.modules.desktop.apps.games.vintagestory = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; }; }; + + config = lib.mkIf (vsConf.enable) { + home.manager.xdg.mimeApps = { + defaultApplications = { + "x-scheme-handler/vintagestoryjoin" = [ "Vintagestory_url_connect.desktop" ]; + "x-scheme-handler/vintagestorymodinstall" = [ "Vintagestory_url_mod.desktop" ]; + }; + }; + + home.packages = with pkgs; [ + (callPackage (rootPath + /packages/vintagestory/default.nix) {}) + ]; + }; } diff --git a/modules/desktop/apps/mpd.nix b/modules/desktop/apps/mpd.nix index e7af8c3..17b22ec 100644 --- a/modules/desktop/apps/mpd.nix +++ b/modules/desktop/apps/mpd.nix @@ -18,12 +18,11 @@ in config = lib.mkIf (mpdConfig.enable) { home.packages = [ pkgs.mpc-cli - pkgs.ncmpcpp ]; services.mpd = { enable = true; - musicDirectory = /home/jon/mus; + musicDirectory = "/home/jon/mus"; extraConfig = '' audio_output { type "pipewire" @@ -34,6 +33,11 @@ audio_output { }; systemd.services.mpd.environment = { XDG_RUNTIME_DIR = "/run/user/1000"; + }; + + home.manager.programs.ncmpcpp = { + enable = true; + mpdMusicDir = /home/jon/mus; }; }; } diff --git a/modules/desktop/apps/mutt-wizard.nix b/modules/desktop/apps/mutt-wizard.nix new file mode 100644 index 0000000..da7b779 --- /dev/null +++ b/modules/desktop/apps/mutt-wizard.nix @@ -0,0 +1,46 @@ +{ + config, + options, + lib, + pkgs, + ... +}: let + muttConfig = config.modules.desktop.apps.mutt; +in +{ + options.modules.desktop.apps.mutt = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf (muttConfig.enable) { + home.packages = [ + pkgs.neomutt + pkgs.isync + pkgs.lynx + pkgs.mutt-wizard + ]; + + systemd.timers."auto-mailsync" = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "10m"; + OnUnitActiveSec = "10m"; + Unit = "auto-mailsync.service"; + }; + }; + + systemd.services."auto-mailsync" = { + script = '' + set -eu + /run/current-system/sw/bin/bash -l -c '${pkgs.mutt-wizard}/bin/mailsync -Y' + ''; + serviceConfig = { + Type = "oneshot"; + User = "jon"; + }; + }; + }; +} diff --git a/modules/desktop/apps/virt.nix b/modules/desktop/apps/virt.nix index 5851a0b..a9eaef4 100644 --- a/modules/desktop/apps/virt.nix +++ b/modules/desktop/apps/virt.nix @@ -16,6 +16,10 @@ in }; config = lib.mkIf (virtConfig.enable) { + home.packages = [ + pkgs.virtiofsd + ]; + virtualisation.libvirtd = { enable = true; qemu = { diff --git a/modules/desktop/apps/vpn.nix b/modules/desktop/apps/vpn.nix new file mode 100644 index 0000000..8cddb39 --- /dev/null +++ b/modules/desktop/apps/vpn.nix @@ -0,0 +1,23 @@ +{ + config, + options, + lib, + pkgs, + ... +}: let + vpnConfig = config.modules.desktop.apps.vpn; +in +{ + options.modules.desktop.apps.vpn = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf (vpnConfig.enable) { + home.packages = [ + pkgs.mullvad-vpn + ]; + }; +} diff --git a/modules/desktop/greetd.nix b/modules/desktop/greetd.nix index f9b6f90..0bc5208 100644 --- a/modules/desktop/greetd.nix +++ b/modules/desktop/greetd.nix @@ -18,5 +18,6 @@ in { services.greetd = { enable = true; }; + security.pam.services.greetd.enableGnomeKeyring = true; }; } diff --git a/modules/desktop/hyprland.nix b/modules/desktop/hyprland.nix index 5e35608..2839b9a 100644 --- a/modules/desktop/hyprland.nix +++ b/modules/desktop/hyprland.nix @@ -10,8 +10,6 @@ defaultApps = config.modules.desktop.defaultApplications.apps; configDir = config.nixosConfig.configDir; - screenshotarea = "hyprctl keyword animation 'fadeOut,0,0,default'; grimblast --notify copysave area; hyprctl keyword animation 'fadeOut,1,4,default'"; - # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} workspaces = builtins.concatLists (builtins.genList ( x: let @@ -34,12 +32,6 @@ size = 3; passes = 1; }; - drop_shadow = true; - shadow_ignore_window = true; - shadow_offset = "0 2"; - shadow_range = 20; - shadow_render_power = 3; - "col.shadow" = "rgba(00000055)"; }; animations = { @@ -85,7 +77,10 @@ "$mod, D, exec, wofi --show drun" "$mod, Return, exec, ${defaultApps.terminal.cmd}" "$mod, W, exec, ${defaultApps.browser.cmd}" - "$mod ALTL, B, exec, killall -SIGUSR2 waybar" + "$mod ALT, B, exec, killall -SIGUSR2 waybar" + + #Screenshot + "$mod, Print, exec, slurp | grim -g - ~/pic/$(date +%s).png" ] ++ workspaces; @@ -108,15 +103,16 @@ in { config = lib.mkIf (hyprlandConf.enable) (lib.mkMerge [ { - environment.variables.WLR_NO_HARDWARE_CURSORS = "1"; - environment.sessionVariables.NIXOS_OZONE_WL = "1"; - home.packages = [ pkgs.killall pkgs.wl-clipboard pkgs.wdisplays pkgs.swaylock pkgs.swayidle + pkgs.slurp + pkgs.grim + pkgs.mako + pkgs.libnotify pkgs.wofi pkgs.jq pkgs.swww @@ -135,13 +131,18 @@ in { }; }; }; - extraPortals = [pkgs.xdg-desktop-portal-gtk]; - config.common.default = ["wlr" "gtk"]; + extraPortals = [ + pkgs.xdg-desktop-portal-gtk + pkgs.xdg-desktop-portal-hyprland + ]; + config.common.default = ["wlr" "gtk" "hyprland" ]; }; + environment.sessionVariables.NIXOS_OZONE_WL = "1"; home.manager.wayland.windowManager.hyprland = { enable = true; xwayland.enable = hyprlandConf.xwayland; + systemd.enable = true; settings = { "$mod" = "SUPER"; @@ -171,22 +172,35 @@ in { "swww img ${configDir}/hypr/wallpaper.png" ]; - env = [ + env = lib.mkMerge [ + ([ "XDG_CURRENT_DESKTOP,Hyprland" "XDG_SESSION_TYPE,wayland" "XDG_SESSION_DESKTOP,Hyprland" - "GDK_BACKEND=wayland,x11" - "QT_QPA_PLATFORM=wayland;xcb" - "CLUTTER_BACKEND=wayland" - "QT_WAYLAND_DISABLE_WINDOWDECORATION,1" + "GDK_BACKEND,wayland,x11" + "SDL_VIDEODRIVER,wayland" + "CLUTTER_BACKEND,wayland" + "MOZ_ENABLE_WAYLAND,1" + "MOZ_DISABLE_RDD_SANDBOX,1" + "_JAVA_AWT_WM_NONREPARENTING,1" "QT_AUTO_SCREEN_SCALE_FACTOR,1" - - "SDL_VIDEODRIVER=wayland" + "QT_QPA_PLATFORM,wayland" + "QT_WAYLAND_DISABLE_WINDOWDECORATION,1" - "disable_hyprland_logo=true" + "disable_hyprland_logo,true" "force_default_wallpaper,0" - ]; + ]) + ( lib.mkIf (config.modules.device.gpu == "nvidia") + [ + "GBM_BACKEND,nvidia" + "__GLX_VENDOR_LIBRARY_NAME,nvidia" + "LIBVA_DRIVER_NAME,nvidia" + "NVD_BACKEND,direct" + "WLR_DRM_NO_ATOMIC,1" + "WLR_USE_LIBINPUT,1" + "WLR_RENDERER_ALLOW_SOFTWARE,1" + ])]; decoration = decoration; animations = animations; @@ -209,16 +223,6 @@ in { security.pam.services.swaylock = {}; } - (lib.mkIf (device.gpu == "nvidia") { - home.manager.wayland.windowManager.hyprland.settings.env = [ - "GBM_BACKEND=nvidia-drm" - "__GLX_VENDOR_LIBRARY_NAME=nvidia" - "LIBVA_DRIVER_NAME=nvidia" - "__GL_GSYNC_ALLOWED" - "__GL_VRR_ALLOWED" - "WLR_DRM_NO_ATOMIC=1" - ]; - }) (lib.mkIf (config.modules.desktop.greetd.enable) { services.greetd.settings = { default_session.command = '' diff --git a/modules/hardware/audio.nix b/modules/hardware/audio.nix index 3ffa32a..a674597 100644 --- a/modules/hardware/audio.nix +++ b/modules/hardware/audio.nix @@ -23,22 +23,18 @@ in { alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; + + wireplumber.extraConfig.bluetoothEnhancements = { + "monitor.bluez.properties" = { + "bluez5.enable-sbc-xq" = true; + "bluez5.enable-msbc" = true; + "bluez5.enable-hw-volume" = true; + }; + }; }; user.extraGroups = ["audio"]; home.packages = [pkgs.pavucontrol]; - } - (lib.mkIf (device.hasBluetooth) { - home.configFile = { - "wireplumber/bluetooth.lua.d/51-bluez-config.lua".text = '' - bluez_monitor.properties = { - ["bluez5.enable-sbc-xq"] = true, - ["bluez5.enable-msbc"] = true, - ["bluez5.enable-hw-volume"] = true, - ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]" - } - ''; - }; - }) + } ]); } diff --git a/modules/hardware/bluetooth.nix b/modules/hardware/bluetooth.nix index 7f835bf..c5da0fa 100644 --- a/modules/hardware/bluetooth.nix +++ b/modules/hardware/bluetooth.nix @@ -18,9 +18,9 @@ in { config = lib.mkIf (bluetoothConfig.enable && device.hasBluetooth) { hardware.bluetooth = { enable = true; - package = pkgs.bluez; powerOnBoot = true; }; + services.blueman.enable = true; user.extraGroups = ["bluetooth"]; }; } diff --git a/modules/hardware/gpu.nix b/modules/hardware/gpu.nix index fd696ab..72604a8 100644 --- a/modules/hardware/gpu.nix +++ b/modules/hardware/gpu.nix @@ -17,10 +17,8 @@ in { config = lib.mkIf (gpuConfig.enable) (lib.mkMerge [ { - hardware.opengl = { + hardware.graphics = { enable = true; - driSupport = true; - driSupport32Bit = true; }; } (lib.mkIf (device.gpu == "intel") { @@ -38,24 +36,23 @@ in { environment.variables.VDPAU_DRIVER = "va_gl"; }) (lib.mkIf (device.gpu == "nvidia") { - services.xserver.videoDrivers = ["nvidia"]; - hardware.nvidia = { - modesetting.enable = true; - powerManagement.enable = false; - powerManagement.finegrained = false; - open = false; - nvidiaSettings = true; - package = config.boot.kernelPackages.nvidiaPackages.production; - }; - boot.initrd.kernelModules = [ - "nvidia" - "nvidia_modeset" - "nvidia_uvm" - "nvidia_drm" - ]; - boot.extraModprobeConfig = '' - options nvidia-drm modeset=1 - ''; + hardware.graphics.extraPackages = with pkgs; [ nvidia-vaapi-driver ]; + services.xserver.videoDrivers = ["nvidia"]; + + hardware.nvidia = { + modesetting.enable = true; + + powerManagement.enable = false; + powerManagement.finegrained = false; + + open = true; + nvidiaSettings = true; + package = config.boot.kernelPackages.nvidiaPackages.latest; + }; + + environment.systemPackages = with pkgs; [ + nvtopPackages.nvidia + ]; }) ]); } diff --git a/modules/options.nix b/modules/options.nix index e429171..c2463b4 100644 --- a/modules/options.nix +++ b/modules/options.nix @@ -95,6 +95,7 @@ # home manager configuration home-manager = { useUserPackages = true; + useGlobalPkgs = true; users.${config.user.name} = lib.mkAliasDefinitions options.home.manager; }; diff --git a/modules/security.nix b/modules/security.nix index c88fe0c..3100f54 100644 --- a/modules/security.nix +++ b/modules/security.nix @@ -9,19 +9,19 @@ in { config = { security.polkit.enable = true; + services.pcscd.enable = true; + services.gnome.gnome-keyring.enable = true; programs.gnupg.agent = { enable = true; enableSSHSupport = true; }; - environment.systemPackages = [ - pkgs.pinentry-curses - ]; - home.packages = [ (pkgs.pass.withExtensions (exts: [exts.pass-otp ])) + pkgs.gcr + pkgs.seahorse pkgs.pinentry-qt ]; }; diff --git a/modules/shell/zsh.nix b/modules/shell/zsh.nix index c39ec7a..c844564 100644 --- a/modules/shell/zsh.nix +++ b/modules/shell/zsh.nix @@ -39,7 +39,7 @@ in { }; zsh = { enable = true; - enableAutosuggestions = true; + autosuggestion.enable = true; enableCompletion = true; syntaxHighlighting.enable = true; autocd = true; diff --git a/overlay.nix b/overlay.nix index d79b87c..0f08d5e 100644 --- a/overlay.nix +++ b/overlay.nix @@ -2,9 +2,46 @@ inputs, system, ... -}: final: prev: { - stable = import inputs.nixpkgs-stable { + }: final: prev: { + unstable = import inputs.nixpkgs-unstable { inherit system; config.allowUnfree = true; }; + + unciv = prev.unciv.overrideAttrs (old: rec { + version = "4.18.14"; + src = prev.fetchurl { + url = "https://github.com/yairm210/Unciv/releases/download/${version}-patch1/Unciv.jar"; + hash = "sha256-ykyHaIxnahC8D8ZAqzGnwNhc7mUX25uO4hEWKz+7p7o="; + }; + }); + + cataclysm-dda = prev.cataclysm-dda.overrideAttrs (old: { + version = "0.I"; + src = prev.fetchFromGitHub { + owner = "CleverRaven"; + repo = "Cataclysm-DDA"; + tag = "cdda-0.I-2025-10-02-0217"; + sha256 = "sha256-wD11w1u4hJfvh003ce+7Kq3/OgZDDDDd3VUh7fDgY5Q="; + }; + patches = []; + }); + + cataclysm-tlg = prev.cataclysm-dda-git.overrideAttrs (old: { + meta.mainProgram = "cataclysm-tlg-tiles"; + pname = "cataclysm-tlg"; + version = "2025-10-17-1123"; + src = prev.fetchFromGitHub { + owner = "Cataclysm-TLG"; + repo = "Cataclysm-TLG"; + tag = "cataclysm-tlg-1.0-${final.cataclysm-tlg.version}"; + sha256 = "sha256-rpfRBVKyFTLOLl8AOdTueaXI+TozVAEGy5aycoE+ZDs="; + }; + makeFlags = prev.cataclysm-dda-git.makeFlags ++ [ "TESTS=0" ]; + postInstall = '' + substituteInPlace $out/share/applications/com.cataclysm-tlg.cataclysm-tlg.desktop \ + --replace-fail "Exec=cataclysm-tlg-tiles" "Exec=$out/bin/cataclysm-tlg-tiles" + rm $out/bin/zzip + ''; + }); } diff --git a/packages/freeciv/default.nix b/packages/freeciv/default.nix new file mode 100644 index 0000000..5cd37c6 --- /dev/null +++ b/packages/freeciv/default.nix @@ -0,0 +1,141 @@ +{ + lib, + stdenv, + fetchFromGitHub, + autoreconfHook, + lua5_3, + pkg-config, + python3, + zlib, + bzip2, + curl, + xz, + gettext, + libiconv, + icu, + SDL2, + SDL2_mixer, + SDL2_image, + SDL2_ttf, + SDL2_gfx, + freetype, + fluidsynth, + sdl2Client ? false, + gtkClient ? true, + gtk4, + wrapGAppsHook3, + qtClient ? false, + qt5, + server ? true, + readline, + enableSqlite ? true, + sqlite, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "freeciv"; + version = "3.2.1"; + + src = fetchFromGitHub { + owner = "freeciv"; + repo = "freeciv"; + tag = "R${lib.replaceStrings [ "." ] [ "_" ] finalAttrs.version}"; + hash = "sha256-Rl/B71pp5PA6mtRaKs8TbOya18cYxlNmMzVJ4ySVmhY="; + }; + + postPatch = '' + for f in {common,utility}/*.py; do + substituteInPlace $f \ + --replace-fail '/usr/bin/env python3' ${python3.interpreter} + done + for f in bootstrap/*.sh; do + patchShebangs $f + done + ''; + + nativeBuildInputs = [ + autoreconfHook + pkg-config + ] + ++ lib.optionals qtClient [ qt5.wrapQtAppsHook ] + ++ lib.optionals gtkClient [ wrapGAppsHook3 ]; + + buildInputs = [ + lua5_3 + zlib + bzip2 + curl + xz + gettext + libiconv + icu + SDL2 + SDL2_mixer + fluidsynth + ] + ++ lib.optionals sdl2Client [ + SDL2_image + SDL2_ttf + SDL2_gfx + freetype + ] + ++ lib.optionals gtkClient [ gtk4 ] + ++ lib.optionals qtClient [ qt5.qtbase ] + ++ lib.optional server readline + ++ lib.optional enableSqlite sqlite; + + dontWrapQtApps = true; + dontWrapGApps = true; + + # configure is not smart enough to look for SDL2 headers under + # .../SDL2, but thankfully $SDL2_PATH is almost exactly what we want + preConfigure = '' + export CPPFLAGS="$(echo $SDL2_PATH | sed 's#/nix/store/#-I/nix/store/#g')" + ''; + configureFlags = [ + "--enable-shared" + ] + ++ lib.optionals sdl2Client [ + "--enable-client=sdl2" + "--enable-sdl-mixer=sdl2" + ] + ++ lib.optionals qtClient [ + "--enable-client=qt" + "--with-qtver=qt5" + "--with-qt5-includes=${qt5.qtbase.dev}/include" + ] + ++ lib.optionals gtkClient [ + "--enable-client=gtk4" + "--enable-sdl-mixer=sdl2" + ] + ++ lib.optional enableSqlite "--enable-fcdb=sqlite3" + ++ lib.optional (!gtkClient) "--enable-fcmp=cli" + ++ lib.optional (!server) "--disable-server"; + + postFixup = + lib.optionalString qtClient '' + wrapQtApp $out/bin/freeciv-qt + '' + + lib.optionalString gtkClient '' + wrapGApp $out/bin/freeciv-gtk4 + ''; + + enableParallelBuilding = true; + + meta = { + description = "Multiplayer (or single player), turn-based strategy game"; + longDescription = '' + Freeciv is a Free and Open Source empire-building strategy game + inspired by the history of human civilization. The game commences in + prehistory and your mission is to lead your tribe from the stone age + to the space age... + ''; + homepage = "https://freeciv.org/"; + license = lib.licenses.gpl2Plus; + maintainers = with lib.maintainers; [ pierron ]; + platforms = lib.platforms.unix; + hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin + broken = qtClient && stdenv.hostPlatform.isDarwin; # Missing Qt5 development files + }; +}) + diff --git a/packages/freecol/default.nix b/packages/freecol/default.nix new file mode 100644 index 0000000..e2562ad --- /dev/null +++ b/packages/freecol/default.nix @@ -0,0 +1,64 @@ +{ + lib, + stdenv, + fetchFromGitHub, + autoreconfHook, + lua5_3, + pkg-config, + python3, + zlib, + bzip2, + curl, + xz, + gettext, + libiconv, + icu, + SDL2, + SDL2_mixer, + SDL2_image, + SDL2_ttf, + SDL2_gfx, + freetype, + fluidsynth, + sdl2Client ? false, + gtkClient ? false, + gtk3, + wrapGAppsHook3, + qtClient ? true, + qt5, + server ? true, + readline, + enableSqlite ? true, + sqlite, +}: + +stdenv.mkDerivation rec { + pname = "freecol"; + version = "1.2.0"; + + src = fetchFromGitHub { + owner = "FreeCol"; + repo = "freecol"; + rev = "stable"; + hash = "sha256-+kAV9Jz0aQpzeVUFp3so+rYbWOn52NuxRwE8kP5hzM8="; + }; + + enableParallelBuilding = true; + + meta = { + description = "Multiplayer (or single player), turn-based strategy game"; + longDescription = '' + Freeciv is a Free and Open Source empire-building strategy game + inspired by the history of human civilization. The game commences in + prehistory and your mission is to lead your tribe from the stone age + to the space age... + ''; + homepage = "http://www.freeciv.org"; # http only + license = lib.licenses.gpl2Plus; + maintainers = with lib.maintainers; [ pierron ]; + platforms = lib.platforms.unix; + hydraPlatforms = lib.platforms.linux; # sdl-config times out on darwin + broken = qtClient && stdenv.hostPlatform.isDarwin; # Missing Qt5 development files + }; +} + diff --git a/packages/vintagestory/default.nix b/packages/vintagestory/default.nix new file mode 100644 index 0000000..8df3a75 --- /dev/null +++ b/packages/vintagestory/default.nix @@ -0,0 +1,117 @@ +{ + lib, + stdenv, + fetchurl, + makeWrapper, + makeDesktopItem, + copyDesktopItems, + xorg, + gtk2, + sqlite, + openal, + cairo, + libGLU, + SDL2, + freealut, + libglvnd, + pipewire, + libpulseaudio, + wayland, + libxkbcommon, + dotnet-runtime_8 +}: + +stdenv.mkDerivation rec { + name = "vintagestory-${version}"; + version = "1.21.4"; + + src = fetchurl { + url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${version}.tar.gz"; + hash = "sha256-npffJgxgUMefX9OiveNk1r4kVqsMaVCC1jcWaibz9l8="; + }; + + nativeBuildInputs = [ + makeWrapper + copyDesktopItems + ]; + + buildInputs = [ dotnet-runtime_8 ]; + + runtimeLibs = lib.makeLibraryPath ( + [ + gtk2 + sqlite + openal + cairo + libGLU + SDL2 + freealut + libglvnd + pipewire + libpulseaudio + wayland + libxkbcommon + ] + ++ (with xorg; [ + libX11 + libXi + libXcursor + ]) + ); + + desktopItems = [ + (makeDesktopItem { + name = "vintagestory"; + desktopName = "Vintage Story"; + exec = "vintagestory"; + icon = "vintagestory"; + comment = "Innovate and explore in a sandbox world"; + categories = [ "Game" ]; + }) + (makeDesktopItem { + name = "Vintagestory_url_connect"; + desktopName = "Vintage Story URI Connect"; + type = "Application"; + noDisplay = true; + mimeTypes = [ "x-scheme-handler/vintagestoryjoin" ]; + exec = "vintagestory -c %U"; + categories = [ "Game" ]; + }) + (makeDesktopItem { + name = "Vintagestory_url_mod"; + desktopName = "Vintage Story URI mod install"; + type = "Application"; + noDisplay = true; + mimeTypes = [ "x-scheme-handler/vintagestorymodinstall" ]; + exec = "vintagestory -i %U"; + categories = [ "Game" ]; + }) + ]; + + installPhase = '' + runHook preInstall + + mkdir -p $out/share/vintagestory $out/bin $out/share/pixmaps $out/share/fonts/truetype + cp -r * $out/share/vintagestory + cp $out/share/vintagestory/assets/gameicon.xpm $out/share/pixmaps/vintagestory.xpm + cp $out/share/vintagestory/assets/game/fonts/*.ttf $out/share/fonts/truetype + + runHook postInstall + ''; + + preFixup = + '' + makeWrapper ${dotnet-runtime_8}/bin/dotnet $out/bin/vintagestory \ + --prefix LD_LIBRARY_PATH : "${runtimeLibs}" \ + --add-flags $out/share/vintagestory/Vintagestory.dll + makeWrapper ${dotnet-runtime_8}/bin/dotnet $out/bin/vintagestory-server \ + --prefix LD_LIBRARY_PATH : "${runtimeLibs}" \ + --add-flags $out/share/vintagestory/VintagestoryServer.dll + '' + + '' + find "$out/share/vintagestory/assets/" -not -path "*/fonts/*" -regex ".*/.*[A-Z].*" | while read -r file; do + local filename="$(basename -- "$file")" + ln -sf "$filename" "''${file%/*}"/"''${filename,,}" + done + ''; +} |
