diff --git a/flake.lock b/flake.lock index e165ab74..798667cf 100644 --- a/flake.lock +++ b/flake.lock @@ -206,7 +206,7 @@ "zen-browser": { "inputs": { "nixpkgs": [ - "nixpkgs" + "nixpkgs-master" ] }, "locked": { diff --git a/flake.nix b/flake.nix index dd6be1aa..4431490e 100644 --- a/flake.nix +++ b/flake.nix @@ -8,6 +8,9 @@ home-manager.url = "github:nix-community/home-manager/release-24.11"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; nixos-hardware.url = "github:NixOS/nixos-hardware/master"; + # helix.url = "github:helix-editor/helix"; + # helix.inputs.nixpkgs.follows = "nixpkgs"; + # software lix-module = { @@ -15,7 +18,7 @@ inputs.nixpkgs.follows = "nixpkgs"; }; zen-browser.url = "github:0xc000022070/zen-browser-flake"; - zen-browser.inputs.nixpkgs.follows = "nixpkgs"; + zen-browser.inputs.nixpkgs.follows = "nixpkgs-master"; kmonad = { url = "git+https://github.com/jokesper/kmonad?dir=nix&ref=feat-tap-overlap"; inputs.nixpkgs.follows = "nixpkgs"; diff --git a/hm-modules/git.nix b/hm-modules/git.nix index 7b88dc12..4cae6702 100644 --- a/hm-modules/git.nix +++ b/hm-modules/git.nix @@ -1,8 +1,6 @@ { - pkgs, config, lib, - inputs, ... }: let @@ -11,7 +9,7 @@ in { options.xyno.git.enable = lib.mkEnableOption "xynos git config"; config = lib.mkIf cfg.enable { - git = { + programs.git = { enable = true; lfs.enable = true; diff --git a/hm-modules/helix.nix b/hm-modules/helix.nix index f4f630c9..599c5497 100644 --- a/hm-modules/helix.nix +++ b/hm-modules/helix.nix @@ -19,11 +19,11 @@ in ## python ruff-lsp # nodePackages_latest.pyright - inputs.roslyn-language-server.packages.${pkgs.system}.roslyn-language-server + # inputs.roslyn-language-server.packages.${pkgs.system}.roslyn-language-server netcoredbg ]; programs.helix = { - package = inputs.helix.packages.${pkgs.system}.default; + # package = inputs.helix.packages.${pkgs.system}.default; enable = true; defaultEditor = true; settings = { diff --git a/hm-modules/module-list.nix b/hm-modules/module-list.nix index c3e1826e..72302b51 100644 --- a/hm-modules/module-list.nix +++ b/hm-modules/module-list.nix @@ -1,7 +1,7 @@ [ ./alacritty.nix ./borgmatic.nix - # ./git.nix + ./git.nix ./helix.nix ./dark-theme.nix ] diff --git a/instances/theseus/configuration.nix b/instances/theseus/configuration.nix index d3303e31..222ae73a 100644 --- a/instances/theseus/configuration.nix +++ b/instances/theseus/configuration.nix @@ -10,9 +10,10 @@ home-manager.users.${config.xyno.system.user.name} = ( { ... }: { + xyno.git.enable = true; home.packages = [ # work - pkgs.unstable.jetbrains.rider - (pkgs.unstable.firefox-devedition.overrideAttrs (super: self: { meta.priority = 1; })) + pkgs.jetbrains.rider + (pkgs.firefox-devedition.overrideAttrs (super: self: { meta.priority = 1; })) ]; services.flatpak.update.auto.enable = true; services.flatpak = { @@ -34,6 +35,8 @@ } ); + services.tailscale.enable = true; + services.tailscale.useRoutingFeatures = "client"; xyno.desktop.common-programs.enable = true; xyno.hardware.kmonad.enable = true; xyno.presets.cli.enable = true; diff --git a/modules/cli/starship.nix b/modules/cli/starship.nix index 3b23e61b..2c24654f 100644 --- a/modules/cli/starship.nix +++ b/modules/cli/starship.nix @@ -13,239 +13,237 @@ in config = lib.mkIf cfg.enable { programs.starship.enable = true; programs.starship.settings = { - enable = true; - settings = { - "add_newline" = false; - # "format" = "($direnv$nix_shell$container$fill$git_metrics\n)$cmd_duration$hostname$localip$shlvl$shell$env_var$jobs$username$directory "; - "format" = "$cmd_duration$status$hostname$localip$shlvl$shell$env_var$jobs$username$directory"; - "right_format" = - "$nix_shell$git_branch$git_commit$git_state$git_status$package$custom$os$battery$time"; - aws.disabled = true; - status.disabled = false; - battery.disabled = true; - "buf" = { - "format" = " [buf](italic) [$symbol $version $buf_version]($style)"; - # "symbol" = "■ "; - }; - "c" = { - "format" = " [$symbol($version(-$name))]($style)"; - # "symbol" = "ℂ "; - }; - "character" = { - "error_symbol" = "[:](italic purple)"; - "format" = "$symbol "; - "success_symbol" = "[:](bold italic bright-yellow)"; - "vimcmd_replace_one_symbol" = "r"; - "vimcmd_replace_symbol" = "R"; - "vimcmd_symbol" = "[>](italic dimmed green)"; - "vimcmd_visual_symbol" = "SEL"; - }; - "cmd_duration" = { - "format" = "[$duration](italic white) "; - }; - "conda" = { - "format" = " conda [$symbol$environment]($style)"; - # "symbol" = "◯ "; - }; - "continuation_prompt" = "[▸▹ ](dimmed white)"; - "dart" = { - "format" = " dart [$symbol($version )]($style)"; - # "symbol" = "◁◅ "; - }; - "deno" = { - "format" = " [deno](italic) [∫ $version](green bold)"; - "version_format" = "\${raw}"; - }; - "directory" = { - "format" = "[$path]($style)[$read_only]($read_only_style)"; - "home_symbol" = "~"; - "read_only" = " (ro) "; - "repo_root_format" = - "[$before_root_path]($before_repo_root_style)[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style)"; - "repo_root_style" = "bold blue"; - "style" = "italic blue"; - "truncation_length" = 50; - "truncation_symbol" = "⋯"; - "use_os_path_sep" = true; - }; - "docker_context" = { - "format" = " docker [$symbol$context]($style)"; - # "symbol" = "◧ "; - }; - direnv = { - disabled = false; - }; - "elixir" = { - "format" = " exs [$symbol $version OTP $otp_version ]($style)"; - # "symbol" = "△ "; - }; - "elm" = { - "format" = " elm [$symbol($version )]($style)"; - # "symbol" = "◩ "; - }; - "env_var" = { - "VIMSHELL" = { - "format" = "[$env_value]($style)"; - "style" = "green italic"; - }; - }; - "fill" = { - "symbol" = " "; - }; - "git_branch" = { - "format" = " [$branch(:$remote_branch)]($style)"; - "ignore_branches" = [ - "main" - "master" - ]; - "only_attached" = true; - "style" = "italic bright-blue"; - "symbol" = "(bold italic bright-blue)"; - # "symbol" = "[△](bold italic bright-blue)"; - "truncation_length" = 13; - "truncation_symbol" = "⋯"; - }; - "git_metrics" = { - "added_style" = "italic dimmed green"; - "deleted_style" = "italic dimmed red"; - "disabled" = false; - "format" = "([▴$added]($added_style))([▿$deleted]($deleted_style))"; - "ignore_submodules" = true; - }; - "git_status" = { - "ahead" = "[▴│[\${count}](bold white)│](italic green)"; - "behind" = "[▿│[\${count}](bold white)│](italic red)"; - "conflicted" = "[◪◦](italic bright-magenta)"; - "deleted" = "[✕](italic red)"; - "diverged" = - "[◇ ▴┤[\${ahead_count}](regular white)│▿┤[\${behind_count}](regular white)│](italic bright-magenta)"; - "format" = - "([⎪$ahead_behind$staged$modified$untracked$renamed$deleted$conflicted$stashed⎥]($style))"; - "modified" = "[●◦](italic yellow)"; - "renamed" = "[◎◦](italic bright-blue)"; - "staged" = "[▪┤[$count](bold white)│](italic bright-cyan)"; - "stashed" = "[◃◈](italic white)"; - "style" = "bold italic bright-blue"; - "untracked" = "[◌◦](italic bright-yellow)"; - }; - "golang" = { - "format" = " go [$symbol($version )]($style)"; - # "symbol" = "∩ "; - }; - "haskell" = { - "format" = " hs [$symbol($version )]($style)"; - # "symbol" = "❯λ "; - }; - "java" = { - "format" = " java [\${symbol}(\${version} )]($style)"; - # "symbol" = "∪ "; - }; - "jobs" = { - "format" = "[$symbol$number]($style) "; - "style" = "white"; - "symbol" = "[▶](blue italic)"; - }; - "julia" = { - "format" = " jl [$symbol($version )]($style)"; - "symbol" = "◎ "; - }; - "localip" = { - "disabled" = false; - "format" = " ◯[$localipv4](bold magenta)"; - "ssh_only" = true; - }; - "lua" = { - "format" = " [lua](italic) [\${symbol}\${version}]($style)"; - "style" = "bold bright-yellow"; - "symbol" = "⨀ "; - "version_format" = "\${raw}"; - }; - "memory_usage" = { - "format" = " mem [\${ram}( \${swap})]($style)"; - "symbol" = "▪▫▪ "; - }; - "nim" = { - "format" = " nim [$symbol($version )]($style)"; - "symbol" = "▴▲▴ "; - }; - "nix_shell" = { - "format" = "[$symbol]($style) [$name](italic dimmed white)"; - "impure_msg" = "[impure](bold dimmed red)"; - "pure_msg" = "[pure](bold dimmed green)"; - "style" = "bold italic dimmed blue"; - "symbol" = "󱄅"; - "unknown_msg" = "[unknown](bold dimmed ellow)"; - }; - "nodejs" = { - "detect_extensions" = [ - ]; - "detect_files" = [ - "package-lock.json" - "yarn.lock" - "pnpm-lock.yaml" - ]; - "detect_folders" = [ - "node_modules" - ]; - "format" = " [node](italic) [($version)](bold bright-green)"; - "version_format" = "\${raw}"; - }; - "package" = { - "format" = " [pkg](italic dimmed) [$symbol$version]($style)"; - "style" = "dimmed yellow italic bold"; - # "symbol" = "◨ "; - "version_format" = "\${raw}"; - }; - "python" = { - "format" = " [py](italic) [\${symbol}\${version}]($style)"; - "style" = "bold bright-yellow"; - # "symbol" = "[⌉](bold bright-blue)⌊ "; - "version_format" = "\${raw}"; - }; - "ruby" = { - disabled = true; - "format" = " [rb](italic) [\${symbol}\${version}]($style)"; - "style" = "bold red"; - # "symbol" = "◆ "; - "version_format" = "\${raw}"; - }; - "rust" = { - "format" = " [rs](italic) [$symbol$version]($style)"; - "style" = "bold red"; - # "symbol" = "⊃ "; - "version_format" = "\${raw}"; - }; - "spack" = { - "format" = " spack [$symbol$environment]($style)"; - # "symbol" = "◇ "; - }; - "sudo" = { - "disabled" = true; - "format" = "[$symbol]($style)"; - "style" = "bold italic bright-purple"; - "symbol" = "sudo"; - }; - "swift" = { - "format" = " [sw](italic) [\${symbol}\${version}]($style)"; - "style" = "bold bright-red"; - # "symbol" = "◁ "; - "version_format" = "\${raw}"; - }; - "time" = { - "disabled" = true; - "format" = "[ $time]($style)"; - "style" = "italic dimmed white"; - "time_format" = "%R"; - "utc_time_offset" = "local"; - }; - "username" = { - "disabled" = false; - "format" = "[$user]($style) "; - "show_always" = false; - "style_root" = "purple bold italic"; - "style_user" = "bright-yellow bold italic"; + # enable = true; + "add_newline" = false; + # "format" = "($direnv$nix_shell$container$fill$git_metrics\n)$cmd_duration$hostname$localip$shlvl$shell$env_var$jobs$username$directory "; + "format" = "$cmd_duration$status$hostname$localip$shlvl$shell$env_var$jobs$username$directory "; + "right_format" = + "$nix_shell$git_branch$git_commit$git_state$git_status$package$custom$os$battery$time"; + aws.disabled = true; + status.disabled = false; + battery.disabled = true; + "buf" = { + "format" = " [buf](italic) [$symbol $version $buf_version]($style)"; + # "symbol" = "■ "; + }; + "c" = { + "format" = " [$symbol($version(-$name))]($style)"; + # "symbol" = "ℂ "; + }; + "character" = { + "error_symbol" = "[:](italic purple)"; + "format" = "$symbol "; + "success_symbol" = "[:](bold italic bright-yellow)"; + "vimcmd_replace_one_symbol" = "r"; + "vimcmd_replace_symbol" = "R"; + "vimcmd_symbol" = "[>](italic dimmed green)"; + "vimcmd_visual_symbol" = "SEL"; + }; + "cmd_duration" = { + "format" = "[$duration](italic white) "; + }; + "conda" = { + "format" = " conda [$symbol$environment]($style)"; + # "symbol" = "◯ "; + }; + "continuation_prompt" = "[▸▹ ](dimmed white)"; + "dart" = { + "format" = " dart [$symbol($version )]($style)"; + # "symbol" = "◁◅ "; + }; + "deno" = { + "format" = " [deno](italic) [∫ $version](green bold)"; + "version_format" = "\${raw}"; + }; + "directory" = { + "format" = "[$path]($style)[$read_only]($read_only_style)"; + "home_symbol" = "~"; + "read_only" = " (ro) "; + "repo_root_format" = + "[$before_root_path]($before_repo_root_style)[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style)"; + "repo_root_style" = "bold blue"; + "style" = "italic blue"; + "truncation_length" = 50; + "truncation_symbol" = "⋯"; + "use_os_path_sep" = true; + }; + "docker_context" = { + "format" = " docker [$symbol$context]($style)"; + # "symbol" = "◧ "; + }; + direnv = { + disabled = false; + }; + "elixir" = { + "format" = " exs [$symbol $version OTP $otp_version ]($style)"; + # "symbol" = "△ "; + }; + "elm" = { + "format" = " elm [$symbol($version )]($style)"; + # "symbol" = "◩ "; + }; + "env_var" = { + "VIMSHELL" = { + "format" = "[$env_value]($style)"; + "style" = "green italic"; }; }; + "fill" = { + "symbol" = " "; + }; + "git_branch" = { + "format" = " [$branch(:$remote_branch)]($style)"; + "ignore_branches" = [ + "main" + "master" + ]; + "only_attached" = true; + "style" = "italic bright-blue"; + "symbol" = "(bold italic bright-blue)"; + # "symbol" = "[△](bold italic bright-blue)"; + "truncation_length" = 13; + "truncation_symbol" = "⋯"; + }; + "git_metrics" = { + "added_style" = "italic dimmed green"; + "deleted_style" = "italic dimmed red"; + "disabled" = false; + "format" = "([▴$added]($added_style))([▿$deleted]($deleted_style))"; + "ignore_submodules" = true; + }; + "git_status" = { + "ahead" = "[▴│[\${count}](bold white)│](italic green)"; + "behind" = "[▿│[\${count}](bold white)│](italic red)"; + "conflicted" = "[◪◦](italic bright-magenta)"; + "deleted" = "[✕](italic red)"; + "diverged" = + "[◇ ▴┤[\${ahead_count}](regular white)│▿┤[\${behind_count}](regular white)│](italic bright-magenta)"; + "format" = + "([⎪$ahead_behind$staged$modified$untracked$renamed$deleted$conflicted$stashed⎥]($style))"; + "modified" = "[●◦](italic yellow)"; + "renamed" = "[◎◦](italic bright-blue)"; + "staged" = "[▪┤[$count](bold white)│](italic bright-cyan)"; + "stashed" = "[◃◈](italic white)"; + "style" = "bold italic bright-blue"; + "untracked" = "[◌◦](italic bright-yellow)"; + }; + "golang" = { + "format" = " go [$symbol($version )]($style)"; + # "symbol" = "∩ "; + }; + "haskell" = { + "format" = " hs [$symbol($version )]($style)"; + # "symbol" = "❯λ "; + }; + "java" = { + "format" = " java [\${symbol}(\${version} )]($style)"; + # "symbol" = "∪ "; + }; + "jobs" = { + "format" = "[$symbol$number]($style) "; + "style" = "white"; + "symbol" = "[▶](blue italic)"; + }; + "julia" = { + "format" = " jl [$symbol($version )]($style)"; + "symbol" = "◎ "; + }; + "localip" = { + "disabled" = false; + "format" = " ◯[$localipv4](bold magenta)"; + "ssh_only" = true; + }; + "lua" = { + "format" = " [lua](italic) [\${symbol}\${version}]($style)"; + "style" = "bold bright-yellow"; + "symbol" = "⨀ "; + "version_format" = "\${raw}"; + }; + "memory_usage" = { + "format" = " mem [\${ram}( \${swap})]($style)"; + "symbol" = "▪▫▪ "; + }; + "nim" = { + "format" = " nim [$symbol($version )]($style)"; + "symbol" = "▴▲▴ "; + }; + "nix_shell" = { + "format" = "[$symbol]($style) [$name](italic dimmed white)"; + "impure_msg" = "[impure](bold dimmed red)"; + "pure_msg" = "[pure](bold dimmed green)"; + "style" = "bold italic dimmed blue"; + "symbol" = "󱄅"; + "unknown_msg" = "[unknown](bold dimmed ellow)"; + }; + "nodejs" = { + "detect_extensions" = [ + ]; + "detect_files" = [ + "package-lock.json" + "yarn.lock" + "pnpm-lock.yaml" + ]; + "detect_folders" = [ + "node_modules" + ]; + "format" = " [node](italic) [($version)](bold bright-green)"; + "version_format" = "\${raw}"; + }; + "package" = { + "format" = " [pkg](italic dimmed) [$symbol$version]($style)"; + "style" = "dimmed yellow italic bold"; + # "symbol" = "◨ "; + "version_format" = "\${raw}"; + }; + "python" = { + "format" = " [py](italic) [\${symbol}\${version}]($style)"; + "style" = "bold bright-yellow"; + # "symbol" = "[⌉](bold bright-blue)⌊ "; + "version_format" = "\${raw}"; + }; + "ruby" = { + disabled = true; + "format" = " [rb](italic) [\${symbol}\${version}]($style)"; + "style" = "bold red"; + # "symbol" = "◆ "; + "version_format" = "\${raw}"; + }; + "rust" = { + "format" = " [rs](italic) [$symbol$version]($style)"; + "style" = "bold red"; + # "symbol" = "⊃ "; + "version_format" = "\${raw}"; + }; + "spack" = { + "format" = " spack [$symbol$environment]($style)"; + # "symbol" = "◇ "; + }; + "sudo" = { + "disabled" = true; + "format" = "[$symbol]($style)"; + "style" = "bold italic bright-purple"; + "symbol" = "sudo"; + }; + "swift" = { + "format" = " [sw](italic) [\${symbol}\${version}]($style)"; + "style" = "bold bright-red"; + # "symbol" = "◁ "; + "version_format" = "\${raw}"; + }; + "time" = { + "disabled" = true; + "format" = "[ $time]($style)"; + "style" = "italic dimmed white"; + "time_format" = "%R"; + "utc_time_offset" = "local"; + }; + "username" = { + "disabled" = false; + "format" = "[$user]($style) "; + "show_always" = false; + "style_root" = "purple bold italic"; + "style_user" = "bright-yellow bold italic"; + }; }; }; diff --git a/modules/desktop/common-programs.nix b/modules/desktop/common-programs.nix index 8bb5b595..aa8cc903 100644 --- a/modules/desktop/common-programs.nix +++ b/modules/desktop/common-programs.nix @@ -2,6 +2,7 @@ pkgs, config, lib, + inputs, ... }: let @@ -25,7 +26,6 @@ in services.gnome.evolution-data-server.enable = true; services.flatpak.enable = true; programs.fuse.userAllowOther = true; - programs.sway.enable = true; programs.nix-ld.enable = true; programs.gamescope.enable = true; programs.wireshark.enable = true; @@ -34,7 +34,7 @@ in environment.systemPackages = with pkgs; [ element-desktop # this is not a place of honor discord # shitcord - unstable.signal-desktop + signal-desktop obsidian diebahn vlc diff --git a/modules/desktop/niri.nix b/modules/desktop/niri.nix index 5c7ca0c8..bcae8e45 100644 --- a/modules/desktop/niri.nix +++ b/modules/desktop/niri.nix @@ -28,19 +28,295 @@ in xyno.desktop = { waybar.enable = lib.mkDefault true; mako.enable = lib.mkDefault true; + shikane.enable = lib.mkDefault true; + swayidle.enable = lib.mkDefault true; + wpaperd.enable = lib.mkDefault true; }; - home-manager.users.${config.xyno.system.user.name} = lib.mkIf config.xyno.presets.home-manager.enable ({...}: { - xyno.dark-theme.enable = true; - }); + home-manager.users.${config.xyno.system.user.name} = + lib.mkIf config.xyno.presets.home-manager.enable + ( + { ... }: + { + xyno.dark-theme.enable = true; + } + ); # xdg.portal = { # enable = true; # wlr.enable = true; # }; programs.niri.enable = true; + environment.systemPackages = with pkgs; [ + fuzzel + libnotify + ]; + environment.etc."xdg/fuzzel/fuzzel.ini".text = '' + font=JetBrains Mono Nerd Font:size=10 + dpi-aware=yes + # prompt=> + icon-theme=hicolor + icons-enabled=yes + fuzzy=yes + width=80 + horizontal-pad=10 + vertical-pad=10 + inner-pad=10 + line-height=18 + [colors] + background=000000AA + text=efefefef + match=fabd2fff + selection-match=fabd2fff + selection=666666ff + selection-text=efefefef + border=33eeffee + [border] + width=2 + radius=3 + ''; environment.etc."niri/config.kdl".text = '' // xwayland spawn-at-startup "${pkgs.xwayland-satellite}/bin/xwayland-satellite" + environment { + DISPLAY ":0" + } + // keybinds + binds { + Mod+D { spawn "fuzzel"; } + Mod+T { spawn "alacritty"; } + XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; } + XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; } + XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; } + XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; } + + Mod+Q { close-window; } + + Mod+Left { focus-column-left; } + Mod+Down { focus-window-down; } + Mod+Up { focus-window-up; } + Mod+Right { focus-column-right; } + Mod+H { focus-column-left; } + Mod+J { focus-window-down; } + Mod+K { focus-window-up; } + Mod+L { focus-column-right; } + + Mod+Ctrl+Left { move-column-left; } + Mod+Ctrl+Down { move-window-down; } + Mod+Ctrl+Up { move-window-up; } + Mod+Ctrl+Right { move-column-right; } + Mod+Ctrl+H { move-column-left; } + Mod+Ctrl+J { move-window-down; } + Mod+Ctrl+K { move-window-up; } + Mod+Ctrl+L { move-column-right; } + + Mod+Home { focus-column-first; } + Mod+End { focus-column-last; } + Mod+Ctrl+Home { move-column-to-first; } + Mod+Ctrl+End { move-column-to-last; } + + Mod+Shift+Left { focus-monitor-left; } + Mod+Shift+Down { focus-monitor-down; } + Mod+Shift+Up { focus-monitor-up; } + Mod+Shift+Right { focus-monitor-right; } + Mod+Shift+H { focus-monitor-left; } + Mod+Shift+J { focus-monitor-down; } + Mod+Shift+K { focus-monitor-up; } + Mod+Shift+L { focus-monitor-right; } + + Mod+Shift+Ctrl+Left { move-column-to-monitor-left; } + Mod+Shift+Ctrl+Down { move-column-to-monitor-down; } + Mod+Shift+Ctrl+Up { move-column-to-monitor-up; } + Mod+Shift+Ctrl+Right { move-column-to-monitor-right; } + Mod+Shift+Ctrl+H { move-column-to-monitor-left; } + Mod+Shift+Ctrl+J { move-column-to-monitor-down; } + Mod+Shift+Ctrl+K { move-column-to-monitor-up; } + Mod+Shift+Ctrl+L { move-column-to-monitor-right; } + // Alternatively, there are commands to move just a single window: + // Mod+Shift+Ctrl+Left { move-window-to-monitor-left; } + // ... + + // And you can also move a whole workspace to another monitor: + // Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; } + // ... + + Mod+Page_Down { focus-workspace-down; } + Mod+Page_Up { focus-workspace-up; } + Mod+U { focus-workspace-down; } + Mod+I { focus-workspace-up; } + Mod+Ctrl+Page_Down { move-column-to-workspace-down; } + Mod+Ctrl+Page_Up { move-column-to-workspace-up; } + Mod+Ctrl+U { move-column-to-workspace-down; } + Mod+Ctrl+I { move-column-to-workspace-up; } + + // Alternatively, there are commands to move just a single window: + // Mod+Ctrl+Page_Down { move-window-to-workspace-down; } + // ... + + Mod+Shift+Page_Down { move-workspace-down; } + Mod+Shift+Page_Up { move-workspace-up; } + Mod+Shift+U { move-workspace-down; } + Mod+Shift+I { move-workspace-up; } + + // You can bind mouse wheel scroll ticks using the following syntax. + // These binds will change direction based on the natural-scroll setting. + // + // To avoid scrolling through workspaces really fast, you can use + // the cooldown-ms property. The bind will be rate-limited to this value. + // You can set a cooldown on any bind, but it's most useful for the wheel. + Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; } + Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; } + Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; } + Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; } + + Mod+WheelScrollRight { focus-column-right; } + Mod+WheelScrollLeft { focus-column-left; } + Mod+Ctrl+WheelScrollRight { move-column-right; } + Mod+Ctrl+WheelScrollLeft { move-column-left; } + + // Usually scrolling up and down with Shift in applications results in + // horizontal scrolling; these binds replicate that. + Mod+Shift+WheelScrollDown { focus-column-right; } + Mod+Shift+WheelScrollUp { focus-column-left; } + Mod+Ctrl+Shift+WheelScrollDown { move-column-right; } + Mod+Ctrl+Shift+WheelScrollUp { move-column-left; } + + // Similarly, you can bind touchpad scroll "ticks". + // Touchpad scrolling is continuous, so for these binds it is split into + // discrete intervals. + // These binds are also affected by touchpad's natural-scroll, so these + // example binds are "inverted", since we have natural-scroll enabled for + // touchpads by default. + // Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; } + // Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; } + + // You can refer to workspaces by index. However, keep in mind that + // niri is a dynamic workspace system, so these commands are kind of + // "best effort". Trying to refer to a workspace index bigger than + // the current workspace count will instead refer to the bottommost + // (empty) workspace. + // + // For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on + // will all refer to the 3rd workspace. + Mod+1 { focus-workspace 1; } + Mod+2 { focus-workspace 2; } + Mod+3 { focus-workspace 3; } + Mod+4 { focus-workspace 4; } + Mod+5 { focus-workspace 5; } + Mod+6 { focus-workspace 6; } + Mod+7 { focus-workspace 7; } + Mod+8 { focus-workspace 8; } + Mod+9 { focus-workspace 9; } + Mod+Ctrl+1 { move-column-to-workspace 1; } + Mod+Ctrl+2 { move-column-to-workspace 2; } + Mod+Ctrl+3 { move-column-to-workspace 3; } + Mod+Ctrl+4 { move-column-to-workspace 4; } + Mod+Ctrl+5 { move-column-to-workspace 5; } + Mod+Ctrl+6 { move-column-to-workspace 6; } + Mod+Ctrl+7 { move-column-to-workspace 7; } + Mod+Ctrl+8 { move-column-to-workspace 8; } + Mod+Ctrl+9 { move-column-to-workspace 9; } + + // Alternatively, there are commands to move just a single window: + // Mod+Ctrl+1 { move-window-to-workspace 1; } + + // Switches focus between the current and the previous workspace. + // Mod+Tab { focus-workspace-previous; } + + // The following binds move the focused window in and out of a column. + // If the window is alone, they will consume it into the nearby column to the side. + // If the window is already in a column, they will expel it out. + Mod+BracketLeft { consume-or-expel-window-left; } + Mod+BracketRight { consume-or-expel-window-right; } + + // Consume one window from the right to the bottom of the focused column. + Mod+Comma { consume-window-into-column; } + // Expel the bottom window from the focused column to the right. + Mod+Period { expel-window-from-column; } + + Mod+R { switch-preset-column-width; } + Mod+Shift+R { switch-preset-window-height; } + Mod+Ctrl+R { reset-window-height; } + Mod+F { maximize-column; } + Mod+Shift+F { fullscreen-window; } + + // Expand the focused column to space not taken up by other fully visible columns. + // Makes the column "fill the rest of the space". + Mod+Ctrl+F { expand-column-to-available-width; } + + Mod+C { center-column; } + + // Finer width adjustments. + // This command can also: + // * set width in pixels: "1000" + // * adjust width in pixels: "-5" or "+5" + // * set width as a percentage of screen width: "25%" + // * adjust width as a percentage of screen width: "-10%" or "+10%" + // Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0, + // set-column-width "100" will make the column occupy 200 physical screen pixels. + Mod+Minus { set-column-width "-10%"; } + Mod+Equal { set-column-width "+10%"; } + + // Finer height adjustments when in column with other windows. + Mod+Shift+Minus { set-window-height "-10%"; } + Mod+Shift+Equal { set-window-height "+10%"; } + + // Move the focused window between the floating and the tiling layout. + Mod+V { toggle-window-floating; } + Mod+Shift+V { switch-focus-between-floating-and-tiling; } + + // Toggle tabbed column display mode. + // Windows in this column will appear as vertical tabs, + // rather than stacked on top of each other. + Mod+W { toggle-column-tabbed-display; } + + // Actions to switch layouts. + // Note: if you uncomment these, make sure you do NOT have + // a matching layout switch hotkey configured in xkb options above. + // Having both at once on the same hotkey will break the switching, + // since it will switch twice upon pressing the hotkey (once by xkb, once by niri). + // Mod+Space { switch-layout "next"; } + // Mod+Shift+Space { switch-layout "prev"; } + + Mod+Alt+4 { screenshot; } + Mod+Alt+3 { screenshot-screen; } + Mod+Alt+2 { screenshot-window; } + Print { screenshot; } + Ctrl+Print { screenshot-screen; } + Alt+Print { screenshot-window; } + + // Applications such as remote-desktop clients and software KVM switches may + // request that niri stops processing the keyboard shortcuts defined here + // so they may, for example, forward the key presses as-is to a remote machine. + // It's a good idea to bind an escape hatch to toggle the inhibitor, + // so a buggy application can't hold your session hostage. + // + // The allow-inhibiting=false property can be applied to other binds as well, + // which ensures niri always processes them, even when an inhibitor is active. + Mod+Escape allow-inhibiting=false { toggle-keyboard-shortcuts-inhibit; } + + // The quit action will show a confirmation dialog to avoid accidental exits. + Mod+Shift+E { quit; } + Ctrl+Alt+Delete { quit; } + + // Powers off the monitors. To turn them back on, do any input like + // moving the mouse or pressing any other key. + Mod+Shift+P { power-off-monitors; } + Super+Backslash { focus-workspace "scratchpad"; } + } + layout { + gaps 4 + shadow { + on + } + tab-indicator { + hide-when-single-tab + position "top" + } + } + prefer-no-csd + // scratchpad + workspace "scratchpad" + screenshot-path "~/Pictures/screenshots/screenshot-%Y-%m-%d %H-%M-%S.png" // Indicate screencasted windows with red colors. @@ -67,9 +343,10 @@ in } // Block out password managers from screencasts. window-rule { - match app-id=r#"^org\.keepassxc\.KeePassXC$"# - match app-id=r#"^org\.gnome\.World\.Secrets$"# + match app-id="KeePassXC" + open-floating true + open-on-workspace "scratchpad" block-out-from "screencast" } // Block out mako notifications from screencasts. @@ -78,11 +355,21 @@ in block-out-from "screencast" } + // Open the Firefox picture-in-picture player as floating by default. + window-rule { + // This app-id regular expression will work for both: + // - host Firefox (app-id is "firefox") + // - Flatpak Firefox (app-id is "org.mozilla.firefox") + match app-id=r#"firefox$"# title="^Picture-in-Picture$" + open-floating true + } + input { workspace-auto-back-and-forth - focus-follows-mouse max-scroll-amount="10%" + focus-follows-mouse touchpad { tap + natural-scroll } } // autogenerated from here on diff --git a/modules/desktop/shikane.nix b/modules/desktop/shikane.nix new file mode 100644 index 00000000..7f732658 --- /dev/null +++ b/modules/desktop/shikane.nix @@ -0,0 +1,31 @@ +{ + pkgs, + config, + lib, + ... +}: +let + cfg = config.xyno.desktop.shikane; +in +{ + options.xyno.desktop.shikane.enable = lib.mkEnableOption "enable shikane screen size manager thing"; + options.xyno.desktop.shikane.wantedBy = lib.mkOption { + type = lib.types.str; + default = "niri.service"; + }; + options.xyno.desktop.shikane.package = lib.mkOption { + type = lib.types.package; + default = pkgs.shikane; + }; + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + systemd.user.services.shikane = { + unitConfig.PartOf = "graphical-session.target"; + unitConfig.After = "graphical-session.target"; + unitConfig.Requisite = "graphical-session.target"; + serviceConfig.Restart = "on-failure"; + wantedBy = [ cfg.wantedBy ]; + script = "${cfg.package}/bin/shikane"; + }; + }; +} diff --git a/modules/desktop/swayidle.nix b/modules/desktop/swayidle.nix index d24b9dfa..41ae6f64 100644 --- a/modules/desktop/swayidle.nix +++ b/modules/desktop/swayidle.nix @@ -6,13 +6,6 @@ }: let cfg = config.xyno.desktop.swayidle; - makoConf = pkgs.writeText "mako.conf" '' - font=Source Sans Pro Nerd Font 11 - background-color=#1d2021ff - border-color=#3c3836FF - text-color=#ebdbb2ff - progress-color=over #928374FF - ''; in { options.xyno.desktop.swayidle.enable = lib.mkEnableOption "enable swayidle and swaylock and stuff"; @@ -30,19 +23,18 @@ in }; options.xyno.desktop.swayidle.swaylockArgs = lib.mkOption { type = lib.types.str; - default = "--fade-in 2 --clock --timestr %T%z --datestr %F"; + default = "-f --fade-in 2 --clock --timestr %T%z --datestr %F -i /home/${config.xyno.system.user.name}/Pictures/background.jpg"; }; config = lib.mkIf cfg.enable { environment.systemPackages = with cfg; [ package swaylockPackage ]; - systemd.user.services.mako = { + systemd.user.services.swayidle = { unitConfig.PartOf = "graphical-session.target"; unitConfig.After = "graphical-session.target"; unitConfig.Requisite = "graphical-session.target"; serviceConfig.Restart = "on-failure"; wantedBy = [ cfg.wantedBy ]; - script = "${cfg.package}/bin/mako -c ${makoConf}"; - restartTrigers = makoConf; + script = "${cfg.package}/bin/swayidle -w timeout 310 'niri msg action power-off-monitors' timeout 300 '${cfg.swaylockPackage}/bin/swaylock ${cfg.swaylockArgs}' before-sleep '${cfg.swaylockPackage}/bin/swaylock ${cfg.swaylockArgs}'"; }; }; } diff --git a/modules/desktop/waybar.nix b/modules/desktop/waybar.nix index d0c863fd..c3d6883c 100644 --- a/modules/desktop/waybar.nix +++ b/modules/desktop/waybar.nix @@ -23,27 +23,32 @@ in }; config = lib.mkIf cfg.enable { programs.waybar.enable = true; + programs.waybar.package = cfg.package; programs.light.enable = true; systemd.user.services.waybar.wantedBy = lib.mkForce [ cfg.wantedBy ]; - environment.etc."xdg/waybar/config".text = builtins.toJSON { - mainBar = { + systemd.user.services.waybar.restartTriggers = [ "/etc/xdg/waybar/config" "/etc/xdg/waybar/style.css" ]; + environment.etc."xdg/waybar/config".source = + let + json = pkgs.formats.json { }; + in + + (json.generate "waybar-config.json" { layer = "top"; position = "top"; height = 15; - modules-left = - (lib.optional (cfg.mode == "river") [ + modules-left = (lib.optionals (cfg.mode == "river") [ "river/tags" "river/layout" "river/window" ]) - ++ (lib.optional (cfg.mode == "niri") [ + ++ (lib.optionals (cfg.mode == "niri") [ "niri/workspaces" "niri/window" ]); modules-right = [ "tray" - "power-profiles-daemon" + "power_profiles_daemon" "idle_inhibitor" "wireplumber" "battery" @@ -52,13 +57,15 @@ in "temperature" "memory" "disk" - "custom/tailscale" "network" "clock" ]; "river/window" = { max-length = 40; }; + "niri/window" = { + max-length = 40; + }; wireplumber = { "format" = "{icon} {volume}%"; "format-muted" = " MUTE"; @@ -162,8 +169,7 @@ in "tooltip-format-disconnected" = "Disconnected"; "max-length" = 50; }; - }; - }; + }); environment.etc."xdg/waybar/style.css".text = '' * { /* `otf-font-awesome` is required to be installed for icons */ @@ -202,7 +208,7 @@ in border: none; }*/ - #tags button { + #workspaces button { padding: 0 2px; background-color: #1d2021; color: #ebdbb2; @@ -214,24 +220,24 @@ in } /* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ - #tags button:hover { + #workspaces button:hover { background: rgba(0, 0, 0, 0.2); /* box-shadow: inset 0 -3px #fbf1c7; */ background-color: #3c3836; } - #tags button.focused { + #workspaces button.focused { /* box-shadow: inset 0 -3px #fbf1c7; */ background-color: #3c3836; color: #ebdbb2; } - #tags button.occupied { + #workspaces button.occupied { color: #d3869b; } - #tags button.urgent { + #workspaces button.urgent { background-color: #cc241d; color: #ebdbb2; } diff --git a/modules/desktop/wpaperd.nix b/modules/desktop/wpaperd.nix new file mode 100644 index 00000000..3d717e41 --- /dev/null +++ b/modules/desktop/wpaperd.nix @@ -0,0 +1,38 @@ +{ + pkgs, + config, + lib, + ... +}: +let + cfg = config.xyno.desktop.wpaperd; + wpaperdConf = pkgs.writeText "wpaperd.conf" '' + [default] + path = "/home/${config.xyno.system.user.name}/Pictures/backgrounds" + duration = "10m" + sorting = "random" + mode = "center" + ''; +in +{ + options.xyno.desktop.wpaperd.enable = lib.mkEnableOption "enable wpaperd notification daemon"; + options.xyno.desktop.wpaperd.wantedBy = lib.mkOption { + type = lib.types.str; + default = "niri.service"; + }; + options.xyno.desktop.wpaperd.package = lib.mkOption { + type = lib.types.package; + default = pkgs.wpaperd; + }; + config = lib.mkIf cfg.enable { + systemd.user.services.wpaperd = { + unitConfig.PartOf = "graphical-session.target"; + unitConfig.After = "graphical-session.target"; + unitConfig.Requisite = "graphical-session.target"; + serviceConfig.Restart = "on-failure"; + wantedBy = [ cfg.wantedBy ]; + script = "${cfg.package}/bin/wpaperd -c ${wpaperdConf}"; + restartTriggers = [wpaperdConf]; + }; + }; +} diff --git a/modules/module-list.nix b/modules/module-list.nix index d6ac3160..ae3674cc 100644 --- a/modules/module-list.nix +++ b/modules/module-list.nix @@ -5,7 +5,10 @@ ./desktop/common-programs.nix ./desktop/mako.nix ./desktop/niri.nix + ./desktop/shikane.nix + ./desktop/swayidle.nix ./desktop/waybar.nix + ./desktop/wpaperd.nix ./hardware/kmonad.nix ./networking/networkd.nix ./presets/cli.nix diff --git a/modules/presets/cli.nix b/modules/presets/cli.nix index 346a5737..4670f2cc 100644 --- a/modules/presets/cli.nix +++ b/modules/presets/cli.nix @@ -14,6 +14,24 @@ in xyno.cli.fish.enable = true; xyno.cli.starship.enable = true; security.sudo.enable = false; + + nix.settings = { + trusted-users = lib.mkDefault [ "root" "@wheel" ]; + allowed-users = lib.mkDefault [ "root" "@wheel" ]; + auto-optimise-store = true; + + + }; + nix.extraOptions = "experimental-features = nix-command flakes"; + programs.direnv = { + enable = true; + nix-direnv.enable = true; + enableFishIntegration = true; + }; + +# https://github.com/NixOS/nixpkgs/issues/361592 needed for run0 +security.pam.services.systemd-run0 = {}; + environment.systemPackages = with pkgs; [ jq bottom diff --git a/modules/presets/home-manager.nix b/modules/presets/home-manager.nix index f12ae723..96dde1b3 100644 --- a/modules/presets/home-manager.nix +++ b/modules/presets/home-manager.nix @@ -12,6 +12,7 @@ in lib.mkEnableOption "enables home manager on the default user"; config = lib.mkIf cfg.enable { home-manager.useGlobalPkgs = true; + home-manager.extraSpecialArgs = { inherit inputs;}; home-manager.sharedModules = (import ../../hm-modules/module-list.nix) ++ [ inputs.nix-flatpak.homeManagerModules.nix-flatpak ];