diff --git a/flake.nix b/flake.nix index 8416dcb..816d6ba 100644 --- a/flake.nix +++ b/flake.nix @@ -2,8 +2,7 @@ description = "System config"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-21.05"; - nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager"; @@ -15,7 +14,8 @@ }; - outputs = { nixpkgs, home-manager, ... }@inputs: + outputs = { self, ... }@inputs: + with inputs; let defSystem = systemArch: baseConfig: @@ -24,12 +24,11 @@ modules = [ { _module.args.inputs = inputs; } { _module.args.self-overlay = self.overlay; } - { _module.args.overlay-unstable = self.overlay-unstable; } ({ ... }: { imports = builtins.attrValues self.nixosModules ++ [ { nix.nixPath = [ "nixpkgs=${nixpkgs}" ]; - nixpkgs.overlays = [ self.overlay self.overlay-unstable ]; + nixpkgs.overlays = [ self.overlay ]; } baseConfig @@ -70,12 +69,12 @@ # }; overlay = final: prev: (import ./overlays) final prev; - overlay-unstable = final: prev: { - unstable = import nixpkgs-unstable { - system = "x86_64-linux"; - config.allowUnfree = true; - }; - }; + # overlay = final: prev: { + # unstable = import nixpkgs { + # system = "x86_64-linux"; + # config.allowUnfree = true; + # }; + # }; nixosModules = builtins.listToAttrs (map (x: { @@ -112,6 +111,11 @@ # cpuCores = 4; # }; + vm1 = defSystem "x86_64-linux" { + imports = [ + (import (./machines/vm1/configuration.nix) { inherit self; }) + ]; + }; vm2 = defSystem "x86_64-linux" { imports = [ (import (./machines/vm2/configuration.nix) { inherit self; }) @@ -125,8 +129,8 @@ # }; }; - } - (flake-utils.lib.eachSystem [ "x86_64-linux" ]) + } // + (flake-utils.lib.eachSystem [ "x86_64-linux" ]) (system: let pkgs = import nixpkgs { @@ -141,10 +145,12 @@ rec { packages = flake-utils.lib.flattenTree { rofi-wayland = pkgs.rofi-wayland; + pamedia = pkgs.pamedia; }; apps = { rofi-wayland = flake-utils.lib.mkApp { drv = packages.rofi-wayland; }; + pamedia = flake-utils.lib.mkApp { drv = packages.pamedia; }; }; } ); diff --git a/home-manager/modules/rofi/config.rasi b/home-manager/modules/rofi/config.rasi new file mode 100644 index 0000000..486bcf0 --- /dev/null +++ b/home-manager/modules/rofi/config.rasi @@ -0,0 +1,86 @@ +configuration { + modi: "drun"; + font: "Overpass Nerd Font 10"; + display-drun: ""; + sidebar-mode: false; + show-icons: true; + icon-theme: "Paper"; +} + +@theme "/dev/null" + +* { + bg: #b5b5aa; + fg: #2b2b2b; + button: #9e9e95; + + background-color: @bg; + text-color: @fg; +} + +window { + transparency: "real"; + border-radius: 7px; + width: 40%; + y-offset: 10px; + padding: 20px; + location: north; +} + +prompt { enabled: false; } + +entry { + placeholder: "Search"; + expand: true; + padding: 5px 2% 5px 2%; + background-color: @button; + placeholder-color: @fg; +} + +inputbar { + children: [ prompt, entry ]; + background-color: @button; + text-color: @fg; + expand: false; + border-radius: 6px; + padding: 8px; +} + +listview { + columns: 1; + lines: 8; + cycle: false; + dynamic: true; + layout: vertical; +} + +mainbox { + children: [ inputbar, listview ]; + spacing: 2%; + padding: 2% 1% 2% 1%; +} + +element { + orientation: horizontal; + border-radius: 0%; + padding: 1.0% 0% 1.0% 1.0%; +} + +element-text { + expand: true; + vertical-align: 0.5; + margin: 0.5% 1% 0% 1%; + background-color: inherit; + text-color: inherit; +} + +element-icon { + size: 48px; + border: 0px; +} + +element selected { + background-color: @fg; + text-color: @bg; + border-radius: 6px; +} diff --git a/home-manager/modules/rofi/default.nix b/home-manager/modules/rofi/default.nix new file mode 100644 index 0000000..f2a7208 --- /dev/null +++ b/home-manager/modules/rofi/default.nix @@ -0,0 +1,16 @@ +{ lib, pkgs, config, ... }: +with lib; +let + cfg = config.eboskma.programs.rofi; +in +{ + options.eboskma.programs.rofi.enable = mkEnableOption "Enable rofi"; + + config = mkIf cfg.enable { + + programs.rofi = { + enable = true; + theme = ./launch.rasi; + }; + }; +} diff --git a/home-manager/modules/rofi/power.rasi b/home-manager/modules/rofi/power.rasi new file mode 100644 index 0000000..663df45 --- /dev/null +++ b/home-manager/modules/rofi/power.rasi @@ -0,0 +1,111 @@ +configuration { + dpi: 0; + me-select-entry: "Control+MousePrimary"; + me-accept-entry: "MousePrimary"; +} + +* { + blue: #009ad1; + orange: #d14200; + text: #efefef; + text-alt: #c2c2c2; + bg: #333333; + + spacing: 0; + background-color: transparent; + + font: "DroidSansMono Nerd Font Mono, 14, FontAwesome5Free, 14"; + highlight: bold; + text-color: @text; +} + +window { + transparency: "real"; + y-offset: -1.5em; + x-offset: -0.5em; + width: 27em; + background-color: transparent; +} + +inputbar { + enabled: false; + border: 1px; + border-color: @orange; + border-radius: 5px; + padding: 10px; + margin: 0 5px; + background-color: @bg; +} + +prompt { + text-color: @text; +} + +textbox-prompt-colon { + expand: false; + str: ":"; + text-color: @text-alt; +} + +entry { + margin: 0 0.0em; +} + +listview { + padding: 0.2em; + spacing: 0.2em; + dynamic: true; + scrollbar: false; + lines: 1; + columns: 5; + background-color: transparent; +} + +element { + padding: 0.6em; + text-color: @text-alt; + highlight: bold #95ee8f; /* green */ + background-color: @bg; + border-radius: 5px; + border: 1px; + border-color: @orange; +} +element-icon { + size: 1em; + padding: 0 0.6em 0 0; +} + +element selected { + border: 0 0 0 1px; + background-color: @blue; + text-color: @text; +} + +element urgent, element selected urgent { + text-color: @red; +} + +element active, element selected active { + text-color: @purple; +} + +message, error-message { + margin: 0 0 0.6em; + padding: 1%; + border-radius: 5px; + background-color: @emphasis; +} +error-message { + margin: 0; + padding: 0.6em; + border-color: @red; + border: 3px; +} +mode-switcher { + margin: 0.1em 0 0 0; +} +button selected { + padding: 0.3em; + border-radius: 5px; + background-color: @emphasis; +} diff --git a/home-manager/modules/sway/default.nix b/home-manager/modules/sway/default.nix new file mode 100644 index 0000000..f3a3808 --- /dev/null +++ b/home-manager/modules/sway/default.nix @@ -0,0 +1,186 @@ +{ lib, pkgs, config, ... }: +with lib; +let + cfg = config.eboskma.programs.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 +{ + options.eboskma.programs.sway.enable = mkEnableOption "Enable sway"; + + config = mkIf cfg.enable { + wayland.windowManager.sway = { + enable = true; + config = { + 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 = [ "Iosevka 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"; + }; + "DP-2" = { + bg = "~/.wallpapers/river-2560.png fill"; + mode = "2560x1440@144Hz"; + adaptive_sync = "on"; + }; + }; + + menu = "${pkgs.wofi}/bin/wofi --show drun -i | ${pkgs.findutils}/bin/xargs swaymsg exec --"; + + keybindings = { + "${mod}+Return" = "exec ${config.wayland.windowManager.sway.config.terminal}"; + "${mod}+Shift+q" = "kill"; + "${mod}+s" = "exec ${config.wayland.windowManager.sway.config.menu}"; + "${mod}+Shift+s" = "exec ${pkgs.wofi}/bin/wofi --show run | ${pkgs.findutils}/bin/xargs swaymsg exec --"; + + "${mod}+${config.wayland.windowManager.sway.config.left}" = "focus left"; + "${mod}+${config.wayland.windowManager.sway.config.down}" = "focus down"; + "${mod}+${config.wayland.windowManager.sway.config.up}" = "focus up"; + "${mod}+${config.wayland.windowManager.sway.config.right}" = "focus right"; + + "${mod}+Left" = "focus left"; + "${mod}+Down" = "focus down"; + "${mod}+Up" = "focus up"; + "${mod}+Right" = "focus right"; + + "${mod}+Shift+${config.wayland.windowManager.sway.config.left}" = "move left"; + "${mod}+Shift+${config.wayland.windowManager.sway.config.down}" = "move down"; + "${mod}+Shift+${config.wayland.windowManager.sway.config.up}" = "move up"; + "${mod}+Shift+${config.wayland.windowManager.sway.config.right}" = "move right"; + + "${mod}+Shift+Left" = "move left"; + "${mod}+Shift+Down" = "move down"; + "${mod}+Shift+Up" = "move up"; + "${mod}+Shift+Right" = "move right"; + + "${mod}+h" = "split h"; + "${mod}+v" = "split v"; + "${mod}+t" = "fullscreen toggle"; + "${mod}+a" = "focus parent"; + + "${mod}+r" = "layout stacking"; + "${mod}+w" = "layout tabbed"; + "${mod}+f" = "layout toggle split"; + + "${mod}+Shift+space" = "floating toggle"; + "${mod}+space" = "focus mode_toggle"; + + "${mod}+1" = "workspace number 1"; + "${mod}+2" = "workspace number 2"; + "${mod}+3" = "workspace number 3"; + "${mod}+4" = "workspace number 4"; + "${mod}+5" = "workspace number 5"; + "${mod}+6" = "workspace number 6"; + "${mod}+7" = "workspace number 7"; + "${mod}+8" = "workspace number 8"; + "${mod}+9" = "workspace number 9"; + + "${mod}+Shift+1" = + "move container to workspace number 1"; + "${mod}+Shift+2" = + "move container to workspace number 2"; + "${mod}+Shift+3" = + "move container to workspace number 3"; + "${mod}+Shift+4" = + "move container to workspace number 4"; + "${mod}+Shift+5" = + "move container to workspace number 5"; + "${mod}+Shift+6" = + "move container to workspace number 6"; + "${mod}+Shift+7" = + "move container to workspace number 7"; + "${mod}+Shift+8" = + "move container to workspace number 8"; + "${mod}+Shift+9" = + "move container to workspace number 9"; + + "${mod}+Shift+minus" = "move scratchpad"; + "${mod}+minus" = "scratchpad show"; + + "${mod}+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 ${pkgs.pamedia}/bin/pamedia up"; + "XF86AudioLowerVolume" = "exec ${pkgs.pamedia}/bin/pamedia down"; + "XF86AudioMute" = "exec ${pkgs.pamedia}/bin/pamedia mute"; + "XF86Calculator" = "exec ${pkgs.gnome.gnome-calculator}/bin/gnome-calculator"; + }; + + terminal = "${pkgs.alacritty}/bin/alacritty"; + + window = { + border = 1; + titlebar = false; + }; + + workspaceAutoBackAndForth = true; + + }; + extraConfig = '' + assign [app_id="firefox"] 1 + assign [app_id="Alacritty"] 2 + assign [app_id="Code"] 3 + assign [app_id="telegramdesktop"] 10 + assign [app_id="Signal"] 10 + + for_window [app_id="^.*"] inhibit_idle fullscreen + for_window [class="^.*"] inhibit_idle fullscreen + for_window [app_id="gnome-calculator"] floating enable + + exec --no-startup-id ${pkgs.networkmanagerapplet}/bin/nm-applet --indicator + ''; + }; + }; +} diff --git a/home-manager/modules/waybar/default.nix b/home-manager/modules/waybar/default.nix new file mode 100644 index 0000000..e9ebbc1 --- /dev/null +++ b/home-manager/modules/waybar/default.nix @@ -0,0 +1,366 @@ +{ lib, pkgs, config, ... }: +with lib; +let + cfg = config.eboskma.programs.waybar; +in +{ + options.eboskma.programs.waybar.enable = mkEnableOption "Enable waybar"; + + config = mkIf cfg.enable { + programs.waybar = { + 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; + } + ''; + }; + }; +} diff --git a/machines/vm1/configuration.nix b/machines/vm1/configuration.nix new file mode 100644 index 0000000..769d1c3 --- /dev/null +++ b/machines/vm1/configuration.nix @@ -0,0 +1,38 @@ +{ self, ... }: +{ + imports = [ ./hardware-configuration.nix ]; + + eboskma = { + desktop = { + enable = true; + home-manager = true; + }; + }; + + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + + time.timeZone = "Europe/Amsterdam"; + + networking = { + hostName = "vm2"; + useDHCP = false; + interfaces.enp1s.useDHCP = true; + }; + + # nix = { + # package = pkgs.nixUnstable; + # extraOptions = '' + # experimental-features = nix-command flakes + # ''; + # }; + + services.openssh.enable = true; + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "21.05"; # Did you read the comment? +} diff --git a/machines/vm1/hardware-configuration.nix b/machines/vm1/hardware-configuration.nix new file mode 100644 index 0000000..dc456b4 --- /dev/null +++ b/machines/vm1/hardware-configuration.nix @@ -0,0 +1,32 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ + (modulesPath + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { + device = "/dev/disk/by-label/nixos"; + fsType = "ext4"; + }; + + fileSystems."/boot" = + { + device = "/dev/disk/by-label/boot"; + fsType = "vfat"; + }; + + swapDevices = + [{ device = "/dev/disk/by-label/swap"; }]; + +} diff --git a/machines/vm2/configuration.nix b/machines/vm2/configuration.nix index 7587313..769d1c3 100644 --- a/machines/vm2/configuration.nix +++ b/machines/vm2/configuration.nix @@ -1,6 +1,13 @@ { self, ... }: { - imports = [ ./hardware-configuration.nix ../../users/erwin.nix ]; + imports = [ ./hardware-configuration.nix ]; + + eboskma = { + desktop = { + enable = true; + home-manager = true; + }; + }; boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; @@ -8,17 +15,17 @@ time.timeZone = "Europe/Amsterdam"; networking = { - hostname = "vm2"; + hostName = "vm2"; useDHCP = false; interfaces.enp1s.useDHCP = true; }; - nix = { - package = pkgs.nixUnstable; - extraOptions = '' - experimental-features = nix-command flakes - ''; - }; + # nix = { + # package = pkgs.nixUnstable; + # extraOptions = '' + # experimental-features = nix-command flakes + # ''; + # }; services.openssh.enable = true; # This value determines the NixOS release from which the default diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix new file mode 100644 index 0000000..82f5fbc --- /dev/null +++ b/modules/desktop/default.nix @@ -0,0 +1,53 @@ +{ lib, pkgs, config, inputs, self-overlay, ... }: +with lib; +let cfg = config.eboskma.desktop; +in +{ + imports = [ ../../users/erwin.nix ../../users/root.nix ]; + + options.eboskma.desktop = { + enable = mkEnableOption "Enable default desktop configuration"; + home-manager = mkOption { + type = types.bool; + default = false; + description = '' + Enable home-manager for this desktop + ''; + }; + }; + + config = mkIf cfg.enable { + home-manager.users.erwin = mkIf cfg.home-manager { + _module.args.flake-inputs = inputs; + + programs.home-manager.enable = true; + programs.command-not-found.enable = true; + + home.username = "erwin"; + home.homeDirectory = "/home/erwin"; + + nixpkgs.config = { allowUnfree = true; }; + services.gnome-keyring.enable = true; + + home.stateVersion = "21.11"; + + eboskma = { + programs = { + sway.enable = true; + rofi.enable = true; + waybar.enable = true; + }; + }; + + home.packages = with pkgs; [ + (nerdfonts.override { fonts = [ "CascadiaCode" "FantasqueSansMono" "FiraCode" "Iosevka" "JetBrainsMono" "Meslo" "Noto" "SourceCodePro" ]; }) + ]; + + imports = [ + ../../home-manager/modules/sway + ../../home-manager/modules/waybar + ../../home-manager/modules/rofi + ]; + }; + }; +} diff --git a/overlays/default.nix b/overlays/default.nix index e71f99d..6fa401a 100644 --- a/overlays/default.nix +++ b/overlays/default.nix @@ -1,3 +1,4 @@ self: super: { - rofi-wayland = super.pkgs.callPackage ../pkgs/rofi-wayland { }; + rofi = super.pkgs.callPackage ../pkgs/rofi-wayland { }; + pamedia = super.pkgs.callPackage ../pkgs/pamedia { }; } diff --git a/pkgs/pamedia/default.nix b/pkgs/pamedia/default.nix new file mode 100644 index 0000000..0b00f16 --- /dev/null +++ b/pkgs/pamedia/default.nix @@ -0,0 +1,21 @@ +{ buildPythonPackage, lib, pulsectl }: +buildPythonPackage rec { + pname = "pamedia"; + version = "0.1.0"; + + src = ./src; + + propagatedBuildInputs = [ + pulsectl + ]; + + installPhase = '' + install -d $out/bin + install -m 0755 $src/pamedia $out/bin/pamedia + ''; + + meta = { + description = "Change volume of the PulseAudio default sink"; + license = lib.licenses.mit; + }; +} diff --git a/pkgs/pamedia/src/pamedia b/pkgs/pamedia/src/pamedia new file mode 100755 index 0000000..c880b89 --- /dev/null +++ b/pkgs/pamedia/src/pamedia @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 + +import argparse +import pulsectl +import gi + +gi.require_version('Notify', '0.7') + +from gi.repository import GLib +from gi.repository import Notify + + +class PAMedia: + def __init__(self, sink=None): + self.client = pulsectl.Pulse('volumectl') + sinks = self.client.sink_list() + + if sink == None: + self.sink = self.client.get_sink_by_name( + self.client.server_info().default_sink_name) + else: + if sink > len(sinks): + notification = Notify.Notification.new( + 'Volume', f'Unknown sink index \'{sink}\', using default sink') + notification.show() + self.sink = self.client.get_sink_by_name( + self.client.server_info().default_sink_name) + + self.sink = sinks[sink] + + def toggle_mute(self): + self.client.mute(self.sink, mute=not self.sink.mute) + + def volume_up(self): + self.client.mute(self.sink, mute=False) + self.client.volume_change_all_chans(self.sink, 0.05) + + def volume_down(self): + self.client.mute(self.sink, mute=False) + self.client.volume_change_all_chans(self.sink, -0.05) + + def volume_set(self, new_volume): + new_volume = min(100, max(0, int(new_volume))) + self.client.volume_set_all_chans(self.sink, new_volume / 100.0) + + def list_sinks(self): + for num, sink in enumerate(self.client.sink_list()): + print(f'[{num}] {sink.description}') + + def icon(self): + if self.sink.mute: + return 'muted' + elif self.sink.volume.value_flat <= 0.3: + return 'low' + elif self.sink.volume.value_flat <= 0.7: + return 'medium' + else: + return 'high' + + def notify(self): + icon = f'audio-volume-{self.icon()}' + title = f'Volume' + + if self.sink.mute: + title = 'Muted' + + notification = Notify.Notification.new(title, '', icon) + if not self.sink.mute: + notification.set_hint( + 'x-canonical-private-synchronous', GLib.Variant.new_string('audio')) + notification.set_hint( + 'value', GLib.Variant.new_int32(round(self.volume()))) + + notification.show() + + def volume(self): + return self.sink.volume.value_flat * 100 + + def volume_format(self): + volume = round(self.volume()) + + return f'{volume}%' + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='PulseAudio volume control') + parser.add_argument('-s', '--sink', type=int, + help='Select output sink to control') + parser.add_argument('command', metavar='CMD', type=str, + nargs='+', help='Command, one of: mute, up, down, set, get, sinks') + + args = parser.parse_args() + + ctl = PAMedia(sink=args.sink) + Notify.init('volumectl') + + if args.command[0] == 'mute': + ctl.toggle_mute() + elif args.command[0] == 'up': + ctl.volume_up() + elif args.command[0] == 'down': + ctl.volume_down() + elif args.command[0] == 'get': + print(f'Volume: {ctl.volume_format()}') + exit(0) + elif args.command[0] == 'set' and len(args.command) >= 2: + ctl.volume_set(args.command[1]) + elif args.command[0] == 'sinks': + ctl.list_sinks() + exit(0) + else: + print(f"Unknown command '{args.command}'") + parser.print_help() + exit(1) + + ctl.notify() diff --git a/pkgs/rofi-wayland/default.nix b/pkgs/rofi-wayland/default.nix index 267549d..07b0877 100644 --- a/pkgs/rofi-wayland/default.nix +++ b/pkgs/rofi-wayland/default.nix @@ -19,7 +19,7 @@ stdenv.mkDerivation rec { ''; nativeBuildInputs = [ meson ninja pkgconfig ]; - buildInputs = [ + buildInputs = with pkgs; [ libxkbcommon pango cairo @@ -29,9 +29,9 @@ stdenv.mkDerivation rec { librsvg check libstartup_notification - libxcb - xcbutil - xcbutilwm + xorg.libxcb + xorg.xcbutil + xorg.xcbutilwm xcbutilxrm which wayland-protocols diff --git a/users/erwin.nix b/users/erwin.nix index 9970cf4..02b635b 100644 --- a/users/erwin.nix +++ b/users/erwin.nix @@ -1,9 +1,9 @@ -{ config, pkgs, lib, ... }: +{ pkgs, ... }: { users.users.erwin = { isNormalUser = true; home = "/home/erwin"; - exdraGroups = [ "wheel" "adm" "audio" "video" ]; + extraGroups = [ "wheel" "adm" "audio" "video" ]; shell = pkgs.fish; openssh.authorizedKeys.keyFiles = [ (pkgs.fetchurl { diff --git a/users/root.nix b/users/root.nix new file mode 100644 index 0000000..86a8fd6 --- /dev/null +++ b/users/root.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: +{ + users.users.root = { + openssh.authorizedKeys.keyFiles = [ + (pkgs.fetchurl { + url = "https://github.com/eboskma.keys"; + sha256 = "1l7f425kvfmrs4dfcvllb76182jgb14l1silyy4qmjxvinawb1yj"; + }) + ]; + }; +}