diff --git a/flake.nix b/flake.nix index 54c368c..baed75e 100644 --- a/flake.nix +++ b/flake.nix @@ -41,7 +41,9 @@ flake-parts.lib.mkFlake {inherit inputs;} { systems = ["x86_64-linux"]; imports = [ + inputs.home-manager.flakeModules.home-manager ./hosts/comfy-station + (./home + "/jonas@comfy-station") (import-tree ./modules) ]; }; diff --git a/home/jonas@comfy-station/borg.nix b/home/jonas@comfy-station/borg.nix new file mode 100644 index 0000000..fb1fcfa --- /dev/null +++ b/home/jonas@comfy-station/borg.nix @@ -0,0 +1,131 @@ +{config, ...}: let + defaultChecks = [ + { + name = "repository"; + frequency = "2 weeks"; + } + { + name = "archives"; + frequency = "4 weeks"; + } + { + name = "data"; + frequency = "6 weeks"; + } + { + name = "extract"; + frequency = "6 weeks"; + } + ]; + passwordFile = "${config.home.homeDirectory}/.config/borg/password"; + encCmd = ''cat ${passwordFile}''; + repo = "ssh://borg.jroeger.de/./comfy-station"; +in { + sops.secrets = { + "borg/password" = { + sopsFile = ../../secrets/jonas/borg.yaml; + key = "password"; + path = passwordFile; + }; + }; + + services.borgmatic.enable = true; + services.borgmatic.frequency = "hourly"; + + programs.borgmatic.enable = true; + programs.borgmatic.backups = { + workspaces = { + location = { + sourceDirectories = ["${config.xdg.userDirs.extraConfig.XDG_WORKSPACES_DIR}"]; + repositories = [repo]; + excludeHomeManagerSymlinks = true; + extraConfig = { + archive_name_format = "{hostname}-workspaces-{now}"; + exclude_patterns = [ + "*/.venv" + "__pycache__" + ]; + }; + }; + retention = { + keepDaily = 7; + keepHourly = 12; + keepWeekly = 4; + keepMonthly = 6; + }; + storage = { + encryptionPasscommand = encCmd; + }; + consistency.checks = defaultChecks; + }; + media = { + location = { + sourceDirectories = [ + "${config.xdg.userDirs.documents}" + "${config.xdg.userDirs.music}" + "${config.home.homeDirectory}/org" + "${config.home.homeDirectory}/Obsidian" + "${config.home.homeDirectory}/Zotero" + ]; + repositories = [repo]; + excludeHomeManagerSymlinks = true; + extraConfig = { + archive_name_format = "{hostname}-media-{now}"; + }; + }; + retention = { + keepDaily = 7; + keepWeekly = 2; + keepMonthly = 6; + }; + storage = { + encryptionPasscommand = encCmd; + }; + consistency.checks = defaultChecks; + }; + sec = { + location = { + sourceDirectories = [ + "${config.xdg.configHome}/sops" + "${config.home.homeDirectory}/Stuff/sec" + "${config.home.homeDirectory}/.password-store" + ]; + repositories = [repo]; + excludeHomeManagerSymlinks = true; + extraConfig = { + archive_name_format = "{hostname}-sec-{now}"; + }; + }; + retention = { + keepDaily = 7; + keepWeekly = 2; + keepMonthly = 6; + }; + storage = { + encryptionPasscommand = encCmd; + }; + consistency.checks = defaultChecks; + }; + var = { + location = { + sourceDirectories = [ + "${config.xdg.userDirs.desktop}" + ]; + repositories = [repo]; + excludeHomeManagerSymlinks = true; + extraConfig = { + archive_name_format = "{hostname}-var-{now}"; + }; + }; + retention = { + keepDaily = 7; + keepWeekly = 2; + keepMonthly = 6; + }; + storage = { + encryptionPasscommand = encCmd; + }; + consistency.checks = defaultChecks; + }; + }; +} diff --git a/home/jonas@comfy-station/configuration.nix b/home/jonas@comfy-station/configuration.nix new file mode 100644 index 0000000..a780603 --- /dev/null +++ b/home/jonas@comfy-station/configuration.nix @@ -0,0 +1,101 @@ +{ + config, + lib, + ... +}: { + imports = [ + ./borg.nix + ]; + + # Home Manager needs a bit of information about you and the paths it should + # manage. + home.username = "jonas"; + home.homeDirectory = "/home/jonas"; + + sops = { + age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt"; + }; + + # hive modules + #hive.waybar.enable = true; + #hive.wlogout.enable = true; + #hive.wofi.enable = true; + #hive.kitty.enable = true; + #hive.nextcloud.enable = true; + #hive.firefox = { + # enable = true; + # plasmaIntegration = true; + # passFF = true; + #}; + #hive.kdeconnect.enable = true; + #hive.ranger.enable = true; + #hive.ssh = { + # enable = true; + # sopsFile = ../secrets/jonas/ssh.yaml; + # keys = ["borg" "passgit"]; + #}; + #hive.yubikey.enable = true; + #hive.yubikey.withCCID = false; + #hive.zsh.enable = true; + #hive.nix-scripts.enable = true; + #hive.doom.enable = true; + #hive.doom.asDefaultEditor = true; + #hive.doom.enableCopilot = true; + #hive.doom.withNixPkgs = true; + #hive.doom.withShellPkgs = true; + #hive.doom.withPythonPkgs = true; + #hive.jj.enable = true; + + # Make session variables available in systemd units + # SEE: https://github.com/nix-community/home-manager/pull/5543 + # systemd.user.settings.Manager.DefaultEnvironment = + # lib.mapAttrs (_: lib.mkDefault) config.home.sessionVariables; + + xdg.mimeApps = { + enable = true; + + defaultApplications = { + "text/html" = "firefox.desktop"; + "x-scheme-handler/http" = "firefox.desktop"; + "x-scheme-handler/https" = "firefox.desktop"; + "x-scheme-handler/about" = "firefox.desktop"; + "x-scheme-handler/unknown" = "firefox.desktop"; + }; + }; + xdg.userDirs.enable = true; + xdg.userDirs.createDirectories = true; + xdg.userDirs.extraConfig = { + XDG_WORKSPACES_DIR = "${config.home.homeDirectory}/Workspaces"; + XDG_NEXTCLOUD_DIR = "${config.home.homeDirectory}/Nextcloud"; + XDG_NOTES_DIR = "${config.home.homeDirectory}/Notes"; + }; + + # 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.11"; # Please read the comment before changing. + + home.sessionVariables = { + EDITOR = lib.mkDefault "vim"; + }; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; + + # Git + programs.difftastic.enable = true; + programs.difftastic.git.enable = true; + programs.git = { + enable = true; + settings.user.name = "Jonas Röger"; + settings.user.email = "jonas.roeger@tu-dortmund.de"; + signing = { + signByDefault = true; + key = "4000EB35E1AE0F07"; + }; + }; +} diff --git a/home/jonas@comfy-station/default.nix b/home/jonas@comfy-station/default.nix new file mode 100644 index 0000000..4dfc26f --- /dev/null +++ b/home/jonas@comfy-station/default.nix @@ -0,0 +1,21 @@ +{ + self, + inputs, + ... +}: { + flake.homeConfigurations."jonas@comfy-station" = inputs.home-manager.lib.homeManagerConfiguration { + pkgs = import inputs.nixpkgs {system = "x86_64-linux";}; + modules = [ + ({...}: {nixpkgs.overlays = [self.overlays.unstable inputs.audio.overlays.default];}) + ({...}: {nixpkgs.config.allowUnfree = true;}) + + ./configuration.nix + + inputs.sops-nix.homeManagerModules.sops + self.homeModules.layan + self.homeModules.hyprland + self.homeModules.swaync + self.homeModules.waybar + ]; + }; +} diff --git a/hosts/comfy-station/default.nix b/hosts/comfy-station/default.nix index 36912ad..c327758 100644 --- a/hosts/comfy-station/default.nix +++ b/hosts/comfy-station/default.nix @@ -7,7 +7,6 @@ modules = [ ({...}: { nixpkgs.config.allowUnfree = true; - nixpkgs.overlays = [self.overlays.unstable self.overlays.bulk-transcode]; }) ./configuration.nix @@ -25,6 +24,8 @@ self.nixosModules.games self.nixosModules.creative self.nixosModules.openhantek + self.nixosModules.unstable-overlay + self.nixosModules.bulk-transcode-overlay ]; }; } diff --git a/modules/desktop/hyprland.nix b/modules/desktop/hyprland.nix index 93cae48..8665a0a 100644 --- a/modules/desktop/hyprland.nix +++ b/modules/desktop/hyprland.nix @@ -53,4 +53,380 @@ security.pam.services.hyprlock = {}; }; }; + + flake.homeModules.hyprland = {pkgs, ...}: let + screenshot = pkgs.writeShellScriptBin "screenshot" '' + region=0 + clip=0 + while [[ "$#" -gt 0 ]]; do + case $1 in + --region) region=1; ;; + --clip) clip=1; ;; + *) echo "Unknown parameter passed: $1"; exit 1 ;; + esac + shift + done + + if [[ $region -eq 1 ]]; then + if [[ $clip -eq 1 ]]; then + ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" - | ${pkgs.wl-clipboard}/bin/wl-copy + else + ${pkgs.grim}/bin/grim -g "$(${pkgs.slurp}/bin/slurp)" ~/Pictures/Screenshots/$(${pkgs.coreutils}/bin/date +'%Y-%m-%d_%H-%M-%S').png + fi + else + if [[ $clip -eq 1 ]]; then + ${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy + else + ${pkgs.grim}/bin/grim ~/Pictures/Screenshots/$(${pkgs.coreutils}/bin/date +'%Y-%m-%d_%H-%M-%S').png + fi + fi + ''; + in { + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = false; + systemd.variables = ["--all"]; + xwayland.enable = true; + }; + + home.packages = with pkgs; [ + wl-clipboard + ]; + + services.wpaperd = { + enable = true; + settings = { + default = { + path = ../../static/wallpaper/stones.jpg; + }; + }; + }; + + services.hypridle.enable = true; + services.hypridle.settings = { + general = { + # lock_cmd = notify-send "lock!" # dbus/sysd lock command (loginctl lock-session) + # unlock_cmd = notify-send "unlock!" # same as above, but unlock + ignore_dbus_inhibit = "false"; # whether to ignore dbus-sent idle-inhibit requests (used by e.g. firefox or steam) + lock_cmd = "pidof hyprlock || hyprlock"; # avoid starting multiple hyprlock instances. + before_sleep_cmd = "loginctl lock-session"; # lock before suspend. + after_sleep_cmd = "hyprctl dispatch dpms on"; # to avoid having to press a key twice to turn on the display. + }; + + listener = [ + # Screenlock + { + timeout = 180; # in seconds + on-timeout = "hyprlock"; # command to run when timeout has passed + # on-resume = notify-send "Welcome back to your desktop!" # command to run when activity is detected after timeout has fired. + } + # Suspend + { + timeout = 360; # in seconds + on-timeout = "systemctl suspend"; # command to run when timeout has passed + # on-resume = notify-send "Welcome back to your desktop!" # command to run when activity is detected after timeout has fired. + } + ]; + }; + + programs.hyprlock = { + enable = true; + settings = { + background = [ + { + path = "screenshot"; # only png supported for now + # color = $color1 + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_size = 4; + blur_passes = 3; # 0 disables blurring + noise = 0.0117; + contrast = 1.3000; # Vibrant!!! + brightness = 0.8000; + vibrancy = 0.2100; + vibrancy_darkness = 0.0; + } + ]; + + # Hours + label = [ + { + text = ''cmd[update:1000] echo " $(date +"%H") "''; + #color = $color6 + font_size = 112; + # font_family = Geist Mono 10 + shadow_passes = 3; + shadow_size = 4; + + position = "0, 220"; + halign = "center"; + valign = "center"; + } + { + text = ''cmd[update:1000] echo " $(date +"%M") "''; + # color = $color6 + font_size = 112; + # font_family = Geist Mono 10 + shadow_passes = 3; + shadow_size = 4; + + position = "0, 80"; + halign = "center"; + valign = "center"; + } + { + text = ''cmd[update:18000000] echo " "$(date +'%A')" "''; + # color = $color7 + font_size = 22; + # font_family = JetBrainsMono Nerd Font 10 + + position = "0, -10"; + halign = "center"; + valign = "center"; + } + { + text = ''cmd[update:18000000] echo " "$(${pkgs.coreutils-full}/bin/date +'%d %b')" "''; + # color = $color7 + font_size = 18; + #font_family = JetBrainsMono Nerd Font 10 + + position = "0, -40"; + halign = "center"; + valign = "center"; + } + { + text = ''cmd[update:18000000] echo "So ca. $(${pkgs.curl}/bin/curl -s 'wttr.in?format=%t' | ${pkgs.coreutils-full}/bin/tr -d '+') oder watt."''; + #color = $color7 + font_size = 18; + # font_family = Geist Mono 10 + + position = "0, 40"; + halign = "center"; + valign = "bottom"; + } + ]; + + input-field = [ + { + size = "250, 50"; + outline_thickness = 3; + + dots_size = 0.26; # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.64; # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true; + dots_rouding = -1; + + rounding = 22; + # outer_color = $color0 + # inner_color = $color0 + # font_color = $color6 + fade_on_empty = true; + placeholder_text = ''Password...''; # Text rendered in the input box when it's empty. + + position = "0, 120"; + halign = "center"; + valign = "bottom"; + } + ]; + }; + }; + + wayland.windowManager.hyprland = { + settings = { + exec-once = [ + "${pkgs.wpaperd}/bin/wpaperd &" + ]; + + "$mod" = "SUPER"; + bind = + [ + "$mod, RETURN, exec, ${pkgs.kitty}/bin/kitty" + "$mod, d, exec, ${pkgs.wofi}/bin/wofi --show drun" + "$mod, h, movefocus, l" + "$mod, j, movefocus, d" + "$mod, k, movefocus, u" + "$mod, l, movefocus, r" + "$mod, LEFT, movefocus, l" + "$mod, DOWN, movefocus, d" + "$mod, UP, movefocus, u" + "$mod, RIGHT, movefocus, r" + "$mod SHIFT, h, movewindow, l" + "$mod SHIFT, j, movewindow, d" + "$mod SHIFT, k, movewindow, u" + "$mod SHIFT, l, movewindow, r" + "$mod SHIFT, LEFT, movewindow, l" + "$mod SHIFT, DOWN, movewindow, d" + "$mod SHIFT, UP, movewindow, u" + + "$mod CTRL SHIFT, LEFT, moveactive, -10 0" + "$mod CTRL SHIFT, DOWN, moveactive, 0 10" + "$mod CTRL SHIFT, UP, moveactive, 0 -10" + "$mod CTRL SHIFT, RIGHT, moveactive, 10 0" + "$mod CTRL SHIFT, h, moveactive, -10 0" + "$mod CTRL SHIFT, j, moveactive, 0 10" + "$mod CTRL SHIFT, k, moveactive, 0 -10" + "$mod CTRL SHIFT, l, moveactive, 10 0" + "$mod SHIFT, q, killactive" + "$mod CTRL, h, resizeactive, -5% 0%" + "$mod CTRL, l, resizeactive, 5% 0%" + "$mod CTRL, j, resizeactive, 0% -5%" + "$mod CTRL, k, resizeactive, 0% 5%" + "$mod, SPACE, togglefloating, active" + "$mod SHIFT, SPACE, centerwindow" + "$mod, f, fullscreen, 1" + "$mod SHIFT, f, fullscreen, 0" + "$mod CTRL, f, fullscreenstate, -1 2" + "$mod SHIFT, s, pin" + "$mod SHIFT, x, exec, ${pkgs.hyprland}/bin/hyprctl kill" + ", XF86AudioRaiseVolume, exec, ${pkgs.pulsemixer}/bin/pulsemixer --change-volume +5" + ", XF86AudioLowerVolume, exec, ${pkgs.pulsemixer}/bin/pulsemixer --change-volume -5" + ", XF86AudioMute, exec, ${pkgs.pulsemixer}/bin/pulsemixer --toggle-mute" + ", XF86AudioMicMute, exec, ${pkgs.pulsemixer}/bin/pulsemixer --toggle-mute --id 1" + ", XF86MonBrightnessUp, exec, ${pkgs.brightnessctl}/bin/brightnessctl set +5%" + ", XF86MonBrightnessDown, exec, ${pkgs.brightnessctl}/bin/brightnessctl set 5%-" + "$mod, 9, exec, ${pkgs.hyprlock}/bin/hyprlock" + "$mod, 0, exec, ${pkgs.wlogout}/bin/wlogout -b 5" + "$mod, n, exec, ${pkgs.swaynotificationcenter}/bin/swaync-client -t" + ", Print, exec, ${screenshot}/bin/screenshot" + "CTRL, Print, exec, ${screenshot}/bin/screenshot --region" + "SHIFT, Print, exec, ${screenshot}/bin/screenshot --clip" + "CTRL SHIFT, Print, exec, ${screenshot}/bin/screenshot --region --clip" + ] + ++ ( + # workspaces + # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} + builtins.concatLists (builtins.genList ( + x: let + ws = builtins.toString (x + 1); + in [ + "$mod, ${ws}, workspace, ${ws}" + "$mod SHIFT, ${ws}, movetoworkspace, ${ws}" + "$mod CTRL, ${ws}, movetoworkspacesilent, ${ws}" + ] + ) + 8) + ); + # See https://wiki.hyprland.org/Configuring/Monitors/ + monitor = ",preferred,auto,1"; + env = [ + "GDK_SCALE,1" + "XCURSOR_SIZE,12" + ]; + + xwayland = { + force_zero_scaling = true; + }; + + # See https://wiki.hyprland.org/Configuring/Keywords/ for more + + # Execute your favorite apps at launch + # exec-once = waybar & hyprpaper & firefox + + # Source a file (multi-file configs) + # source = ~/.config/hypr/myColors.conf + + # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ + input = { + kb_layout = "de"; + kb_variant = "deadacute"; + kb_model = ""; + kb_options = "caps:ctrl_modifier"; + kb_rules = ""; + repeat_delay = 250; + repeat_rate = 30; + follow_mouse = 1; + + touchpad = { + natural_scroll = "yes"; + }; + + sensitivity = 0; # -1.0 - 1.0, 0 means no modification. + }; + + general = { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + gaps_in = 5; + gaps_out = 10; + border_size = 2; + "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg"; + "col.inactive_border" = "rgba(595959aa)"; + + layout = "dwindle"; + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false; + }; + + layerrule = [ + # blur for wlogout + "blur, logout_dialog" + + # blur for swaync + "blur, swaync-control-center" + "blur, swaync-notification-window" + "ignorezero, swaync-control-center" + "ignorezero, swaync-notification-window" + "ignorealpha 0.5, swaync-control-center" + "ignorealpha 0.5, swaync-notification-window" + ]; + + decoration = { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + rounding = 10; + + blur = { + enabled = true; + size = 8; + passes = 1; + new_optimizations = true; + }; + }; + + animations = { + enabled = "yes"; + + # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + + animation = [ + "windows, 1, 7, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "borderangle, 1, 8, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + + dwindle = { + # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more + pseudotile = "yes"; # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = "yes"; # you probably want this + }; + + master = { + # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more + # new_is_master = true; + }; + + ecosystem = { + no_update_news = true; + }; + + misc = { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + force_default_wallpaper = 0; # Set to 0 to disable the anime mascot wallpapers + }; + + # Example per-device config + # See https://wiki.hyprland.org/Configuring/Keywords/#executing for more + # "device:epic-mouse-v1" = { + # sensitivity = -0.5; + # }; + }; + }; + }; } diff --git a/modules/desktop/swaync/icons/bolt.png b/modules/desktop/swaync/icons/bolt.png new file mode 100644 index 0000000..e0ce40d Binary files /dev/null and b/modules/desktop/swaync/icons/bolt.png differ diff --git a/modules/desktop/swaync/icons/brightness-100.png b/modules/desktop/swaync/icons/brightness-100.png new file mode 100644 index 0000000..e98b793 Binary files /dev/null and b/modules/desktop/swaync/icons/brightness-100.png differ diff --git a/modules/desktop/swaync/icons/brightness-20.png b/modules/desktop/swaync/icons/brightness-20.png new file mode 100644 index 0000000..0edf2ba Binary files /dev/null and b/modules/desktop/swaync/icons/brightness-20.png differ diff --git a/modules/desktop/swaync/icons/brightness-40.png b/modules/desktop/swaync/icons/brightness-40.png new file mode 100644 index 0000000..681583b Binary files /dev/null and b/modules/desktop/swaync/icons/brightness-40.png differ diff --git a/modules/desktop/swaync/icons/brightness-60.png b/modules/desktop/swaync/icons/brightness-60.png new file mode 100644 index 0000000..a9ea001 Binary files /dev/null and b/modules/desktop/swaync/icons/brightness-60.png differ diff --git a/modules/desktop/swaync/icons/brightness-80.png b/modules/desktop/swaync/icons/brightness-80.png new file mode 100644 index 0000000..8345d21 Binary files /dev/null and b/modules/desktop/swaync/icons/brightness-80.png differ diff --git a/modules/desktop/swaync/icons/gamemode.png b/modules/desktop/swaync/icons/gamemode.png new file mode 100644 index 0000000..ed5c3d2 Binary files /dev/null and b/modules/desktop/swaync/icons/gamemode.png differ diff --git a/modules/desktop/swaync/icons/microphone-mute.png b/modules/desktop/swaync/icons/microphone-mute.png new file mode 100644 index 0000000..8c1ab7a Binary files /dev/null and b/modules/desktop/swaync/icons/microphone-mute.png differ diff --git a/modules/desktop/swaync/icons/microphone.png b/modules/desktop/swaync/icons/microphone.png new file mode 100644 index 0000000..ab43784 Binary files /dev/null and b/modules/desktop/swaync/icons/microphone.png differ diff --git a/modules/desktop/swaync/icons/music.png b/modules/desktop/swaync/icons/music.png new file mode 100644 index 0000000..fe02df3 Binary files /dev/null and b/modules/desktop/swaync/icons/music.png differ diff --git a/modules/desktop/swaync/icons/palette.png b/modules/desktop/swaync/icons/palette.png new file mode 100644 index 0000000..552ae1d Binary files /dev/null and b/modules/desktop/swaync/icons/palette.png differ diff --git a/modules/desktop/swaync/icons/picture.png b/modules/desktop/swaync/icons/picture.png new file mode 100644 index 0000000..21a5541 Binary files /dev/null and b/modules/desktop/swaync/icons/picture.png differ diff --git a/modules/desktop/swaync/icons/play.png b/modules/desktop/swaync/icons/play.png new file mode 100644 index 0000000..d5b448b Binary files /dev/null and b/modules/desktop/swaync/icons/play.png differ diff --git a/modules/desktop/swaync/icons/timer.png b/modules/desktop/swaync/icons/timer.png new file mode 100644 index 0000000..1e80912 Binary files /dev/null and b/modules/desktop/swaync/icons/timer.png differ diff --git a/modules/desktop/swaync/icons/volume-high.png b/modules/desktop/swaync/icons/volume-high.png new file mode 100644 index 0000000..908af2a Binary files /dev/null and b/modules/desktop/swaync/icons/volume-high.png differ diff --git a/modules/desktop/swaync/icons/volume-low.png b/modules/desktop/swaync/icons/volume-low.png new file mode 100644 index 0000000..26ff46f Binary files /dev/null and b/modules/desktop/swaync/icons/volume-low.png differ diff --git a/modules/desktop/swaync/icons/volume-mid.png b/modules/desktop/swaync/icons/volume-mid.png new file mode 100644 index 0000000..3159ed5 Binary files /dev/null and b/modules/desktop/swaync/icons/volume-mid.png differ diff --git a/modules/desktop/swaync/icons/volume-mute.png b/modules/desktop/swaync/icons/volume-mute.png new file mode 100644 index 0000000..e99b2b2 Binary files /dev/null and b/modules/desktop/swaync/icons/volume-mute.png differ diff --git a/modules/desktop/swaync/icons/wand.png b/modules/desktop/swaync/icons/wand.png new file mode 100644 index 0000000..f06223c Binary files /dev/null and b/modules/desktop/swaync/icons/wand.png differ diff --git a/modules/desktop/swaync/swaync.nix b/modules/desktop/swaync/swaync.nix new file mode 100644 index 0000000..28fe903 --- /dev/null +++ b/modules/desktop/swaync/swaync.nix @@ -0,0 +1,111 @@ +{ + flake.homeModules.swaync = {pkgs, ...}: { + xdg.enable = true; + xdg.configFile = { + "swaync/themes" = { + source = ./themes; + }; + "swaync/icons" = { + source = ./icons; + recursive = true; + }; + }; + services.swaync.enable = true; + services.swaync.style = '' + @import 'themes/nova-dark/notifications.css'; + @import 'themes/nova-dark/central_control.css'; + ''; + services.swaync.settings = { + positionX = "right"; + positionY = "top"; + cssPriority = "user"; + + control-center-width = 380; + control-center-height = 860; + control-center-margin-top = 2; + control-center-margin-bottom = 2; + control-center-margin-right = 1; + control-center-margin-left = 0; + + notification-window-width = 400; + notification-icon-size = 48; + notification-body-image-height = 160; + notification-body-image-width = 200; + + timeout = 4; + timeout-low = 2; + timeout-critical = 6; + + fit-to-screen = false; + keyboard-shortcuts = true; + image-visibility = "when-available"; + transition-time = 200; + hide-on-clear = false; + hide-on-action = false; + script-fail-notify = true; + scripts = { + example-script = { + exec = "echo 'Do something...'"; + urgency = "Normal"; + }; + }; + notification-visibility = { + example-name = { + state = "muted"; + urgency = "Low"; + app-name = "Spotify"; + }; + }; + widgets = [ + "label" + "buttons-grid" + "mpris" + "title" + "dnd" + "notifications" + ]; + widget-config = { + title = { + text = "Notifications"; + clear-all-button = true; + button-text = " 󰎟 "; + }; + dnd = { + text = "Do not disturb"; + }; + label = { + max-lines = 1; + text = " "; + }; + mpris = { + image-size = 96; + image-radius = 12; + }; + volume = { + label = "󰕾"; + show-per-app = true; + }; + buttons-grid = { + actions = [ + { + label = " "; + command = "${pkgs.alsa-utils}/bin/amixer set Master toggle"; + } + { + label = ""; + command = "${pkgs.alsa-utils}/bin/amixer set Capture toggle"; + } + { + label = " "; + command = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor"; + } + { + label = "󰂯"; + command = "${pkgs.blueman}/bin/blueman-manager"; + } + ]; + }; + }; + }; + }; +} diff --git a/modules/desktop/swaync/themes/nova-dark/central_control.css b/modules/desktop/swaync/themes/nova-dark/central_control.css new file mode 100644 index 0000000..361784a --- /dev/null +++ b/modules/desktop/swaync/themes/nova-dark/central_control.css @@ -0,0 +1,258 @@ +@define-color text @foreground; +@define-color background-alt alpha(@color1, .4); +@define-color selected @color6; +@define-color hover alpha(@selected, .4); +@define-color urgent @color2; + +/* Temporary color defs */ +@define-color background rgb(0,10,20); +@define-color background-alt rgb(0,20,30); +@define-color selected rgb(0,30,130); + +* { + color: @text; + + all: unset; + font-size: 14px; + /*font-family: "JetBrains Mono Nerd Font 10";*/ + transition: 200ms; + +} + +/* Avoid 'annoying' backgroud */ +.blank-window { + background: transparent; +} + +/* CONTROL CENTER ------------------------------------------------------------------------ */ + +.control-center { + background: alpha(@background, .55); + border-radius: 24px; + border: 1px solid @selected; + box-shadow: 0 0 10px 0 rgba(0,0,0,.6); + margin: 18px; + padding: 12px; +} + +/* Notifications */ +.control-center .notification-row .notification-background, +.control-center .notification-row .notification-background .notification.critical { + background-color: @background-alt; + border-radius: 16px; + margin: 4px 0px; + padding: 4px; +} + +.control-center .notification-row .notification-background .notification.critical { + color: @urgent; +} + +.control-center .notification-row .notification-background .notification .notification-content { + margin: 6px; + padding: 8px 6px 2px 2px; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * { + min-height: 3.4em; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action { + background: alpha(@selected, .6); + color: @text; + border-radius: 12px; + margin: 6px; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:hover { + background: @selected; +} + +.control-center .notification-row .notification-background .notification > *:last-child > * .notification-action:active { + background-color: @selected; +} + +/* Buttons */ + +.control-center .notification-row .notification-background .close-button { + background: transparent; + border-radius: 6px; + color: @text; + margin: 0px; + padding: 4px; +} + +.control-center .notification-row .notification-background .close-button:hover { + background-color: @selected; +} + +.control-center .notification-row .notification-background .close-button:active { + background-color: @selected; +} + +progressbar, +progress, +trough { + border-radius: 12px; +} + +progressbar { + background-color: rgba(255,255,255,.1); +} + +/* Notifications expanded-group */ + +.notification-group { + margin: 2px 8px 2px 8px; + +} +.notification-group-headers { + font-weight: bold; + font-size: 1.25rem; + color: @text; + letter-spacing: 2px; +} + +.notification-group-icon { + color: @text; +} + +.notification-group-collapse-button, +.notification-group-close-all-button { + background: transparent; + color: @text; + margin: 4px; + border-radius: 6px; + padding: 4px; +} + +.notification-group-collapse-button:hover, +.notification-group-close-all-button:hover { + background: @hover; +} + +/* WIDGETS --------------------------------------------------------------------------- */ + + /* Notification clear button */ +.widget-title { + font-size: 1.2em; + margin: 6px; +} + +.widget-title button { + background: @background-alt; + border-radius: 6px; + padding: 4px 16px; +} + +.widget-title button:hover { + background-color: @hover; +} + +.widget-title button:active { + background-color: @selected; +} + + /* Do not disturb */ +.widget-dnd { + margin: 6px; + font-size: 1.2rem; +} + +.widget-dnd > switch { + background: @background-alt; + font-size: initial; + border-radius: 8px; + box-shadow: none; + padding: 2px; +} + +.widget-dnd > switch:hover { + background: @hover; +} + +.widget-dnd > switch:checked { + background: @selected; +} + +.widget-dnd > switch:checked:hover { + background: @hover; +} + +.widget-dnd > switch slider { + background: @text; + border-radius: 6px; +} + + /* Buttons menu */ +.widget-buttons-grid { + font-size: x-large; + padding: 6px 2px; + margin: 6px; + border-radius: 12px; + background: @background-alt; +} + +.widget-buttons-grid>flowbox>flowboxchild>button { + margin: 4px 10px; + padding: 6px 12px; + background: transparent; + border-radius: 8px; +} + +.widget-buttons-grid>flowbox>flowboxchild>button:hover { + background: @hover; +} + + + /* Music player */ +.widget-mpris { + background: @background-alt; + border-radius: 16px; + color: @text; + margin: 20px 6px; +} + + /* NOTE: Background need *opacity 1* otherwise will turn into the album art blurred */ +.widget-mpris-player { + background-color: @background-sec; + border-radius: 22px; + padding: 6px 14px; + margin: 6px; +} + +.widget-mpris > box > button { + color: @text; + border-radius: 20px; +} + +.widget-mpris button { + color: alpha(@text, .6); +} + +.widget-mpris button:hover { + color: @text; +} + +.widget-mpris-album-art { + border-radius: 16px; +} + +.widget-mpris-title { + font-weight: 700; + font-size: 1rem; +} + +.widget-mpris-subtitle { + font-weight: 500; + font-size: 0.8rem; +} + +/* Volume */ +.widget-volume { + background: @background-sec; + color: @background; + padding: 4px; + margin: 6px; + border-radius: 6px; +} diff --git a/modules/desktop/swaync/themes/nova-dark/notifications.css b/modules/desktop/swaync/themes/nova-dark/notifications.css new file mode 100644 index 0000000..1e898a8 --- /dev/null +++ b/modules/desktop/swaync/themes/nova-dark/notifications.css @@ -0,0 +1,115 @@ +@define-color text @foreground; +@define-color background-alt @color1; +@define-color selected @color3; +@define-color hover @color5; +@define-color urgent @color2; +/* Temporary color defs */ +@define-color background rgb(0,10,20); +@define-color background-alt rgb(0,20,30); +@define-color selected rgb(0,30,130); + +* { + + /*background-alt: @color1; Buttons background */ + /*selected: @color2; Button selected */ + /*hover: @color5; Hover button */ + /*urgent: @color6; Urgency critical */ + /*text-selected: @background; */ + + color: @text; + + all: unset; + font-size: 14px; + font-family: "JetBrains Mono Nerd Font 10"; + transition: 200ms; + +} + +.notification-row { + outline: none; + margin: 0; + padding: 0px; +} + +.floating-notifications.background .notification-row .notification-background { + background: alpha(@background, .55); + box-shadow: 0 0 8px 0 rgba(0,0,0,.6); + border: 1px solid @selected; + border-radius: 24px; + margin: 16px; + padding: 0; +} + +.floating-notifications.background .notification-row .notification-background .notification { + padding: 6px; + border-radius: 12px; +} + +.floating-notifications.background .notification-row .notification-background .notification.critical { + border: 2px solid @urgent; +} + +.floating-notifications.background .notification-row .notification-background .notification .notification-content { + margin: 14px; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * { + min-height: 3.4em; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action { + border-radius: 8px; + background-color: @background-alt ; + margin: 6px; + border: 1px solid transparent; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:hover { + background-color: @hover; + border: 1px solid @selected; +} + +.floating-notifications.background .notification-row .notification-background .notification > *:last-child > * .notification-action:active { + background-color: @selected; + color: @background; +} + +.image { + margin: 10px 20px 10px 0px; +} + +.summary { + font-weight: 800; + font-size: 1rem; +} + +.body { + font-size: 0.8rem; +} + +.floating-notifications.background .notification-row .notification-background .close-button { + margin: 6px; + padding: 2px; + border-radius: 6px; + background-color: transparent; + border: 1px solid transparent; +} + +.floating-notifications.background .notification-row .notification-background .close-button:hover { + background-color: @selected; +} + +.floating-notifications.background .notification-row .notification-background .close-button:active { + background-color: @selected; + color: @background; +} + +.notification.critical progress { + background-color: @selected; +} + +.notification.low progress, +.notification.normal progress { + background-color: @selected; +} + diff --git a/modules/desktop/waybar.nix b/modules/desktop/waybar.nix new file mode 100644 index 0000000..367da48 --- /dev/null +++ b/modules/desktop/waybar.nix @@ -0,0 +1,261 @@ +{ + flake.homeModules.waybar = { + config, + lib, + pkgs, + ... + }: { + programs.waybar.enable = true; + programs.waybar.systemd.enable = true; + + services.blueman-applet.enable = true; + services.network-manager-applet.enable = true; + services.pasystray.enable = true; + + # is already fixed on latest home-manager rev + systemd.user.services = { + blueman-applet.Unit.After = lib.mkForce ["graphical-session.target"]; + network-manager-applet.Unit.After = lib.mkForce ["graphical-session.target"]; + pasystray.Unit.After = lib.mkForce ["graphical-session.target"]; + waybar.Unit.After = lib.mkForce ["graphical-session.target"]; + }; + + home.packages = with pkgs; [ + pulsemixer + pavucontrol + networkmanagerapplet + ]; + + programs.waybar = { + settings.mainBar = { + position = "top"; + layer = "top"; + height = 5; + margin-top = 0; + margin-bottom = 0; + margin-left = 0; + margin-right = 0; + modules-left = [ + "custom/launcher" + "hyprland/workspaces" + ]; + modules-center = [ + "hyprland/window" + ]; + modules-right = [ + "clock" + "cpu" + "memory" + "disk" + "battery" + "network" + "tray" + ]; + clock = { + calendar = { + format = {today = "{}";}; + }; + format = " {:%H:%M}"; + tooltip = "true"; + tooltip-format = "{:%Y %B}\n{calendar}"; + format-alt = " {:%d/%m}"; + }; + "hyprland/workspaces" = { + active-only = false; + disable-scroll = true; + format = "{icon}"; + on-click = "activate"; + format-icons = { + "1" = "1"; + "2" = "2"; + "3" = "3"; + "4" = "4"; + "5" = "5"; + "6" = "6"; + "7" = "7"; + "8" = "8"; + urgent = ""; + default = ""; + sort-by-number = true; + }; + persistent-workspaces = { + "1" = []; + "2" = []; + "3" = []; + "4" = []; + "5" = []; + "6" = []; + "7" = []; + "8" = []; + }; + }; + memory = { + format = "󰟜 {}%"; + format-alt = "󰟜 {used} GiB"; #  + interval = 2; + }; + cpu = { + format = " {usage}%"; + format-alt = " {avg_frequency} GHz"; + interval = 2; + }; + disk = { + # path = "/"; + format = "󰋊 {percentage_used}%"; + interval = 60; + }; + network = { + format-wifi = " {signalStrength}%"; + format-ethernet = "󰀂 "; + tooltip-format = "Connected to {essid} {ifname} via {gwaddr}"; + format-linked = "{ifname} (No IP)"; + format-disconnected = "󰖪 "; + }; + tray = { + icon-size = 20; + spacing = 8; + }; + pulseaudio = { + format = "{icon} {volume}%"; + format-muted = "󰖁 {volume}%"; + format-icons = { + default = [" "]; + }; + scroll-step = 5; + on-click = "pamixer -t"; + }; + battery = { + format = "{icon} {capacity}%"; + format-icons = [" " " " " " " " " "]; + format-charging = " {capacity}%"; + format-full = " {capacity}%"; + format-warning = " {capacity}%"; + interval = 5; + states = { + warning = 20; + }; + format-time = "{H}h{M}m"; + tooltip = true; + tooltip-format = "{time}"; + }; + "custom/launcher" = { + format = ""; + on-click = "${pkgs.wofi}/bin/wofi --show drun"; + tooltip = "false"; + }; + }; + style = '' + * { + border: none; + font-family: Font Awesome, Roboto, Arial, sans-serif; + font-size: 13px; + color: #ffffff; + border-radius: 15px; + } + + window { + /*font-weight: bold;*/ + } + window#waybar { + border-style: none; + border-width: 1px; + border-color: #33ccff; + background: rgba(0, 0, 0, 0); + } + /*-----module groups----*/ + .modules-right { + background-color: rgba(0,43,51,0.85); + margin: 2px 10px 2px 0; + } + .modules-left { + margin: 2px 0 2px 5px; + background-color: rgba(0,119,179,0.6); + } + /*-----modules indv----*/ + #workspaces button { + padding: 1px 5px; + background-color: transparent; + } + #workspaces button:hover { + box-shadow: inherit; + background-color: rgba(0,153,153,1); + } + #workspaces button.empty { + color: rgba(0 ,40, 40, 40); + } + #workspaces button.active { + background-color: rgba(0,43,51,0.85); + } + #window { + border-style: solid; + background-color: rgba(0,43,51,0.5); + margin: 2px 5px; + padding: 2px 5px; + border-width: 1px; + border-color: #33ccff; + } + #window.empty { + border-style: none; + background-color: transparent; + } + #custom-launcher { + background-color: rgba(0,119,179,0.6); + border-radius: 100px; + margin: 5px 5px; + } + + #clock, + #battery, + #cpu, + #memory, + #temperature, + #network, + #pulseaudio, + #custom-media, + #tray, + #mode, + #custom-power, + #custom-menu, + #idle_inhibitor { + padding: 0 10px; + } + #mode { + color: #cc3436; + font-weight: bold; + } + #custom-power { + background-color: rgba(0,119,179,0.6); + border-radius: 100px; + margin: 5px 5px; + padding: 1px 1px 1px 6px; + } + /*-----Indicators----*/ + #idle_inhibitor.activated { + color: #2dcc36; + } + #pulseaudio.muted { + color: #cc3436; + } + #battery.charging { + color: #2dcc36; + } + #battery.warning:not(.charging) { + color: #e6e600; + } + #battery.critical:not(.charging) { + color: #cc3436; + } + #temperature.critical { + color: #cc3436; + } + /*-----Colors----*/ + /* + *rgba(0,85,102,1),#005566 --> Indigo(dye) + *rgba(0,43,51,1),#002B33 --> Dark Green + *RGBA(0,153,153,1),#009999 --> PERSIAN GREEN + * + */ + ''; + }; + }; +} diff --git a/modules/overlays/unstable.nix b/modules/overlays/unstable.nix index 3cb2730..21ea4ec 100644 --- a/modules/overlays/unstable.nix +++ b/modules/overlays/unstable.nix @@ -1,4 +1,18 @@ -{inputs, ...}: { +{ + inputs, + self, + ... +}: { + flake.nixosModules.unstable-overlay = { + nixpkgs.overlays = [ + self.overlays.unstable + ]; + }; + flake.homeModules.unstable-overlay = { + nixpkgs.overlays = [ + self.overlays.unstable + ]; + }; flake.overlays.unstable = final: prev: { unstable = import inputs.nixpkgs-unstable { system = prev.system; diff --git a/modules/packages/bulk-transcode/default.nix b/modules/packages/bulk-transcode/default.nix index d6106da..ca3cca8 100644 --- a/modules/packages/bulk-transcode/default.nix +++ b/modules/packages/bulk-transcode/default.nix @@ -1,7 +1,10 @@ -{ +{self, ...}: { flake.overlays.bulk-transcode = final: prev: { bulk-transcode = final.callPackage ./_derivation.nix {}; }; + flake.nixosModules.bulk-transcode-overlay = { + nixpkgs.overlays = [self.overlays.bulk-transcode]; + }; perSystem = {pkgs, ...}: { packages.bulk-transcode = pkgs.callPackage ./_derivation.nix {}; devShells.bulk-transcode = import ./_shell.nix {inherit pkgs;}; diff --git a/modules/packages/layan-qt6/default.nix b/modules/packages/layan-qt6/default.nix deleted file mode 100644 index cd0a9e2..0000000 --- a/modules/packages/layan-qt6/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - flake.overlays.layan-qt6 = final: prev: { - crossover = final.callPackage ./_derivation.nix {}; - }; - perSystem = {pkgs, ...}: { - packages.layan-qt6 = pkgs.callPackage ./_derivation.nix {}; - }; -} diff --git a/modules/packages/layan-qt6/_derivation.nix b/modules/themes/layan/_derivation.nix similarity index 100% rename from modules/packages/layan-qt6/_derivation.nix rename to modules/themes/layan/_derivation.nix diff --git a/modules/themes/layan/layan-qt6.nix b/modules/themes/layan/layan-qt6.nix new file mode 100644 index 0000000..23e947e --- /dev/null +++ b/modules/themes/layan/layan-qt6.nix @@ -0,0 +1,18 @@ +{self, ...}: { + flake.homeModules.layan-qt6-overlay = { + nixpkgs.overlays = [ + self.overlays.layan-qt6 + ]; + }; + flake.nixosModules.layan-qt6-overlay = { + nixpkgs.overlays = [ + self.overlays.layan-qt6 + ]; + }; + flake.overlays.layan-qt6 = final: prev: { + layan-qt6 = final.kdePackages.callPackage ./_derivation.nix {}; + }; + perSystem = {pkgs, ...}: { + packages.layan-qt6 = pkgs.callPackage ./_derivation.nix {}; + }; +} diff --git a/modules/themes/layan/layan.nix b/modules/themes/layan/layan.nix new file mode 100644 index 0000000..bbdcb54 --- /dev/null +++ b/modules/themes/layan/layan.nix @@ -0,0 +1,48 @@ +{self, ...}: { + flake.homeModules.layan = { + lib, + pkgs, + ... + }: { + imports = [ + self.homeModules.layan-qt6-overlay + self.homeModules.unstable-overlay + ]; + home.packages = [ + pkgs.layan-qt6 + pkgs.kdePackages.qtstyleplugin-kvantum + pkgs.unstable.layan-cursors + pkgs.layan-gtk-theme + pkgs.tela-circle-icon-theme + ]; + + qt.enable = false; + qt.style.name = "kvantum"; + qt.style.package = pkgs.kdePackages.qtstyleplugin-kvantum; + qt.platformTheme.name = "gtk"; + systemd.user.settings.Manager.DefaultEnvironment = lib.mapAttrs (_: lib.mkDefault) { + QT_STYLE_OVERRIDE = "kvantum"; + QT_QPA_PLATFORMTHEME = "gtk"; + }; + xdg.configFile."Kvantum/kvantum.kvconfig".text = lib.generators.toINI {} { + General.theme = "LayanDark"; + }; + + # add nord like gtk theme + gtk = { + enable = true; + cursorTheme = { + package = pkgs.unstable.layan-cursors; + name = "Layan-cursors"; + }; + theme = { + package = pkgs.layan-gtk-theme; + name = "Layan-Dark"; + }; + iconTheme = { + package = pkgs.tela-circle-icon-theme; + name = "Tela-circle-dark"; + }; + }; + }; +} diff --git a/old/static/keys/borg-jonas@comfy-station.pub b/static/keys/borg-jonas@comfy-station.pub similarity index 100% rename from old/static/keys/borg-jonas@comfy-station.pub rename to static/keys/borg-jonas@comfy-station.pub diff --git a/old/static/keys/my_pub.asc b/static/keys/my_pub.asc similarity index 100% rename from old/static/keys/my_pub.asc rename to static/keys/my_pub.asc diff --git a/old/static/keys/passgit-jonas@comfy-station.pub b/static/keys/passgit-jonas@comfy-station.pub similarity index 100% rename from old/static/keys/passgit-jonas@comfy-station.pub rename to static/keys/passgit-jonas@comfy-station.pub diff --git a/old/static/wallpaper/nord.png b/static/wallpaper/nord.png similarity index 100% rename from old/static/wallpaper/nord.png rename to static/wallpaper/nord.png diff --git a/old/static/wallpaper/stones.jpg b/static/wallpaper/stones.jpg similarity index 100% rename from old/static/wallpaper/stones.jpg rename to static/wallpaper/stones.jpg