diff options
28 files changed, 1324 insertions, 168 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 efc3893..5d84e30 100644 --- a/config/nvim/lua/lsp.lua +++ b/config/nvim/lua/lsp.lua @@ -1,95 +1,189 @@ -vim.o.completeopt = "menuone,noselect" -vim.o.shortmess = vim.o.shortmess .. "c" +-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua -local has_words_before = function() - unpack = unpack or table.unpack - 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 +-- Some servers have issues with backup files, see #649 +vim.opt.backup = false +vim.opt.writebackup = false + +-- Having longer updatetime (default is 4000 ms = 4s) leads to noticeable +-- delays and poor user experience +vim.opt.updatetime = 300 + +-- Always show the signcolumn, otherwise it would shift the text each time +-- diagnostics appeared/became resolved +vim.opt.signcolumn = "yes" + +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 + +-- 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}) + + +-- 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" +}) + + +-- Symbol renaming +keyset("n", "<leader>rn", "<Plug>(coc-rename)", {silent = 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 luasnip = require("luasnip") -local cmp = require("cmp") - -cmp.setup({ - snippet = { - -- REQUIRED - you must specify a snippet engine - expand = function(args) - require('luasnip').lsp_expand(args.body) -- For `luasnip` users. - end, - }, - mapping = cmp.mapping.preset.insert({ - -- Use <C-b/f> to scroll the docs - ['<C-b>'] = cmp.mapping.scroll_docs( -4), - ['<C-f>'] = cmp.mapping.scroll_docs(4), - -- Use <C-k/j> to switch in items - ['<C-k>'] = cmp.mapping.select_prev_item(), - ['<C-j>'] = cmp.mapping.select_next_item(), - -- Use <CR>(Enter) to confirm selection - -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. - ['<CR>'] = cmp.mapping.confirm({ select = true }), - - -- A super tab - -- sourc: https://github.com/hrsh7th/nvim-cmp/wiki/Example-mappings#luasnip - ["<Tab>"] = cmp.mapping(function(fallback) - -- Hint: if the completion menu is visible select next one - if cmp.visible() then - cmp.select_next_item() - elseif has_words_before() then - cmp.complete() - else - fallback() - end - end, { "i", "s" }), -- i - insert mode; s - select mode - ["<S-Tab>"] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.jumpable( -1) then - luasnip.jump( -1) - else - fallback() - end - end, { "i", "s" }), - }), - - -- Let's configure the item's appearance - -- source: https://github.com/hrsh7th/nvim-cmp/wiki/Menu-Appearance - formatting = { - -- Set order from left to right - -- kind: single letter indicating the type of completion - -- abbr: abbreviation of "word"; when not empty it is used in the menu instead of "word" - -- menu: extra text for the popup menu, displayed after "word" or "abbr" - fields = { 'abbr', 'menu' }, - - -- customize the appearance of the completion menu - format = function(entry, vim_item) - vim_item.menu = ({ - nvim_lsp = '[Lsp]', - luasnip = '[Luasnip]', - buffer = '[File]', - path = '[Path]', - })[entry.source.name] - return vim_item - end, - }, - - -- Set source precedence - sources = cmp.config.sources({ - { name = 'nvim_lsp' }, -- For nvim-lsp - { name = 'nvim_lsp_signature_help' }, - { name = 'luasnip' }, -- For luasnip user - { name = 'buffer' }, -- For buffer word completion - { name = 'path' }, -- For path completion - { name = 'treesitter' }, - }) + +-- 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)." +}) + +-- 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" }) -vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with( - vim.lsp.diagnostic.on_publish_diagnostics, { - virtual_text = true, - signs = true, - update_in_insert = true - } -) +-- 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, }, diff --git a/config/waybar/style.css b/config/waybar/style.css index 0a098e4..a6a79ab 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,11 +197,11 @@ label:focus { } #temperature { - background-color: #f0932b; + background-color: #4b4b5b; } #temperature.critical { - background-color: #eb4d4b; + background-color: #4b4b5b; } #tray { diff --git a/default.nix b/default.nix index 239d3e2..f7d4eb1 100644 --- a/default.nix +++ b/default.nix @@ -66,5 +66,5 @@ }; }; - system.stateVersion = "24.11"; + system.stateVersion = "25.05"; } @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1728903686, - "narHash": "sha256-ZHFrGNWDDriZ4m8CA/5kDa250SG1LiiLPApv1p/JF0o=", + "lastModified": 1750713626, + "narHash": "sha256-uM+hqdMxp+H53d8R7EHn2yY+nLNGgg59pdipIgCZ5yY=", "owner": "nix-community", "repo": "home-manager", - "rev": "e1aec543f5caf643ca0d94b6a633101942fd065f", + "rev": "86402a17b6c67b07c5536354da5d56c14196de46", "type": "github" }, "original": { @@ -56,32 +56,32 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1737299813, - "narHash": "sha256-Qw2PwmkXDK8sPQ5YQ/y/icbQ+TYgbxfjhgnkNJyT1X8=", + "lastModified": 1750400657, + "narHash": "sha256-3vkjFnxCOP6vm5Pm13wC/Zy6/VYgei/I/2DWgW4RFeA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "107d5ef05c0b1119749e381451389eded30fb0d5", + "rev": "b2485d56967598da068b5a6946dadda8bfcbcd37", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.11", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1737299813, - "narHash": "sha256-Qw2PwmkXDK8sPQ5YQ/y/icbQ+TYgbxfjhgnkNJyT1X8=", + "lastModified": 1750400657, + "narHash": "sha256-3vkjFnxCOP6vm5Pm13wC/Zy6/VYgei/I/2DWgW4RFeA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "107d5ef05c0b1119749e381451389eded30fb0d5", + "rev": "b2485d56967598da068b5a6946dadda8bfcbcd37", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-24.11", + "ref": "nixos-25.05", "repo": "nixpkgs", "type": "github" } @@ -2,8 +2,8 @@ description = "Jon's NixOS configuration"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11"; - nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-25.05"; + nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-25.05"; home-manager = { url = "github:nix-community/home-manager"; @@ -30,6 +30,10 @@ pkgs = import nixpkgs { inherit system; config.allowUnfree = true; + config.permittedInsecurePackages = [ + "dotnet-runtime-7.0.20" + "dotnet-runtime-wrapped-7.0.20" + ]; overlays = [ self.overlays.default ]; }; @@ -44,7 +48,7 @@ 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 { diff --git a/hosts/jonbox/default.nix b/hosts/jonbox/default.nix index 6f4a059..6cb3eff 100644 --- a/hosts/jonbox/default.nix +++ b/hosts/jonbox/default.nix @@ -46,7 +46,7 @@ noto-fonts noto-fonts-cjk-sans noto-fonts-emoji - (nerdfonts.override { fonts = [ "FiraCode" ]; } ) + nerd-fonts.fira-code ]; modules = { @@ -60,9 +60,15 @@ hyprland.enable = true; apps = { browsers.firefox.enable = true; + vpn.enable = true; games = { enable = true; + prism.enable = true; steam.enable = true; + vintagestory.enable = true; + freeciv.enable = true; + unciv.enable = true; + openttd.enable = true; }; editors = { neovim.enable = true; @@ -88,6 +94,9 @@ pkgs.wineWowPackages.staging pkgs.winetricks pkgs.wineWowPackages.waylandFull + + pkgs.linuxPackages_latest.perf + pkgs.perf-tools ]; #services.clamav.daemon.enable = true; #services.clamav.updater.enable = true; @@ -97,8 +106,8 @@ no_hardware_cursors = true; }; monitor = [ - "HDMI-A-1,1920x1080,0x0,1" - "DP-1,1920x1080,1920x0,1" + "HDMI-A-2,1920x1080,0x0,1" + "DP-2,1920x1080,1920x0,1" ]; }; 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 16cd3fd..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 = [{ @@ -48,7 +48,7 @@ in }; "NixOS Wiki" = { urls = [{ template = "https://wiki.nixos.org/index.php?search={searchTerms}"; }]; - iconUpdateURL = "https://wiki.nixos.org/favicon.png"; + 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 e17dac6..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,10 +22,9 @@ in { }; home.packages = [ - pkgs.ccls - pkgs.nodePackages.bash-language-server + pkgs.clang-tools + pkgs.nil pkgs.texlab - pkgs.sumneko-lua-language-server ]; home.manager.programs.neovim = { @@ -40,32 +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 - - nvim-lspconfig - nvim-cmp - cmp-cmdline - cmp-nvim-lsp - cmp-nvim-lsp-signature-help - cmp-buffer - cmp-path - cmp-treesitter - luasnip - - vim-nix - nvim-treesitter.withAllGrammars - neoformat + vim-commentary + vim-fugitive + + popup-nvim + plenary-nvim + telescope-nvim + + nvim-lspconfig + 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 23bf15d..a775be8 100644 --- a/modules/desktop/apps/editors/vscode.nix +++ b/modules/desktop/apps/editors/vscode.nix @@ -18,7 +18,7 @@ in { config = lib.mkIf (codeConf.enable) { home.manager.programs.vscode = { enable = true; - extensions = with pkgs.vscode-extensions; [ + profiles.default.extensions = with pkgs.vscode-extensions; [ catppuccin.catppuccin-vsc catppuccin.catppuccin-vsc-icons ms-dotnettools.csharp ]; diff --git a/modules/desktop/apps/games/freeciv.nix b/modules/desktop/apps/games/freeciv.nix new file mode 100644 index 0000000..cb5e462 --- /dev/null +++ b/modules/desktop/apps/games/freeciv.nix @@ -0,0 +1,24 @@ +{ + config, + options, + lib, + pkgs, + rootPath, + ... +}: let + freecivConf = config.modules.desktop.apps.games.freeciv; + configDir = config.nixosConfig.configDir; +in { + options.modules.desktop.apps.games.freeciv = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf (freecivConf.enable) { + home.packages = with pkgs; [ + (callPackage (rootPath + /packages/freeciv/default.nix) {}) + ]; + }; +} 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/unciv.nix b/modules/desktop/apps/games/unciv.nix new file mode 100644 index 0000000..1eec540 --- /dev/null +++ b/modules/desktop/apps/games/unciv.nix @@ -0,0 +1,24 @@ +{ + config, + options, + lib, + pkgs, + rootPath, + ... +}: let + uncivConf = config.modules.desktop.apps.games.unciv; + configDir = config.nixosConfig.configDir; +in { + options.modules.desktop.apps.games.unciv = { + enable = lib.mkOption { + type = lib.types.bool; + default = false; + }; + }; + + config = lib.mkIf (uncivConf.enable) { + home.packages = with pkgs; [ + (callPackage (rootPath + /packages/unciv/default.nix) {}) + ]; + }; +} diff --git a/modules/desktop/apps/games/vintagestory.nix b/modules/desktop/apps/games/vintagestory.nix index ec82058..a15935a 100644 --- a/modules/desktop/apps/games/vintagestory.nix +++ b/modules/desktop/apps/games/vintagestory.nix @@ -3,12 +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) { + 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/mutt-wizard.nix b/modules/desktop/apps/mutt-wizard.nix index 3b8a5db..da7b779 100644 --- a/modules/desktop/apps/mutt-wizard.nix +++ b/modules/desktop/apps/mutt-wizard.nix @@ -21,6 +21,26 @@ in 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/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 7d594e1..45ad967 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 @@ -79,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,6 +109,10 @@ in { pkgs.wdisplays pkgs.swaylock pkgs.swayidle + pkgs.slurp + pkgs.grim + pkgs.mako + pkgs.libnotify pkgs.wofi pkgs.jq pkgs.swww diff --git a/modules/hardware/gpu.nix b/modules/hardware/gpu.nix index be2ab58..fb333ed 100644 --- a/modules/hardware/gpu.nix +++ b/modules/hardware/gpu.nix @@ -36,13 +36,14 @@ in { environment.variables.VDPAU_DRIVER = "va_gl"; }) (lib.mkIf (device.gpu == "nvidia") { + hardware.graphics.extraPackages = with pkgs; [ nvidia-vaapi-driver ]; services.xserver.videoDrivers = ["nvidia"]; - boot.initrd.kernelModules = [ "nvidia" ]; hardware.nvidia = { modesetting.enable = true; - powerManagement.enable = false; - powerManagement.finegrained = false; + + powerManagement.enable = true; + open = true; nvidiaSettings = true; package = config.boot.kernelPackages.nvidiaPackages.latest; 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/packages/freeciv/default.nix b/packages/freeciv/default.nix new file mode 100644 index 0000000..a49069f --- /dev/null +++ b/packages/freeciv/default.nix @@ -0,0 +1,138 @@ +{ + 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 = "freeciv"; + version = "3.1.5"; + + src = fetchFromGitHub { + owner = "freeciv"; + repo = "freeciv"; + rev = "R${lib.replaceStrings [ "." ] [ "_" ] version}"; + hash = "sha256-+kAV9Jz0aQpzeVUFp3so+rYbWOn52NuxRwE8kP5hzM8="; + }; + + postPatch = '' + for f in {common,utility}/*.py; do + substituteInPlace $f \ + --replace '/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 + SDL2_image + SDL2_ttf + SDL2_gfx + freetype + fluidsynth + ] + ++ lib.optionals gtkClient [ gtk3 ] + ++ 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" + "--enable-sdl-mixer=sdl2" + "--with-qtver=qt5" + "--with-qt5-includes=${qt5.qtbase.dev}/include" + ] + ++ lib.optionals gtkClient [ "--enable-client=gtk3.22" ] + ++ 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-gtk3.22 + ''; + + 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/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/intel-vtune.patch b/packages/intel-vtune.patch new file mode 100644 index 0000000..54f2518 --- /dev/null +++ b/packages/intel-vtune.patch @@ -0,0 +1,514 @@ +From 9ee4876f0e0c7ba153ccaf69b42310ee8c25dca0 Mon Sep 17 00:00:00 2001 +From: Albert Safin <xzfcpw@gmail.com> +Date: Fri, 26 Apr 2024 18:47:53 +0000 +Subject: [PATCH 1/4] libsafec: init at 3.3.0 + +--- + pkgs/by-name/li/libsafec/package.nix | 46 ++++++++++++++++++++++++++++ + 1 file changed, 46 insertions(+) + create mode 100644 pkgs/by-name/li/libsafec/package.nix + +diff --git a/pkgs/by-name/li/libsafec/package.nix b/pkgs/by-name/li/libsafec/package.nix +new file mode 100644 +index 00000000000000..7d65d84f695ef6 +--- /dev/null ++++ b/pkgs/by-name/li/libsafec/package.nix +@@ -0,0 +1,46 @@ ++{ ++ stdenv, ++ lib, ++ fetchFromGitHub, ++ fetchpatch, ++ autoreconfHook, ++ perl, ++}: ++ ++stdenv.mkDerivation (finalAttrs: { ++ pname = "safeclib"; ++ version = "3.3.0"; ++ ++ src = fetchFromGitHub { ++ owner = "rurban"; ++ repo = "safeclib"; ++ rev = "refs/tags/v${finalAttrs.version}"; ++ hash = "sha256-vwMyxGgJvvv2Nlo14HKZtq8YnmAVqAHDvBL6CUmbaYQ="; ++ }; ++ ++ patches = [ ++ # Fix linking error. ++ # Upstreamed in v3.4.0, but intel-opeapi-vtune wants libsafec-3.3.so.3. ++ (fetchpatch { ++ name = "0001-add-pic_flag-to-RETPOLINE-cflags-and-ldflags.patch"; ++ url = "https://github.com/rurban/safeclib/commit/23ae79fe84a3fa5d995b8c6b9be70587e37a6cd8.patch"; ++ hash = "sha256-iv9OZJT9WILug1vVmUgIh8RxGAx8accwR1R0LOxYqYQ="; ++ }) ++ ]; ++ ++ nativeBuildInputs = [ autoreconfHook ]; ++ ++ buildInputs = [ perl ]; ++ ++ env = { ++ CFLAGS = "-Wno-error=dangling-pointer"; ++ }; ++ ++ meta = { ++ description = "Libc extension with all C11 Annex K functions"; ++ homepage = "https://github.com/rurban/safeclib"; ++ license = lib.licenses.mit; ++ maintainers = [ lib.maintainers.xzfc ]; ++ platforms = lib.platforms.all; ++ }; ++}) + +From e85bff2164b9e9058dff94c11cd93b73d3efb43b Mon Sep 17 00:00:00 2001 +From: Albert Safin <xzfcpw@gmail.com> +Date: Fri, 26 Apr 2024 20:03:57 +0000 +Subject: [PATCH 2/4] intel-oneapi-vtune: init at 2025.0.1 + +--- + .../by-name/in/intel-oneapi-vtune/package.nix | 142 ++++++++++++++++++ + pkgs/by-name/in/intel-oneapi-vtune/update.sh | 42 ++++++ + 2 files changed, 184 insertions(+) + create mode 100644 pkgs/by-name/in/intel-oneapi-vtune/package.nix + create mode 100755 pkgs/by-name/in/intel-oneapi-vtune/update.sh + +diff --git a/pkgs/by-name/in/intel-oneapi-vtune/package.nix b/pkgs/by-name/in/intel-oneapi-vtune/package.nix +new file mode 100644 +index 00000000000000..2de5be57e8446c +--- /dev/null ++++ b/pkgs/by-name/in/intel-oneapi-vtune/package.nix +@@ -0,0 +1,142 @@ ++{ ++ alsa-lib, ++ atk, ++ autoPatchelfHook, ++ cairo, ++ cups, ++ dbus, ++ elfutils, ++ expat, ++ fetchurl, ++ file-rename, ++ glib, ++ gtk3, ++ kmod, ++ lib, ++ libdrm, ++ libndctl, ++ libsafec, ++ libxcrypt-legacy, ++ libxkbcommon, ++ mesa, ++ ncurses5, ++ nspr, ++ nss, ++ opencl-clang, ++ p7zip, ++ pango, ++ stdenv, ++ systemd, ++ wrapGAppsHook3, ++ xorg, ++}: ++ ++stdenv.mkDerivation ( ++ finalAttrs: ++ let ++ versionMajorMinor = lib.versions.majorMinor finalAttrs.version; ++ in ++ { ++ pname = "intel-oneapi-vtune"; ++ version = "2025.0.1"; ++ ++ src = fetchurl { ++ url = "https://installer.repos.intel.com/oneapi/vtune/lin/intel.oneapi.lin.vtune,v=2025.0.1%2B14/cupPayload.cup"; ++ sha256 = "1pzh0kx7wxwr48rbv7wfkpkixqxsaass3xkpwhvvkdm09v5fhm7h"; ++ }; ++ ++ nativeBuildInputs = [ ++ autoPatchelfHook ++ file-rename ++ p7zip ++ wrapGAppsHook3 ++ ]; ++ ++ buildInputs = [ ++ alsa-lib ++ atk ++ cairo ++ cups ++ dbus ++ elfutils ++ expat ++ glib ++ gtk3 ++ kmod ++ libdrm ++ libndctl ++ libsafec ++ libxcrypt-legacy ++ libxkbcommon ++ mesa ++ ncurses5 ++ nspr ++ nss ++ opencl-clang ++ pango ++ stdenv.cc.cc.lib ++ xorg.libX11 ++ xorg.libXcomposite ++ xorg.libXdamage ++ xorg.libXext ++ xorg.libXfixes ++ xorg.libXrandr ++ xorg.libxcb ++ ]; ++ ++ unpackPhase = '' ++ runHook preUnpack ++ ++ 7za x $src _installdir/vtune/${versionMajorMinor} ++ ++ # Fix percent-encoded filenames, e.g. "libstdc%2B%2B.so.6" -> "libstdc++.so.6" ++ find -depth -name '*%*' -execdir rename 's/%2B/+/g; s/%5B/[/g; s/%5D/]/g' {} \; ++ ++ runHook postUnpack ++ ''; ++ ++ installPhase = '' ++ runHook preInstall ++ ++ mkdir -p $out/opt/intel/oneapi ++ mv _installdir/vtune $out/opt/intel/oneapi ++ ln -s $out/opt/intel/oneapi/vtune/{${versionMajorMinor},latest} ++ ++ mkdir -p $out/bin ++ for bin in vtune vtune-backend vtune-gui; do ++ ln -s $out/opt/intel/oneapi/vtune/${versionMajorMinor}/bin64/$bin $out/bin/ ++ done ++ ++ mkdir -p $out/share/applications ++ cp $out/opt/intel/oneapi/vtune/${versionMajorMinor}/bin64/vtune-gui.desktop $out/share/applications/ ++ sed -i $out/share/applications/vtune-gui.desktop -e " ++ s|^Exec=.*|Exec=vtune-gui|g; ++ s|^Icon=./|Icon=$out/opt/intel/oneapi/vtune/${versionMajorMinor}/bin64/|g; ++ " ++ ++ runHook postInstall ++ ''; ++ ++ autoPatchelfIgnoreMissingDeps = [ ++ "libffi.so.6" # Used in vendored python ++ "libgdbm.so.4" # Used in vendored python ++ "libgdbm_compat.so.4" # Used in vendored python ++ "libsycl.so.8" # Used in bin64/self_check_apps/matrix.dpcpp/matrix.dpcpp ++ ]; ++ ++ runtimeDependencies = [ ++ systemd # for zygote (vtune-gui) ++ ]; ++ ++ passthru.updateScript = ./update.sh; ++ ++ meta = { ++ changelog = "https://www.intel.com/content/www/us/en/developer/articles/release-notes/vtune-profiler-release-notes.html"; ++ description = "Performance analysis tool for x86-based machines"; ++ homepage = "https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html"; ++ license = lib.licenses.unfree; ++ maintainers = [ lib.maintainers.xzfc ]; ++ platforms = [ "x86_64-linux" ]; ++ }; ++ } ++) +diff --git a/pkgs/by-name/in/intel-oneapi-vtune/update.sh b/pkgs/by-name/in/intel-oneapi-vtune/update.sh +new file mode 100755 +index 00000000000000..5536c846f8e844 +--- /dev/null ++++ b/pkgs/by-name/in/intel-oneapi-vtune/update.sh +@@ -0,0 +1,42 @@ ++#!/usr/bin/env nix-shell ++#!nix-shell -i bash -p curl jq common-updater-scripts ++ ++set -e ++ ++# Check on https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler-download.html ++DOWNLOAD_ID=bef05a56-52f3-40ad-a91a-040a98316680 ++ ++INSTALLER_URL=$( ++ curl --silent "https://www.intel.com/libs/apps/intel/idz/productsinfo?downloadId=$DOWNLOAD_ID" | ++ jq -r ' ++ .downloads.downloads.productVersionsBuilds[0].files[] ++ | select (.operatingSystem == "Linux" and .fileType == "Custom Package") ++ .url ++ ' | ++ uniq ++) ++echo "INSTALLER_URL=$INSTALLER_URL" ++[ "$INSTALLER_URL" ] || exit 1 ++ ++{ ++ read -r CUP_URL ++ read -r VERSION ++} < <( ++ curl --silent "$INSTALLER_URL" | ++ sed '0,/^__CONTENT__$/d' | ++ tar -zx -O --wildcards './packages/intel.oneapi.lin.vtune,v=*/manifest.json' | ++ jq -r ' ++ [(.payloads[] | select (.fileName == "cupPayload.cup") | .url), ++ (.version | split("+")[0]) ++ ][] ++ ' ++) ++echo "CUP_URL=$CUP_URL" ++echo "VERSION=$VERSION" ++[ "$CUP_URL" ] || exit 1 ++[ "$VERSION" ] || exit 1 ++ ++CUP_HASH=$(nix-prefetch-url "$CUP_URL") ++echo "CUP_HASH=$CUP_HASH" ++ ++update-source-version intel-oneapi-vtune "$VERSION" "$CUP_HASH" "$CUP_URL" + +From 26dc08626bcef7802e58d4e1d50b99ab71f1a60d Mon Sep 17 00:00:00 2001 +From: Albert Safin <xzfcpw@gmail.com> +Date: Fri, 26 Apr 2024 20:05:57 +0000 +Subject: [PATCH 3/4] intel-vtune-sepdk: init + +--- + .../linux/intel-vtune-sepdk/default.nix | 106 ++++++++++++++++++ + pkgs/top-level/linux-kernels.nix | 2 + + 2 files changed, 108 insertions(+) + create mode 100644 pkgs/os-specific/linux/intel-vtune-sepdk/default.nix + +diff --git a/pkgs/os-specific/linux/intel-vtune-sepdk/default.nix b/pkgs/os-specific/linux/intel-vtune-sepdk/default.nix +new file mode 100644 +index 00000000000000..bd69321476c538 +--- /dev/null ++++ b/pkgs/os-specific/linux/intel-vtune-sepdk/default.nix +@@ -0,0 +1,106 @@ ++{ ++ bash, ++ coreutils, ++ gnugrep, ++ gnused, ++ intel-oneapi-vtune, ++ kernel, ++ kmod, ++ lib, ++ makeWrapper, ++ p7zip, ++ procps, ++ python3, ++ shadow, ++ stdenv, ++ which, ++}: ++ ++let ++ binPath = lib.makeBinPath [ ++ bash ++ coreutils ++ gnugrep ++ gnused ++ kmod ++ procps ++ python3 ++ shadow ++ which ++ ]; ++ libexecDir = "\${out}/libexec/intel-vtune-sepdk"; ++ modDestDir = "$out/lib/modules/${kernel.modDirVersion}/kernel/drivers/platform/x86"; ++ versionMajorMinor = lib.versions.majorMinor intel-oneapi-vtune.version; ++in ++stdenv.mkDerivation { ++ pname = "intel-vtune-sepdk"; ++ version = "${intel-oneapi-vtune.version}-${kernel.version}"; ++ ++ inherit (intel-oneapi-vtune) src; ++ ++ hardeningDisable = [ "pic" ]; ++ ++ nativeBuildInputs = [ ++ makeWrapper ++ p7zip ++ ] ++ kernel.moduleBuildDependencies; ++ ++ makeFlags = [ ++ "KERNEL_SRC_DIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" ++ "KERNEL_VERSION=${kernel.modDirVersion}" # Output of `uname -r` ++ "MACH=x86_64" # Output of `uname -m` ++ "SMP=1" ++ "VERBOSE=1" ++ "INSTALL=${libexecDir}" ++ ]; ++ ++ unpackPhase = '' ++ runHook preUnpack ++ 7za x $src _installdir/vtune/${versionMajorMinor}/sepdk ++ cd _installdir/vtune/${versionMajorMinor}/sepdk/src ++ runHook postUnpack ++ ''; ++ ++ prePatch = '' ++ # Allow using --load-in-tree-driver option ++ substituteInPlace insmod-sep pax/insmod-pax socperf/src/insmod-socperf \ ++ --replace-fail IS_INTREE_DRIVER_OS=0 IS_INTREE_DRIVER_OS=1 ++ ''; ++ ++ preBuild = '' ++ makeFlags="$makeFlags KBUILD_EXTRA_SYMBOLS=$PWD/socperf/src/Module.symvers" ++ ''; ++ ++ preInstall = "mkdir -p ${libexecDir}"; ++ ++ postInstall = '' ++ # Install wrappers to bin ++ for i in insmod-sep pax/insmod-pax socperf/src/insmod-socperf \ ++ rmmod-sep pax/rmmod-pax socperf/src/rmmod-socperf; do ++ sed -i ' ++ s/^PATH=/# &/; ++ # Do not check for su to make it usable with clean PATH (e.g. as systemd service) ++ s/\(\bCOMMANDS_TO_CHECK="[^"]*\)''${SU}\([^"]*"\)/\1\2/; ++ ' ${libexecDir}/$i ++ makeWrapper ${libexecDir}/$i $out/bin/''${i##*/} --prefix PATH : "${binPath}" ++ done ++ ++ # Install kernel modules ++ mkdir -p ${modDestDir}/{socperf,sepdk/sep,sepdk/pax} ++ ln -s ${libexecDir}/sep5-*.ko ${modDestDir}/sepdk/sep/sep5.ko ++ ln -s ${libexecDir}/pax/pax-*.ko ${modDestDir}/sepdk/pax/pax.ko ++ ln -s ${libexecDir}/socperf/src/socperf3-*.ko ${modDestDir}/socperf/socperf3.ko ++ ''; ++ ++ meta = { ++ description = "Kernel module for Intel VTune Profiler"; ++ homepage = "https://www.intel.com/content/www/us/en/docs/vtune-profiler/user-guide/2024-0/sep-driver.html"; ++ license = [ ++ lib.licenses.bsd3 ++ lib.licenses.gpl2Only ++ lib.licenses.unfree ++ ]; ++ maintainers = [ lib.maintainers.xzfc ]; ++ platforms = [ "x86_64-linux" ]; ++ }; ++} +diff --git a/pkgs/top-level/linux-kernels.nix b/pkgs/top-level/linux-kernels.nix +index 3cabaec2c7b14f..9b07bbcd7189bc 100644 +--- a/pkgs/top-level/linux-kernels.nix ++++ b/pkgs/top-level/linux-kernels.nix +@@ -392,6 +392,8 @@ in { + + intel-speed-select = if lib.versionAtLeast kernel.version "5.3" then callPackage ../os-specific/linux/intel-speed-select { } else null; + ++ intel-vtune-sepdk = callPackage ../os-specific/linux/intel-vtune-sepdk { }; ++ + ipu6-drivers = callPackage ../os-specific/linux/ipu6-drivers {}; + + ivsc-driver = callPackage ../os-specific/linux/ivsc-driver {}; + +From 4a32ac7311f23d4a17f6f294d19e1df5afc4f90d Mon Sep 17 00:00:00 2001 +From: Albert Safin <xzfcpw@gmail.com> +Date: Fri, 26 Apr 2024 20:07:19 +0000 +Subject: [PATCH 4/4] nixos/vtune: init module + +--- + .../manual/release-notes/rl-2505.section.md | 2 + + nixos/modules/module-list.nix | 1 + + nixos/modules/programs/vtune.nix | 74 +++++++++++++++++++ + 3 files changed, 77 insertions(+) + create mode 100644 nixos/modules/programs/vtune.nix + +diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix +index 2367ba3ba7d7ec..eb0224fa18c195 100644 +--- a/nixos/modules/module-list.nix ++++ b/nixos/modules/module-list.nix +@@ -313,6 +313,7 @@ + ./programs/vim.nix + ./programs/virt-manager.nix + ./programs/wavemon.nix ++ ./programs/vtune.nix + ./programs/wayland/cardboard.nix + ./programs/wayland/hyprlock.nix + ./programs/wayland/hyprland.nix +diff --git a/nixos/modules/programs/vtune.nix b/nixos/modules/programs/vtune.nix +new file mode 100644 +index 00000000000000..9ace5cbc338fbc +--- /dev/null ++++ b/nixos/modules/programs/vtune.nix +@@ -0,0 +1,74 @@ ++{ ++ config, ++ lib, ++ pkgs, ++ ... ++}: ++ ++let ++ inherit (lib) ++ mkEnableOption ++ mkIf ++ mkMerge ++ mkOption ++ mkPackageOption ++ types ++ ; ++ ++ cfg = config.programs.vtune; ++in ++{ ++ options.programs.vtune = { ++ enable = mkEnableOption "VTune Profiler"; ++ ++ package = mkPackageOption pkgs "intel-oneapi-vtune" { ++ nullable = true; ++ extraDescription = '' ++ Set to `null` to install only the kernel module. ++ ''; ++ }; ++ ++ modulePackage = mkOption { ++ type = types.nullOr types.package; ++ default = config.boot.kernelPackages.intel-vtune-sepdk.override { ++ intel-oneapi-vtune = config.programs.package or pkgs.intel-oneapi-vtune; ++ }; ++ defaultText = '' ++ config.boot.kernelPackages.intel-vtune-sepdk.override { ++ intel-oneapi-vtune = config.programs.vtune.package or pkgs.intel-oneapi-vtune; ++ } ++ ''; ++ example = "config.boot.kernelPackages.intel-vtune-sepdk"; ++ description = '' ++ The package to use for the VTune Profiler kernel module. ++ Set to `null` to disable the kernel module. ++ An user should be in the `vtune` group to use the module. ++ ''; ++ }; ++ }; ++ ++ config = mkIf cfg.enable (mkMerge [ ++ (mkIf (cfg.package != null) { environment.systemPackages = [ cfg.package ]; }) ++ ++ (mkIf (cfg.modulePackage != null) { ++ boot.extraModulePackages = [ cfg.modulePackage ]; ++ ++ environment.systemPackages = [ cfg.modulePackage ]; ++ ++ users.groups.vtune = { }; ++ ++ systemd.services.vtune-sep5 = { ++ description = "Load VTune SEP5 driver"; ++ wantedBy = [ "multi-user.target" ]; ++ serviceConfig = { ++ Type = "oneshot"; ++ ExecStart = "${cfg.modulePackage}/bin/insmod-sep --load-in-tree-driver"; ++ ExecStop = "${cfg.modulePackage}/bin/rmmod-sep"; ++ RemainAfterExit = true; ++ }; ++ }; ++ }) ++ ]); ++ ++ meta.maintainers = [ lib.maintainers.xzfc ]; ++} + diff --git a/packages/unciv/default.nix b/packages/unciv/default.nix new file mode 100644 index 0000000..7980c59 --- /dev/null +++ b/packages/unciv/default.nix @@ -0,0 +1,76 @@ +{ + stdenv, + lib, + fetchurl, + copyDesktopItems, + makeDesktopItem, + makeWrapper, + jre, + libGL, + libpulseaudio, + libXxf86vm, +}: +stdenv.mkDerivation rec { + pname = "unciv"; + version = "4.17.2"; + + desktopIcon = fetchurl { + url = "https://github.com/yairm210/Unciv/blob/${version}/extraImages/Icons/Unciv%20icon%20v6.png?raw=true"; + hash = "sha256-Zuz+HGfxjGviGBKTiHdIFXF8UMRLEIfM8f+LIB/xonk="; + }; + + src = fetchurl { + url = "https://github.com/yairm210/Unciv/releases/download/${version}/Unciv.jar"; + hash = "sha256-zLH7juFlPkvM6xbVrmsAuIrvoGOXMrZswujbU6u7bms="; + }; + + envLibPath = lib.makeLibraryPath ( + lib.optionals stdenv.hostPlatform.isLinux [ + libGL + libpulseaudio + libXxf86vm + ] + ); + + desktopItem = makeDesktopItem { + name = "unciv"; + exec = "unciv"; + comment = "An open-source Android/Desktop remake of Civ V"; + desktopName = "Unciv"; + icon = "unciv"; + categories = [ "Game" ]; + }; + + dontUnpack = true; + + nativeBuildInputs = [ + copyDesktopItems + makeWrapper + ]; + + installPhase = '' + runHook preInstall + + makeWrapper ${jre}/bin/java $out/bin/unciv \ + --prefix LD_LIBRARY_PATH : "${envLibPath}" \ + --prefix PATH : ${lib.makeBinPath [ jre ]} \ + --add-flags "-jar ${src}" + + install -Dm444 ${desktopIcon} $out/share/icons/hicolor/512x512/apps/unciv.png + + runHook postInstall + ''; + + desktopItems = [ desktopItem ]; + + meta = with lib; { + description = "Open-source Android/Desktop remake of Civ V"; + mainProgram = "unciv"; + homepage = "https://github.com/yairm210/Unciv"; + maintainers = with maintainers; [ tex ]; + sourceProvenance = with sourceTypes; [ binaryBytecode ]; + license = licenses.mpl20; + platforms = platforms.all; + }; +} + diff --git a/packages/vintagestory/default.nix b/packages/vintagestory/default.nix new file mode 100644 index 0000000..364cdc2 --- /dev/null +++ b/packages/vintagestory/default.nix @@ -0,0 +1,113 @@ +{ + lib, + stdenv, + fetchurl, + makeWrapper, + makeDesktopItem, + copyDesktopItems, + xorg, + gtk2, + sqlite, + openal, + cairo, + libGLU, + SDL2, + freealut, + libglvnd, + pipewire, + libpulseaudio, + dotnet-runtime_7 +}: + +stdenv.mkDerivation rec { + name = "vintagestory-${version}"; + version = "1.20.11"; + + src = fetchurl { + url = "https://cdn.vintagestory.at/gamefiles/stable/vs_client_linux-x64_${version}.tar.gz"; + hash = "sha256-IOreg6j/jLhOK8jm2AgSnYQrql5R6QxsshvPs8OUcQA="; + }; + + nativeBuildInputs = [ + makeWrapper + copyDesktopItems + ]; + + buildInputs = [ dotnet-runtime_7 ]; + + runtimeLibs = lib.makeLibraryPath ( + [ + gtk2 + sqlite + openal + cairo + libGLU + SDL2 + freealut + libglvnd + pipewire + libpulseaudio + ] + ++ (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_7}/bin/dotnet $out/bin/vintagestory \ + --prefix LD_LIBRARY_PATH : "${runtimeLibs}" \ + --add-flags $out/share/vintagestory/Vintagestory.dll + makeWrapper ${dotnet-runtime_7}/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 + ''; +} |