diff --git a/modules/hypr/hyprland.nix b/modules/hypr/hyprland.nix index f4a6ad2..4a4e7e9 100644 --- a/modules/hypr/hyprland.nix +++ b/modules/hypr/hyprland.nix @@ -1,480 +1,13 @@ +{ ... }: { - lib, - userConfig, - pkgs, - inputs, - ... -}: -let - exe = pkg: bin: if userConfig.isNixOS then "${pkg}/bin/${bin}" else "/usr/bin/${bin}"; - - jq = exe pkgs.jq "jq"; - grim = exe pkgs.grim "grim"; - satty = exe pkgs.satty "satty"; - wl_copy = exe pkgs.wl-clipboard "wl-copy"; - notify_send = exe pkgs.libnotify "notify-send"; - xdg-desktop-portal-hyprland = - if userConfig.isNixOS then - "${pkgs.xdg-desktop-portal-hyprland}/libexec/xdg-desktop-portal-hyprland" - else - "/usr/lib/xdg-desktop-portal-hyprland"; - hyprlock = exe pkgs.hyprlock "hyprlock"; - playerctl = exe pkgs.playerctl "playerctl"; -in -{ - wayland.windowManager.hyprland = { - enable = true; - package = - if userConfig.isNixOS then - # inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland - pkgs.hyprland - else - null; - #portalPackage = lib.mkIf (userConfig.isNixOS - #) inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; - xwayland.enable = true; - - settings = { - "$mainMod" = "SUPER"; - "$terminal" = "uwsm app -- kitty"; - "$menu" = "hyprlauncher"; - "$music_player" = if userConfig.isNixOS then "spotify" else "flatpak run com.spotify.Client"; - "$notes" = "obsidian"; - "$browser" = if userConfig.isNixOS then "zen-beta" else "zen-browser"; # beta on nixos - "$openrgb_color" = "09ce30"; - - env = [ - "XCURSOR_SIZE, 32" - "HYPRCURSOR_SIZE, 32" - "HYPRCURSOR_THEME, theme_phinger-cursors-light" - "XDG_CURRENT_DESKTOP,Hyprland" - ]; - - general = { - gaps_in = 4; - gaps_out = 6; - border_size = 4; - "col.active_border" = "$blue $sky"; - "col.inactive_border" = "$overlay1"; - resize_on_border = false; - allow_tearing = false; - layout = "scrolling"; - }; - - animations = { - enabled = userConfig.animations; - bezier = [ - "easeOutQuint,0.23,1,0.32,1" - "easeInOutCubic,0.65,0.05,0.36,1" - "linear,0,0,1,1" - "almostLinear,0.5,0.5,0.75,1.0" - "quick,0.15,0,0.1,1" - ]; - animation = [ - "global, 1, 7, default" - "border, 1, 3.39, easeOutQuint" - "windows, 1, 2.79, easeOutQuint" - "windowsIn, 1, 2.1, easeOutQuint, popin 87%" - "windowsOut, 1, 1, linear, popin 87%" - "fadeIn, 1, 1.4, almostLinear" - "fadeOut, 1, 1.2, almostLinear" - "fade, 1, 3.03, quick" - "layers, 1, 2, easeOutQuint" - "layersIn, 1, 2, easeOutQuint, fade" - "layersOut, 1, 1, linear, fade" - "fadeLayersIn, 1, 1.4, almostLinear" - "fadeLayersOut, 1, 1.1, almostLinear" - "workspaces, 1, 1.4, quick, slidevert" - "workspacesIn, 1, 0.5, quick, slidevert" - "workspacesOut, 1, 0.5, quick, slidevert" - ]; - }; - - decoration = { - rounding = 1; - rounding_power = 2; - active_opacity = 1.0; - inactive_opacity = 1.0; - shadow = { - enabled = true; - range = 1; - render_power = 1; - color = "$overlay0"; - }; - blur = { - enabled = true; - size = 1; - passes = 1; - vibrancy = 0.1696; - }; - }; - - dwindle = { - preserve_split = true; - }; - - master = { - new_status = "slave"; - allow_small_split = true; - orientation = "left"; - }; - - ecosystem = { - enforce_permissions = true; - }; - - permission = [ - "^${grim}$, screencopy, allow" - "^${hyprlock}$, screencopy, allow" - "^${xdg-desktop-portal-hyprland}$, screencopy, allow" - ]; - - input = { - kb_layout = "pl"; - kb_variant = ""; - kb_model = ""; - kb_options = "caps:escape_shifted_capslock"; - kb_rules = ""; - follow_mouse = 1; - left_handed = false; - sensitivity = -0.5; - touchpad = { - natural_scroll = true; - }; - }; - - device = { - name = "msft0001:01-06cb:7f28-touchpad"; - sensitivity = 0; - }; - - cursor = { - no_hardware_cursors = true; - inactive_timeout = 5; - warp_on_change_workspace = 1; - zoom_factor = 1.0; - hide_on_key_press = 1; - }; - - misc = { - force_default_wallpaper = 0; - disable_hyprland_logo = true; - middle_click_paste = false; - }; - - xwayland = { - force_zero_scaling = 1; - }; - - quirks = { - prefer_hdr = 1; - }; - - "exec-once" = [ - "wl-paste --type text --watch cliphist store" - "wl-paste --type image --watch cliphist store" - "uwsm app -- ${userConfig.statusBar}" - "awww-daemon" - "openrgb -c $openrgb_color" - ]; - - workspace = [ - "1, monitor:DP-2" - "1, layout: dwindle" - "2, monitor:DP-1" - "3, monitor:DP-1" - "4, monitor:DP-1" - "5, monitor:DP-1" - "6, monitor:DP-1" - "7, monitor:HDMI-A-2" - "9, monitor:DP-2" - "10, monitor:DP-2" - "w[tv1], gapsout:0, gapsin:0" - "f[1], gapsout:0, gapsin:0" - ]; - - windowrule = [ - # smart gaps - "border_size 0, match:float 0, match:workspace w[tv1]" - "rounding 0, match:float 0, match:workspace w[tv1]" - "border_size 0, match:float 0, match:workspace f[1]" - "rounding 0, match:float 0, match:workspace f[1]" - # general rules - "match:class ^(signal)$, workspace 1" - "match:class ^(vesktop)$, workspace 1 silent" - "match:class ^(chrome-facebook.com__-Default)$, workspace 1" - "match:class ^(zen)$, workspace 2" - "match:class ^(zen-beta)$, workspace 2" - "match:class ^(com.github.IsmaelMartinez.teams_for_linux)$, workspace 2" - "match:class ^(FreeTube)$, workspace 2" - "match:class ^(brave-x.com__-Default)$, workspace 2" - "match:class ^(chrome-www.inoreader.com__all_articles-Default)$, workspace 2" - "match:class ^(chrome-mail.proton.me__u_0_inbox.com-Default)$, workspace 2" - "match:class ^(chrome-app.tuta.com__-Default)$, workspace 2" - "match:class ^(steam)$, workspace 3 silent" - "match:class ^(heroic)$, workspace 3" - "match:class ^(net.lutris.Lutris)$, workspace 3" - "match:class ^(rpcs3)$, workspace 3" - "match:class ^(winboat)$, workspace 5" - "match:class ^(qemu)$, workspace 5" - "match:class ^(obsidian)$, workspace 6" - "match:class ^(gimp)$, workspace 8" - "match:class .*potify, workspace 9 silent" - "match:class ^(com.obsproject.Studio)$, workspace 10" - ]; - - bind = - # hyprlang - [ - # background - "$mainMod, V, exec, cliphist list | hyprlauncher -m | cliphist decode | wl-copy" - "$mainMod ALT_L, V, exec, cliphist wipe && notify-send \"Clipboard\" \"Clipboard cleared!\"" - # power management - "$mainMod L_SHIFT ctrl, l, exec, hyprlock" - "$mainMod L_SHIFT ctrl, r, exec, openrgb -c black && systemctl reboot" - "$mainMod L_SHIFT ctrl, p, exec, openrgb -c black && systemctl poweroff" - "$mainMod L_SHIFT ctrl, s, exec, openrgb -c black && pidof hyprlock || sleep 1 && systemctl sleep" - "$mainMod L_SHIFT ctrl, m, exec, uwsm stop" - # zoom - "$mainMod alt, 0, exec, hyprctl -q keyword cursor:zoom_factor 1" - # focus management - "$mainMod, h, movefocus, l" - "$mainMod, l, movefocus, r" - "$mainMod, k, movefocus, u" - "$mainMod, j, movefocus, d" - "$mainMod, mouse_down, workspace, e+1" - "$mainMod, mouse_up, workspace, e-1" - "$mainMod L_SHIFT, right, exec, hyprctl dispatch movecurrentworkspacetomonitor +1" - "$mainMod L_SHIFT, left, exec, hyprctl dispatch movecurrentworkspacetomonitor -1" - # workspace management - "$mainMod, 1, workspace, 1" - "$mainMod, 2, workspace, 2" - "$mainMod, 3, workspace, 3" - "$mainMod, 4, workspace, 4" - "$mainMod, 5, workspace, 5" - "$mainMod, 6, workspace, 6" - "$mainMod, 7, workspace, 7" - "$mainMod, 8, workspace, 8" - "$mainMod, 9, workspace, 9" - "$mainMod, 0, workspace, 10" - # window management - "$mainMod SHIFT, 1, movetoworkspace, 1" - "$mainMod SHIFT, 2, movetoworkspace, 2" - "$mainMod SHIFT, 3, movetoworkspace, 3" - "$mainMod SHIFT, 4, movetoworkspace, 4" - "$mainMod SHIFT, 5, movetoworkspace, 5" - "$mainMod SHIFT, 6, movetoworkspace, 6" - "$mainMod SHIFT, 7, movetoworkspace, 7" - "$mainMod SHIFT, 8, movetoworkspace, 8" - "$mainMod SHIFT, 9, movetoworkspace, 9" - "$mainMod SHIFT, 0, movetoworkspace, 10" - # special workspace - "$mainMod, TAB, togglespecialworkspace, magic" - "$mainMod SHIFT, TAB, movetoworkspace, special:magic" - # layout - "$mainMod, S, layoutmsg, swapwithmaster" - "$mainMod, n, layoutmsg, swapnext" - "$mainMod, p, layoutmsg, swapprev" - # apps - "$mainMod, M, exec, [float] waypaper" - "$mainMod, RETURN, exec, [workspace 4] $terminal" - "$mainMod CONTROL_L, RETURN, exec, $terminal" - "$mainMod, space , exec, $menu" - "$mainMod ALT_L, c, exec, openrgb -c $openrgb_color" - "$mainMod Control_L, s, exec,[workspace 1] signal-desktop --password-store=\"kwallet6\"" - "$mainMod Control_L, s, focuswindow, class:^(signal)$" - "$mainMod Control_L, s, focuswindow, title:^(signal)$" - "$mainMod Control_L, v, sendshortcut, ctrl, k, class:^(vesktop)$" - "$mainMod Control_L, v, exec, uwsm app -- vesktop" - "$mainMod Control_L, v, focuswindow, class:^(vesktop)$" - "$mainMod Control_L, g, exec, uwsm app -- steam" - "$mainMod Control_L, g, focuswindow, class:^(steam)$" - "$mainMod Control_L, b, exec, uwsm app -- $browser" - "$mainMod Control_L, b, focuswindow, class:^(zen)$" - "$mainMod Control_L, n, exec, [workspace 6] uwsm app -- $notes" - "$mainMod Control_L, n, focuswindow, class:^(obsidian)$" - "$mainMod Control_L, m, exec, [workspace 9] uwsm app -- $music_player" - "$mainMod Control_L, f, exec, uwsm app -- freetube" - "$mainMod Control_L, f, focuswindow, class:^(freetube)$" - "$mainMod Control_L, x, exec, uwsm app -- ~/.nix-profile/share/applications/x.desktop" - "$mainMod Control_L, x, focuswindow, class:^(chrome-x.com__-Default)$" - "$mainMod CONTROL_L L_SHIFT, B, exec, killall ashell && uwsm app -- ashell" - ]; - - binde = [ - "$mainMod alt, equal, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 * 1.1}')" - "$mainMod alt, minus, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 * 0.9}')" - "$mainMod L_SHIFT, l, resizeactive, 10 0" - "$mainMod L_SHIFT, h, resizeactive, -10 0" - "$mainMod L_SHIFT, k, resizeactive, 0 -10" - "$mainMod L_SHIFT, j, resizeactive, 0 10" - ]; - - bindel = [ - ",XF86MonBrightnessDown, exec, hyprctl hyprsunset gamma -10" - ",XF86MonBrightnessUp, exec, hyprctl hyprsunset gamma +10" - ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && ~/.local/bin/wp-vol.sh && paplay /usr/share/sounds/freedesktop/stereo/bell.oga" - ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && ~/.local/bin/wp-vol.sh && paplay /usr/share/sounds/freedesktop/stereo/bell.oga" - ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle" - ]; - - bindt = [ - ", PRINT, exec, ${pkgs.writeShellScript "screenshot-region" '' - MONITOR=$(hyprctl monitors -j | ${jq} -r '.[] | select(.focused == true) | .name') - ${grim} -o "$MONITOR" - | ${satty} -f - - ''}" - - "$mainMod, PRINT, exec, ${pkgs.writeShellScript "screenshot-fullscreen" '' - target_path="$HOME/${userConfig.pathConfig.screenshot}/$(date +'%d-%m-%Y_%H-%M-%S').png" - mkdir -p "$(dirname "$target_path")" - - MONITOR=$(hyprctl monitors -j | ${jq} -r '.[] | select(.focused == true) | .name') - - ${grim} -o "$MONITOR" "$target_path" - ${wl_copy} < "$target_path" - ${notify_send} -i "$target_path" -u low -a "Screenshot" "Screenshot fullscreen" "Saved and copied" - ''}" - - "alt_l, PRINT, exec, ${pkgs.writeShellScript "screenshot-window" '' - target_path="$HOME/${userConfig.pathConfig.screenshot}/$(date +'%d-%m-%Y_%H-%M-%S').png" - mkdir -p "$(dirname "$target_path")" - - GEOMETRY=$(hyprctl activewindow -j | ${jq} -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"') - - ${grim} -g "$GEOMETRY" "$target_path" - ${wl_copy} < "$target_path" - ${notify_send} -i "$target_path" -u low -a "Screenshot" "Screenshot window" "Saved and copied" - ''}" - - ", PAUSE, exec, ${playerctl} play-pause" - "$mainMod, PAUSE, exec, ${playerctl} play-pause --player spotify" - ]; - - bindm = [ - "$mainMod, mouse:272, movewindow" - "$mainMod, mouse:273, resizewindow" - ]; - - bindd = [ - "$mainMod, F, Make app fullscreen, fullscreen" - "$mainMod, T, Toggle floating, togglefloating" - "$mainMod, Q, Kill active window, killactive" - ]; - }; - - extraConfig = - #hyprlang - '' - windowrule { - name = pavucontrol-float - match:class = ^(org.pulseaudio.pavucontrol)$ - float = 1 - size = 80% 60% - stay_focused = 1 - center = 1 - pin = 1 - } - - windowrule { - name = share-picker-float - match:class = ^(hyprland-share-picker)$ - float = 1 - center = 1 - pin = 1 - } - - windowrule { - name = steam-friends-list - match:title = ^(Lista znajomych)$ - float = 1 - center = 1 - size = 40% 60% - } - - windowrule { - name = vesktop-dont-focus-pls - match:class = ^(vesktop)$ - no_initial_focus = 1 - focus_on_activate = 0 - render_unfocused = 1 - } - - windowrule { - name = xdg-desktop-portal-gtk - match:class = ^(xdg-desktop-portal-gtk)$ - float = 1 - center = 1 - size = 55% 50% - } - - windowrule { - name = picture-in-picture - match:title = ^(Obraz w obrazie)$ - pseudo = 1 - no_initial_focus = 1 - } - - windowrule { - name = login-google-zen - match:title = ^(Logowanie – Konta Google — Zen Browser)$ - float = 1 - center = 1 - } - - windowrule { - name = prism-launcher - match:class = ^(org.prismlauncher.PrismLauncher)$ - workspace = 3 - } - - windowrule { - name = gamescope - match:class = ^(gamescope)$ - workspace = 3 - } - - monitorv2 { - output = DP-1 - mode = 2560x1440@180.06 - position = 0x0 - scale = 1 - vrr = 1 - supports_wide_color = 1 - bitdepth = 10 - sdr_min_luminance = 0.005 - sdr_max_luminance = 220 - cm = hdr - supports_hdr = 1 - } - - monitorv2 { - output = DP-2 - mode = 1920x1080@144 - position = auto-left - vrr = 1 - scale = 1.0 - } - - monitorv2 { - output = HDMI-A-2 - mode = highres - position = auto-up - scale = 1 - } - - # for laptop - monitorv2 { - output = eDP-1 - mode = highres - position = 0x0 - scale = 1 - } - - monitorv2 { - output = - position = auto-right - scale = 1 - } - ''; - }; + imports = [ + ./hyprland/general.nix + ./hyprland/looks.nix + ./hyprland/layouts.nix + ./hyprland/hardware.nix + ./hyprland/apps.nix + ./hyprland/workspaces.nix + ./hyprland/env.nix + ./hyprland/autostart.nix + ]; } diff --git a/modules/hypr/hyprland/apps.nix b/modules/hypr/hyprland/apps.nix new file mode 100644 index 0000000..cab5804 --- /dev/null +++ b/modules/hypr/hyprland/apps.nix @@ -0,0 +1,10 @@ +{ ... }: + +{ + imports = [ + ./apps/communicators.nix + ./apps/browser.nix + ./apps/games.nix + ./apps/misc.nix + ]; +} diff --git a/modules/hypr/hyprland/apps/browser.nix b/modules/hypr/hyprland/apps/browser.nix new file mode 100644 index 0000000..92b39c3 --- /dev/null +++ b/modules/hypr/hyprland/apps/browser.nix @@ -0,0 +1,45 @@ +{ ... }: + +{ + wayland.windowManager.hyprland = { + windowrule = [ + "match:class ^(chrome-facebook.com__-Default)$, workspace 1" + "match:class ^(zen)$, workspace 2" + "match:class ^(zen-beta)$, workspace 2" + "match:class ^(com.github.IsmaelMartinez.teams_for_linux)$, workspace 2" + "match:class ^(FreeTube)$, workspace 2" + "match:class ^(brave-x.com__-Default)$, workspace 2" + "match:class ^(chrome-www.inoreader.com__all_articles-Default)$, workspace 2" + "match:class ^(chrome-mail.proton.me__u_0_inbox.com-Default)$, workspace 2" + "match:class ^(chrome-app.tuta.com__-Default)$, workspace 2" + ]; + + bind = [ + "$mainMod Control_L, b, exec, uwsm app -- $browser" + "$mainMod Control_L, b, focuswindow, class:^(zen)$" + "$mainMod Control_L, f, exec, uwsm app -- freetube" + "$mainMod Control_L, f, focuswindow, class:^(freetube)$" + "$mainMod Control_L, x, exec, uwsm app -- ~/.nix-profile/share/applications/x.desktop" + "$mainMod Control_L, x, focuswindow, class:^(chrome-x.com__-Default)$" + ]; + + extraConfig = + #hyprlang + '' + windowrule { + name = picture-in-picture + match:title = ^(Obraz w obrazie)$ + pseudo = 1 + no_initial_focus = 1 + } + + windowrule { + name = login-google-zen + match:title = ^(Logowanie – Konta Google — Zen Browser)$ + float = 1 + center = 1 + } + + ''; + }; +} diff --git a/modules/hypr/hyprland/apps/communicators.nix b/modules/hypr/hyprland/apps/communicators.nix new file mode 100644 index 0000000..e55eb53 --- /dev/null +++ b/modules/hypr/hyprland/apps/communicators.nix @@ -0,0 +1,32 @@ +{ ... }: + +{ + wayland.windowManager.hyprland = { + windowrule = [ + # general rules + "match:class ^(signal)$, workspace 1" + "match:class ^(vesktop)$, workspace 1 silent" + ]; + + bind = [ + "$mainMod Control_L, s, exec,[workspace 1] signal-desktop --password-store=\"kwallet6\"" + "$mainMod Control_L, s, focuswindow, class:^(signal)$" + "$mainMod Control_L, s, focuswindow, title:^(signal)$" + "$mainMod Control_L, v, sendshortcut, ctrl, k, class:^(vesktop)$" + "$mainMod Control_L, v, exec, uwsm app -- vesktop" + "$mainMod Control_L, v, focuswindow, class:^(vesktop)$" + ]; + extraConfig = + #hyprlang + '' + windowrule { + name = vesktop-dont-focus-pls + match:class = ^(vesktop)$ + no_initial_focus = 1 + focus_on_activate = 0 + render_unfocused = 1 + } + + ''; + }; +} diff --git a/modules/hypr/hyprland/apps/games.nix b/modules/hypr/hyprland/apps/games.nix new file mode 100644 index 0000000..f37240c --- /dev/null +++ b/modules/hypr/hyprland/apps/games.nix @@ -0,0 +1,41 @@ +{ ... }: + +{ + wayland.windowManager.hyprland = { + windowrule = [ + "match:class ^(steam)$, workspace 3 silent" + "match:class ^(heroic)$, workspace 3" + "match:class ^(net.lutris.Lutris)$, workspace 3" + "match:class ^(rpcs3)$, workspace 3" + ]; + + bind = [ + "$mainMod Control_L, g, exec, uwsm app -- steam" + "$mainMod Control_L, g, focuswindow, class:^(steam)$" + ]; + extraConfig = + #hyprlang + '' + windowrule { + name = steam-friends-list + match:title = ^(Lista znajomych)$ + float = 1 + center = 1 + size = 40% 60% + } + + windowrule { + name = prism-launcher + match:class = ^(org.prismlauncher.PrismLauncher)$ + workspace = 3 + } + + windowrule { + name = gamescope + match:class = ^(gamescope)$ + workspace = 3 + } + ''; + }; + +} diff --git a/modules/hypr/hyprland/apps/misc.nix b/modules/hypr/hyprland/apps/misc.nix new file mode 100644 index 0000000..f2f26d3 --- /dev/null +++ b/modules/hypr/hyprland/apps/misc.nix @@ -0,0 +1,58 @@ +{ ... }: + +{ + wayland.windowManager.hyprland = { + windowrule = [ + # general rules + "match:class ^(winboat)$, workspace 5" + "match:class ^(qemu)$, workspace 5" + "match:class ^(obsidian)$, workspace 6" + "match:class ^(gimp)$, workspace 8" + "match:class .*potify, workspace 9 silent" + "match:class ^(com.obsproject.Studio)$, workspace 10" + ]; + + bind = [ + "$mainMod, M, exec, [float] waypaper" + "$mainMod, RETURN, exec, [workspace 4] $terminal" + "$mainMod CONTROL_L, RETURN, exec, $terminal" + "$mainMod, space , exec, $menu" + "$mainMod ALT_L, c, exec, openrgb -c $openrgb_color" + "$mainMod Control_L, n, exec, [workspace 6] uwsm app -- $notes" + "$mainMod Control_L, n, focuswindow, class:^(obsidian)$" + "$mainMod Control_L, m, exec, [workspace 9] uwsm app -- $music_player" + "$mainMod CONTROL_L L_SHIFT, B, exec, killall ashell && uwsm app -- ashell" + ]; + + extraConfig = + #hyprlang + '' + windowrule { + name = pavucontrol-float + match:class = ^(org.pulseaudio.pavucontrol)$ + float = 1 + size = 80% 60% + stay_focused = 1 + center = 1 + pin = 1 + } + + windowrule { + name = share-picker-float + match:class = ^(hyprland-share-picker)$ + float = 1 + center = 1 + pin = 1 + } + + windowrule { + name = xdg-desktop-portal-gtk + match:class = ^(xdg-desktop-portal-gtk)$ + float = 1 + center = 1 + size = 55% 50% + } + + ''; + }; +} diff --git a/modules/hypr/hyprland/autostart.nix b/modules/hypr/hyprland/autostart.nix new file mode 100644 index 0000000..af9e1f9 --- /dev/null +++ b/modules/hypr/hyprland/autostart.nix @@ -0,0 +1,19 @@ +{ + userConfig, + pkgs, + ... +}: +let + uwsm_run = "${pkgs.uwsm}/bin/uwsm"; +in +{ + wayland.windowManager.hyprland = { + "exec-once" = [ + "wl-paste --type text --watch cliphist store" + "wl-paste --type image --watch cliphist store" + "${uwsm_run} -- ${userConfig.statusBar}" + "awww-daemon" + "openrgb -c $openrgb_color" + ]; + }; +} diff --git a/modules/hypr/hyprland/env.nix b/modules/hypr/hyprland/env.nix new file mode 100644 index 0000000..9c8c6b6 --- /dev/null +++ b/modules/hypr/hyprland/env.nix @@ -0,0 +1,47 @@ +{ + userConfig, + pkgs, + ... +}: +let + uwsm_run = "${pkgs.uwsm}/bin/uwsm"; + exe = pkg: bin: if userConfig.isNixOS then "${pkg}/bin/${bin}" else "/usr/bin/${bin}"; + jq = exe pkgs.jq "jq"; + grim = exe pkgs.grim "grim"; + satty = exe pkgs.satty "satty"; + wl_copy = exe pkgs.wl-clipboard "wl-copy"; + notify_send = exe pkgs.libnotify "notify-send"; + playerctl = exe pkgs.playerctl "playerctl"; +in +{ + wayland.windowManager.hyprland = { + settings = { + "$mainMod" = "SUPER"; + "$terminal" = "${uwsm_run} -- ${pkgs.kitty}/bin/kitty"; + "$menu" = "${pkgs.hyprlauncher}/bin/hyprlauncher"; + "$music_player" = + if userConfig.isNixOS then "${pkgs.spotify}/bin/spotify" else "flatpak run com.spotify.Client"; + "$notes" = "${pkgs.obsidian}/bin/obsidian"; + "$browser" = if userConfig.isNixOS then "zen-beta" else "zen-browser"; # beta on nixos + "$openrgb_color" = "09ce30"; + + env = [ + "XCURSOR_SIZE, 32" + "HYPRCURSOR_SIZE, 32" + "HYPRCURSOR_THEME, theme_phinger-cursors-light" + "XDG_CURRENT_DESKTOP,Hyprland" + ]; + + general = { + gaps_in = 4; + gaps_out = 6; + border_size = 4; + "col.active_border" = "$blue $sky"; + "col.inactive_border" = "$overlay1"; + resize_on_border = false; + allow_tearing = false; + layout = "scrolling"; + }; + }; + }; +} diff --git a/modules/hypr/hyprland/general.nix b/modules/hypr/hyprland/general.nix new file mode 100644 index 0000000..9de4c61 --- /dev/null +++ b/modules/hypr/hyprland/general.nix @@ -0,0 +1,105 @@ +{ + userConfig, + pkgs, + ... +}: +let + uwsm_run = "${pkgs.uwsm}/bin/uwsm"; + exe = pkg: bin: if userConfig.isNixOS then "${pkg}/bin/${bin}" else "/usr/bin/${bin}"; + jq = exe pkgs.jq "jq"; + grim = exe pkgs.grim "grim"; + satty = exe pkgs.satty "satty"; + wl_copy = exe pkgs.wl-clipboard "wl-copy"; + notify_send = exe pkgs.libnotify "notify-send"; + playerctl = exe pkgs.playerctl "playerctl"; +in +{ + wayland.windowManager.hyprland = { + + enable = true; + package = + if userConfig.isNixOS then + # inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland + pkgs.hyprland + else + null; + #portalPackage = lib.mkIf (userConfig.isNixOS + #) inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland; + + xwayland.enable = true; + general = { + gaps_in = 4; + gaps_out = 6; + border_size = 4; + "col.active_border" = "$blue $sky"; + "col.inactive_border" = "$overlay1"; + resize_on_border = false; + allow_tearing = false; + layout = "scrolling"; + }; + + ecosystem = { + enforce_permissions = true; + }; + + permission = [ + "^${pkgs.grim}$, screencopy, allow" + "^${pkgs.hyprlock}$, screencopy, allow" + "^${pkgs.xdg-desktop-portal-hyprland}$, screencopy, allow" + ]; + + misc = { + force_default_wallpaper = 0; + disable_hyprland_logo = true; + middle_click_paste = false; + }; + + xwayland = { + force_zero_scaling = 1; + }; + + quirks = { + prefer_hdr = 1; + }; + + windowrule = [ + # smart gaps + "border_size 0, match:float 0, match:workspace w[tv1]" + "rounding 0, match:float 0, match:workspace w[tv1]" + "border_size 0, match:float 0, match:workspace f[1]" + "rounding 0, match:float 0, match:workspace f[1]" + ]; + + bindt = [ + ", PRINT, exec, ${pkgs.writeShellScript "screenshot-region" '' + MONITOR=$(hyprctl monitors -j | ${jq} -r '.[] | select(.focused == true) | .name') + ${grim} -o "$MONITOR" - | ${satty} -f - + ''}" + + "$mainMod, PRINT, exec, ${pkgs.writeShellScript "screenshot-fullscreen" '' + target_path="$HOME/${userConfig.pathConfig.screenshot}/$(date +'%d-%m-%Y_%H-%M-%S').png" + mkdir -p "$(dirname "$target_path")" + + MONITOR=$(hyprctl monitors -j | ${jq} -r '.[] | select(.focused == true) | .name') + + ${grim} -o "$MONITOR" "$target_path" + ${wl_copy} < "$target_path" + ${notify_send} -i "$target_path" -u low -a "Screenshot" "Screenshot fullscreen" "Saved and copied" + ''}" + + "alt_l, PRINT, exec, ${pkgs.writeShellScript "screenshot-window" '' + target_path="$HOME/${userConfig.pathConfig.screenshot}/$(date +'%d-%m-%Y_%H-%M-%S').png" + mkdir -p "$(dirname "$target_path")" + + GEOMETRY=$(hyprctl activewindow -j | ${jq} -r '"\(.at[0]),\(.at[1]) \(.size[0])x\(.size[1])"') + + ${grim} -g "$GEOMETRY" "$target_path" + ${wl_copy} < "$target_path" + ${notify_send} -i "$target_path" -u low -a "Screenshot" "Screenshot window" "Saved and copied" + ''}" + + ", PAUSE, exec, ${playerctl} play-pause" + "$mainMod, PAUSE, exec, ${playerctl} play-pause --player spotify" + ]; + }; +} diff --git a/modules/hypr/hyprland/hardware.nix b/modules/hypr/hyprland/hardware.nix new file mode 100644 index 0000000..ccc5985 --- /dev/null +++ b/modules/hypr/hyprland/hardware.nix @@ -0,0 +1,86 @@ +{ ... }: + +{ + wayland.windowManager.hyprland = { + input = { + kb_layout = "pl"; + kb_variant = ""; + kb_model = ""; + kb_options = "caps:escape_shifted_capslock"; + kb_rules = ""; + follow_mouse = 1; + left_handed = false; + sensitivity = -0.5; + touchpad = { + natural_scroll = true; + }; + }; + + device = { + name = "msft0001:01-06cb:7f28-touchpad"; + sensitivity = 0; + }; + + cursor = { + no_hardware_cursors = true; + inactive_timeout = 5; + warp_on_change_workspace = 1; + zoom_factor = 1.0; + hide_on_key_press = 1; + }; + + bindel = [ + ",XF86MonBrightnessDown, exec, hyprctl hyprsunset gamma -10" + ",XF86MonBrightnessUp, exec, hyprctl hyprsunset gamma +10" + ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ && ~/.local/bin/wp-vol.sh && paplay /usr/share/sounds/freedesktop/stereo/bell.oga" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- && ~/.local/bin/wp-vol.sh && paplay /usr/share/sounds/freedesktop/stereo/bell.oga" + ", XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_SOURCE@ toggle" + ]; + + extraConfig = + #hyprlang + '' + monitorv2 { + output = DP-1 + mode = 2560x1440@180.06 + position = 0x0 + scale = 1 + vrr = 1 + supports_wide_color = 1 + bitdepth = 10 + sdr_min_luminance = 0.005 + sdr_max_luminance = 220 + cm = hdr + supports_hdr = 1 + } + + monitorv2 { + output = DP-2 + mode = 1920x1080@144 + position = auto-left + vrr = 1 + scale = 1.0 + } + + monitorv2 { + output = HDMI-A-2 + mode = highres + position = auto-up + scale = 1 + } + # for laptop + monitorv2 { + output = eDP-1 + mode = highres + position = 0x0 + scale = 1 + } + + monitorv2 { + output = + position = auto-right + scale = 1 + } + ''; + }; +} diff --git a/modules/hypr/hyprland/layouts.nix b/modules/hypr/hyprland/layouts.nix new file mode 100644 index 0000000..7dab019 --- /dev/null +++ b/modules/hypr/hyprland/layouts.nix @@ -0,0 +1,77 @@ +{ + ... +}: +{ + wayland.windowManager.hyprland = { + + dwindle = { + preserve_split = true; + }; + + master = { + new_status = "slave"; + allow_small_split = true; + orientation = "left"; + }; + }; + + bind = [ + "$mainMod, h, movefocus, l" + "$mainMod, l, movefocus, r" + "$mainMod, k, movefocus, u" + "$mainMod, j, movefocus, d" + "$mainMod, mouse_down, workspace, e+1" + "$mainMod, mouse_up, workspace, e-1" + "$mainMod L_SHIFT, right, exec, hyprctl dispatch movecurrentworkspacetomonitor +1" + "$mainMod L_SHIFT, left, exec, hyprctl dispatch movecurrentworkspacetomonitor -1" + # workspace management + "$mainMod, 1, workspace, 1" + "$mainMod, 2, workspace, 2" + "$mainMod, 3, workspace, 3" + "$mainMod, 4, workspace, 4" + "$mainMod, 5, workspace, 5" + "$mainMod, 6, workspace, 6" + "$mainMod, 7, workspace, 7" + "$mainMod, 8, workspace, 8" + "$mainMod, 9, workspace, 9" + "$mainMod, 0, workspace, 10" + # window management + "$mainMod SHIFT, 1, movetoworkspace, 1" + "$mainMod SHIFT, 2, movetoworkspace, 2" + "$mainMod SHIFT, 3, movetoworkspace, 3" + "$mainMod SHIFT, 4, movetoworkspace, 4" + "$mainMod SHIFT, 5, movetoworkspace, 5" + "$mainMod SHIFT, 6, movetoworkspace, 6" + "$mainMod SHIFT, 7, movetoworkspace, 7" + "$mainMod SHIFT, 8, movetoworkspace, 8" + "$mainMod SHIFT, 9, movetoworkspace, 9" + "$mainMod SHIFT, 0, movetoworkspace, 10" + # special workspace + "$mainMod, TAB, togglespecialworkspace, magic" + "$mainMod SHIFT, TAB, movetoworkspace, special:magic" + # layout + "$mainMod, S, layoutmsg, swapwithmaster" + "$mainMod, n, layoutmsg, swapnext" + "$mainMod, p, layoutmsg, swapprev" + ]; + + binde = [ + "$mainMod alt, equal, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 * 1.1}')" + "$mainMod alt, minus, exec, hyprctl -q keyword cursor:zoom_factor $(hyprctl getoption cursor:zoom_factor | awk '/^float.*/ {print $2 * 0.9}')" + "$mainMod L_SHIFT, l, resizeactive, 10 0" + "$mainMod L_SHIFT, h, resizeactive, -10 0" + "$mainMod L_SHIFT, k, resizeactive, 0 -10" + "$mainMod L_SHIFT, j, resizeactive, 0 10" + ]; + + bindd = [ + "$mainMod, F, Make app fullscreen, fullscreen" + "$mainMod, T, Toggle floating, togglefloating" + "$mainMod, Q, Kill active window, killactive" + ]; + + bindm = [ + "$mainMod, mouse:272, movewindow" + "$mainMod, mouse:273, resizewindow" + ]; +} diff --git a/modules/hypr/hyprland/looks.nix b/modules/hypr/hyprland/looks.nix new file mode 100644 index 0000000..5d1d4f9 --- /dev/null +++ b/modules/hypr/hyprland/looks.nix @@ -0,0 +1,58 @@ +{ + userConfig, + pkgs, + ... +}: +let +in +{ + wayland.windowManager.hyprland = { + animations = { + enabled = userConfig.animations; + bezier = [ + "easeOutQuint,0.23,1,0.32,1" + "easeInOutCubic,0.65,0.05,0.36,1" + "linear,0,0,1,1" + "almostLinear,0.5,0.5,0.75,1.0" + "quick,0.15,0,0.1,1" + ]; + animation = [ + "global, 1, 7, default" + "border, 1, 3.39, easeOutQuint" + "windows, 1, 2.79, easeOutQuint" + "windowsIn, 1, 2.1, easeOutQuint, popin 87%" + "windowsOut, 1, 1, linear, popin 87%" + "fadeIn, 1, 1.4, almostLinear" + "fadeOut, 1, 1.2, almostLinear" + "fade, 1, 3.03, quick" + "layers, 1, 2, easeOutQuint" + "layersIn, 1, 2, easeOutQuint, fade" + "layersOut, 1, 1, linear, fade" + "fadeLayersIn, 1, 1.4, almostLinear" + "fadeLayersOut, 1, 1.1, almostLinear" + "workspaces, 1, 1.4, quick, slidevert" + "workspacesIn, 1, 0.5, quick, slidevert" + "workspacesOut, 1, 0.5, quick, slidevert" + ]; + }; + + decoration = { + rounding = 1; + rounding_power = 2; + active_opacity = 1.0; + inactive_opacity = 1.0; + shadow = { + enabled = true; + range = 1; + render_power = 1; + color = "$overlay0"; + }; + blur = { + enabled = true; + size = 1; + passes = 1; + vibrancy = 0.1696; + }; + }; + }; +} diff --git a/modules/hypr/hyprland/workspaces.nix b/modules/hypr/hyprland/workspaces.nix new file mode 100644 index 0000000..4555792 --- /dev/null +++ b/modules/hypr/hyprland/workspaces.nix @@ -0,0 +1,20 @@ +{ ... }: +{ + + wayland.windowManager.hyprland = { + workspace = [ + "1, monitor:DP-2" + "1, layout: dwindle" + "2, monitor:DP-1" + "3, monitor:DP-1" + "4, monitor:DP-1" + "5, monitor:DP-1" + "6, monitor:DP-1" + "7, monitor:HDMI-A-2" + "9, monitor:DP-2" + "10, monitor:DP-2" + "w[tv1], gapsout:0, gapsin:0" + "f[1], gapsout:0, gapsin:0" + ]; + }; +}