diff --git a/flake.nix b/flake.nix index c5a742c..af69b35 100644 --- a/flake.nix +++ b/flake.nix @@ -65,7 +65,8 @@ ]; }]; - in { + in + { homeManagerConfigurations = { erwin = user.mkHMUser { userConfig = { @@ -74,6 +75,7 @@ applications.enable = true; gpg.enable = true; fish.enable = true; + sway.enable = true; }; username = "erwin"; }; diff --git a/modules/system/boot/default.nix b/modules/system/boot/default.nix index 6738554..1848ea6 100644 --- a/modules/system/boot/default.nix +++ b/modules/system/boot/default.nix @@ -1,8 +1,10 @@ { pkgs, config, lib, modulesPath, ... }: with lib; -let cfg = config.eb.boot; -in { +let + cfg = config.eb.boot; +in +{ options.eb.boot = { type = mkOption { description = "Type of boot. Default bios."; @@ -10,10 +12,8 @@ in { type = types.enum [ "bios" "uefi" ]; }; - qemu = mkOption { + qemu = mkEnableOption { description = "Set to true if running in qemu"; - default = false; - type = types.bool; }; grubInstallDevice = mkOption { @@ -75,11 +75,12 @@ in { kernelModules = [ "virtio_balloon" "virtio_console" "virtio_rng" ]; postDeviceCommands = '' - hwclock -s + hwclock -s ''; }; services.qemuGuest.enable = true; + services.spice-vdagentd.enable = true; }) ]; } diff --git a/modules/system/core/default.nix b/modules/system/core/default.nix index 62b9bbc..8044afd 100644 --- a/modules/system/core/default.nix +++ b/modules/system/core/default.nix @@ -3,7 +3,8 @@ with lib; let cfg = config.eb.core; -in { +in +{ options.eb.core = { enable = mkOption { description = "Enable core options"; @@ -26,7 +27,6 @@ in { console = { font = "Lat2-Terminus16"; - keyMap = "colemak"; }; i18n.defaultLocale = "en_US.UTF-8"; @@ -65,5 +65,9 @@ in { services.openssh.enable = true; + hardware.opengl = { + enable = true; + driSupport = true; + }; }; } diff --git a/modules/users/applications/alacritty.nix b/modules/users/applications/alacritty.nix new file mode 100644 index 0000000..cd77cc5 --- /dev/null +++ b/modules/users/applications/alacritty.nix @@ -0,0 +1,85 @@ +{ + enable = true; + settings = { + window = { + decorations = "full"; + startup_mode = "Maximized"; + }; + + scrolling = { + history = 100000; + }; + font = { + normal = { + family = "CaskaydiaCove Nerd Font"; + style = "Medium"; + }; + size = 10.0; + }; + colors = { + primary = { + background = "#2e3440"; + foreground = "#d8dee9"; + dim_foreground = "#a5abb6"; + }; + cursor = { + text = "#2e3440"; + cursor = "#d8dee9"; + }; + vi_mode_cursor = { + text = "#2e3440"; + cursor = "#d8dee9"; + }; + selection = { + text = "CellForeground"; + background = "#4c566a"; + }; + search = { + matches = { + foreground = "CellBackground"; + background = "#88c0d0"; + }; + bar = { + background = "#434c5e"; + foreground = "#d8dee9"; + }; + }; + normal = { + black = "#3b4252"; + red = "#bf616a"; + green = "#a3be8c"; + yellow = "#ebcb8b"; + blue = "#81a1c1"; + magenta = "#b48ead"; + cyan = "#88c0d0"; + white = "#e5e9f0"; + }; + bright = { + black = "#4c566a"; + red = "#bf616a"; + green = "#a3be8c"; + yellow = "#ebcb8b"; + blue = "#81a1c1"; + magenta = "#b48ead"; + cyan = "#8fbcbb"; + white = "#eceff4"; + }; + dim = { + black = "#373e4d"; + red = "#94545d"; + green = "#809575"; + yellow = "#b29e75"; + blue = "#68809a"; + magenta = "#8c738c"; + cyan = "#6d96a5"; + white = "#aeb3bb"; + }; + background_opacity = 0.9; + live_config_reload = true; + mouse = { + hide_when_typing = true; + }; + + }; + }; +} diff --git a/modules/users/applications/default.nix b/modules/users/applications/default.nix index 263a492..3979498 100644 --- a/modules/users/applications/default.nix +++ b/modules/users/applications/default.nix @@ -3,7 +3,8 @@ with lib; let cfg = config.erwin.applications; -in { +in +{ options.erwin.applications = { enable = mkOption { description = "Enable a set of common applications"; @@ -19,8 +20,17 @@ in { home.packages = with pkgs; [ neovim + (nerdfonts.override { fonts = [ "CascadiaCode" "FantasqueSansMono" "FiraCode" "JetBrainsMono" "Meslo" "Noto" "SourceCodePro" ]; }) ]; fonts.fontconfig.enable = true; + + xdg = { + enable = true; + }; + + programs = { + alacritty = import ./alacritty.nix; + }; }; } diff --git a/modules/users/default.nix b/modules/users/default.nix index 8a4971e..edbe7c0 100644 --- a/modules/users/default.nix +++ b/modules/users/default.nix @@ -7,5 +7,6 @@ ./git ./gpg ./ssh + ./sway ]; } diff --git a/modules/users/fish/default.nix b/modules/users/fish/default.nix index 590ea3d..3cb1a97 100644 --- a/modules/users/fish/default.nix +++ b/modules/users/fish/default.nix @@ -4,10 +4,8 @@ with lib; let cfg = config.erwin.fish; in { options.erwin.fish = { - enable = mkOption { + enable = mkEnableOption { description = "Enable fish shell"; - type = types.bool; - default = false; }; }; diff --git a/modules/users/sway/default.nix b/modules/users/sway/default.nix new file mode 100644 index 0000000..89a8d9c --- /dev/null +++ b/modules/users/sway/default.nix @@ -0,0 +1,44 @@ +{ pkgs, config, lib, ... }: +with lib; + +let cfg = config.erwin.sway; +in +{ + options.erwin.sway = { + enable = mkEnableOption { + description = "Enable sway"; + }; + }; + + config = mkIf (cfg.enable) { + wayland.windowManager.sway = { + enable = true; + config = import ./sway.nix { + inherit pkgs config lib; + }; + + extraSessionCommands = + '' + export _JAVA_AWT_WM_NONREPARENTING=1 + export MOZ_ENABLE_WAYLAND=1 + export MOZ_DBUS_REMOTE=1 + export QT_QPA_PLATFORM=wayland + export QT_WAYLAND_DISABLE_WINDOWDECORATION="1" + export QT_QPA_PLATFORMTHEME=qt5ct + export SDL_VIDEODRIVER=wayland + export SSH_AUTH_SOCK="''${XDG_RUNTIME_DIR}/gnupg/S.gpg-agent.ssh" + ''; + + wrapperFeatures = { + base = true; + gtk = true; + }; + + xwayland = true; + }; + + programs.waybar = import ./waybar.nix { inherit pkgs config lib; }; + + home.file.".wallpapers".source = ./wallpapers; + }; +} diff --git a/modules/users/sway/sway.nix b/modules/users/sway/sway.nix new file mode 100644 index 0000000..7097910 --- /dev/null +++ b/modules/users/sway/sway.nix @@ -0,0 +1,157 @@ +{ pkgs, config, lib, ... }: +let + cfg = config.wayland.windowManager.sway; + mod = "Mod4"; + swaylockcmd = "${pkgs.swaylock}/bin/swaylock --ignore-empty-password --daemonize --show-failed-attempts --indicator-caps-lock --clock --image /home/erwin/Dropbox/Private/Wallpapers/2560x1440/arch.png --fade-in 0.5 --scaling fill"; +in +{ + modifier = mod; + + assigns = { + "1" = [{ app_id = "firefox"; }]; + "2" = [{ app_id = "Alacritty"; }]; + "3" = [{ class = "Code"; }]; + "10" = [{ class = "telegramdesktop"; } { class = "Signal"; }]; + }; + bars = [ + { + command = "${pkgs.waybar}/bin/waybar"; + } + ]; + left = "n"; + down = "e"; + up = "i"; + right = "o"; + + floating = { + criteria = [{ app_id = "gnome-calculator"; }]; + modifier = mod; + }; + + fonts = { + names = [ "MesloLGM Nerd Font" ]; + style = "Regular"; + size = 12.0; + }; + + gaps = { + inner = 10; + outer = 5; + smartBorders = "on"; + }; + + input = { + "36125:40349:splitKB_Kyria" = { + xkb_options = "lv3:ralt_switch"; + }; + "1133:49291:Logitech_G502_HERO_SE" = { + natural_scroll = "enabled"; + }; + }; + + output = { + "Virtual-1" = { + bg = "~/.wallpapers/river-1920.png fill"; + mode = "1920x1080@60Hz"; + }; + }; + + menu = "${pkgs.wofi}/bin/wofi --show drun -i | ${pkgs.findutils}/bin/xargs swaymsg exec --"; + + keybindings = { + "${cfg.config.modifier}+Return" = "exec ${cfg.config.terminal}"; + "${cfg.config.modifier}+Shift+q" = "kill"; + "${mod}+s" = "exec ${cfg.config.menu}"; + "${mod}+Shift+s" = "exec ${pkgs.wofi}/bin/wofi --show run | ${pkgs.findutils}/bin/xargs swaymsg exec --"; + + "${cfg.config.modifier}+${cfg.config.left}" = "focus left"; + "${cfg.config.modifier}+${cfg.config.down}" = "focus down"; + "${cfg.config.modifier}+${cfg.config.up}" = "focus up"; + "${cfg.config.modifier}+${cfg.config.right}" = "focus right"; + + "${cfg.config.modifier}+Left" = "focus left"; + "${cfg.config.modifier}+Down" = "focus down"; + "${cfg.config.modifier}+Up" = "focus up"; + "${cfg.config.modifier}+Right" = "focus right"; + + "${cfg.config.modifier}+Shift+${cfg.config.left}" = "move left"; + "${cfg.config.modifier}+Shift+${cfg.config.down}" = "move down"; + "${cfg.config.modifier}+Shift+${cfg.config.up}" = "move up"; + "${cfg.config.modifier}+Shift+${cfg.config.right}" = "move right"; + + "${cfg.config.modifier}+Shift+Left" = "move left"; + "${cfg.config.modifier}+Shift+Down" = "move down"; + "${cfg.config.modifier}+Shift+Up" = "move up"; + "${cfg.config.modifier}+Shift+Right" = "move right"; + + "${mod}+h" = "split h"; + "${mod}+v" = "split v"; + "${mod}+t" = "fullscreen toggle"; + "${cfg.config.modifier}+a" = "focus parent"; + + "${mod}+r" = "layout stacking"; + "${cfg.config.modifier}+w" = "layout tabbed"; + "${mod}+f" = "layout toggle split"; + + "${cfg.config.modifier}+Shift+space" = "floating toggle"; + "${cfg.config.modifier}+space" = "focus mode_toggle"; + + "${cfg.config.modifier}+1" = "workspace number 1"; + "${cfg.config.modifier}+2" = "workspace number 2"; + "${cfg.config.modifier}+3" = "workspace number 3"; + "${cfg.config.modifier}+4" = "workspace number 4"; + "${cfg.config.modifier}+5" = "workspace number 5"; + "${cfg.config.modifier}+6" = "workspace number 6"; + "${cfg.config.modifier}+7" = "workspace number 7"; + "${cfg.config.modifier}+8" = "workspace number 8"; + "${cfg.config.modifier}+9" = "workspace number 9"; + + "${cfg.config.modifier}+Shift+1" = + "move container to workspace number 1"; + "${cfg.config.modifier}+Shift+2" = + "move container to workspace number 2"; + "${cfg.config.modifier}+Shift+3" = + "move container to workspace number 3"; + "${cfg.config.modifier}+Shift+4" = + "move container to workspace number 4"; + "${cfg.config.modifier}+Shift+5" = + "move container to workspace number 5"; + "${cfg.config.modifier}+Shift+6" = + "move container to workspace number 6"; + "${cfg.config.modifier}+Shift+7" = + "move container to workspace number 7"; + "${cfg.config.modifier}+Shift+8" = + "move container to workspace number 8"; + "${cfg.config.modifier}+Shift+9" = + "move container to workspace number 9"; + + "${cfg.config.modifier}+Shift+minus" = "move scratchpad"; + "${cfg.config.modifier}+minus" = "scratchpad show"; + + "${cfg.config.modifier}+Shift+c" = "reload"; + "${mod}+Shift+p" = "restart"; + + "${mod}+Shift+f" = "exec --no-startup-id ~/.config/wofi/session.sh"; + "${mod}+l" = "exec ${swaylockcmd}"; + "${mod}+p" = "mode resize"; + + "${mod}+Print" = "exec grim -o $(swaymsg -t get_outputs | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name')"; + "${mod}+Shift+Print" = "exec grim -o $(swaymsg -t get_outputs | ${pkgs.jq}/bin/jq -r '.[] | select(.focused) | .name') - | ${pkgs.wl-clipboard}/bin/wl-copy -t \"image/png\" -f"; + "${mod}+Shift+Ctrl+Print" = "exec grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | ${pkgs.wl-clipboard}/bin/wl-copy -t \"image/png\" -f"; + "${mod}+Shift+Alt+Print" = "exec grim -g \"$(${pkgs.slurp}/bin/slurp)\""; + + "XF86AudioRaiseVolume" = "exec pamixer -ui 2 && pamixer --get-volume > $SWAYSOCK.wob"; + "XF86AudioLowerVolume" = "exec pamixer -ud 2 && pamixer --get-volume > $SWAYSOCK.wob"; + "XF86AudioMute" = "exec pamixer --toggle-mute && ( pamixer --get-mute && echo 0 > $SWAYSOCK.wob ) || pamixer --get-volume > $SWAYSOCK.wob"; + "XF86Calculator" = "exec ${pkgs.gnome.gnome-calculator}/bin/gnome-calculator"; + }; + + terminal = "${pkgs.alacritty}/bin/alacritty"; + + window = { + border = 1; + titlebar = false; + }; + + workspaceAutoBackAndForth = true; +} diff --git a/modules/users/sway/wallpapers/river-1920.png b/modules/users/sway/wallpapers/river-1920.png new file mode 100644 index 0000000..d63e8b2 Binary files /dev/null and b/modules/users/sway/wallpapers/river-1920.png differ diff --git a/modules/users/sway/waybar.nix b/modules/users/sway/waybar.nix new file mode 100644 index 0000000..10ec95e --- /dev/null +++ b/modules/users/sway/waybar.nix @@ -0,0 +1,356 @@ +{ pkgs, config, lib, ... }: +{ + enable = true; + settings = [ + { + layer = "top"; + position = "top"; + height = 30; + + modules-left = [ + "sway/workspaces" + "sway/mode" + # "custom/now_playing" + ]; + modules-center = [ + "sway/window" + ]; + modules-right = [ + "network" + "memory" + "cpu" + "temperature" + "custom/keyboard-layout" + "pulseaudio" + "tray" + "clock#date" + "clock#time" + "idle_inhibitor" + ]; + modules = { + "clock#time" = { + interval = 1; + format = "{:%H:%M:%S}"; + tooltip = false; + }; + + "clock#date" = { + interval = 10; + format = " {:%e %b %Y}"; + tooltip-format = "{:%e %B %Y}"; + }; + + "cpu" = { + interval = 5; + format = "﬙ {usage}% ({load})"; + states = { + warning = 70; + critical = 90; + }; + }; + + "custom/keyboard-layout" = { + exec = "swaymsg -t get_inputs | grep -m1 'xkb_active_layout_name' | cut -d '\"' -f4"; + interval = 30; + format = " {}"; # Icon: keyboard + # Signal sent by Sway key binding (~/.config/sway/key-bindings) + signal = 1; # SIGHUP + tooltip = false; + }; + + "memory" = { + interval = 5; + format = " {}%"; # Icon: memory + states = { + warning = 70; + critical = 90; + }; + }; + + "network" = { + interval = 5; + format-wifi = "直 {essid} ({signalStrength}%)"; # Icon: wifi + format-ethernet = " {ifname}: {ipaddr}/{cidr}"; # Icon: ethernet + format-disconnected = "⚠ Disconnected"; + tooltip-format = "{ifname}: {ipaddr}"; + }; + + "sway/mode" = { + format = " {}"; # Icon: expand-arrows-alt + tooltip = false; + }; + + # TODO: package as nix thingy + # "custom/now_playing" = { + # exec = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY"; + # format = " ♪ {}"; + # interval = 2; + # on-click = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY play-pause"; + # on-scroll-down = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY volume-up"; + # on-scroll-up = "${HOME}/.config/waybar/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI5OWJmN2YyNWYyODc0ZmZhOWVhMTZiNGM1MTQyZmUzZiIsImlhdCI6MTYwMzIyMDAyMiwiZXhwIjoxOTE4NTgwMDIyfQ.dNfjPN-cYStiPrSO-PVArJdShMWl2rdDeo8AXr1byIY volume-down"; + # }; + + "sway/window" = { + format = "{}"; + max-length = 120; + }; + + "sway/workspaces" = { + all-outputs = false; + disable-scroll = true; + format = "{icon} {name}"; + format-icons = { + "1 =www" = ""; + # Icon = firefox-browser + "2 =mail" = ""; + # Icon = mail + "3 =editor" = ""; + # Icon = code + "4 =terminals" = ""; + # Icon = terminal + "5 =portal" = ""; + # Icon = terminal + "urgent" = ""; + "focused" = ""; + "default" = ""; + }; + }; + + "pulseaudio" = { + #scroll-step = 1; + format = "{icon} {volume}%"; + format-bluetooth = "{icon} {volume}%"; + format-muted = "婢"; + format-icons = { + headphones = ""; + handsfree = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ "奄" "奔" "墳" ]; + }; + on-click = "pavucontrol"; + }; + + "temperature" = { + hwmon-path = "/sys/class/hwmon/hwmon2/temp1_input"; + critical-threshold = 80; + interval = 5; + format = "{icon} {temperatureC}°C"; + format-icons = [ + "" # Icon = temperature-empty + "" # Icon = temperature-quarter + "" # Icon = temperature-half + "" # Icon = temperature-three-quarters + "" # Icon = temperature-full + ]; + tooltip = true; + }; + + "tray" = { + icon-size = 21; + spacing = 10; + }; + "idle_inhibitor" = { + format = "{icon}"; + format-icons = { + activated = "﯎"; + deactivated = "﯏"; + }; + }; + }; + + } + + ]; + + style = + '' + @keyframes blink-warning { + 70% { + color: white; + } + + to { + color: white; + background-color: orange; + } + } + + @keyframes blink-critical { + 70% { + color: white; + } + + to { + color: white; + background-color: red; + } + } + + * { + border: none; + border-radius: 0; + min-height: 0; + margin: 0; + padding: 0; + } + + #waybar { + background: #323232; + color: white; + font-family: "MesloLGM Nerd Font", sans-serif; + font-size: 13px; + } + + #battery, + #clock, + #cpu, + #custom-keyboard-layout, + #memory, + #mode, + #network, + #pulseaudio, + #temperature, + #tray, + #custom-now_playing, + #idle_inhibitor { + padding-left: 10px; + padding-right: 10px; + } + + #battery { + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; + } + + #battery.warning { + color: orange; + } + + #battery.critical { + color: red; + } + + #battery.warning.discharging { + animation-name: blink-warning; + animation-duration: 3s; + } + + #battery.critical.discharging { + animation-name: blink-critical; + animation-duration: 2s; + } + + #clock { + font-weight: bold; + } + + #cpu { + /* No styles */ + } + + #cpu.warning { + color: orange; + } + + #cpu.critical { + color: red; + } + + #memory { + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; + } + + #memory.warning { + color: orange; + } + + #memory.critical { + color: red; + animation-name: blink-critical; + animation-duration: 2s; + } + + #mode { + background: #64727D; + border-top: 2px solid white; + /* To compensate for the top border and still have vertical centering */ + padding-bottom: 2px; + } + + #network { + /* No styles */ + } + + #network.disconnected { + color: orange; + } + + #pulseaudio { + /* No styles */ + } + + #pulseaudio.muted { + /* No styles */ + } + + #custom-spotify { + color: rgb(102, 220, 105); + } + + #temperature { + /* No styles */ + } + + #temperature.critical { + color: red; + } + + #tray { + /* No styles */ + } + + #window { + font-weight: bold; + } + + #workspaces button { + border-top: 2px solid transparent; + /* To compensate for the top border and still have vertical centering */ + padding-bottom: 2px; + padding-left: 10px; + padding-right: 10px; + color: #888888; + } + + #workspaces button.focused { + border-color: #4c7899; + color: white; + background-color: #285577; + } + + #workspaces button.urgent { + border-color: #c9545d; + color: #c9545d; + } + + #idle_inhibitor { + background-color: transparent; + font-weight: bold; + } + + #idle_inhibitor.activated { + background-color: #c9545d; + color: #ffffff; + } + + #custom-now_playing { + font-weight: bold; + } + ''; +}