diff --git a/home-manager/modules/river/default.nix b/home-manager/modules/river/default.nix new file mode 100644 index 0000000..823bc7c --- /dev/null +++ b/home-manager/modules/river/default.nix @@ -0,0 +1,218 @@ +{ + pkgs, + config, + lib, + ... +}: +with lib; +let + cfg = config.eboskma.programs.river; + + mod = "Mod4"; + lockcmd = "${pkgs.swaylock}/bin/swaylock --ignore-empty-password --daemonize --show-failed-attempts --indicator-caps-lock --image ${cfg.wallpaper} --scaling fill"; + rofiPower = pkgs.writeShellScriptBin "rofi-power" ( + builtins.replaceStrings [ "{WALLPAPER}" ] [ (builtins.toString cfg.wallpaper) ] ( + builtins.readFile ./powermenu.sh + ) + ); + + menu = "${config.programs.anyrun.package}/bin/anyrun"; + + directions = { + left = "n"; + down = "e"; + up = "i"; + right = "o"; + }; + + catppuccin = { + rosewater = "0xf5e0dc"; + flamingo = "0xf2cdcd"; + pink = "0xf5c2e7"; + mauve = "0xcba6f7"; + red = "0xf38ba8"; + maroon = "0xeba0ac"; + peach = "0xfab387"; + yellow = "0xf9e2af"; + green = "0xa6e3a1"; + teal = "0x94e2d5"; + sky = "0x89dceb"; + sapphire = "0x74c7ec"; + blue = "0x89b4fa"; + lavender = "0xb4befe"; + text = "0xcdd6f4"; + subtext1 = "0xbac2de"; + subtext0 = "0xa6adc8"; + overlay2 = "0x9399b2"; + overlay1 = "0x7f849c"; + overlay0 = "0x6c7086"; + surface2 = "0x585b70"; + surface1 = "0x45475a"; + surface0 = "0x313244"; + base = "0x1e1e2e"; + mantle = "0x181825"; + crust = "0x11111b"; + }; + + bit = b: (foldl (x: _: x * 2) 1 (builtins.genList (n: n + 1) b)); + tags = map (num: { + value = bit num; + index = toString (num + 1); + }) (builtins.genList (n: n) 9); +in +{ + options.eboskma.programs.river = { + enable = mkEnableOption "river"; + package = mkPackageOption pkgs "river" { }; + wallpaper = mkOption { + description = "Desired wallpaper"; + type = types.path; + }; + }; + + config = mkIf cfg.enable { + wayland.windowManager.river = { + enable = true; + settings = { + declare-mode = [ + "normal" + "locked" + "passthrough" + ]; + + input = { + pointer-1390-268-ELECOM_TrackBall_Mouse_HUGE_TrackBall = { + accel-profile = "adaptive"; + natural-scroll = "enabled"; + }; + }; + hide-cursor = "when-typing enabled"; + set-cursor-warp = "on-output-change"; + + keyboard-layout-file = toString ./keyboard-layout; + + map = { + normal = + { + "${mod} Return" = "spawn ${pkgs.foot}/bin/foot"; + "${mod}+Shift q" = "close"; + "${mod} s" = "spawn ${menu}"; + + "${mod} ${directions.left}" = "focus-view left"; + "${mod} ${directions.right}" = "focus-view right"; + "${mod} ${directions.up}" = "focus-view up"; + "${mod} ${directions.down}" = "focus-view down"; + + "${mod}+Shift ${directions.left}" = "move left"; + "${mod}+Shift ${directions.right}" = "move right"; + "${mod}+Shift ${directions.up}" = "move up"; + "${mod}+Shift ${directions.down}" = "move down"; + + "${mod}+Control ${directions.left}" = "snap left"; + "${mod}+Control ${directions.right}" = "snap right"; + "${mod}+Control ${directions.up}" = "snap up"; + "${mod}+Control ${directions.down}" = "snap down"; + + "${mod}+Shift Space" = "toggle-float"; + "${mod} t" = "toggle-fullscreen"; + + # Scratchpad + "${mod}+Shift minus" = "toggle-view-tags ${toString (bit 20)}"; + "${mod} minus" = "toggle-focused-tags ${toString (bit 20)}"; + + "${mod} Print" = "spawn '${pkgs.grim}/bin/grim'"; + + "${mod} l" = "spawn '${lockcmd}'"; + + # Enable passthrough mode + "${mod} Pause" = "enter-mode passthrough"; + + "None XF86AudioRaiseVolume" = "spawn '${pkgs.pamedia}/bin/pamedia up'"; + "None XF86AudioLowerVolume" = "spawn '${pkgs.pamedia}/bin/pamedia down'"; + "None XF86AudioMute" = "spawn '${pkgs.pamedia}/bin/pamedia mute'"; + "None XF86Calculator" = "spawn ${pkgs.gnome.gnome-calculator}/bin/gnome-calculator"; + + "${mod} c" = mkIf config.eboskma.programs.emacs.enable "spawn '${config.eboskma.programs.emacs.package}/bin/emacsclient -c'"; + + "${mod} d" = "spawn '${pkgs.swaynotificationcenter}/bin/swaync-client --toggle-panel --skip-wait'"; + "${mod}+Shift d" = "spawn '${pkgs.swaynotificationcenter}/bin/swaync-client --toggle-dnd --skip-wait'"; + + "${mod}+Shift f" = "spawn ${rofiPower}"; + + "${mod}+Shift+Alt ${directions.left}" = "send-layout-cmd rivertile 'main-ratio -0.05'"; + "${mod}+Shift+Alt ${directions.right}" = "send-layout-cmd rivertile 'main-ratio +0.05'"; + + "${mod}+Shift+Control ${directions.left}" = "send-layout-cmd rivertile 'main-location left'"; + "${mod}+Shift+Control ${directions.right}" = "send-layout-cmd rivertile 'main-location right'"; + "${mod}+Shift+Control ${directions.up}" = "send-layout-cmd rivertile 'main-location top'"; + "${mod}+Shift+Control ${directions.down}" = "send-layout-cmd rivertile 'main-location bottom'"; + } + // builtins.listToAttrs ( + map (tag: { + name = "${mod} ${toString tag.index}"; + value = "set-focused-tags ${toString tag.value}"; + }) tags + ) + // builtins.listToAttrs ( + map (tag: { + name = "${mod}+Control ${toString tag.index}"; + value = "toggle-view-tags ${toString tag.value}"; + }) tags + ) + // builtins.listToAttrs ( + map (tag: { + name = "${mod}+Shift ${toString tag.index}"; + value = "set-view-tags ${toString tag.value}"; + }) tags + ); + + passthrough = { + "${mod} Pause" = "enter-mode normal"; + }; + }; + + map-pointer = { + normal = { + "${mod} BTN_LEFT" = "move-view"; + "${mod} BTN_RIGHT" = "resize-view"; + }; + }; + + spawn-tagmask = toString (builtins.bitXor ((bit 32) - 1) (bit 20)); + + spawn = [ + # "'${ewwDaemon} --restart open bar-home'" + "'${pkgs.swaybg}/bin/swaybg --image ${cfg.wallpaper} --mode fill'" + ]; + + rule-add = { + "-app-id" = { + foot = "tags ${toString (bit 1)}"; + firefox = "tags ${toString (bit 0)}"; + emacs = "tags ${toString (bit 2)}"; + gnome-calculator = "float"; + }; + }; + + default-layout = "rivertile"; + + border-width = 1; + border-color-focused = catppuccin.lavender; + border-color-unfocused = catppuccin.overlay0; + border-color-urgent = catppuccin.peach; + + # target title bg text indicator border + # client.focused $lavender $base $text $rosewater $lavender + # client.focused_inactive $overlay0 $base $text $rosewater $overlay0 + # client.unfocused $overlay0 $base $text $rosewater $overlay0 + # client.urgent $peach $base $peach $overlay0 $peach + # client.placeholder $overlay0 $base $text $overlay0 $overlay0 + # client.background $base + }; + + extraConfig = '' + ${cfg.package}/bin/rivertile -view-padding 10 -outer-padding 5 & + ''; + }; + }; +} diff --git a/home-manager/modules/river/keyboard-layout b/home-manager/modules/river/keyboard-layout new file mode 100644 index 0000000..b7396fc --- /dev/null +++ b/home-manager/modules/river/keyboard-layout @@ -0,0 +1,9 @@ +// mode: c-ts-mode + +default partial alphanumeric_keys; + +xkb_symbols "basic" { + include "us(altgr-intl)"; + include "eurosign(5)"; + name[Group1] = "English (US, international with AltGr and Euro sign)"; +}; diff --git a/home-manager/modules/river/powermenu.sh b/home-manager/modules/river/powermenu.sh new file mode 100755 index 0000000..e527589 --- /dev/null +++ b/home-manager/modules/river/powermenu.sh @@ -0,0 +1,59 @@ +# shellcheck disable=SC2148 + +confirm() { + rofi -dmenu \ + -i \ + -no-fixed-num-lines \ + -p "Are you sure? [y/n]: " \ + -theme power +} + +# Options +shutdown="󰐥" # Icon: power +reboot="󰜉" # Icon: restart +lock="󰌾" # Icon: lock +hibernate="󰤄" # Icon: power_sleep +exit_wm="󰗼" # Icon: exit_to_app +#shutdown="S" +#reboot="R" +#lock="L" +#hibernate="S" +#exit_wm="E" + +# Variable passed to rofi +options="${shutdown}\n${reboot}\n${lock}\n${hibernate}\n${exit_wm}" +uptime=$(uptime | awk '{print $1}' || true) +lockcmd="swaylock --ignore-empty-password --daemonize --show-failed-attempts --indicator-caps-lock --image {WALLPAPER} --scaling fill" + +chosen="$(echo -e "${options}" | rofi -theme power -p "Uptime: ${uptime}" -dmenu -selected-row 2)" + +if [[ ${chosen} == "" ]]; then + exit 0 +fi + +if [[ ${chosen} == "${lock}" ]]; then + ${lockcmd} + exit 0 +fi + +answer=$(confirm) + +if [[ ${answer} == "y" ]]; then + case "${chosen}" in + "${shutdown}") + systemctl poweroff + ;; + "${reboot}") + systemctl reboot + ;; + "${hibernate}") + ${lockcmd} + systemctl hibernate + ;; + "${exit_wm}") + riverctl exit + ;; + *) ;; + + esac +fi diff --git a/home-manager/modules/sway/default.nix b/home-manager/modules/sway/default.nix index f80c1be..79d0ed4 100644 --- a/home-manager/modules/sway/default.nix +++ b/home-manager/modules/sway/default.nix @@ -347,8 +347,11 @@ in timeouts = let - resumeMessages = builtins.concatStringsSep ", " ( - builtins.map (name: "output ${name} power on") (builtins.attrNames cfg.output) + poweroffOpts = builtins.concatStringsSep " " ( + builtins.map (name: "--output ${name} --off") (builtins.attrNames cfg.output) + ); + resumeOpts = builtins.concatStringsSep " " ( + builtins.map (name: "--output ${name} --on") (builtins.attrNames cfg.output) ); in [ @@ -358,8 +361,8 @@ in } { timeout = 1200; - command = "${cfg.package}/bin/swaymsg 'output * power off'"; - resumeCommand = "${cfg.package}/bin/swaymsg '${resumeMessages}'"; + command = "${pkgs.wlr-randr}/bin/wlr-randr ${poweroffOpts}"; + resumeCommand = "${pkgs.wlr-randr}/bin/wlr-randr '${resumeOpts}'"; } ]; }; diff --git a/home-manager/modules/waybar/default.nix b/home-manager/modules/waybar/default.nix index 03d6cfc..dd6e156 100644 --- a/home-manager/modules/waybar/default.nix +++ b/home-manager/modules/waybar/default.nix @@ -23,25 +23,26 @@ in height = 32; modules-left = [ - "sway/workspaces" "wlr/workspaces" + "river/tags" + "river/mode" + "sway/workspaces" "sway/mode" "custom/now_playing" ]; modules-center = [ "sway/window" - "hyprland/window" + "river/window" ]; modules-right = [ "network" "memory" "cpu" "temperature" - "custom/keyboard-layout" "wireplumber" - "tray" "clock#date" "clock#time" + "tray" "idle_inhibitor" "custom/notifications" ]; @@ -67,15 +68,6 @@ in }; }; - "custom/keyboard-layout" = { - exec = ''${pkgs.sway}/bin/swaymsg -t get_inputs | ${pkgs.jaq}/bin/jaq -r '.[] | select(.identifier == "36125:40349:splitkb_Kyria_rev1") | .xkb_active_layout_name' ''; - 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 @@ -93,12 +85,6 @@ in tooltip-format = "{ifname}: {ipaddr}"; }; - "sway/mode" = { - format = ''󰁌 {}''; # Icon: arrow_expand_all - tooltip = false; - }; - - # TODO: package as nix thingy "custom/now_playing" = { exec = "${pkgs.ha-now-playing}/bin/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token-file /run/secrets/ha_now_playing_token"; exec-on-event = false; @@ -111,6 +97,11 @@ in on-scroll-up = "${pkgs.ha-now-playing}/bin/ha-now-playing --host home.datarift.nl --entity media_player.sonos_woonkamer --token-file /run/secrets/ha_now_playing_token volume-down"; }; + "sway/mode" = { + format = ''󰁌 {}''; # Icon: arrow_expand_all + tooltip = false; + }; + "sway/window" = { format = "{}"; max-length = 120; @@ -128,6 +119,16 @@ in }; }; + "river/mode" = { + format = ''󰁌 {}''; # Icon: arrow_expand_all + }; + + "river/tags" = { }; + + "river/window" = { + max-length = 120; + }; + "wlr/workspaces" = { all-outputs = false; # disable-scroll = true; @@ -206,198 +207,7 @@ in } ]; - 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: rgba(0, 0, 0, 0.8); - color: white; - font-family: "Iosevka 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, #workspaces button.active { - border-color: #4c7899; - color: white; - background-color: #285577; - } - - #workspaces button.urgent { - border-color: #c9545d; - color: #c9545d; - } - - #idle_inhibitor { - background-color: transparent; - font-weight: bold; - padding-right: 10px; - } - - #idle_inhibitor.activated { - background-color: #c9545d; - color: #ffffff; - } - - #custom-now_playing { - font-weight: bold; - } - - #custom-notifications { - padding: 0 10px; - } - ''; + style = ./style.css; }; }; } diff --git a/home-manager/modules/waybar/style.css b/home-manager/modules/waybar/style.css new file mode 100644 index 0000000..3b0a04a --- /dev/null +++ b/home-manager/modules/waybar/style.css @@ -0,0 +1,247 @@ +@define-color rosewater #f5e0dc; +@define-color flamingo #f2cdcd; +@define-color pink #f5c2e7; +@define-color mauve #cba6f7; +@define-color red #f38ba8; +@define-color maroon #eba0ac; +@define-color peach #fab387; +@define-color yellow #f9e2af; +@define-color green #a6e3a1; +@define-color teal #94e2d5; +@define-color sky #89dceb; +@define-color sapphire #74c7ec; +@define-color blue #89b4fa; +@define-color lavender #b4befe; +@define-color text #cdd6f4; +@define-color subtext1 #bac2de; +@define-color subtext0 #a6adc8; +@define-color overlay2 #9399b2; +@define-color overlay1 #7f849c; +@define-color overlay0 #6c7086; +@define-color surface2 #585b70; +@define-color surface1 #45475a; +@define-color surface0 #313244; +@define-color base #1e1e2e; +@define-color mantle #181825; +@define-color crust #11111b; + +@keyframes blink-warning { + 70% { + color: @text; + } + + to { + color: @text; + background-color: orange; + } +} + +@keyframes blink-critical { + 70% { + color: @text; + } + + to { + color: @text; + background-color: red; + } +} + +* { + border: none; + border-radius: 0; + color: @text; + min-height: 0; + margin: 0; + padding: 0; +} + +#waybar { + background: @base; + color: @text; + font-family: "Iosevka Nerd Font", sans-serif; + font-size: 14px; +} + +#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: @peach; +} + +#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: @peach; +} + +#cpu.critical { + color: @red; +} + +#memory { + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#memory.warning { + color: @peach; +} + +#memory.critical { + color: @red; + animation-name: blink-critical; + animation-duration: 2s; +} + +#mode { + background: @surface0; + border-top: 2px solid @text; + /* To compensate for the top border and still have vertical centering */ + padding-bottom: 2px; +} + +#mode.normal { + font-size: 0; + min-width: 0; + min-height: 0; + margin: -17px; + padding: 0; + border: 0; + opacity: 0; + box-shadow: none; + background-color: transparent; +} + +#network { + /* No styles */ +} + +#network.disconnected { + color: @peach; +} + +#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; +} + +#tags button, +#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: @overlay1; +} + +#tags button.focused, +#tags button.active, +#workspaces button.focused, +#workspaces button.active { + border-color: @surface2; + color: @text; + background-color: @surface0; +} + +#tags button.urgent, +#workspaces button.urgent { + border-color: @red; + color: @text; +} + +#tags button:not(.occupied):not(.focused) { + font-size: 0; + min-width: 0; + min-height: 0; + margin: -17px; + padding: 0; + border: 0; + opacity: 0; + box-shadow: none; + background-color: transparent; +} + +#idle_inhibitor { + background-color: transparent; + font-weight: bold; + padding-right: 10px; +} + +#idle_inhibitor.activated { + background-color: @red; + color: @text; +} + +#custom-now_playing { + font-weight: bold; +} + +#custom-notifications { + padding: 0 10px; +} diff --git a/machines/loki/configuration.nix b/machines/loki/configuration.nix index 56bfea7..9d772b6 100644 --- a/machines/loki/configuration.nix +++ b/machines/loki/configuration.nix @@ -46,6 +46,7 @@ greetd = { enable = true; sway = true; + river = true; wallpaper = ../../wallpapers/river-2560.png; }; libvirtd.enable = false; diff --git a/modules/greetd/default.nix b/modules/greetd/default.nix index 99bed25..dc10a44 100644 --- a/modules/greetd/default.nix +++ b/modules/greetd/default.nix @@ -41,6 +41,7 @@ in options.eboskma.greetd = { enable = mkEnableOption "enable greetd"; sway = mkEnableOption "sway"; + river = mkEnableOption "river"; steam = mkEnableOption "steam"; wayvnc = mkEnableOption "wayvnc"; output = mkOption { @@ -131,6 +132,7 @@ in "greetd/environments" = { text = concatStringsSep "\n" ( (optional cfg.sway "${swaySession}") + ++ (optional cfg.river "${pkgs.river}/bin/river") ++ (optional cfg.steam "${steam-gamescope}") ++ [ "${pkgs.bash}/bin/bash" ] ); diff --git a/users/erwin/home.nix b/users/erwin/home.nix index e42a572..0bf315b 100644 --- a/users/erwin/home.nix +++ b/users/erwin/home.nix @@ -107,6 +107,10 @@ in } ]; }; + river = { + enable = true; + wallpaper = "${homeCfg.home.homeDirectory}/.wallpapers/river-2560.png"; + }; rofi = { enable = true; package = pkgs.rofi-wayland; @@ -131,6 +135,7 @@ in input = { "36125:40349:splitkb.com_Kyria_rev1" = { xkb_layout = "us"; + xkb_variant = "altgr-intl"; xkb_options = "lv3:ralt_switch_multikey,eurosign:5"; }; "1133:49291:Logitech_G502_HERO_SE" = { @@ -161,7 +166,7 @@ in }; }; tmux.enable = true; - waybar.enable = false; + waybar.enable = true; zathura.enable = true; zellij = { enable = true;