{ config, pkgs, lib, ... }: { imports = [../theming/gruvbox.nix]; wayland.windowManager.hyprland.enable = true; wayland.windowManager.hyprland.plugins = ["${pkgs.hyprlandPlugins.hyprscroller}/lib/libhyprscroller.so"]; wayland.windowManager.hyprland.settings = { input = { kb_layout = "us,ua"; repeat_rate = 50; repeat_delay = 300; # mouse accel_profile = "flat"; sensitivity = 0; }; device = [ { name = "at-translated-set-2-keyboard"; kb_variant = "colemak_dh,"; } { name = "keyd-virtual-keyboard"; kb_variant = "colemak_dh,"; } ]; monitor = [ ", preferred, auto, 1" "eDP-1, preferred, auto, 1.2" ]; env = [ "QT_QPA_PLATFORM,wayland" "QT_QPA_PLATFORMTHEME,gtk3" ]; decoration = { # shadow_offset = "0 5"; # "col.shadow" = "rgba(00000099)"; rounding = 12; }; bezier = [ "easeOutQuad, 0.25, 0.46, 0.45, 0.94" "easeOutExpo, 0.19, 1, 0.22, 1" ]; animation = [ "workspaces, 1, 3, easeOutExpo, slidefade 20%" "windows, 1, 3, easeOutExpo, popin 80%" "layers, 1, 2, easeOutExpo, fade" ]; "$mod" = "SUPER"; "$modShift" = "$mod SHIFT"; "$modCtrl" = "$mod CTRL"; "$modShiftCtrl" = "$mod SHIFT CTRL"; "$left" = "N"; "$down" = "E"; "$up" = "I"; "$right" = "O"; "$terminal" = "kitty"; "$screenLocker" = "hyprlock"; "$webBrowser" = "io.github.zen_browser.zen"; "$clipboardManager" = "copyq menu"; general = { gaps_in = 4; gaps_out = 4; border_size = 4; allow_tearing = true; layout = "scroller"; }; bind = [ "$mod, Return, exec, $terminal" "$mod, Space, exec, fuzzel" "$mod, Escape, exec, hyprctl switchxkblayout all next" "$mod, M, scroller:fitsize, active" "$mod, K, scroller:cyclesize" "$modCtrl, H, killactive" "$modCtrl, M, fullscreen" "$modCtrl, L, exec, $screenLocker" "$modCtrl, B, exec, $webBrowser" "$modCtrl, V, exec, $clipboardManager" ", Print, exec, grimblast --freeze copy area" #${xdg.userDirs.pictures}/screenshots/" "CTRL, Print, exec, grimblast --freeze copy active" #${xdg.userDirs.pictures}/screenshots/" "SHIFT, Print, exec, grimblast --freeze copy output" #${xdg.userDirs.pictures}/screenshots/" # navigation #"$modCtrl, N," "$mod, $left, scroller:movefocus, l" "$mod, $down, scroller:movefocus, d" "$mod, $up, scroller:movefocus, u" "$mod, $right, scroller:movefocus, r" "$modshift, $left, workspace, e-1" "$modshift, $right, workspace, e+1" "$mod, left, scroller:movefocus, l" "$mod, up, scroller:movefocus, u" "$mod, down, scroller:movefocus, d" "$mod, right, scroller:movefocus, r" "$modShift, left, workspace, e-1" "$modShift, right, workspace, e+1" "$modCtrl, $left, scroller:movewindow, l" "$modCtrl, $down, scroller:movewindow, d" "$modCtrl, $up, scroller:movewindow, u" "$modCtrl, $right, scroller:movewindow, r" "$modCtrl, left, scroller:movewindow, l" "$modCtrl, up, scroller:movewindow, u" "$modCtrl, down, scroller:movewindow, d" "$modCtrl, right, scroller:movewindow, r" # workspaces "$mod, 1, workspace, 1" "$mod, 2, workspace, 2" "$mod, 3, workspace, 3" "$mod, 4, workspace, 4" "$mod, 5, workspace, 5" "$mod, 6, workspace, 6" "$mod, 7, workspace, 7" "$mod, 8, workspace, 8" "$mod, 9, workspace, 9" "$mod, 0, workspace, 10" "$modShiftCtrl, 1, movetoworkspace, 1" "$modShiftCtrl, 2, movetoworkspace, 2" "$modShiftCtrl, 3, movetoworkspace, 3" "$modShiftCtrl, 4, movetoworkspace, 4" "$modShiftCtrl, 5, movetoworkspace, 5" "$modShiftCtrl, 6, movetoworkspace, 6" "$modShiftCtrl, 7, movetoworkspace, 7" "$modShiftCtrl, 8, movetoworkspace, 8" "$modShiftCtrl, 9, movetoworkspace, 9" "$modShiftCtrl, 0, movetoworkspace, 10" "$modShiftCtrl, $left, movetoworkspace, e-1" "$modShiftCtrl, $right, movetoworkspace, e+1" "$modShiftCtrl, left, movetoworkspace, e-1" "$modShiftCtrl, right, movetoworkspace, e+1" ]; binde = [ "$mod, comma, resizeactive, -10 0" "$mod, period, resizeactive, 10 0" "$modShift, comma, resizeactive, 0 -10" "$modShift, period, resizeactive, 0 10" ]; bindl = [ ", switch:on:Lid Switch, exec, hyprctl keyword monitor 'eDP-1, disable'" ", switch:off:Lid Switch, exec, hyprctl keyword monitor 'eDP-1, auto, preferred, 1.2'" ", XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+" ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" ", XF86AudioPlay, exec, playerctl play-pause" ", XF86AudioPrev, exec, playerctl previous" ", XF86AudioNext, exec, playerctl next" "$modCtrl, Escape, exit" ]; bindm = [ # mouse movements "$mod, mouse:272, movewindow" "$mod, mouse:273, resizewindow" "$mod ALT, mouse:272, resizewindow" ]; gestures = { workspace_swipe = true; workspace_swipe_fingers = 3; workspace_swipe_distance = 500; }; windowrulev2 = [ "float, class:(com.github.hluk.copyq)" "float, class:(com.mojang.minecraft.java-edition)" "immediate, class:(com.mojang.minecraft.java-edition)" ]; }; services.hyprpaper = { enable = true; }; services.hypridle = { enable = true; settings = { general = { lock_cmd = "hyprlock"; }; listener = [ { timeout = 600; on-timeout = "hyprlock"; } { timeout = 601; on-timeout = "hyprctl dispatch dpms off"; on-resume = "hyprctl dispatch dpms on"; } ]; }; }; services.playerctld.enable = true; services.gnome-keyring = { enable = true; components = ["secrets" "ssh"]; }; services.ssh-agent.enable = true; programs.keychain = { enable = true; keys = ["gitea-local"]; enableNushellIntegration = true; extraFlags = [ "--quiet" "--noask" ]; }; services.network-manager-applet.enable = true; services.copyq.enable = true; stylix.targets.waybar.enable = false; programs.waybar = { enable = true; #package = pkgs.waybar-0.11.0"; systemd = { enable = true; target = "graphical-session.target"; }; settings = { bar-0 = { layer = "top"; position = "top"; height = 40; spacing = 4; margin-left = 8; margin-right = 8; margin-top = 4; reload_style_on_change = true; modules-left = [ #"custom/notification" "group/hypr" "wlr/taskbar" ]; modules-center = ["clock" "privacy"]; modules-right = [ "tray" "wireplumber" "group/laptop" "idle_inhibitor" ]; "hyprland/workspaces" = { format = "{id}"; format-icons = { focused = "󰗝"; active = "󰻃"; default = "󰄰"; }; }; "hyprland/language" = { format = "{}"; format-en = "🇺🇸"; format-uk = "🇺🇦"; }; "custom/separator" = { format = "|"; interval = "once"; tooltip = false; }; "custom/text" = { format = "here will be workspaces"; interval = "once"; tooltip = false; }; "group/hypr" = { orientation = "inherit"; modules = [ "hyprland/language" "hyprland/workspaces" ]; }; "group/laptop" = { orientation = "inherit"; drawer = { transition-duration = 500; children-class = "laptop"; transition-left-to-right = false; }; modules = [ "battery" "power-profiles-daemon" "custom/separator" "custom/kbd-backlight" "custom/separator" "backlight" "custom/separator" ]; }; "idle_inhibitor" = { format = "{icon}"; format-icons = { activated = "󰈈"; deactivated = "󰈉"; }; }; "tray" = { icon-size = 24; spacing = 3; }; "clock" = { interval = 1; format = "{:%H:%M:%S}"; tooltip-format = "{:%d.%m.%Y}"; }; "backlight" = { device = "intel_backlight"; format = "{percent}% {icon}"; format-icons = ["󰃞" "󰃟" "󰃝" "󰃠"]; on-scroll-up = "light -A 2%"; on-scroll-down = "light -U 2%"; }; "custom/kbd-backlight" = { exec = "cat /sys/class/leds/platform::kbd_backlight/brightness"; interval = 1; format = "{}% {icon}"; format-icons = ["󰌌"]; on-scroll-up = "light -s sysfs/leds/platform::kbd_backlight -A 5%"; on-scroll-down = "light -s sysfs/leds/platform::kbd_backlight -U 5%"; }; battery = { states = { good = 95; warning = 30; critical = 15; }; format = "{capacity}% {icon}"; format-full = "{capacity}% 󱟢"; format-charging = "{capacity}% 󰂄"; format-plugged = "{capacity}% 󰚥"; format-alt = "{icon} {time}"; format-icons = ["󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"]; }; "upower" = { icon-size = 16; format = "{percentage}"; hide-if-empty = true; tooltip = true; tooltip-spacing = 20; }; "power-profiles-daemon" = { format = "{icon}"; tooltip-format = "Power profile: {profile}\nDriver: {driver}"; tooltip = true; format-icons = { default = "󱡮"; performance = "󱡮"; balanced = ""; power-saver = ""; }; }; "wireplumber" = { scroll-step = 3; format = "{volume}% {icon}"; format-muted = "󰖁"; format-icons = ["󰕿" "󰖀" "󰕾"]; on-click = "pwvucontrol"; on-click-right = "wpctl set-mute @DEFAULT_SINK@ toggle"; }; "custom/notification" = { tooltip = false; format = "{icon}"; format-icons = { notification = ""; none = ""; dnd-notification = ""; dnd-none = ""; }; return-type = "json"; exec-if = "which swaync-client"; exec = "swaync-client -swb"; on-click = "swaync-client -t -sw"; on-click-right = "swaync-client -d -sw"; escape = true; }; "privacy" = { # icon-spacing = 4; icon-size = 16; transition-duration = 250; screenshare = { type = "screenshare"; tooltip = true; tooltip-icon-size = 24; }; audio-in = { type = "audio-in"; tooltip = true; tooltip-icon-size = 24; }; }; "wlr/taskbar" = { format = "{icon}"; icon-size = 24; icon-theme = "${config.dconf.settings."org/gnome/desktop/interface".icon-theme}"; tooltip-format = "{title}"; on-click = "activate"; }; }; }; style = '' @define-color base00 #${config.lib.stylix.colors.base00}; @define-color base01 #${config.lib.stylix.colors.base01}; @define-color base02 #${config.lib.stylix.colors.base02}; @define-color base03 #${config.lib.stylix.colors.base03}; @define-color base04 #${config.lib.stylix.colors.base04}; @define-color base05 #${config.lib.stylix.colors.base05}; @define-color base06 #${config.lib.stylix.colors.base06}; @define-color base07 #${config.lib.stylix.colors.base07}; @define-color base08 #${config.lib.stylix.colors.base08}; @define-color base09 #${config.lib.stylix.colors.base09}; @define-color base0A #${config.lib.stylix.colors.base0A}; @define-color base0B #${config.lib.stylix.colors.base0B}; @define-color base0C #${config.lib.stylix.colors.base0C}; @define-color base0D #${config.lib.stylix.colors.base0D}; @define-color base0E #${config.lib.stylix.colors.base0E}; @define-color base0F #${config.lib.stylix.colors.base0F}; * { font-family: Iosevka Nerd Font Propo, FontAwesome; font-size: 100%; /* margin: 0px 2px 2px 2px; */ } window#waybar { background-color: transparent; /* border-top: 3px solid @overlay0; */ color: @base05; /* padding: 0px 2px 0px 0px; */ transition-property: background-color; transition-duration: 0.5s; } .modules-left { border-radius: 12px; margin-right: 4px; } .modules-center { border-radius: 12px; } .modules-right { border-radius: 12px; margin-left: 4px; } tooltip { background: @base01; border: 1px solid @base0E; } tooltip label { color: @base05; } /* .modules-center { margin: 4px; margin-top: 6px; }*/ button { box-shadow: inset 0 -3px transparent; border-radius: 12px; } /* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ button:hover { background: inherit; box-shadow: inset 0 -3px transparent; } #mode { background-color: rgba(0, 0, 0, 0.2); box-shadow: inset 0 -3px @base05; } #clock, #battery, #cpu, #memory, #disk, #temperature, #backlight, #custom-kbd-backlight, #workspaces, #network, #pulseaudio, #wireplumber, #custom-media, #laptop, #tray, #mode, #privacy #privacy-item, #idle_inhibitor, #backlight-slider, #custom-notification, #scratchpad, #power-profiles-daemon, #taskbar, #language, #upower, #mpris, #mpd { padding: 0 0.8em; border-radius: 12px; color: @base05; background-color: @base00; } /* #upower, */ #battery, #backlight, #custom-kbd-backlight, #backlight-slider, #cpu, #memory, #disk, #network, #wireplumber, #power-profiles-daemon { padding-right: 0.8em; } #language { padding-right: 0; border-top-right-radius: 0; border-bottom-right-radius: 0; } #workspaces { border-top-left-radius: 0; border-bottom-left-radius: 0; } #taskbar, #workspaces { padding: 0 0.5em; } #taskbar button, #workspaces button { padding: 0 0.2em; } #workspaces button.active { color: @base0D; } #taskbar button:hover { box-shadow: transparent; } #taskbar.empty, window#empty { background-color: transparent; } #battery.critical:not(.charging) { background-color: @base09; color: @base00; animation-name: blink; animation-duration: 0.5s; animation-timing-function: steps(12); animation-iteration-count: infinite; animation-direction: alternate; } #power-profiles-daemon.performance { background-color: @base00; color: #000000; } #power-profiles-daemon.balanced { background-color: @base00; color: @base0E; } #power-profiles-daemon.power-saver { background-color: @base00; color: @base08; } label:focus { background-color: #000000; } #tray > .passive { -gtk-icon-effect: dim; } #tray > .needs-attention { -gtk-icon-effect: highlight; background-color: #eb4d4b; } #idle_inhibitor { padding: 0 0.9em; } #idle_inhibitor:hover { box-shadow: inset 0 -3px @base05; } #idle_inhibitor.activated { background-color: @base05; color: @base00; } #idle_inhibitor.activated:hover { box-shadow: inset 0 -3px @base00; } #laptop, #privacy { padding: 0em; } #privacy-item.screenshare { background-color: @base00; color: @base0C; } #privacy-item.audio-in { background-color: @base00; color: @base0E; } #privacy-item.audio-out { background-color: @base; } ''; }; programs.fuzzel = { enable = true; settings = { main = { terminal = "${pkgs.wezterm}/bin/wezterm -e"; fields = "filename,name,generic,keywords,categories,exec"; match-mode = "fuzzy"; icon-theme = "${config.dconf.settings."org/gnome/desktop/interface".icon-theme}"; }; border = { width = 4; radius = 12; }; }; }; services.dunst = { enable = true; settings = { global = { width = 300; height = 300; icon_theme = "${config.dconf.settings."org/gnome/desktop/interface".icon-theme}"; corner_radius = 12; #corners = "top-right,bottom-left"; offset = "12x12"; origin = "top-right"; timeout = 15; frame_width = 4; notification_limit = 5; }; rule-telegram = { "desktop_entry" = "org.telegram.desktop"; "urgency" = "normal"; }; }; }; programs.hyprlock = { enable = true; settings = { general = { disable_loading_bar = true; #grace = 300; hide_cursor = true; no_fade_in = false; }; background = [ { path = "screenshot"; blur_passes = 3; blur_size = 8; } ]; input-field = [ { size = "274, 50"; rounding = 12; outline_thickness = 4; position = "0, -30"; monitor = ""; dots_center = true; fade_on_empty = false; font_family = "${config.stylix.fonts.serif.name}"; font_color = "rgb(${config.lib.stylix.colors.base05})"; inner_color = "rgb(${config.lib.stylix.colors.base00})"; outer_color = "rgb(${config.lib.stylix.colors.base0D})"; check_color = "rgb(${config.lib.stylix.colors.base0A})"; fail_color = "rgb(${config.lib.stylix.colors.base08})"; placeholder_text = "locked..."; fail_text = "wrong"; #placeholder_text = '\'Password...'\'; shadow_passes = 0; } ]; shape = [ { rounding = 12; #border_size = 3; size = "150, 50"; color = "rgb(${config.lib.stylix.colors.base00})"; border_color = "rgb(${config.lib.stylix.colors.base0D})"; position = "-62, 30"; halign = "center"; valign = "center"; } { rounding = 12; #border_size = 3; size = "120, 50"; color = "rgb(${config.lib.stylix.colors.base00})"; border_color = "rgb(${config.lib.stylix.colors.base0D})"; position = "77, 28"; halign = "center"; valign = "center"; } ]; label = [ { monitor = ""; text = "$LAYOUT"; #"cmd[update:1000] ${pkgs.uutils-coreutils-noprefix}/bin/echo $(${pkgs.uutils-coreutils-noprefix}/bin/date +%H:%M:%S)"; #text = "$TIME text_align = "center"; font_size = 16; font_family = "${config.stylix.fonts.serif.name}"; outer_color = "rgb(${config.lib.stylix.colors.base00})"; color = "rgb(${config.lib.stylix.colors.base05})"; position = "-62, 28"; halign = "center"; valign = "center"; } { monitor = ""; text = "cmd[update:1000] ${pkgs.uutils-coreutils-noprefix}/bin/echo $(${pkgs.uutils-coreutils-noprefix}/bin/date +%H:%M:%S)"; #text = "$TIME text_align = "center"; font_size = 16; font_family = "${config.stylix.fonts.serif.name}"; outer_color = "rgb(${config.lib.stylix.colors.base00})"; color = "rgb(${config.lib.stylix.colors.base05})"; position = "77, 28"; halign = "center"; valign = "center"; } ]; }; }; services.wlsunset = { enable = true; latitude = "49.6"; longitude = "36.1"; temperature = { day = 6500; night = 3000; }; systemdTarget = "graphical-session.target"; }; services.udiskie = { enable = true; automount = false; notify = true; tray = "auto"; }; home.packages = with pkgs; [ dconf glib grimblast grim slurp libnotify playerctl wdisplays pwvucontrol wl-clipboard-rs polkit_gnome papirus-icon-theme ]; gtk = { enable = true; #iconTheme = { # name = "Papirus-Dark"; # package = pkgs.papirus-icon-theme; }; qt = { enable = true; platformTheme.name = "gtk3"; }; xdg.mime.enable = true; xdg.mimeApps = { enable = true; defaultApplications = let file_manager = ["yazi.desktop"]; web_browser = ["io.github.zen_browser.zen.desktop"]; image_viewer = ["imv.desktop"]; video_player = ["io.mpv.Mpv.desktop"]; pdf_reader = ["org.pwmt.zathura-pdf-mupdf.desktop"]; in { "inode/directory" = file_manager; "video/x-matroska" = video_player; "application/pdf" = pdf_reader; }; }; xdg.userDirs = { enable = true; createDirectories = true; templates = "${config.home.homeDirectory}/temps"; publicShare = "${config.home.homeDirectory}/pub"; desktop = "${config.home.homeDirectory}/desktop"; download = "${config.home.homeDirectory}/downloads"; documents = "${config.home.homeDirectory}/docs"; pictures = "${config.home.homeDirectory}/pics"; videos = "${config.home.homeDirectory}/vids"; music = "${config.home.homeDirectory}/music"; }; systemd.user.settings.Manager.DefaultEnvironment = { QT_QPA_PLATFORMTHEME = "gtk3"; QT_QPA_PLATFORM = "wayland"; #DISPLAY = ":123"; }; systemd.user.targets.tray = { # workaround for udiskie Unit = { Description = "Home Manager System Tray"; }; }; systemd.user.services = { udiskie = { Unit = { PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; Requisite = ["graphical-session.target"]; }; Install = { WantedBy = ["hyprland.service"]; }; }; waybar = { # Unit = { # Description = "Swaync notification daemon"; # }; Unit = { PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; Requisite = ["graphical-session.target"]; }; Install = { WantedBy = ["hyprland.service"]; }; }; copyq = { Unit = { PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; Requisite = ["graphical-session.target"]; }; Install = { WantedBy = ["hyprland.service"]; }; Service = { Environment = lib.mkForce "QT_QPA_PLATFORM=wayland"; Restart = "on-failure"; RestartSec = 1; TimeoutStopSec = 10; }; }; network-manager-applet = { Unit = { PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; Requisite = ["graphical-session.target"]; }; Install = { WantedBy = ["hyprland.service"]; }; }; gnome-polkit-agent = { Unit = { PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; Requisite = ["graphical-session.target"]; }; Install = { WantedBy = ["hyprland.service"]; }; Service = { Type = "simple"; ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; Restart = "on-failure"; RestartSec = 1; TimeoutStopSec = 10; }; }; wlsunset = { Unit = { PartOf = ["graphical-session.target"]; After = ["graphical-session.target"]; Requisite = ["graphical-session.target"]; }; Install = { WantedBy = ["hyprland.service"]; }; }; }; }