diff --git a/README.md b/README.md index b03b594..381cbb6 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,15 @@ $ colmena apply --on @production ```console $ colmena apply --on @router ``` + +## Structure +``` +nixfiles +├── config # NixOS configuration +│   ├── common # configuration applyed to all hosts (some settings might be influenced by machine-type) +│   │   └── users # user configuration +│   ├── hosts # configuration for specific hosts +│   ├── profiles # configuariotn for specific machine types +│   └── services # common service configuration +└── modules # NixOS modules +``` diff --git a/config/common/default.nix b/config/common/default.nix index 7c14278..86b698f 100644 --- a/config/common/default.nix +++ b/config/common/default.nix @@ -23,13 +23,16 @@ with lib; { zip figlet ]; + programs = { + mtr.enable = true; + fish.enable = true; + }; deployment.tags = [ "all" ]; deployment.targetHost = mkDefault config.networking.fqdn; deployment.targetPort = mkDefault 22; deployment.targetUser = mkDefault null; - nix.settings.trusted-users = [ "root" "@wheel" ]; security.dhparams.defaultBitSize = 4096; system.activationScripts.motd.text = let @@ -51,11 +54,23 @@ with lib; { nix.gc.automatic = true; nix.gc.options = "--delete-older-than 7d"; nix.optimise.automatic = true; - services.journald.extraConfig = "SystemMaxUse=256M"; - boot.tmp.cleanOnBoot = = mkDefault true; nix.settings.experimental-features = [ "nix-command" "flakes" ]; + nix.settings.trusted-users = [ "@wheel" ]; + nixpkgs.hostPlatform.system = "x86_64-linux"; + boot.tmp.cleanOnBoot = = mkDefault true; + services.journald.extraConfig = "SystemMaxUse=256M"; + + security.sudo.enable = false; + security.sudo-rs = { + enable = true; + execWheelOnly = true; + }; + users.mutableUsers = false; + + services.fprintd.enable = config.kyouma.machine-type.graphical; + system.stateVersion = "23.11"; time.timeZone = mkDefault "CET"; } diff --git a/config/common/users/emily/default.nix b/config/common/users/emily/default.nix index d7ddb67..2f59a2e 100644 --- a/config/common/users/emily/default.nix +++ b/config/common/users/emily/default.nix @@ -1,10 +1,54 @@ -{ config, pkgs, ... }: { +{ config, pkgs, lib, inputs, ... }: { + imports = [ + inputs.home-manager.nixosModules.home-manager + ]; users.users.emily = { isNormalUser = true; - shell = pkgs.bash; + shell = pkgs.fish; extraGroups = [ "wheel" ]; openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA/+iN407+HsfHbbC3tfdA8Yf4TZ08qXQMb4tb/SDAs+ emily@card" ]; }; + + home-manager.useGlobalPkgs = true; + home-manager.users.emily = { + home.stateVersion = "23.11"; + + home.packages = with pkgs; [ + whois + restic + ] ++ lib.optionals config.kyouma.machine-type.graphical [ + thunderbird + obsidian + krita + spotify + cider + pavucontrol + signal-desktop + schildichat-desktop-wayland + + image-roll + wl-clipboard + libnotify + slurp + grim + imagemagick_light + + jetbrains-mono + ]; + + programs.bat.enable = true; + programs.gpg.enable = true; + programs.ripgrep.enable = true; + programs.yt-dl.enable = true; + + programs.git = { + enable = true; + signing.key = "B04F01A7A98A13020C39B4A68AB7B773A214ACE5"; + signing.signByDefault = true; + userName = "emily"; + userEmail = "ek@kyouma.net"; + }; + }; } diff --git a/config/hosts/crime/configuration.nix b/config/hosts/crime/configuration.nix index ebfb2b2..edaedb8 100644 --- a/config/hosts/crime/configuration.nix +++ b/config/hosts/crime/configuration.nix @@ -1,11 +1,11 @@ { config, pkgs, ... }: { imports = [ - ./nginx.nix ../../common - ../../common-dus.nix - ../../common-lxc.nix - ../../common-nginx.nix - ../../common-headless.nix + ../../profiles/headless.nix + ../../profiles/kartoffel.nix + ../../profiles/lxc.nix + ../../services/nginx.nix + ./nginx.nix ]; networking = { hostName = "crime"; diff --git a/config/hosts/crime/nginx.nix b/config/hosts/crime/nginx.nix index c3aad1f..51783e3 100644 --- a/config/hosts/crime/nginx.nix +++ b/config/hosts/crime/nginx.nix @@ -1,8 +1,6 @@ { config, pkgs, lib, ... }: let - landingPage = pkgs.writeTextFile { - name = "index.html"; - text = '' + landingPage = pkgs.writeTextDir "index.html" '' @@ -31,8 +29,6 @@ let ''; - destination = "/index.html"; - }; extraConfig = '' add_header Strict-Transport-Security $hsts_header; add_header X-Content-Type-Options "nosniff" always; diff --git a/config/hosts/ns-nbg/configuration.nix b/config/hosts/ns-nbg/configuration.nix index a7fd120..1bbfe72 100644 --- a/config/hosts/ns-nbg/configuration.nix +++ b/config/hosts/ns-nbg/configuration.nix @@ -1,10 +1,9 @@ { config, lib, ... }: { imports = [ ../../common - ../../common-headless.nix + ../../profiles/headless.nix ]; kyouma.machine-type.physical = true; - kyouma.machine-type.headless = true; systemd.network.networks."98-eth-static" = { matchConfig.Type = "ether"; diff --git a/config/hosts/ryuuko/configuration.nix b/config/hosts/ryuuko/configuration.nix new file mode 100644 index 0000000..23b427a --- /dev/null +++ b/config/hosts/ryuuko/configuration.nix @@ -0,0 +1,6 @@ +{ ... }: { + imports = [ + ../../common + ../../profiles/graphical + ]; +} diff --git a/config/hosts/web-dus/configuration.nix b/config/hosts/web-dus/configuration.nix index c2c26da..11684d8 100644 --- a/config/hosts/web-dus/configuration.nix +++ b/config/hosts/web-dus/configuration.nix @@ -13,10 +13,10 @@ in { inputs.fernglas.nixosModules.default inputs.kyouma-www.nixosModules.default ../../common - ../../common-lxc.nix - ../../common-dus.nix - ../../common-nginx.nix - ../../common-headless.nix + ../../profiles/headless.nix + ../../profiles/kartoffel.nix + ../../profiles/lxc.nix + ../../services/nginx.nix ]; networking = { hostName = "web-dus"; diff --git a/config/profiles/graphical/default.nix b/config/profiles/graphical/default.nix new file mode 100644 index 0000000..f3d1b89 --- /dev/null +++ b/config/profiles/graphical/default.nix @@ -0,0 +1,557 @@ +{ config, pkgs, lib, inputs, ... }: { + imports = [ + inputs.home-manager.nixosModules.home-manager + ]; + + kyouma.machine-type.graphical = true; + + services.geoclue2.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + pulse.enable = true; + }; + environment.variables = { + SDL_VIDEODRIVER = "wayland"; + QT_QPA_PLATFORM = "wayland"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + GDK_BACKEND = "wayland,x11"; + MOZ_ENABLE_WAYLAND = "1"; + CLUTTER_BACKEND = "wayland"; + }; + xdg.portal.wlr.enable = true; + + home-manager.users.emily = { + home.keyboard = { + layout = "de"; + variant = "neo_qwerty"; + }; + + home.file.".local/bin/hypr/playerctl.sh" = let + playerctl = "${pkgs.playerctl}/bin/playerctl"; + title = "$(${playerctl} metadata --format '{{markup_escape(title)}}')"; + artist = "$(${playerctl} metadata --format '{{markup_escape(artist)}}')"; + status = "$(${playerctl} status 2> /dev/null)"; + in { + enable = true; + executable = true; + text = '' + #!${pkgs.bash}/bin/bash + if [ "${status}" = "Playing" ]; then + echo -e " ${title}\nPlaying: ${artist} - ${title}\nplaying" + elif [ "${status}" = "Paused" ]; then + echo -e " ${title}\nPaused: ${artist} - ${title}\npaused" + else + echo -e "" + fi + ''; + }; + home.file.".local/bin/hypr" = { + enable = true; + executable = true; + recursive = true; + source = ./files/scripts; + }; + home.file.".config/mako-icons/" = { + enable = true; + recursive = true; + source = ./files/icons; + }; + home.file.".config/rofi" = { + enable = true; + recursive = true; + source = .files/rofi; + }; + wayland.windowManager.hyprland = { + enable = true; + settings = let + kitty = "${pkgs.kitty}/bin/kitty"; + pactl = "${pkgs.pulseaudio}/bin/pactl"; + playerctl = "${pkgs.playerctl}/bin/playerctl"; + notifysend = "${pkgs.libnotify}/bin/notify-send"; + swaylock = "${pkgs.swaylock}/bin/swaylock"; + dolphin = "${pkgs.libsForQt5.dolphin}/bin/dolphin"; + firefox = "${pkgs.firefox}/bin/firefox"; + brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl"; + screenshot = "~/.local/bin/hypr/screenshot.sh"; + rofi = "${pkgs.rofi-wayland}/bin/rofi"; + in { + general = { + border_size = 1; + gaps_in = 4; + gaps_out = 8; + "col.active_border" = "0xFFB4A1DB 0xFFD04E9D 45deg"; + "col.inactive_border" = "1e2030 1e2030 45deg"; + cursor_inactive_timeout = 30; + layout = "dwindle"; + }; + decoration = { + rounding = 8; + shadow_range = 10; + "col.shadow" = "0x66000000"; + "col.shadow_inactive" = "0x66000000"; + blur = { + enabled = true; + passes = 2; + }; + }; + animations = { + bezier = [ + "wind, 0.05, 0.9, 0.1, 1.05" + "winMov, 0.05, 0.9, 0.1, 1.1" + "winIn, 0.1, 1.1, 0.1, 1.1" + "winOut, 0.3, -0.3, 0, 1" + "liner, 1, 1, 1, 1" + ]; + animation = [ + "windows, 1, 6, wind, slide" + "windowsIn, 1, 8, winIn, slide" + "windowsOut, 1, 5, winOut, slide" + "windowsMove, 1, 6, winMov, slide" + "border, 1, 1, liner" + "borderangle, 1, 30, liner, loop" + "fade, 1, 10, default" + "workspaces, 1, 8, wind" + ]; + }; + + input = { + kb_layout = "de"; + kb_variant = "neo_qwerty"; + kb_options = "grp:alt_shift_toggle"; + accel_profile = "adaptive"; + scroll_method = "2fg"; + float_switch_override_focus = 2; + touchpad = { + natural_scroll = true; + scroll_factor = 0; + tap-to-click = false; + drag_lock = true; + }; + }; + gestures = { + workspace_swipe = true; + workspace_swipe_min_speed_to_force = 15; + workspace_swipe_cancel_ratio = 0.3; + workspace_swipe_forever = true; + }; + group = { + "col.border_inactive" = "0xFFDB695B"; + "col.border_active" = "0xFF4BC66D"; + groupbar = { + render_titles = false; + }; + }; + misc = { + disable_hyprland_logo = true; + vrr = 1; + }; + xwayland = { + use_nearest_neighbor = false; + force_zero_scaling = true; + }; + "device:syna8013:00-06cb:ce69-touchpad" = { + sensitivity = 0.3; + }; + "device:logitech-m705" = { + sensitivity = 0.1; + accel_profile = "flat"; + }; + "device:tpps/2-ibm-trackpoint" = { + sensitivity = 0.2; + scroll_method = "on_button_down"; + accel_profile = "flat"; + }; + "device:tpps/2-elan-trackpoint" = { + sensitivity = 0; + scroll_method = "on_button_down"; + accel_profile = "flat"; + }; + "device:tpps/2-elan-trackpoint" = { + sensitivity = 0; + scroll_method = "on_button_down"; + accel_profile = "flat"; + }; + monitor = [ + "eDP-1, 3840x2400@60, 0x0, 1, bitdepth, 10" + "eDP-1, addreserved,-8,0,0,0" + "desc:ASUSTek COMPUTER INC ASUS VA24E M7LMTF021529, 1920x1080@60, -320x-1080, 1" + "desc:ASUSTek COMPUTER INC ASUS VA24E M7LMTF021525, 1920x1080@60, 1600x-1080, 1" + ",preferred,auto,1" + ]; + workspace = [ + "1, monitor:eDP-1, default:true" + "2, monitor:eDP-1" + "3, monitor:eDP-1" + "8, monitor:DP-2" + "9, monitor:DP-3" + "10, monitor:eDP-1" + ]; + windowrule = [ + "float, foot-float" + "float, yad|nm-connection-editor|pavucontrol" + "float, xfce-polkit|kvantummanager|qt5ct|zenity|waypaper" + "float, feh|com.github.weclaw1.ImageRoll|Gpicview|Gimp|MPlayer" + "float, VirtualBox Manager|qemu|Qemu-system-x86_64|PacketTracer" + "float, title:File Operation Progress|Open Files|Media viewer" + "float, title:Confirm to replace files" + "size 60% 64%, com.github.weclaw1.ImageRoll " + "center, com.github.weclaw1.ImageRoll" + "animation slide down,foot-full" + "animation slide up,Rofi" + ]; + + "$mod" = "SUPER"; + "$notifycmd" = "${notifysend} -h string:x-canonical-private-synchronous:hypr-cfg -u low"; + bind = [ + "$mod, Return, exec, ${kitty}" + "$mod, F1, exec, ${dolphin}" + "$mod, F2, exec, ${firefox}" + + # Rofi + "$mod, D, exec, ${rofi} -show drun -theme ~/.config/rofi/launcher.rasi" + "$mod, R, exec, ${rofi} -show run -theme ~/.config/rofi/runner.rasi" + "$mod, X, exec, ~/.local/bin/hypr/rofi_powermenu.sh" + "$mod, A, exec, ~/.local/bin/hypr/rofi_screenshot.sh" + + # Misc + "$mod, C, exec, ~/.local/bin/hypr/colorpicker.sh" + "CTRL_ALT, L, exec, ${swaylock} -f -i ~/Pictures/wallpapers/lockscreen.png" + + # Function keys + ", XF86MonBrightnessUp, exec, ${brightnessctl} s +10%" + ", XF86MonBrightnessDown, exec, ${brightnessctl} s 10%-" + ", XF86AudioRaiseVolume, exec, ${pactl} set-sink-volume @DEFAULT_SINK@ +2dB" + ", XF86AudioLowerVolume, exec, ${pactl} set-sink-volume @DEFAULT_SINK@ -2dB" + ", XF86AudioMute, exec, ${pactl} set-sink-mute @DEFAULT_SINK@ toggle" + ", XF86AudioMicMute, exec, ${pactl} set-source-mute @DEFAULT_SOURCE@ toggle" + ", XF86AudioNext, exec, ${playerctl} next" + ", XF86AudioPrev, exec, ${playerctl} previous" + ", XF86AudioPlay, exec, ${playerctl} play" + ", XF86AudioStop, exec, ${playerctl} pause" + + # Scratchpad + "$mod SHIFT, MINUS, movetoworkspace,special" + "$mod, MINUS, togglespecialworkspace," + + # Screenshots + ", Print, exec, ${screenshot} --now" + "ALT, Print, exec, ${screenshot} --in5" + "SHIFT, Print, exec, ${screenshot} --in10" + "CTRL, Print, exec, ${screenshot} --win" + "$mod, Print, exec, ${screenshot} --area" + + # Hyprland + "$mod SHIFT, Q, killactive," + "CTRL_ALT, Delete, exit," + "$mod, F, fullscreen, 0" + "$mod, F, exec, $notifycmd 'Fullscreen Mode'" + "$mod, S, pseudo," + "$mod, S, exec, $notifycmd 'Pseudo Mode'" + "$mod SHIFT, Space, togglefloating," + "$mod SHIFT, Space, centerwindow," + + # windowgroup + "$mod, G, togglegroup" + "$mod, G, exec, $notifycmd 'Toggled Group Mode'" + "$mod, H, changegroupactive, b" + "$mod, L, changegroupactive, f" + + # Change Focusconfig + "$mod, left, movefocus, l" + "$mod, H, movefocus, l" + "$mod, right, movefocus, r" + "$mod, L, movefocus, r" + "$mod, up, movefocus, u" + "$mod, K, movefocus, u" + "$mod, down, movefocus, d" + "$mod, J, movefocus, d" + + # Move Active + "$mod SHIFT, left, movewindow, l" + "$mod SHIFT, H, movewindow, l" + "$mod SHIFT, right, movewindow, r" + "$mod SHIFT, L, movewindow, r" + "$mod SHIFT, up, movewindow, u" + "$mod SHIFT, K, movewindow, u" + "$mod SHIFT, down, movewindow, d" + "$mod SHIFT, J, movewindow, d" + + # Switch between windows + "$mod,Tab,cyclenext," + "$mod,Tab,bringactivetotop," + + # 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" + + # Send to Workspaces + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + "$mod SHIFT, 0, movetoworkspace, 10" + + # Change Workspace Mode + "$mod CTRL, F, workspaceopt, allfloat" + "$mod CTRL, F, exec, $notifycmd 'Toggled All Float Mode'" + "$mod CTRL, S, workspaceopt, allpseudo" + "$mod CTRL, S, exec, $notifycmd 'Toggled All Pseudo Mode'" + + # Misc + "$mod SHIFT, P, pin," + "$mod SHIFT, P, exec, $notifycmd 'Toggled Pin'" + "$mod SHIFT, S, swapnext" + "$mod SHIFT, O, toggleopaque" + ]; + binde = [ + # Resize Active + "$mod CTRL, left, resizeactive, -20 0" + "$mod CTRL, H, resizeactive, -20 0" + "$mod CTRL, right, resizeactive, 20 0" + "$mod CTRL, L, resizeactive, 20 0" + "$mod CTRL, up, resizeactive, 0 -20" + "$mod CTRL, K, resizeactive, 0 -20" + "$mod CTRL, down, resizeactive, 0 20" + "$mod CTRL, J, resizeactive, 0 20" + + # Move Active (Floating Only) + "$mod ALT, left, moveactive, -80 0" + "$mod ALT, H, moveactive, -80 0" + "$mod ALT, right, moveactive, 80 0" + "$mod ALT, L, moveactive, 80 0" + "$mod ALT, up, moveactive, 0 -80" + "$mod ALT, K, moveactive, 0 -80" + "$mod ALT, down, moveactive, 0 80" + "$mod ALT, J, moveactive, 0 80" + ]; + bindl = [ + ",switch:Lid Switch, exec, ${swaylock} -f -i ~/Pictures/wallpapers/lockscreen.png" + ]; + bindm = [ + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + }; + }; + + programs.imv.enable = true; + + programs.wpaperd = { + enable = true; + settings.default = { + path = "/home/emily/Pictures/wallpapers/sylviaritter/"; + duration = "60m"; + sorting = "random"; + }; + }; + programs.waybar = { + enable = true; + style = ./waybar-style.css; + systemd = { + enable = true; + target = "hyprland-session.target"; + }; + settings = { + hyprbar = { + layer = "top"; + position = "top"; + output = "eDP-1"; + margin = "0 0 0 0"; + modules-left = [ "hyprland/workspaces" "custom/playerctl" "tray" ]; + modules-center = [ "clock" ]; + modules-right = [ "backlight" "pulseaudio" "temperature" "cpu" "memory" "battery" "network" ]; + + "hyprland/workspaces" = { + format = "{icon}"; + sort-by-number = true; + active-only = false; + on-click = "activate"; + format-icons = { + "10" = "0"; + urgent = ""; + focused = ""; + default = ""; + }; + }; + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + }; + tray = { + icon-size = 18; + spacing = 8; + }; + clock = { + tooltip-format = "{:%A %d %B | %H:%M}"; + format = " {:%Y-%m-%d  %H:%M:%OS}"; + format-alt = " {:%Y %b %d %a  %H:%M:%OS}"; + interval = 1; + }; + cpu = { + format = " {usage:02}"; + interval = 2; + on-click = "kitty -e htop"; + }; + memory = { + format = " {used:0.2f}"; + on-click = "kitty -e htop"; + }; + temperature = { + hwmon-path = "/sys/class/hwmon/hwmon1/temp1_input"; + critical-threshold = 80; + format = " {temperatureC}°C"; + }; + backlight = { + format = "{icon} {percent: >3}%"; + format-icons = ["", ""]; + on-scroll-down = "${pkgs.brightnessctl}/bin/brightnessctl -c backlight set 1%-"; + on-scroll-up = "${pkgs.brightnessctl}/bin/brightnessctl -c backlight set +1%"; + }; + battery = { + states = { + good = 90; + warning = 30; + critical = 15; + }; + format = "\uf1e6"; + format-discharging = "{icon} {capacity: >3}% {power:0.1f}W"; + format-charging = "\uf1e6 {capacity: >3}% {power:0.1f}W"; + interval = 3; + format-icons = ["", "", "", "", ""]; + }; + network = { + format = "⚠ Disabled"; + format-wifi = " {essid}"; + format-ethernet = " Wired"; + format-disconnected = "⚠ Disconnected"; + on-click = "nm-connection-editor"; + }; + pulseaudio = { + scroll-step = 5; + format = "{icon} {volume: >3}%"; + format-bluetooth = "{icon} {volume: >3}%"; + format-muted = " muted"; + format-icons = { + headphones = ""; + handsfree = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = ["", ""]; + }; + on-click = "${pkgs.pavucontrol}/bin/pavucontrol"; + }; + "custom/playerctl" = { + interval = 1; + exec = "~/.local/bin/hypr/playerctl.sh"; + on-click-middle = "${pkgs.playerctl}/bin/playerctl play-pause"; + on-click-right = "${pkgs.playerctl}/bin/playerctl next"; + on-click = "${pkgs.playerctl}/bin/playerctl previous"; + escape = true; + }; + }; + }; + }; + programs.kitty = { + enable = true; + font.size = "11"; + font.name = "JetBrains Mono"; + settings = { + enable_audio_bell = false; + scrollback_lines = 65536; + remember_window_size = false; + initial_window_width = 1200; + initial_window_height = 800; + + bold_font = "auto"; + italic_font = "auto"; + bold_italic_font = "auto"; + + background = "#090312"; + background_opacity = "0.7"; + }; + keybindings = { + "shift+right" = "next_tab"; + "ctrl+l" = "next_tab"; + "shift+left" = "previous_tab"; + "ctrl+h" = "previous_tab"; + }; + }; + programs.rofi = { + enable = true; + package = pkgs.rofi-wayland; + }; + services.gammastep = { + enable = true; + provider = "geoclue2"; + temperature.day = "6500"; + temperature.night = "3700"; + settings.general.adjustment-method = "wayland"; + }; + services.mako = { + enable = true; + anchor = "top-right"; + backgroundColor = "#24273a"; + borderColor = "#c6a0f6"; + borderRadius = 15; + borderSize = 2; + defaultTimeout = 5000; + layer = "overlay"; + maxIconSize = 48; + padding = "15"; + progressColor = "over #B4A1DB"; + sort = "-time"; + textColor = "#cad3f5"; + extraConfig = '' + max-history=100 + on-button-left=dismiss + on-button-right=dismiss-all + on-notify=exec ${pkgs.mpv}/bin/mpv /usr/share/sounds/freedesktop/stereo/message.oga + + [urgency=low] + border-color=#B4A1DB + default-timeout=2000 + + [urgency=normal] + border-color=#B4A1DB + default-timeout=5000 + + [urgency=high] + border-color=#D04E9D + text-color=#D04E9D + default-timeout=0 + + [category=mpd] + border-color=#E49186 + default-timeout=2000 + group-by=category + ''; + }; + services.gpg-agent = { + enable = true; + enableSshSupport = true; + }; + services.syncthing = { + enable = true; + tray.enable = true; + }; + }; +} diff --git a/config/profiles/graphical/files/icons/brightness-100.png b/config/profiles/graphical/files/icons/brightness-100.png new file mode 100644 index 0000000..6656c80 Binary files /dev/null and b/config/profiles/graphical/files/icons/brightness-100.png differ diff --git a/config/profiles/graphical/files/icons/brightness-20.png b/config/profiles/graphical/files/icons/brightness-20.png new file mode 100644 index 0000000..4907992 Binary files /dev/null and b/config/profiles/graphical/files/icons/brightness-20.png differ diff --git a/config/profiles/graphical/files/icons/brightness-40.png b/config/profiles/graphical/files/icons/brightness-40.png new file mode 100644 index 0000000..41b0584 Binary files /dev/null and b/config/profiles/graphical/files/icons/brightness-40.png differ diff --git a/config/profiles/graphical/files/icons/brightness-60.png b/config/profiles/graphical/files/icons/brightness-60.png new file mode 100644 index 0000000..66596fa Binary files /dev/null and b/config/profiles/graphical/files/icons/brightness-60.png differ diff --git a/config/profiles/graphical/files/icons/brightness-80.png b/config/profiles/graphical/files/icons/brightness-80.png new file mode 100644 index 0000000..4952211 Binary files /dev/null and b/config/profiles/graphical/files/icons/brightness-80.png differ diff --git a/config/profiles/graphical/files/icons/dropper.png b/config/profiles/graphical/files/icons/dropper.png new file mode 100644 index 0000000..a2c0288 Binary files /dev/null and b/config/profiles/graphical/files/icons/dropper.png differ diff --git a/config/profiles/graphical/files/icons/microphone-mute.png b/config/profiles/graphical/files/icons/microphone-mute.png new file mode 100644 index 0000000..1780e33 Binary files /dev/null and b/config/profiles/graphical/files/icons/microphone-mute.png differ diff --git a/config/profiles/graphical/files/icons/microphone.png b/config/profiles/graphical/files/icons/microphone.png new file mode 100644 index 0000000..d1b6d76 Binary files /dev/null and b/config/profiles/graphical/files/icons/microphone.png differ diff --git a/config/profiles/graphical/files/icons/music.png b/config/profiles/graphical/files/icons/music.png new file mode 100644 index 0000000..648bcdc Binary files /dev/null and b/config/profiles/graphical/files/icons/music.png differ diff --git a/config/profiles/graphical/files/icons/palette.png b/config/profiles/graphical/files/icons/palette.png new file mode 100644 index 0000000..0e65534 Binary files /dev/null and b/config/profiles/graphical/files/icons/palette.png differ diff --git a/config/profiles/graphical/files/icons/picture.png b/config/profiles/graphical/files/icons/picture.png new file mode 100644 index 0000000..233d9db Binary files /dev/null and b/config/profiles/graphical/files/icons/picture.png differ diff --git a/config/profiles/graphical/files/icons/timer.png b/config/profiles/graphical/files/icons/timer.png new file mode 100644 index 0000000..f37ae53 Binary files /dev/null and b/config/profiles/graphical/files/icons/timer.png differ diff --git a/config/profiles/graphical/files/icons/volume-high.png b/config/profiles/graphical/files/icons/volume-high.png new file mode 100644 index 0000000..26f83cb Binary files /dev/null and b/config/profiles/graphical/files/icons/volume-high.png differ diff --git a/config/profiles/graphical/files/icons/volume-low.png b/config/profiles/graphical/files/icons/volume-low.png new file mode 100644 index 0000000..2a81d5e Binary files /dev/null and b/config/profiles/graphical/files/icons/volume-low.png differ diff --git a/config/profiles/graphical/files/icons/volume-mid.png b/config/profiles/graphical/files/icons/volume-mid.png new file mode 100644 index 0000000..01790b8 Binary files /dev/null and b/config/profiles/graphical/files/icons/volume-mid.png differ diff --git a/config/profiles/graphical/files/icons/volume-mute.png b/config/profiles/graphical/files/icons/volume-mute.png new file mode 100644 index 0000000..a5d32e0 Binary files /dev/null and b/config/profiles/graphical/files/icons/volume-mute.png differ diff --git a/config/profiles/graphical/files/rofi/confirm.rasi b/config/profiles/graphical/files/rofi/confirm.rasi new file mode 100644 index 0000000..a4a66d0 --- /dev/null +++ b/config/profiles/graphical/files/rofi/confirm.rasi @@ -0,0 +1,148 @@ +/** + * Copyright (C) 2020-2023 Aditya Shakya + **/ + +/*****----- Configuration -----*****/ +configuration { + show-icons: false; +} + +/*****----- Global Properties -----*****/ +@import "shared/colors.rasi" +@import "shared/fonts.rasi" + +/* +USE_ICON=YES +*/ + +/*****----- Main Window -----*****/ +window { + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 300px; + x-offset: 0px; + y-offset: 0px; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 15px; + border-color: @border; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + background-color: transparent; + children: [ "inputbar", "message", "listview" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + padding: 0px; + border: 0px; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt"]; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + padding: 10px 14px; + border-radius: 0px; + background-color: var(urgent); + text-color: @background; +} +prompt { + enabled: true; + padding: 10px; + border-radius: 0px; + background-color: var(active); + text-color: @background; +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 10px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: @background-alt; + text-color: @foreground; +} +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 6; + lines: 1; + cycle: true; + scrollbar: false; + layout: vertical; + + spacing: 10px; + background-color: transparent; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + padding: 2px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element-text { + font: "feather 20"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; +} + +element normal.normal, +element alternate.normal { + background-color: var(background-alt); + text-color: var(foreground); +} +element normal.urgent, +element alternate.urgent, +element selected.active { + background-color: var(urgent); + text-color: var(background); +} +element normal.active, +element alternate.active, +element selected.urgent { + background-color: var(active); + text-color: var(background); +} +element selected.normal { + background-color: var(selected); + text-color: var(background); +} diff --git a/config/profiles/graphical/files/rofi/launcher.rasi b/config/profiles/graphical/files/rofi/launcher.rasi new file mode 100644 index 0000000..eb9db2a --- /dev/null +++ b/config/profiles/graphical/files/rofi/launcher.rasi @@ -0,0 +1,202 @@ +/** + * Copyright (C) 2020-2023 Aditya Shakya + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: "drun,run,filebrowser"; + show-icons: true; + display-drun: ""; + display-run: ""; + display-filebrowser: ""; + drun-display-format: "{name}"; +} + +/*****----- Global Properties -----*****/ +@import "shared/colors.rasi" +@import "shared/fonts.rasi" + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 800px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 15px; + border-color: @border; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + background-color: transparent; + children: [ "inputbar", "message", "listview", "mode-switcher" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 10px; + border-radius: 0px; + background-color: @background-alt; + text-color: @foreground; + children: [ "textbox-prompt-colon", "entry" ]; +} + +prompt { + enabled: true; + background-color: inherit; + text-color: inherit; +} +textbox-prompt-colon { + enabled: true; + padding: 0px; + expand: false; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + padding: 0px; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "Search..."; + placeholder-color: inherit; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 2; + lines: 7; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 5px; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} +scrollbar { + handle-width: 5px ; + handle-color: @selected; + border-radius: 10px; + background-color: @background-alt; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 6px; + border-radius: 0px; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element normal.normal, +element alternate.normal { + background-color: var(background); + text-color: var(foreground); +} +element normal.urgent, +element alternate.urgent, +element selected.active { + background-color: var(urgent); + text-color: var(background); +} +element normal.active, +element alternate.active, +element selected.urgent { + background-color: var(active); + text-color: var(background); +} +element selected.normal { + background-color: var(selected); + text-color: var(background); +} +element-icon { + background-color: transparent; + text-color: inherit; + size: 24px; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + highlight: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 10px; + margin: 0px; + padding: 0px 250px; + background-color: transparent; + text-color: @foreground; +} +button { + padding: 10px; + border-radius: 0px; + background-color: @background-alt; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: var(urgent); + text-color: var(background); +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 10px; + border-radius: 0px; + background-color: @background-alt; + text-color: @foreground; +} +textbox { + background-color: transparent; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.0; + highlight: none; + placeholder-color: @foreground; + blink: true; + markup: true; +} +error-message { + padding: 30px; + background-color: @background; + text-color: @foreground; +} diff --git a/config/profiles/graphical/files/rofi/powermenu.rasi b/config/profiles/graphical/files/rofi/powermenu.rasi new file mode 100644 index 0000000..c29f520 --- /dev/null +++ b/config/profiles/graphical/files/rofi/powermenu.rasi @@ -0,0 +1,141 @@ +/*****----- Configuration -----*****/ +configuration { + show-icons: false; +} + +/*****----- Global Properties -----*****/ +@import "shared/colors.rasi" +@import "shared/fonts.rasi" + + +/*****----- Main Window -----*****/ +window { + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 510px; + x-offset: 0px; + y-offset: 0px; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 15px; + border-color: @border; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + background-color: transparent; + children: [ "inputbar", "message", "listview" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + padding: 0px; + border: 0px; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt"]; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + padding: 10px 14px; + border-radius: 0px; + background-color: var(urgent); + text-color: @background; +} +prompt { + enabled: true; + padding: 10px; + border-radius: 0px; + background-color: var(active); + text-color: @background; +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 10px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: @background-alt; + text-color: @foreground; +} +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 6; + lines: 1; + cycle: true; + scrollbar: false; + layout: vertical; + + spacing: 10px; + background-color: transparent; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + padding: 15px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element-text { + font: "feather 20"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; +} + +element normal.normal, +element alternate.normal { + background-color: var(background-alt); + text-color: var(foreground); +} +element normal.urgent, +element alternate.urgent, +element selected.active { + background-color: var(urgent); + text-color: var(background); +} +element normal.active, +element alternate.active, +element selected.urgent { + background-color: var(active); + text-color: var(background); +} +element selected.normal { + background-color: var(selected); + text-color: var(background); +} diff --git a/config/profiles/graphical/files/rofi/runner.rasi b/config/profiles/graphical/files/rofi/runner.rasi new file mode 100644 index 0000000..f73d45b --- /dev/null +++ b/config/profiles/graphical/files/rofi/runner.rasi @@ -0,0 +1,202 @@ +/** + * Copyright (C) 2020-2023 Aditya Shakya + **/ + +/*****----- Configuration -----*****/ +configuration { + modi: "run"; + show-icons: true; + display-drun: ""; + display-run: ""; + display-filebrowser: ""; + drun-display-format: "{name}"; +} + +/*****----- Global Properties -----*****/ +@import "shared/colors.rasi" +@import "shared/fonts.rasi" + +/*****----- Main Window -----*****/ +window { + /* properties for window widget */ + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 600px; + x-offset: 0px; + y-offset: 0px; + + /* properties for all widgets */ + enabled: true; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 15px; + border-color: @border; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + background-color: transparent; + children: [ "inputbar", "listview" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 10px; + border-radius: 0px; + background-color: @background-alt; + text-color: @foreground; + children: [ "textbox-prompt-colon", "entry" ]; +} + +prompt { + enabled: true; + background-color: inherit; + text-color: inherit; +} +textbox-prompt-colon { + enabled: true; + padding: 0px; + expand: false; + str: ""; + background-color: inherit; + text-color: inherit; +} +entry { + enabled: true; + padding: 0px; + background-color: inherit; + text-color: inherit; + cursor: text; + placeholder: "Run..."; + placeholder-color: inherit; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 2; + lines: 6; + cycle: true; + dynamic: true; + scrollbar: false; + layout: vertical; + reverse: false; + fixed-height: true; + fixed-columns: true; + + spacing: 5px; + background-color: transparent; + text-color: @foreground; + cursor: "default"; +} +scrollbar { + handle-width: 5px ; + handle-color: @selected; + border-radius: 10px; + background-color: @background-alt; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 6px; + border-radius: 0px; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element normal.normal, +element alternate.normal { + background-color: var(background); + text-color: var(foreground); +} +element normal.urgent, +element alternate.urgent, +element selected.active { + background-color: var(urgent); + text-color: var(background); +} +element normal.active, +element alternate.active, +element selected.urgent { + background-color: var(active); + text-color: var(background); +} +element selected.normal { + background-color: var(selected); + text-color: var(background); +} +element-icon { + background-color: transparent; + text-color: inherit; + size: 24px; + cursor: inherit; +} +element-text { + background-color: transparent; + text-color: inherit; + highlight: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Mode Switcher -----*****/ +mode-switcher{ + enabled: true; + spacing: 10px; + margin: 0px; + padding: 0px 250px; + background-color: transparent; + text-color: @foreground; +} +button { + padding: 10px; + border-radius: 0px; + background-color: @background-alt; + text-color: inherit; + cursor: pointer; +} +button selected { + background-color: var(urgent); + text-color: var(background); +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 10px; + border-radius: 0px; + background-color: @background-alt; + text-color: @foreground; +} +textbox { + background-color: transparent; + text-color: @foreground; + vertical-align: 0.5; + horizontal-align: 0.0; + highlight: none; + placeholder-color: @foreground; + blink: true; + markup: true; +} +error-message { + padding: 30px; + background-color: @background; + text-color: @foreground; +} diff --git a/config/profiles/graphical/files/rofi/screenshot.rasi b/config/profiles/graphical/files/rofi/screenshot.rasi new file mode 100644 index 0000000..25367e4 --- /dev/null +++ b/config/profiles/graphical/files/rofi/screenshot.rasi @@ -0,0 +1,148 @@ +/** + * Copyright (C) 2020-2023 Aditya Shakya + **/ + +/*****----- Configuration -----*****/ +configuration { + show-icons: false; +} + +/*****----- Global Properties -----*****/ +@import "shared/colors.rasi" +@import "shared/fonts.rasi" + +/* +USE_ICON=YES +*/ + +/*****----- Main Window -----*****/ +window { + transparency: "real"; + location: center; + anchor: center; + fullscreen: false; + width: 440px; + x-offset: 0px; + y-offset: 0px; + margin: 0px; + padding: 0px; + border: 2px solid; + border-radius: 15px; + border-color: @border; + cursor: "default"; + background-color: @background; +} + +/*****----- Main Box -----*****/ +mainbox { + enabled: true; + spacing: 10px; + margin: 0px; + padding: 30px; + background-color: transparent; + children: [ "inputbar", "message", "listview" ]; +} + +/*****----- Inputbar -----*****/ +inputbar { + enabled: true; + spacing: 10px; + padding: 0px; + border: 0px; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + children: [ "textbox-prompt-colon", "prompt"]; +} + +textbox-prompt-colon { + enabled: true; + expand: false; + str: ""; + padding: 10px 12px; + border-radius: 0px; + background-color: var(urgent); + text-color: @background; +} +prompt { + enabled: true; + padding: 10px; + border-radius: 0px; + background-color: var(active); + text-color: @background; +} + +/*****----- Message -----*****/ +message { + enabled: true; + margin: 0px; + padding: 10px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: @background-alt; + text-color: @foreground; +} +textbox { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; + horizontal-align: 0.0; +} + +/*****----- Listview -----*****/ +listview { + enabled: true; + columns: 6; + lines: 1; + cycle: true; + scrollbar: false; + layout: vertical; + + spacing: 10px; + background-color: transparent; + cursor: "default"; +} + +/*****----- Elements -----*****/ +element { + enabled: true; + padding: 15px; + border: 0px solid; + border-radius: 0px; + border-color: @selected; + background-color: transparent; + text-color: @foreground; + cursor: pointer; +} +element-text { + font: "feather 20"; + background-color: transparent; + text-color: inherit; + cursor: inherit; + vertical-align: 0.5; + horizontal-align: 0.5; +} + +element normal.normal, +element alternate.normal { + background-color: var(background-alt); + text-color: var(foreground); +} +element normal.urgent, +element alternate.urgent, +element selected.active { + background-color: var(urgent); + text-color: var(background); +} +element normal.active, +element alternate.active, +element selected.urgent { + background-color: var(active); + text-color: var(background); +} +element selected.normal { + background-color: var(selected); + text-color: var(background); +} diff --git a/config/profiles/graphical/files/rofi/shared/colors.rasi b/config/profiles/graphical/files/rofi/shared/colors.rasi new file mode 100644 index 0000000..e94c7d9 --- /dev/null +++ b/config/profiles/graphical/files/rofi/shared/colors.rasi @@ -0,0 +1,13 @@ +/* Copyright (C) 2020-2023 Aditya Shakya */ + +/* Colors */ + +* { + background: #24273a; + background-alt: #1e2030; + border: #c6a0f6; + foreground: #cad3f5; + selected: #c6a0f6; + active: #c6a0f6; + urgent: #ed8796; +} diff --git a/config/profiles/graphical/files/rofi/shared/fonts.rasi b/config/profiles/graphical/files/rofi/shared/fonts.rasi new file mode 100644 index 0000000..616e614 --- /dev/null +++ b/config/profiles/graphical/files/rofi/shared/fonts.rasi @@ -0,0 +1,9 @@ +/* Copyright (C) 2020-2023 Aditya Shakya */ + +/* Text Font */ + +/* +{ + font: "Iosevka Nerd Font 10"; +} +*/ \ No newline at end of file diff --git a/config/profiles/graphical/files/scripts/colorpicker.sh b/config/profiles/graphical/files/scripts/colorpicker.sh new file mode 100755 index 0000000..cbbd257 --- /dev/null +++ b/config/profiles/graphical/files/scripts/colorpicker.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +color=$(grim -g "`slurp -b 20262C00 -p`" -t ppm - | convert - -format '%[pixel:p{0,0}]' txt:- | tail -n1 | cut -d' ' -f4) +image=/tmp/${color}.png + +main() { + if [[ "$color" ]]; then + # copy color code to clipboard + echo $color | tr -d "\n" | wl-copy + # generate preview + convert -size 48x48 xc:"$color" ${image} + # notify about it + notify-send -h string:x-canonical-private-synchronous:sys-notify-picker -u low -i ${image} "$color, copied to clipboard." + fi +} + +main diff --git a/config/profiles/graphical/files/scripts/rofi_powermenu.sh b/config/profiles/graphical/files/scripts/rofi_powermenu.sh new file mode 100755 index 0000000..6ff3f88 --- /dev/null +++ b/config/profiles/graphical/files/scripts/rofi_powermenu.sh @@ -0,0 +1,97 @@ +#!/usr/bin/env bash + +# Import Current Theme +DIR="$HOME/.config/rofi" +RASI="$DIR/powermenu.rasi" +CNFR="$DIR/confirm.rasi" + +# Theme Elements +prompt="`hostname` (`echo $XDG_CURRENT_DESKTOP`)" +mesg="Uptime : `uptime -p | sed -E -e 's/up //g' -e 's/week|weeks/w/g' -e 's/day|days/d/g' -e 's/hour|hours/h/g' -e 's/minute|minutes/m/g'`" + +# Options +option_1="" +option_2="☀" +option_3="" +option_4="" +option_5="↺" +option_6="" +yes='' +no='' + +# Rofi CMD +rofi_cmd() { + rofi -dmenu \ + -p "$prompt" \ + -mesg "$mesg" \ + -markup-rows \ + -theme ${RASI} +} + +# Pass variables to rofi dmenu +run_rofi() { + echo -e "$option_1\n$option_2\n$option_3\n$option_4\n$option_5\n$option_6" | rofi_cmd +} + +# Confirmation CMD +confirm_cmd() { + rofi -dmenu \ + -p 'Confirmation' \ + -mesg 'Are you Sure?' \ + -theme ${CNFR} +} + +# Ask for confirmation +confirm_exit() { + echo -e "$yes\n$no" | confirm_cmd +} + +# Confirm and execute +confirm_run () { + selected="$(confirm_exit)" + if [[ "$selected" == "$yes" ]]; then + ${1} && ${2} && ${3} && ${4} + else + exit + fi +} + +# Execute Command +run_cmd() { + if [[ "$1" == '--opt1' ]]; then + swaylock -f -i ~/.config/hypr/wallpapers/lockscreen.png + elif [[ "$1" == '--opt2' ]]; then + confirm_run 'hyprctl dispatch exit 0' + elif [[ "$1" == '--opt3' ]]; then + confirm_run 'pulsemixer --mute' 'swaylock -f -i ~/.config/hypr/wallpapers/lockscreen.png' 'systemctl suspend' #"$DIR/scripts/lockscreen" + elif [[ "$1" == '--opt4' ]]; then + confirm_run 'systemctl hibernate' + elif [[ "$1" == '--opt5' ]]; then + confirm_run 'systemctl reboot' + elif [[ "$1" == '--opt6' ]]; then + confirm_run 'systemctl poweroff' + fi +} + +# Actions +chosen="$(run_rofi)" +case ${chosen} in + $option_1) + run_cmd --opt1 + ;; + $option_2) + run_cmd --opt2 + ;; + $option_3) + run_cmd --opt3 + ;; + $option_4) + run_cmd --opt4 + ;; + $option_5) + run_cmd --opt5 + ;; + $option_6) + run_cmd --opt6 + ;; +esac diff --git a/config/profiles/graphical/files/scripts/rofi_screenshot.sh b/config/profiles/graphical/files/scripts/rofi_screenshot.sh new file mode 100755 index 0000000..eeba5d8 --- /dev/null +++ b/config/profiles/graphical/files/scripts/rofi_screenshot.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash + +# Import Current Theme +DIR="$HOME/.config/rofi" +RASI="$DIR/screenshot.rasi" + +# Theme Elements +prompt='Screenshot' +mesg="Directory :: `xdg-user-dir PICTURES`/screenshots" + +# Options +layout=`cat ${RASI} | grep 'USE_ICON' | cut -d'=' -f2` +if [[ "$layout" == 'NO' ]]; then + option_1=" Capture Desktop" + option_2=" Capture Area" + option_3=" Capture Window" + option_4=" Capture in 5s" + option_5=" Capture in 10s" +else + option_1="" + option_2="" + option_3="" + option_4="5s" + option_5="10" +fi + +# Rofi CMD +rofi_cmd() { + rofi -dmenu \ + -p "$prompt" \ + -mesg "$mesg" \ + -markup-rows \ + -theme ${RASI} +} + +# Pass variables to rofi dmenu +run_rofi() { + echo -e "$option_1\n$option_2\n$option_3\n$option_4\n$option_5" | rofi_cmd +} + +# Screenshot +time=`date +%Y-%m-%d-%H-%M-%S` +dir="`xdg-user-dir PICTURES`/screenshots" +file="${time}_${geometry}.png" + +# Directory +if [[ ! -d "$dir" ]]; then + mkdir -p "$dir" +fi + +# notify and view screenshot +iDIR="$HOME/.config/hypr/mako/icons" +notify_view() { + notify_cmd_shot="notify-send -h string:x-canonical-private-synchronous:sys-notify-shot -u low -i ${iDIR}/picture.png" + ${notify_cmd_shot} "Copied to clipboard." + paplay /usr/share/sounds/freedesktop/stereo/screen-capture.oga &>/dev/null & + image-roll "$dir/$file" + if [[ -e "$dir/$file" ]]; then + ${notify_cmd_shot} "Screenshot Saved." + else + ${notify_cmd_shot} "Screenshot Deleted." + fi +} + +# countdown +countdown () { + for sec in `seq $1 -1 1`; do + notify-send -h string:x-canonical-private-synchronous:sys-notify-count -t 1000 -i "$iDIR"/timer.png "Taking shot in : $sec" + sleep 1 + done +} + +# take shots +shotnow () { + cd ${dir} && sleep 0.5 && grim - | tee "$file" | wl-copy + notify_view +} + +shot5 () { + countdown '5' + sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy + notify_view +} + +shot10 () { + countdown '10' + sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy + notify_view +} + +shotwin () { + w_pos=`hyprctl activewindow | grep 'at:' | cut -d':' -f2 | tr -d ' ' | tail -n1` + w_size=`hyprctl activewindow | grep 'size:' | cut -d':' -f2 | tr -d ' ' | tail -n1 | sed s/,/x/g` + cd ${dir} && sleep 0.3 && grim -g "$w_pos $w_size" - | tee "$file" | wl-copy + notify_view +} + +shotarea () { + cd ${dir} && grim -g "$(slurp -b 20262CCC -c B4A1DBff -s B4A1DB0D -w 2 && sleep 0.3)" - | tee "$file" | wl-copy + notify_view +} + +# Execute Command +run_cmd() { + if [[ "$1" == '--opt1' ]]; then + shotnow + elif [[ "$1" == '--opt2' ]]; then + shotarea + elif [[ "$1" == '--opt3' ]]; then + shotwin + elif [[ "$1" == '--opt4' ]]; then + shot5 + elif [[ "$1" == '--opt5' ]]; then + shot10 + fi +} + +# Actions +chosen="$(run_rofi)" +case ${chosen} in + $option_1) + run_cmd --opt1 + ;; + $option_2) + run_cmd --opt2 + ;; + $option_3) + run_cmd --opt3 + ;; + $option_4) + run_cmd --opt4 + ;; + $option_5) + run_cmd --opt5 + ;; +esac diff --git a/config/profiles/graphical/files/scripts/screenshot.sh b/config/profiles/graphical/files/scripts/screenshot.sh new file mode 100755 index 0000000..23f6012 --- /dev/null +++ b/config/profiles/graphical/files/scripts/screenshot.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +iDIR="$HOME/.config/mako-icons" + +time=`date +%Y-%m-%d-%H-%M-%S` +dir="$HOME/Pictures/screenshots" +file="${time}.png" + +# notify and view screenshot +notify_cmd_shot="notify-send -h string:x-canonical-private-synchronous:sys-notify-shot -u low -i ${iDIR}/picture.png" +notify_view () { + ${notify_cmd_shot} "Copied to clipboard." + paplay /usr/share/sounds/freedesktop/stereo/screen-capture.oga &>/dev/null & + image-roll "${dir}/$file" + if [[ -e "$dir/$file" ]]; then + ${notify_cmd_shot} "Screenshot Saved." + else + ${notify_cmd_shot} "Screenshot Deleted." + fi +} + +# countdown +countdown () { + for sec in `seq $1 -1 1`; do + notify-send -h string:x-canonical-private-synchronous:sys-notify-count -t 1000 -i "$iDIR"/timer.png "Taking shot in : $sec" + sleep 1 + done +} + +# take shots +shotnow () { + cd ${dir} && sleep 0.5 && grim - | tee "$file" | wl-copy + notify_view +} + +shot5 () { + countdown '5' + sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy + notify_view +} + +shot10 () { + countdown '10' + sleep 1 && cd ${dir} && grim - | tee "$file" | wl-copy + notify_view +} + +shotwin () { + w_pos=`hyprctl activewindow | grep 'at:' | cut -d':' -f2 | tr -d ' ' | tail -n1` + w_size=`hyprctl activewindow | grep 'size:' | cut -d':' -f2 | tr -d ' ' | tail -n1 | sed s/,/x/g` + cd ${dir} && grim -g "$w_pos $w_size" - | tee "$file" | wl-copy + notify_view +} + +shotarea () { + cd ${dir} && grim -g "$(slurp -b 20262CCC -c B4A1DBff -s B4A1DB0D -w 2 && sleep 0.3)" - | tee "$file" | wl-copy + notify_view +} + +if [[ ! -d "$dir" ]]; then + mkdir -p "$dir" +fi + +if [[ "$1" == "--now" ]]; then + shotnow +elif [[ "$1" == "--in5" ]]; then + shot5 +elif [[ "$1" == "--in10" ]]; then + shot10 +elif [[ "$1" == "--win" ]]; then + shotwin +elif [[ "$1" == "--area" ]]; then + shotarea +else + echo -e "Available Options : --now --in5 --in10 --win --area" +fi + +exit 0 diff --git a/config/profiles/graphical/waybar-style.css b/config/profiles/graphical/waybar-style.css new file mode 100644 index 0000000..70c4b5c --- /dev/null +++ b/config/profiles/graphical/waybar-style.css @@ -0,0 +1,335 @@ +@define-color base #24273a; +@define-color mantle #1e2030; +@define-color crust #181926; + +@define-color text #cad3f5; +@define-color subtext0 #a5adcb; +@define-color subtext1 #b8c0e0; + +@define-color surface0 #363a4f; +@define-color surface1 #494d64; +@define-color surface2 #5b6078; + +@define-color overlay0 #6e738d; +@define-color overlay1 #8087a2; +@define-color overlay2 #939ab7; + +@define-color blue #8aadf4; +@define-color lavender #b7bdf8; +@define-color sapphire #7dc4e4; +@define-color sky #91d7e3; +@define-color teal #8bd5ca; +@define-color green #a6da95; +@define-color yellow #eed49f; +@define-color peach #f5a97f; +@define-color maroon #ee99a0; +@define-color red #ed8796; +@define-color mauve #c6a0f6; +@define-color pink #f5bde6; +@define-color flamingo #f0c6c6; +@define-color rosewater #f4dbd6; + +* { + color: @lavender; + border: 0; + padding: 0 0; + font-family: UbuntuMono; + /* font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; */ + font-size: 19px; + font-weight: bold; + transition: all 0.5s ease; +} + +window#waybar { + /* border-bottom: 4px solid shade(@base, 1.1); */ + /* border-radius: 10px; */ + /* background:#2d2a2e; */ + /* background-color: rgba(36, 39, 58, 0.60); */ + /* background-color: rgba(0, 0, 0, 0); */ + /* background-color: shade(#1e1e2e, 0.95); */ + /* background-color: rgba(9, 3, 18, 0.70); */ + background: none; +} + +#workspaces button { + color: @base; + border-radius: 50%; + /* background-color: @base; */ + margin: 0px 8px 0px 8px; + padding: 2px 6px 2px 0px; +} + +#workspaces button:hover * { + color: @mauve; +} + +#workspaces button:hover { + color: @mauve; + /* border-radius: 20px; */ + box-shadow: none; /* Remove predefined box-shadow */ + text-shadow: none; /* Remove predefined text-shadow */ + border: 0px; + background: none; +} + +#workspaces * { + color: whitesmoke; +} + +#workspaces { + border-style: solid; + background-color: shade(@base, 0.7); + opacity: 1; + border-radius: 10px; + margin: 9px 8px 8px 8px; +} + +#workspaces button.active { + color: @mauve; + border-radius: 20px; + /* background-color: @flamingo; */ +} + +#workspaces button.active * { + color: @mauve; +} + +#mode { + color: #ebcb8b; +} + +#clock, +#battery, +#cpu, +#memory, +#idle_inhibitor, +#temperature, +#backlight, +#network, +#pulseaudio, +#mode, +#tray, +#custom-pacman, +#custom-playerctl, +#mpd { + padding: 6px 8px; + border-style: solid; + background-color: shade(@base, 0.70); + opacity: 1; + margin: 9px 0px 8px 0px; +} + +#mpd { + border-radius: 10px; + color: @mauve; + margin-left: 5px; + background-color: rgba(0, 0, 0, 0); +} + +#custom-background { + border-radius: 0px 10px 10px 0px; + background-color: @base; + color: white; + padding: 5px 14px 5px 5px; +} + +#custom-playerctl { + color: @mauve; + border-radius: 10px; + margin: 9px 8px 8px 0px; +} +#clock { + color: @mauve; + border-radius: 10px; + margin: 9px 10px 8px 10px; +} + +#backlight { + color: @yellow; + border-radius: 10px 0 0 10px; +} + +#battery { + color: @sky; + /* border-bottom: 2px solid #d8dee9; */ + border-radius: 0 10px 10px 0; + margin-right: 10px; +} + +#battery.charging { + color: #81a1c1; +} + +@keyframes blink { + to { + color: @red; + /* border-bottom: 2px solid @red; */ + } +} + +#battery.critical:not(.charging) { + color: #bf616a; + /* border-bottom: 2px solid #bf616a; */ + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#cpu { + color: @sky; + /* border-bottom: 2px solid @sky; */ +} + +#cpu #cpu-icon { + color: @sky; +} + +#memory { + color: @sky; +} + +#network.disabled { + color: #bf616a; + /* border-bottom: 2px solid #bf616a; */ +} + +#network { + color: @green; + /* border-bottom: 2px solid @green; */ + border-radius: 10px; + margin-right: 8px; +} + +#network.disconnected { + color: #bf616a; + /* border-bottom: 2px solid #bf616a; */ +} + +#pulseaudio { + color: @flamingo; + border-radius: 0 10px 10px 0; + margin-right: 10px; + /* border-bottom: 2px solid @flamingo; */ +} + +#pulseaudio.muted { + color: #3b4252; + /* border-bottom: 2px solid #3b4252; */ +} + +#temperature { + color: @teal; + border-radius: 10px 0 0 10px; +} + +#temperature.critical { + color: @red; + /* border-bottom: 2px solid @red; */ +} + +#custom-pacman { + border-radius: 10px 0 0 10px; +} + +#idle_inhibitor { + background-color: #ebcb8b; + color: @base; +} + +#tray { + /* background-color: @base; */ + border-radius: 10px; +} + +#window { + border-style: hidden; + margin-left: 10px; + /* margin-top:1px; + padding: 8px 1rem; */ + margin-right: 10px; + color: #eceff4; +} + +#mode { + margin-bottom: 4px; +} + +/* window#waybar { + background: #2d2a2e; + } + + * { + color: #c8b9a9; + font-family: Ubuntu Mono, sans-serif; + font-size: 12px; + } + + #workspaces button.focused { + color: #f2e5bc; + } + + #workspaces button { + color: #c8b9a9; + } + + .separator { + background-color: #c8b9a9; + } + + #mode { + color: #ebcb8b; + } + + #clock { + color: #a3be8c; + } + + #battery { + color: #d8dee9; + } + + #battery.charging { + color: #b48ead; + } + + #battery.critical:not(.charging) { + color: #bf616a; + } + + #cpu { + color: #a3be8c; + } + + #memory { + color: #d3869b; + } + + #network { + color: #8fbcbb; + } + + #network.disabled { + color: #bf616a; + } + + #network.disconnected { + color: #bf616a; + } + + #pulseaudio { + color: #b48ead; + } + + #pulseaudio.muted { + color: #bf616a; + } + + #temperature { + color: #8fbcbb; + } + + #temperature.critical { + color: #bf616a; + } */ diff --git a/config/common-headless.nix b/config/profiles/headless.nix similarity index 100% rename from config/common-headless.nix rename to config/profiles/headless.nix diff --git a/config/common-dus.nix b/config/profiles/kartoffel.nix similarity index 100% rename from config/common-dus.nix rename to config/profiles/kartoffel.nix diff --git a/config/common-lxc.nix b/config/profiles/lxc.nix similarity index 100% rename from config/common-lxc.nix rename to config/profiles/lxc.nix diff --git a/config/common-nginx.nix b/config/services/nginx.nix similarity index 100% rename from config/common-nginx.nix rename to config/services/nginx.nix diff --git a/flake.lock b/flake.lock index 6613dd9..5397a76 100644 --- a/flake.lock +++ b/flake.lock @@ -6,11 +6,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1703863936, - "narHash": "sha256-sy+rSQ1NMUf5Rhoi0waBgBh+vj98ADjrROSkBG4EFWY=", + "lastModified": 1705593119, + "narHash": "sha256-bax2BqeVfLRILgevpVhT3PMhq/koBB/XzwLGhv6N2LU=", "owner": "wobcom", "repo": "fernglas", - "rev": "eef7c251904c9c39eacb0d680474901af4b7a9b4", + "rev": "2a63e52f6402e3d3ea1fd69091b044dd5b62a960", "type": "github" }, "original": { @@ -76,11 +76,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1705312285, - "narHash": "sha256-rd+dY+v61Y8w3u9bukO/hB55Xl4wXv4/yC8rCGVnK5U=", + "lastModified": 1706182238, + "narHash": "sha256-Ti7CerGydU7xyrP/ow85lHsOpf+XMx98kQnPoQCSi1g=", "owner": "nixos", "repo": "nixos-hardware", - "rev": "bee2202bec57e521e3bd8acd526884b9767d7fa0", + "rev": "f84eaffc35d1a655e84749228cde19922fcf55f1", "type": "github" }, "original": { @@ -123,11 +123,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1705316053, - "narHash": "sha256-J2Ey5mPFT8gdfL2XC0JTZvKaBw/b2pnyudEXFvl+dQM=", + "lastModified": 1705856552, + "narHash": "sha256-JXfnuEf5Yd6bhMs/uvM67/joxYKoysyE3M2k6T3eWbg=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c3e128f3c0ecc1fb04aef9f72b3dcc2f6cecf370", + "rev": "612f97239e2cc474c13c9dafa0df378058c5ad8d", "type": "github" }, "original": { @@ -137,12 +137,47 @@ "type": "github" } }, + "nixpkgs_4": { + "locked": { + "lastModified": 1694959747, + "narHash": "sha256-CXQ2MuledDVlVM5dLC4pB41cFlBWxRw4tCBsFrq3cRk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "970a59bd19eff3752ce552935687100c46e820a5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "fernglas": "fernglas", "kyouma-www": "kyouma-www", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_3", + "secrix": "secrix" + } + }, + "secrix": { + "inputs": { + "nixpkgs": "nixpkgs_4" + }, + "locked": { + "lastModified": 1701493419, + "narHash": "sha256-Aa6uQcHp1vABB0FlMsMVMI0Vhk91VozLoSkAT7L7PMU=", + "owner": "Platonic-Systems", + "repo": "secrix", + "rev": "c5d193ae564b93ffa3e5a950fb7666760e0ae324", + "type": "github" + }, + "original": { + "owner": "Platonic-Systems", + "repo": "secrix", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index a5e09ae..eabdee0 100644 --- a/flake.nix +++ b/flake.nix @@ -5,9 +5,14 @@ nixos-hardware.url = "github:nixos/nixos-hardware"; fernglas.url = "github:wobcom/fernglas"; kyouma-www.url = "git+ssh://git@git.bsd.gay/snaki/kyouma-net.git"; + secrix.url = "github:Platonic-Systems/secrix"; + home-manager = { + url = "github:nix-community/home-manager"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, nixpkgs, nixos-hardware, fernglas, kyouma-www, ... }@inputs: { + outputs = { self, nixpkgs, nixos-hardware, fernglas, kyouma-www, secrix, home-manager, ... }@inputs: { colmena = { meta = { allowApplyAll = false; @@ -20,18 +25,11 @@ crime = { imports = [ ./config/hosts/crime/configuration.nix ]; }; + ryuuko = { + imports = [ ./config/hosts/ryuuko/configuartion.nix ]; + }; }; - nixosConfigurations = { -# ryuuko = nixpkgs.lib.nixosSystem { -# system = "x86_64-linux"; -# specialArgs = attrs; -# modules = [ -# ./config/common -# ./config/x1.nix -# ./config/hosts/ryuuko/configuration.nix -# ]; -# }; - }; + apps.x86_64-linux.secrix = inputs.secrix.secrix self; devShells.x86_64-linux.default = let pkgs = nixpkgs.legacyPackages.x86_64-linux; in pkgs.mkShell { diff --git a/modules/machine-type/default.nix b/modules/machine-type/default.nix index d7e448f..49fa20c 100644 --- a/modules/machine-type/default.nix +++ b/modules/machine-type/default.nix @@ -1,4 +1,7 @@ -{ config, lib, ...}: with lib; { +{ config, lib, ...}: with lib; +let + cfg = config.kyouma.machine-type; +in { options.kyouma.machine-type = { physical = mkOption { type = types.bool; @@ -36,9 +39,21 @@ description = mdDoc "Mark machine as portable."; }; }; - config = let - cfg = config.kyouma.machine-type; - in { + config = { + assertions = [ + { assertion = !(cfg.physical && cfg.virtual); + message = "machine-type.physical and machine-type.virtual are mutually exclusive"; + } + { assertion = !(cfg.headless && cfg.graphical); + message = "machine-type.headless and machine-type.graphical are mutually exclusive"; + } + { assertion = if cfg.router then cfg.headless == cfg.router else true; + message = "hosts of machine-type.router must also be machine-type.headless"; + } + { assertion = if cfg.portable then cfg.physical == cfg.portable else true; + message = "hosts of machine-type.protable must also be machine-type.physical"; + } + ]; deployment.tags = mkIf cfg.router [ "router" ]; }; }