summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
l---------config/hypr/hyprland.conf2
-rw-r--r--config/nvim/lua/lsp.lua268
-rw-r--r--config/waybar/style.css35
-rw-r--r--default.nix2
-rw-r--r--flake.lock22
-rw-r--r--flake.nix10
-rw-r--r--hosts/jonbox/default.nix15
-rw-r--r--hosts/jontop/default.nix4
-rw-r--r--modules/desktop/apps/browsers/firefox.nix4
-rw-r--r--modules/desktop/apps/editors/neovim.nix50
-rw-r--r--modules/desktop/apps/editors/vscode.nix2
-rw-r--r--modules/desktop/apps/games/freeciv.nix24
-rw-r--r--modules/desktop/apps/games/openttd.nix28
-rw-r--r--modules/desktop/apps/games/prism.nix2
-rw-r--r--modules/desktop/apps/games/unciv.nix24
-rw-r--r--modules/desktop/apps/games/vintagestory.nix21
-rw-r--r--modules/desktop/apps/mutt-wizard.nix22
-rw-r--r--modules/desktop/apps/vpn.nix23
-rw-r--r--modules/desktop/greetd.nix1
-rw-r--r--modules/desktop/hyprland.nix11
-rw-r--r--modules/hardware/gpu.nix7
-rw-r--r--modules/security.nix8
-rw-r--r--modules/shell/zsh.nix2
-rw-r--r--packages/freeciv/default.nix138
-rw-r--r--packages/freecol/default.nix64
-rw-r--r--packages/intel-vtune.patch514
-rw-r--r--packages/unciv/default.nix76
-rw-r--r--packages/vintagestory/default.nix113
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";
}
diff --git a/flake.lock b/flake.lock
index 7297353..281d344 100644
--- a/flake.lock
+++ b/flake.lock
@@ -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"
}
diff --git a/flake.nix b/flake.nix
index d44036b..6119cf6 100644
--- a/flake.nix
+++ b/flake.nix
@@ -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
+ '';
+}