diff --git a/modules/application-groups/media-creation.nix b/modules/application-groups/media-creation.nix index 78953d5..e204a21 100644 --- a/modules/application-groups/media-creation.nix +++ b/modules/application-groups/media-creation.nix @@ -6,5 +6,6 @@ inkscape kdePackages.kdenlive obs-studio + pinta ]; } diff --git a/modules/application-groups/system-utilities.nix b/modules/application-groups/system-utilities.nix index af611a1..150bda3 100644 --- a/modules/application-groups/system-utilities.nix +++ b/modules/application-groups/system-utilities.nix @@ -33,13 +33,14 @@ kdePackages.qt6ct killall kitty + swappy lf minicom ncdu networkmanager networkmanagerapplet nmap - # nvtopPackages.full # <- Build failure: https://github.com/nixos/nixpkgs/issues/456928 + nvtopPackages.full openrgb-with-all-plugins pciutils rofi-bluetooth diff --git a/modules/system/hyprland.nix b/modules/system/hyprland.nix index a781890..94b552d 100644 --- a/modules/system/hyprland.nix +++ b/modules/system/hyprland.nix @@ -1,35 +1,32 @@ { config, pkgs, ... }: { - programs.hyprland = { - enable = true; - xwayland.enable = true; - }; - - services.displayManager.gdm = { - enable = true; - wayland = true; - }; - - services.xserver = { - enable = true; - }; hardware.graphics = { enable = true; enable32Bit = true; }; + programs.hyprland = { + enable = true; + xwayland.enable = true; + }; + programs.hyprlock.enable = true; + programs.waybar.enable = true; + + services.displayManager.gdm = { + enable = true; + wayland = true; + }; + services.hypridle.enable = true; + services.xserver.enable = true; + xdg.portal.enable = true; xdg.portal.extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; - programs.hyprlock.enable = true; - programs.waybar.enable = true; - services.hypridle.enable = true; - environment.systemPackages = with pkgs; [ arandr + bemenu dunst - flameshot grim hyprpaper hyprpicker @@ -43,7 +40,7 @@ swayimg wl-clipboard wlogout - bemenu + ]; } diff --git a/modules/system/security.nix b/modules/system/security.nix index e2a0caf..c3dcd7b 100644 --- a/modules/system/security.nix +++ b/modules/system/security.nix @@ -4,6 +4,7 @@ enable = true; extraRules = [ { + groups = [ "wheel" ]; commands = [ { command = "${pkgs.systemd}/bin/reboot"; @@ -14,7 +15,16 @@ options = [ "NOPASSWD" ]; } ]; - groups = [ "wheel" ]; + } + { + users = [ "caperren" ]; + commands = [ + { + command = "${pkgs.nvtopPackages.full}/bin/nvtop"; + options = [ "NOPASSWD" "SETENV" ]; + } + ]; + } ]; }; diff --git a/users/caperren/caperren.nix b/users/caperren/caperren.nix index eb15421..6dd8754 100644 --- a/users/caperren/caperren.nix +++ b/users/caperren/caperren.nix @@ -43,11 +43,16 @@ in programs.bemenu.enable = true; programs.kitty = { + enable = true; font.name = "JetBrains Mono"; + settings = { + allow_remote_control = true; + }; }; - # Assets + # Assets/scripts home.file.".config/streamdeck-ui/icons".source = ./dotfiles/streamdeck/icons; + home.file.".config/hypr/scripts".source = ./dotfiles/.config/hypr/scripts; # Application config files home.file.".config/glances/glances.conf".source = ./dotfiles/.config/glances/glances.conf; @@ -73,16 +78,25 @@ in home.file.".config/wlogout/layout".source = ./dotfiles/wlogout/layout; # Desktop entry files so bemenu can find them - home.file.".local/share/glava.desktop".source = ./dotfiles/.local/share/glava.desktop; - home.file.".local/share/jetbrains-toolbox.desktop".source = - ./dotfiles/.local/share/jetbrains-toolbox.desktop; - home.file.".local/share/spotify-player.desktop".source = - ./dotfiles/.local/share/spotify-player.desktop; + home.file.".local/share/applications/alltop.desktop".source = + ./dotfiles/.local/share/applications/alltop.desktop; + home.file.".local/share/applications/glava.desktop".source = + ./dotfiles/.local/share/applications/glava.desktop; + home.file.".local/share/applications/phonerdp.desktop".source = + ./dotfiles/.local/share/applications/phonerdp.desktop; + home.file.".local/share/applications/spotify-player.desktop".source = + ./dotfiles/.local/share/applications/spotify-player.desktop; # Custom bash aliases home.shellAliases = { - # Streamdeck isn't easy to manually edit, so make a save command to copy any updates to the repo - savestreamdeck = "cp ~/.streamdeck_ui.json ~/.nixos-configs/users/caperren/dotfiles/streamdeck/.streamdeck_ui.json"; + # Phone remote desktop over usb (adb), with some default flags I want + phonerdp = "scrcpy --no-audio --orientation=0 --turn-screen-off --stay-awake"; + + # Streamdeck isn't easy to manually edit, so make a save command to copy any updates to the repo + savestreamdeck = "cp ~/.streamdeck_ui.json ~/.nixos-configs/users/caperren/dotfiles/streamdeck/.streamdeck_ui.json"; + + # Nice to have an alias if I ever want to launch this from cmdline, or see the dbus help string + screenshot = "~/.config/hypr/scripts/screenshot.sh"; }; # Theming @@ -107,6 +121,9 @@ in font.name = "JetBrains Mono 11"; }; + home.sessionPath = [ + "$HOME/.local/share" + ]; home.sessionVariables = { GTK_THEME = "Adwaita-dark"; }; diff --git a/users/caperren/dotfiles/.config/hypr/scripts/screenshot.sh b/users/caperren/dotfiles/.config/hypr/scripts/screenshot.sh new file mode 100755 index 0000000..e345ebc --- /dev/null +++ b/users/caperren/dotfiles/.config/hypr/scripts/screenshot.sh @@ -0,0 +1,116 @@ +#!/usr/bin/env bash + +# Unashamedly taken from: https://www.reddit.com/r/hyprland/comments/13ivh0c/comment/jkgk65k +# Small edits made for my particular needs + +# Flags: + +# r: region +# s: screen +# +# c: clipboard +# f: file +# i: interactive + +# p: pixel + +# Example hyprland bindings +#bind = CTRL, SUPER, ALT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh +#bind = , PRINT, exec, ~/.config/hypr/scripts/screenshot.sh rc +#bind = SUPER, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh rf +#bind = CTRL, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh ri +#bind = SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh sc +#bind = SUPER SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh sf +#bind = CTRL SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh si +#bind = ALT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh p + +screenshotPath=~/Pictures/screenshots + +hyprpicker_launch(){ + # Start hyprpicker with screen render (freeze), no fancy, no zoom + # We're just using this to lock the screen in place for grim ingest + hyprpicker -r -n -z -d >/dev/null 2>&1 & + sleep 0.5 +} + +hyprpicker_kill(){ + killall hyprpicker >/dev/null 2>&1 +} + +trap hyprpicker_kill EXIT + +generate_filename(){ + # Make sure screenshots path exists first + if [ ! -d "$screenshotPath" ]; then + mkdir -p "$screenshotPath" + fi + + echo "$screenshotPath/$(date +%Y-%m-%d_%H-%M-%S).png" +} + +active_screen_grim_region(){ + hyprctl -j monitors | jq -r '.[] | select(.focused) | "\(.x),\(.y) \(.width)x\(.height)"' - +} + +grim_from_region() { + local filename="${1:-}" + local region="${2:-}" + + hyprpicker_launch + + # Get region of screen to capture, if not passed in + if [ -z "$region" ]; then + region=$(slurp -b '#000000b0' -c '#00000000') || exit 1 + fi + + # Start grim while screen is still frozen, kill hyprpicker, and pass through data + if [ -z "$filename" ]; then + grim -g "$region" - | { + hyprpicker_kill || true + cat + } + else + grim -g "$region" "$filename" | { + hyprpicker_kill || true + cat + } + fi +} + +if [[ $1 == rc ]]; then + grim_from_region | wl-copy + notify-send 'Copied to Clipboard' Screenshot + +elif [[ $1 == rf ]]; then + grim_from_region "$(generate_filename)" + notify-send 'Screenshot Taken' "$filename" + +elif [[ $1 == ri ]]; then + grim_from_region | swappy -f - -o "$(generate_filename)" + +elif [[ $1 == sc ]]; then + grim_from_region "" "$(active_screen_grim_region)" | wl-copy + notify-send 'Copied to Clipboard' Screenshot + +elif [[ $1 == sf ]]; then + grim_from_region "$(generate_filename)" "$(active_screen_grim_region)" + notify-send 'Screenshot Taken' "$filename" + +elif [[ $1 == si ]]; then + grim_from_region "" "$(active_screen_grim_region)" | swappy -f - -o "$(generate_filename)" + +elif [[ $1 == p ]]; then + color=$(hyprpicker -a -r) + wl-copy "$color" + notify-send 'Copied to Clipboard' "$color" + +else + notify-send 'Screenshot Shortcuts' "Print:\t\t\tRegion to clip +Super+Print:\t\tRegion to file +Ctrl+Print:\t\tRegion to editor +Shift+Print:\t\t\Screen to clip +Shift+Super+Print:\tScreen to file +Ctrl+Shift+Print:\tScreen to editor +Alt+Print:\t\tColor picker to clip" -t 20000 + +fi \ No newline at end of file diff --git a/users/caperren/dotfiles/.local/share/applications/alltop.desktop b/users/caperren/dotfiles/.local/share/applications/alltop.desktop new file mode 100644 index 0000000..a42d532 --- /dev/null +++ b/users/caperren/dotfiles/.local/share/applications/alltop.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=All Top +Exec=bash -c "kitty --single-instance --detach bash -c 'kitten @ launch --type=window --title btop btop ; kitten @ launch --type=window --title nvtop nvtop'" +Icon=alltop +Terminal=false +Categories=Utilities; \ No newline at end of file diff --git a/users/caperren/dotfiles/.local/share/glava.desktop b/users/caperren/dotfiles/.local/share/applications/glava.desktop similarity index 100% rename from users/caperren/dotfiles/.local/share/glava.desktop rename to users/caperren/dotfiles/.local/share/applications/glava.desktop diff --git a/users/caperren/dotfiles/.local/share/applications/phonerdp.desktop b/users/caperren/dotfiles/.local/share/applications/phonerdp.desktop new file mode 100644 index 0000000..0c16e77 --- /dev/null +++ b/users/caperren/dotfiles/.local/share/applications/phonerdp.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=Phone RDP +Exec=bash -c "scrcpy --no-audio --orientation=0 --turn-screen-off --stay-awake" +Icon=phonerdp +Terminal=false +Categories=Utilities; \ No newline at end of file diff --git a/users/caperren/dotfiles/.local/share/spotify-player.desktop b/users/caperren/dotfiles/.local/share/applications/spotify-player.desktop similarity index 100% rename from users/caperren/dotfiles/.local/share/spotify-player.desktop rename to users/caperren/dotfiles/.local/share/applications/spotify-player.desktop diff --git a/users/caperren/dotfiles/.local/share/jetbrains-toolbox.desktop b/users/caperren/dotfiles/.local/share/jetbrains-toolbox.desktop deleted file mode 100644 index 80792a8..0000000 --- a/users/caperren/dotfiles/.local/share/jetbrains-toolbox.desktop +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Type=Application -Name=JetBrains Toolbox -Exec=jetbrains-toolbox -Icon=jetbrains-toolbox -Terminal=false -Categories=Development;IDE; \ No newline at end of file diff --git a/users/caperren/dotfiles/hyprland/hyprland-common.conf b/users/caperren/dotfiles/hyprland/hyprland-common.conf index d164ede..8f97c0d 100644 --- a/users/caperren/dotfiles/hyprland/hyprland-common.conf +++ b/users/caperren/dotfiles/hyprland/hyprland-common.conf @@ -4,7 +4,7 @@ monitor=,preferred,auto,1 # Set programs that you use $terminal = kitty $fileManager = thunar -$menu = bemenu-run --line-height 22 --hf "##10AC25" --ff "##10AC25" --tf "##10AC25" +$menu = j4-dmenu-desktop --dmenu='bemenu --ignorecase --line-height 22 --hf "##10AC25" --ff "##10AC25" --tf "##10AC25"' --term='kitty' # Some default env vars env = XCURSOR_SIZE,24 @@ -83,14 +83,13 @@ windowrulev2 = suppressevent maximize, class:.* # You'll probably like this. $mainMod = SUPER -bind = $mainMod, T, exec, $terminal -bind = $mainMod, C, killactive, - # Launch terminal +bind = $mainMod, T, exec, $terminal bind = SHIFT_SUPER, Return, exec, $terminal # Close active window bind = $mainMod, Shift+q, killactive, +bind = $mainMod, C, killactive, bind = $mainMod, M, exit, bind = $mainMod, E, exec, $fileManager @@ -157,6 +156,20 @@ bindl=, XF86AudioNext, exec, playerctl next bind = ,XF86MonBrightnessDown, exec, brightnessctl s 1%- bind = ,XF86MonBrightnessUp, exec, brightnessctl s +1% +# Screenshots +bind = , PRINT, exec, ~/.config/hypr/scripts/screenshot.sh rc +bind = SUPER, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh rf +bind = CTRL, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh ri +bind = SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh sc +bind = SUPER_SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh sf +bind = CTRL_SHIFT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh si +bind = ALT, PRINT, exec, ~/.config/hypr/scripts/screenshot.sh p + + +# Jetbrains window rules +# Prevent initial focus for JetBrains popups +windowrulev2 = noinitialfocus, class:^jetbrains-.*$, floating:1, title:^$|^\s$|^win\d+$ + # Application launch exec-once = kanshi # Automatically handles display configurations exec-once = ydotoold # Autoclicker/autokeyboard for automation diff --git a/users/caperren/dotfiles/streamdeck/.streamdeck_ui.json b/users/caperren/dotfiles/streamdeck/.streamdeck_ui.json index a208064..e12a2fe 100644 --- a/users/caperren/dotfiles/streamdeck/.streamdeck_ui.json +++ b/users/caperren/dotfiles/streamdeck/.streamdeck_ui.json @@ -176,14 +176,14 @@ "states": { "0": { "text": "", - "icon": "/home/caperren/.config/streamdeck-ui/icons/glances-logo.png", + "icon": "/home/caperren/.config/streamdeck-ui/icons/btop-logo.png", "keys": "", "write": "", - "command": "kitty -e glances", + "command": "bash -c \"kitty --single-instance --detach bash -c 'kitten @ launch --type=window --title btop btop ; kitten @ launch --type=window --title nvtop nvtop'\"", "brightness_change": 0, "switch_page": 0, "switch_state": 0, - "text_vertical_align": "middle", + "text_vertical_align": "top", "text_horizontal_align": "", "font": "", "font_color": "", @@ -263,7 +263,7 @@ "icon": "/home/caperren/.config/streamdeck-ui/icons/spotify-logo.png", "keys": "", "write": "", - "command": "spotify", + "command": "kitty -e spotify_player", "brightness_change": 0, "switch_page": 0, "switch_state": 0, @@ -582,7 +582,7 @@ "write": "", "command": "kitty -e bash -i -c nrs", "brightness_change": 0, - "switch_page": 0, + "switch_page": 1, "switch_state": 0, "text_vertical_align": "middle", "text_horizontal_align": "", @@ -603,7 +603,7 @@ "write": "", "command": "kitty -e bash -i -c nus", "brightness_change": 0, - "switch_page": 0, + "switch_page": 1, "switch_state": 0, "text_vertical_align": "middle", "text_horizontal_align": "", diff --git a/users/caperren/dotfiles/streamdeck/icons/btop-logo.png b/users/caperren/dotfiles/streamdeck/icons/btop-logo.png new file mode 100644 index 0000000..871317e Binary files /dev/null and b/users/caperren/dotfiles/streamdeck/icons/btop-logo.png differ