diff --git a/home/home-default.nix b/home/home-default.nix new file mode 100644 index 0000000..38d6e35 --- /dev/null +++ b/home/home-default.nix @@ -0,0 +1,212 @@ +{ config, pkgs, lib, ... }: + +with import {}; +let + nextcloudTalkDesktop = pkgs.callPackage ./modules/applications/nextcloud-talk-desktop/package.nix {}; +in +{ + # Home Manager needs a bit of information about you and the paths it should + # manage. + home.username = "johno"; + home.homeDirectory = "/home/johno"; + + # This value determines the Home Manager release that your configuration is + # compatible with. This helps avoid breakage when a new Home Manager release + # introduces backwards incompatible changes. + # + # You should not change this value, even if you update Home Manager. If you do + # want to update the value, then make sure to first check the Home Manager + # release notes. + home.stateVersion = "24.05"; # Please read the comment before changing. + + # The home.packages option allows you to install Nix packages into your + # environment. + home.packages = [ + # # Adds the 'hello' command to your environment. It prints a friendly + # # "Hello, world!" when run. + # pkgs.hello + + # # It is sometimes useful to fine-tune packages, for example, by applying + # # overrides. You can do that directly here, just don't forget the + # # parentheses. Maybe you want to install Nerd Fonts with a limited number of + # # fonts? + # (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; }) + + # # You can also create simple shell scripts directly inside your + # # configuration. For example, this adds a command 'my-hello' to your + # # environment: + # (pkgs.writeShellScriptBin "my-hello" '' + # echo "Hello, ${config.home.username}!" + # '') + + pkgs.bitwarden + pkgs.dunst + pkgs.element-desktop + pkgs.fd + pkgs.fluffychat + pkgs.gzip + pkgs.htop + pkgs.jellyfin-media-player + pkgs.keepassxc + pkgs.killall + pkgs.kitty + pkgs.less + pkgs.moonlight-qt + pkgs.ncdu + pkgs.pandoc + pkgs.pinentry-qt + #pkgs.pytest + pkgs.shellcheck + pkgs.solaar # Logitech management software + pkgs.tmux + pkgs.waybar + pkgs.wofi + pkgs.vlc + + nextcloudTalkDesktop + ]; + + # Home Manager is pretty good at managing dotfiles. The primary way to manage + # plain files is through 'home.file'. + home.file = { + # # Building this configuration will create a copy of 'dotfiles/screenrc' in + # # the Nix store. Activating the configuration will then make '~/.screenrc' a + # # symlink to the Nix store copy. + # ".screenrc".source = dotfiles/screenrc; + + # # You can also set the file content immediately. + # ".gradle/gradle.properties".text = '' + # org.gradle.console=verbose + # org.gradle.daemon.idletimeout=3600000 + # ''; + + }; + + # Home Manager can also manage your environment variables through + # 'home.sessionVariables'. These will be explicitly sourced when using a + # shell provided by Home Manager. If you don't want to manage your shell + # through Home Manager then you have to manually source 'hm-session-vars.sh' + # located at either + # + # ~/.nix-profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh + # + # or + # + # /etc/profiles/per-user/johno/etc/profile.d/hm-session-vars.sh + # + home.sessionVariables = { + }; + + home.sessionPath = [ + ]; + + nixpkgs.config.allowUnfree = true; + + imports = [ + ./modules/applications/emacs/default.nix + ./modules/games/lutris/default.nix + ./modules/window_managers/hyprland/default.nix + ./modules/window_managers/i3/default.nix + ]; + + programs.bash.enable = true; + + nix = { + gc = { + automatic = true; + }; + }; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; + + programs.command-not-found.enable = true; + + programs.firefox = { + enable = true; + }; + + programs.git = { + enable = true; + userName = "John Ogle"; + userEmail = "john@ogle.fyi"; + extraConfig = { + safe.directory = "/etc/nixos"; + }; + }; + + programs.gpg.enable = true; + + services.gpg-agent = { + enable = true; + enableSshSupport = true; + defaultCacheTtl = 1800; + pinentryPackage = pkgs.pinentry-qt; + }; + + programs.jq.enable = true; + + programs.k9s.enable = true; + + programs.neovim = { + enable = true; + viAlias = true; + vimAlias = true; + }; + + programs.rbw = { + enable = true; + settings = { + email = "john@johnogle.info"; + base_url = "https://bitwarden.johnogle.info"; + pinentry = pkgs.pinentry-qt; + }; + }; + + programs.spotify-player.enable = true; + + programs.ssh = { + enable = true; + addKeysToAgent = "yes"; + matchBlocks = { + "nucdeb1" = { + hostname = "nucdeb1.oglehome"; + user = "root"; + }; + }; + }; + + services.home-manager.autoUpgrade = { + enable = true; + frequency = "weekly"; + }; + + services.kdeconnect = { + enable = true; + indicator = true; + package = pkgs.kdePackages.kdeconnect-kde; + }; + + services.spotifyd = { + enable = true; + settings = { + global = { + username = "johnogle222"; + }; + }; + }; + + services.syncthing = { + enable = true; + tray = { + enable = true; + command = "syncthingtray --wait"; + }; + }; + + xdg.enable = true; +} diff --git a/home/home-nix-book.nix b/home/home-nix-book.nix new file mode 100644 index 0000000..1026ef3 --- /dev/null +++ b/home/home-nix-book.nix @@ -0,0 +1,8 @@ +{ config, lib, pkgs, ... }: + +{ + imports = [ + ./home-default.nix + ./modules/window_managers/hyprland/nix-book.nix + ]; +} diff --git a/home/home-z790prors.nix b/home/home-z790prors.nix new file mode 100644 index 0000000..0081782 --- /dev/null +++ b/home/home-z790prors.nix @@ -0,0 +1,8 @@ +{ config, lib, pkgs, ... }: + +{ + imports = [ + ./home-default.nix + ./modules/window_managers/hyprland/z790prors.nix + ]; +} diff --git a/home/modules/applications/emacs/default.nix b/home/modules/applications/emacs/default.nix new file mode 100644 index 0000000..4a53f4f --- /dev/null +++ b/home/modules/applications/emacs/default.nix @@ -0,0 +1,69 @@ +{ config, lib, pkgs, ... }: + +let + emacs = pkgs.emacs29; + doomSync = (let + git = pkgs.git; + in '' + export PATH=${emacs}/bin:${git}/bin:$PATH + ${config.xdg.configHome}/emacs/bin/doom sync -u -j $((`nproc`/4*3)) + ''); +in { + home.packages = [ + pkgs.emacs-all-the-icons-fonts + pkgs.fontconfig + pkgs.graphviz + pkgs.isort + pkgs.nerdfonts + pkgs.nil # nix lsp language server + pkgs.nixfmt-rfc-style + (pkgs.ripgrep.override {withPCRE2 = true;}) + pkgs.pipenv + pkgs.poetry + pkgs.python3 + ]; + + fonts.fontconfig.enable = true; + + home.file = { + ".config/emacs" = { + source = fetchGit { + url = "https://github.com/doomemacs/doomemacs.git"; + # When updating me, remember to run `doom sync` + rev = "36e7aaa619342eff61b1daf3ac664f94d5272db7"; + }; + # We need to use recursive mode here or else doom fails to sync for + # some reason related to the permissions on the synced path. I'm not + # quite sure of everything that's going on here. + recursive = true; + + # Because `recursive = true` will cause this to sync every single + # activation, we turn this off here. + # + # There's probably a way we could do better detection of this within + # our onChange shell? + # + # onChange = doomSync; + }; + }; + + home.sessionVariables = { + DOOMLOCALDIR = "${config.xdg.dataHome}/doom"; + EDITOR = "emacs -nw"; + }; + + home.sessionPath = [ + "${config.xdg.configHome}/emacs/bin" + ]; + + programs.emacs = { + enable = true; + package = emacs; + }; + + xdg.configFile."doom" = { + source = ./doom; + # Sync doom if we updated the config + onChange = doomSync; + }; +} diff --git a/home/modules/applications/nextcloud-talk-desktop/package.nix b/home/modules/applications/nextcloud-talk-desktop/package.nix new file mode 100644 index 0000000..357514e --- /dev/null +++ b/home/modules/applications/nextcloud-talk-desktop/package.nix @@ -0,0 +1,79 @@ +{ lib +, stdenv +, fetchzip +, autoPatchelfHook + +, nss +, cairo +, xorg +, libxkbcommon +, alsa-lib +, at-spi2-core +, mesa +, pango +, libdrm +, vivaldi-ffmpeg-codecs +, gtk3 +, libGL +, libglvnd +, systemd +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "nextcloud-talk-desktop"; + version = "0.29.0"; + + # Building from source would require building also building Server and Talk components + # See https://github.com/nextcloud/talk-desktop?tab=readme-ov-file#%EF%B8%8F-prerequisites + src = fetchzip { + url = "https://github.com/nextcloud-releases/talk-desktop/releases/download/v${finalAttrs.version}/Nextcloud.Talk-linux-x64-${finalAttrs.version}.zip"; + hash = "sha256-fBIeNv8tfrVTFExLQDBPhIazvbsJ7a76+W9G0cuQDlw="; + stripRoot = false; + }; + + nativeBuildInputs = [ autoPatchelfHook ]; + + buildInputs = [ + nss + cairo + alsa-lib + at-spi2-core + pango + libdrm + libxkbcommon + gtk3 + vivaldi-ffmpeg-codecs + mesa + libGL + libglvnd + ] ++ (with xorg; [libX11 libXcomposite libXdamage libXrandr libXfixes libXcursor]); + + # Required to launch the application and proceed past the zygote_linux fork() process + # Fixes `Zygote could not fork` + runtimeDependencies = [ systemd ]; + + preInstall = '' + mkdir -p $out/bin + mkdir -p $out/opt + + cp -r $src/* $out/opt/ + ''; + + installPhase = '' + runHook preInstall + + # Link the application in $out/bin away from contents of `preInstall` + ln -s "$out/opt/Nextcloud Talk-linux-x64/Nextcloud Talk" $out/bin/${finalAttrs.pname} + + runHook postInstall + ''; + + meta = with lib; { + description = "Nextcloud Talk Desktop Client Preview"; + homepage = "https://github.com/nextcloud/talk-desktop"; + changelog = "https://github.com/nextcloud/talk-desktop/blob/${finalAttrs.version}/CHANGELOG.md"; + license = licenses.agpl3Only; + maintainers = with maintainers; [ kashw2 ]; + mainProgram = finalAttrs.pname; + }; +}) diff --git a/home/modules/games/lutris/default.nix b/home/modules/games/lutris/default.nix new file mode 100644 index 0000000..2cc0b77 --- /dev/null +++ b/home/modules/games/lutris/default.nix @@ -0,0 +1,9 @@ +{ config, lib, pkgs, ... }: + +{ + home.packages = [ + pkgs.gamescope + pkgs.lutris + pkgs.mangohud + ]; +} diff --git a/home/modules/window_managers/hyprland/default.nix b/home/modules/window_managers/hyprland/default.nix new file mode 100644 index 0000000..a0d75f0 --- /dev/null +++ b/home/modules/window_managers/hyprland/default.nix @@ -0,0 +1,94 @@ +{ inputs, ... }: + +{ + imports = [ + ./hyprpaper.nix + ]; + + wayland.windowManager.hyprland = { + enable = true; + plugins = [ inputs.hy3.packages.x86_64-linux.hy3 ]; + settings = { + "$mod" = "SUPER"; + "$terminal" = "kitty"; + "$fileManager" = "dolphin"; + "$menu" = "wofi --show drun"; + + exec-once = [ + "waybar" + "dunst" + ]; + + xwayland = { + force_zero_scaling = true; + }; + + input = { + kb_layout = "us"; + kb_options = "caps:escape"; + follow_mouse = 1; + touchpad.natural_scroll = false; + }; + + windowrulev2 = [ + # I can guess, but I should figure out what this actually does + "suppressevent maximize, class:.*" + ]; + + general.layout = "hy3"; + + bind = + [ + "SHIFT_$mod, Q, killactive" + "SHIFT_$mod, M, exit" + + "$mod, D, exec, $menu" + "$mod, Return, exec, $terminal" + + "$mod, H, hy3:movefocus, l" + "$mod, L, hy3:movefocus, r" + "$mod, K, hy3:movefocus, u" + "$mod, J, hy3:movefocus, d" + + "SHIFT_$mod, H, hy3:movewindow, l" + "SHIFT_$mod, L, hy3:movewindow, r" + "SHIFT_$mod, K, hy3:movewindow, u" + "SHIFT_$mod, J, hy3:movewindow, d" + + "$mod, V, hy3:makegroup, opposite" + "$mod, W, hy3:changegroup, toggletab" + + "$mod, A, hy3:changefocus, raise" + "SHIFT_$mod, A, hy3:changefocus, lower" + + "$mod, M, fullscreen, 0" + "$mod, E, hy3:expand, expand" + "SHIFT_$mod, E, hy3:expand, base" + + "$mod, Q, hy3:warpcursor" + ] + ++ ( + # workspaces + # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} + builtins.concatLists (builtins.genList ( + x: let + ws = let + c = (x + 1) / 10; + in + builtins.toString (x + 1 - (c * 10)); + in [ + "$mod, ${ws}, workspace, ${toString (x + 1)}" + "$mod SHIFT, ${ws}, hy3:movetoworkspace, ${toString (x + 1)}" + ] + ) + 10) + ); + + bindm = + [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + }; + }; +} diff --git a/home/modules/window_managers/hyprland/hyprpaper.nix b/home/modules/window_managers/hyprland/hyprpaper.nix new file mode 100644 index 0000000..38c4e45 --- /dev/null +++ b/home/modules/window_managers/hyprland/hyprpaper.nix @@ -0,0 +1,21 @@ +{ config, lib, pkgs, ... }: + +{ + services.hyprpaper = { + enable = true; + settings = { + ipc = "on"; + splash = false; + preload = [ + "${config.xdg.dataHome}/wallpaper.jpg" + ]; + wallpaper = [ + ",${config.xdg.dataHome}/wallpaper.jpg" + ]; + }; + }; + + xdg.dataFile."wallpaper.jpg" = { + source = ./wallpaper.jpg; + }; +} diff --git a/home/modules/window_managers/hyprland/nix-book.nix b/home/modules/window_managers/hyprland/nix-book.nix new file mode 100644 index 0000000..7672b38 --- /dev/null +++ b/home/modules/window_managers/hyprland/nix-book.nix @@ -0,0 +1,5 @@ +{ config, lib, pkgs, ... }: + +{ + wayland.windowManager.hyprland.settings.monitor = ",preferred,2880x1800@90.00Hz,1.33333"; +} diff --git a/home/modules/window_managers/hyprland/wallpaper.jpg b/home/modules/window_managers/hyprland/wallpaper.jpg new file mode 100644 index 0000000..64d23c1 Binary files /dev/null and b/home/modules/window_managers/hyprland/wallpaper.jpg differ diff --git a/home/modules/window_managers/hyprland/z790prors.nix b/home/modules/window_managers/hyprland/z790prors.nix new file mode 100644 index 0000000..26e8adb --- /dev/null +++ b/home/modules/window_managers/hyprland/z790prors.nix @@ -0,0 +1,16 @@ +{ config, lib, pkgs, ... }: + +{ + wayland.windowManager.hyprland.settings.monitor = "DP-1,3440x1440@164.90,0x0,1.33333,vrr,1"; + wayland.windowManager.hyprland.settings.env = [ + "LIBVA_DRIVER_NAME,nvidia" + "XDG_SESSION_TYPE,wayland" + "GBM_BACKEND,nvidia-drm" + "__GLX_VENDOR_LIBRARY_NAME,nvidia" + "NVD_BACKEND,direct" + "ELECTRON_OZONE_PLATFORM_HINT,auto" + "NIXOS_OZONE_WL,1" + ]; + + wayland.windowManager.hyprland.settings.cursor.no_hardware_cursors = true; +} diff --git a/home/modules/window_managers/i3/default.nix b/home/modules/window_managers/i3/default.nix new file mode 100644 index 0000000..7e15cdc --- /dev/null +++ b/home/modules/window_managers/i3/default.nix @@ -0,0 +1,10 @@ +{ config, lib, pkgs, ... }: + +{ + xsession.windowManager.i3 = { + enable = true; + config = { + modifier = "Mod4"; + }; + }; +}