From f6bb7b1113f2f2479d98e41ed92b7ab74e1d7f34 Mon Sep 17 00:00:00 2001 From: Ricard Illa Date: Thu, 29 Dec 2022 20:55:37 +0100 Subject: [PATCH] fleshed out river config --- home/desktop-river/bemenu.nix | 101 +++++++++++++++++++++ home/desktop-river/default.nix | 7 +- home/desktop-river/foot.nix | 39 ++++++++ home/desktop-river/init.nix | 137 +++++++++++++++++++++------- home/desktop-river/waybar.nix | 160 +++++++++++++++++++++++++++++++++ 5 files changed, 411 insertions(+), 33 deletions(-) create mode 100644 home/desktop-river/bemenu.nix create mode 100644 home/desktop-river/foot.nix create mode 100644 home/desktop-river/waybar.nix diff --git a/home/desktop-river/bemenu.nix b/home/desktop-river/bemenu.nix new file mode 100644 index 0000000..eebe053 --- /dev/null +++ b/home/desktop-river/bemenu.nix @@ -0,0 +1,101 @@ +{ config, pkgs, ... }: + +# usage: bemenu [options] +# Options +# -h, --help display this help and exit. +# -v, --version display version. +# -i, --ignorecase match items case insensitively. +# -F, --filter filter entries for a given string. +# -w, --wrap wraps cursor selection. +# -l, --list list items vertically with the given number of lines. +# -p, --prompt defines the prompt text to be displayed. +# -P, --prefix text to show before highlighted item. +# -I, --index select item at index automatically. +# -x, --password hide input. +# -s, --no-spacing disable the title spacing on entries. +# --scrollbar display scrollbar. (none (default), always, autohide) +# --ifne only display menu if there are items. +# --fork always fork. (bemenu-run) +# --no-exec do not execute command. (bemenu-run) +# +# Use BEMENU_BACKEND env variable to force backend: +# curses ncurses based terminal backend +# wayland wayland backend +# x11 x11 backend +# +# If BEMENU_BACKEND is empty, one of the GUI backends is selected automatically. +# +# Backend specific options +# c = ncurses, w == wayland, x == x11 +# (...) At end of help indicates the backend support for option. +# +# -b, --bottom appears at the bottom of the screen. (wx) +# -c, --center appears at the center of the screen. (wx) +# -f, --grab show the menu before reading stdin. (wx) +# -n, --no-overlap adjust geometry to not overlap with panels. (w) +# -m, --monitor index of monitor where menu will appear. (wx) +# -H, --line-height defines the height to make each menu line (0 = default height). (wx) +# -M, --margin defines the empty space on either side of the menu. (wx) +# -W, --width-factor defines the relative width factor of the menu (from 0 to 1). (wx) +# -B, --border defines the width of the border in pixels around the menu. (wx) +# --ch defines the height of the cursor (0 = scales with line height). (wx) +# --cw defines the width of the cursor. (wx) +# --hp defines the horizontal padding for the entries in single line mode. (wx) +# --fn defines the font to be used ('name [size]'). (wx) +# --tb defines the title background color. (wx) +# --tf defines the title foreground color. (wx) +# --fb defines the filter background color. (wx) +# --ff defines the filter foreground color. (wx) +# --nb defines the normal background color. (wx) +# --nf defines the normal foreground color. (wx) +# --hb defines the highlighted background color. (wx) +# --hf defines the highlighted foreground color. (wx) +# --fbb defines the feedback background color. (wx) +# --fbf defines the feedback foreground color. (wx) +# --sb defines the selected background color. (wx) +# --sf defines the selected foreground color. (wx) +# --ab defines the alternating background color. (wx) +# --af defines the alternating foreground color. (wx) +# --scb defines the scrollbar background color. (wx) +# --scf defines the scrollbar foreground color. (wx) +# --bdr defines the border color. (wx) + +let + bemenuColors = { + titleBackground = "#282828E0"; + titleForeground = "#fbf1c7"; + filterBackground = "#282828E0"; + filterForeground = "#ebdbb2"; + normalBackground = "#282828E0"; + normalForeground = "#ebdbb2"; + highlightedBackground = "#458588E0"; + highlightedForeground = "#fbf1c7"; + scrollbarBackground = "#282828E0"; + scrollbarForeground = "#458588E0"; + }; +in { + home.packages = [ pkgs.bemenu ]; + home.sessionVariables.BEMENU_OPTS = '' + --ignorecase \ + --list 20 \ + --prompt '❯' \ + --scrollbar none \ + --wrap \ + --scrollbar autohide \ + --no-overlap \ + --monitor all \ + --fn 'Inter 13px' \ + --tb '${bemenuColors.titleBackground}' \ + --tf '${bemenuColors.titleForeground}' \ + --fb '${bemenuColors.filterBackground}' \ + --ff '${bemenuColors.filterForeground}' \ + --nb '${bemenuColors.normalBackground}' \ + --ab '${bemenuColors.normalBackground}' \ + --nf '${bemenuColors.normalForeground}' \ + --af '${bemenuColors.normalForeground}' \ + --hb '${bemenuColors.highlightedBackground}' \ + --hf '${bemenuColors.highlightedForeground}' \ + --scb '${bemenuColors.scrollbarBackground}' \ + --scf '${bemenuColors.scrollbarForeground}' + ''; +} diff --git a/home/desktop-river/default.nix b/home/desktop-river/default.nix index d7996cc..17c616f 100644 --- a/home/desktop-river/default.nix +++ b/home/desktop-river/default.nix @@ -1,12 +1,15 @@ { config, pkgs, ... }: { - imports = [ ./init.nix ]; + imports = [ ./init.nix ./bemenu.nix ./waybar.nix ./foot.nix ]; - home.packages = with pkgs; [ river foot ]; + home.packages = with pkgs; [ river swaybg ]; programs.zsh.loginExtra = '' [[ -z "''${DISPLAY}" ]] && [[ "$(tty)" = "/dev/tty1" ]] && \ + export XKB_DEFAULT_LAYOUT="us" + export XKB_DEFAULT_VARIANT="altgr-intl" + export XKB_DEFAULT_OPTIONS="caps:escape" exec ${pkgs.river}/bin/river ''; } diff --git a/home/desktop-river/foot.nix b/home/desktop-river/foot.nix new file mode 100644 index 0000000..609ab3c --- /dev/null +++ b/home/desktop-river/foot.nix @@ -0,0 +1,39 @@ +{ config, pkgs, ... }: + +{ + programs.foot = { + enable = true; + settings = { + main = { + shell = "${pkgs.tmux}/bin/tmux -u"; + font = "Hack Nerd Font:size=8:style=Regular"; + font-bold = "Hack Nerd Font:size=8:style=Bold"; + font-italic = "Hack Nerd Font:size=8:style=Italic"; + font-bold-italic = "Hack Nerd Font:size=8:style=Bold Italic"; + }; + colors = { + alpha = 0.9; + background = "282828"; + foreground = "ebdbb2"; + + regular0 = "282828"; # black + regular1 = "cc241d"; # red + regular2 = "98971a"; # green + regular3 = "d79921"; # yellow + regular4 = "458588"; # blue + regular5 = "b16286"; # magenta + regular6 = "689d6a"; # cyan + regular7 = "ebdbb2"; # white + + bright0 = "928374"; # black + bright1 = "fb4934"; # red + bright2 = "b8bb26"; # green + bright3 = "fabd2f"; # yellow + bright4 = "83a598"; # blue + bright5 = "d3869b"; # magenta + bright6 = "8ec07c"; # cyan + bright7 = "ebdbb2"; # white + }; + }; + }; +} diff --git a/home/desktop-river/init.nix b/home/desktop-river/init.nix index 36b7bd4..6efc7ce 100644 --- a/home/desktop-river/init.nix +++ b/home/desktop-river/init.nix @@ -1,102 +1,128 @@ { config, pkgs, ... }: let + wallpapers = "${config.home.homeDirectory}/Images/wallpapers/enabled"; shell = "${pkgs.dash}/bin/dash"; riverctl = "${pkgs.river}/bin/riverctl"; rivertile = "${pkgs.river}/bin/rivertile"; foot = "${pkgs.foot}/bin/foot"; + bemenu-run = "${pkgs.bemenu}/bin/bemenu-run"; + waybar = "${pkgs.waybar}/bin/waybar"; + swaybg = "${pkgs.swaybg}/bin/swaybg"; seq = "${pkgs.coreutils}/bin/seq"; + playerctl = "${pkgs.playerctl}/bin/playerctl"; + pamixer = "${pkgs.pamixer}/bin/pamixer"; + light = "${pkgs.light}/bin/light"; + eject = "${pkgs.util-linux}/bin/eject"; + find = "${pkgs.findutils}/bin/find"; + shuf = "${pkgs.coreutils}/bin/shuf"; in { home.file.river_init = { executable = true; target = "${config.xdg.configHome}/river/init"; text = '' + #!${shell} - # start an instance of foot + # Super+Return to start an instance of foot (https://codeberg.org/dnkl/foot) ${riverctl} map normal Super Return spawn ${foot} - # close the focused view + ${riverctl} map normal Super R spawn ${bemenu-run} + + # Super+Shift+C to close the focused view ${riverctl} map normal Super+Shift C close - # exit river + # Super+Shift+Esc to exit river ${riverctl} map normal Super+Shift Escape exit - # focus next/previous + # Super+J and Super+K to focus the next/previous view in the layout stack ${riverctl} map normal Super J focus-view next ${riverctl} map normal Super K focus-view previous - # swap next/previous + # Super+Shift+J and Super+Shift+K to swap the focused view with the next/previous + # view in the layout stack ${riverctl} map normal Super+Shift J swap next ${riverctl} map normal Super+Shift K swap previous - # bump focused view to the top of the stack layout + # Super+E and Super+W to focus the next/previous output + ${riverctl} map normal Super E focus-output next + ${riverctl} map normal Super W focus-output previous + + # Super+Shift+{W,E} to send the focused view to the next/previous output + ${riverctl} map normal Super+Shift W send-to-output next + ${riverctl} map normal Super+Shift W send-to-output previous + + # Super+Shift+Return to bump the focused view to the top of the layout stack ${riverctl} map normal Super+Shift Return zoom - # increase/decrease the main ratio of rivertile - ${riverctl} map normal Super H send-layout-cmd ${rivertile} "main-ratio -0.05" - ${riverctl} map normal Super L send-layout-cmd ${rivertile} "main-ratio +0.05" + # Super+H and Super+L to decrease/increase the main ratio of rivertile(1) + ${riverctl} map normal Super H send-layout-cmd rivertile "main-ratio -0.05" + ${riverctl} map normal Super L send-layout-cmd rivertile "main-ratio +0.05" - # increase/decrease the main count of rivertile - ${riverctl} map normal Super+Shift H send-layout-cmd ${rivertile} "main-count +1" - ${riverctl} map normal Super+Shift L send-layout-cmd ${rivertile} "main-count -1" + # Super+Shift+Comma and Super+Shift+Period. to increment/decrement the main count of rivertile(1) + ${riverctl} map normal Super+Shift Comma send-layout-cmd rivertile "main-count +1" + ${riverctl} map normal Super+Shift Period send-layout-cmd rivertile "main-count -1" - # move views + # Super+Alt+{H,J,K,L} to move views ${riverctl} map normal Super+Alt H move left 100 ${riverctl} map normal Super+Alt J move down 100 ${riverctl} map normal Super+Alt K move up 100 ${riverctl} map normal Super+Alt L move right 100 - # snap views to screen edges + # Super+Alt+Control+{H,J,K,L} to snap views to screen edges ${riverctl} map normal Super+Alt+Control H snap left ${riverctl} map normal Super+Alt+Control J snap down ${riverctl} map normal Super+Alt+Control K snap up ${riverctl} map normal Super+Alt+Control L snap right - # resize views + # Super+Alt+Shift+{H,J,K,L} to resize views ${riverctl} map normal Super+Alt+Shift H resize horizontal -100 ${riverctl} map normal Super+Alt+Shift J resize vertical 100 ${riverctl} map normal Super+Alt+Shift K resize vertical -100 ${riverctl} map normal Super+Alt+Shift L resize horizontal 100 - # move/resize with mouse + # Super + Left Mouse Button to move views ${riverctl} map-pointer normal Super BTN_LEFT move-view + + # Super + Right Mouse Button to resize views ${riverctl} map-pointer normal Super BTN_RIGHT resize-view - ${rivertile} -view-padding 6 -outer-padding 6 + # Super + Middle Mouse Button to toggle float + ${riverctl} map-pointer normal Super BTN_MIDDLE toggle-float - for i in $(${seq} 1 9); do + for i in $(${seq} 1 9) + do tags=$((1 << ($i - 1))) - # focus tag [0-8] + # Super+[1-9] to focus tag [0-8] ${riverctl} map normal Super $i set-focused-tags $tags - # tag focused view with tag [0-8] + # Super+Shift+[1-9] to tag focused view with tag [0-8] ${riverctl} map normal Super+Shift $i set-view-tags $tags - # toggle focus of tag [0-8] + # Super+Ctrl+[1-9] to toggle focus of tag [0-8] ${riverctl} map normal Super+Control $i toggle-focused-tags $tags - # toggle tag [0-8] of focused view + # Super+Shift+Ctrl+[1-9] to toggle tag [0-8] of focused view ${riverctl} map normal Super+Shift+Control $i toggle-view-tags $tags done + # Super+0 to focus all tags + # Super+Shift+0 to tag focused view with all tags all_tags=$(((1 << 32) - 1)) - # focus all tags ${riverctl} map normal Super 0 set-focused-tags $all_tags - # tag focused view with all tags ${riverctl} map normal Super+Shift 0 set-view-tags $all_tags - # toggle float + # Super+T to toggle float ${riverctl} map normal Super T toggle-float - # toggle fullscreen + # Super+M to toggle fullscreen ${riverctl} map normal Super M toggle-fullscreen # Super+{Up,Right,Down,Left} to change layout orientation - ${riverctl} map normal Super Up send-layout-cmd ${rivertile} "main-location top" - ${riverctl} map normal Super Right send-layout-cmd ${rivertile} "main-location right" - ${riverctl} map normal Super Down send-layout-cmd ${rivertile} "main-location bottom" - ${riverctl} map normal Super Left send-layout-cmd ${rivertile} "main-location left" + ${riverctl} map normal Super Up send-layout-cmd rivertile "main-location top" + ${riverctl} map normal Super Right send-layout-cmd rivertile "main-location right" + ${riverctl} map normal Super Down send-layout-cmd rivertile "main-location bottom" + ${riverctl} map normal Super Left send-layout-cmd rivertile "main-location left" # Declare a passthrough mode. This mode has only a single mapping to return to # normal mode. This makes it useful for testing a nested wayland compositor @@ -108,8 +134,57 @@ in { # Super+F11 to return to normal mode ${riverctl} map passthrough Super F11 enter-mode normal + # Various media key mapping examples for both normal and locked mode which do + # not have a modifier + for mode in normal locked + do + # Eject the optical drive (well if you still have one that is) + ${riverctl} map $mode None XF86Eject spawn '${eject} -T' + + # Control pulse audio volume with pamixer (https://github.com/cdemoulins/pamixer) + ${riverctl} map $mode None XF86AudioRaiseVolume spawn '${pamixer} -i 5' + ${riverctl} map $mode None XF86AudioLowerVolume spawn '${pamixer} -d 5' + ${riverctl} map $mode None XF86AudioMute spawn '${pamixer} --toggle-mute' + + # Control MPRIS aware media players with playerctl (https://github.com/altdesktop/playerctl) + ${riverctl} map $mode None XF86AudioMedia spawn '${playerctl} play-pause' + ${riverctl} map $mode None XF86AudioPlay spawn '${playerctl} play-pause' + ${riverctl} map $mode None XF86AudioPrev spawn '${playerctl} previous' + ${riverctl} map $mode None XF86AudioNext spawn '${playerctl} next' + + # Control screen backlight brightness with light (https://github.com/haikarainen/light) + ${riverctl} map $mode None XF86MonBrightnessUp spawn '${light} -A 5' + ${riverctl} map $mode None XF86MonBrightnessDown spawn '${light} -U 5' + done + + # Set background and border color + ${riverctl} background-color 0x282828 + ${riverctl} border-color-focused 0x458588 + ${riverctl} border-color-unfocused 0x504945 + ${riverctl} border-width 3 + + ${riverctl} focus-follows-cursor normal + + # Set keyboard repeat rate + ${riverctl} set-repeat 50 300 + + # Make certain views start floating + ${riverctl} float-filter-add app-id float + ${riverctl} float-filter-add title "popup title with spaces" + + # Set app-ids and titles of views which should use client side decorations + ${riverctl} csd-filter-add app-id "gedit" + + ${riverctl} spawn "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=river" + ${riverctl} spawn "systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=river" + ${riverctl} spawn "${waybar}" + + ${riverctl} spawn '${swaybg} --image "$(${find} ${wallpapers} -type f | ${shuf} -n 1)" --mode fill' + + # Set the default layout generator to be rivertile and start it. + # River will send the process group of the init executable SIGTERM on exit. ${riverctl} default-layout rivertile - ${rivertile} -view-padding 6 -outer-padding 6 + ${rivertile} -view-padding 0 -outer-padding 0 & ''; }; } diff --git a/home/desktop-river/waybar.nix b/home/desktop-river/waybar.nix new file mode 100644 index 0000000..317cfeb --- /dev/null +++ b/home/desktop-river/waybar.nix @@ -0,0 +1,160 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ at-spi2-atk ]; + + programs.waybar = { + enable = true; + settings = [{ + modules-left = [ "river/tags" ]; + modules-center = [ "river/window" ]; + modules-right = [ "tray" "pulseaudio" "battery" "network" "clock" ]; + modules = { + clock.format = ''{: %m/%d |  %H:%M}''; + network = { + format-icons = [ + '''' + '''' + '''' + ]; + format = "({ifname})"; + format-wifi = "{icon} {signalStrength}"; + format-disconnected = ''''; + format-ethernet = ""; + }; + battery = { + states = { + good = 95; + warning = 50; + critical = 20; + }; + format-icons = { + discharging = [ + '''' + '''' + '''' + '''' + '''' + '''' + '''' + '''' + '''' + ]; #  + charging = [ + '''' + '''' + '''' + '''' + '''' + '''' + ]; #  + }; + format = " {capacity}"; + format-full = ""; + format-good-charging = ""; + format-plugged = ""; + format-charging = "{icon} {capacity}"; + format-discharging = "{icon} {capacity} ({time})"; + interval = 5; + }; + pulseaudio = { + states = { + high = 101; + very_high = 111; + }; + format-icons = [ + '''' + ''奔'' + '''' + ]; + format = "{icon} {volume}"; + format-bluetooth = "{icon} {volume}"; + format-muted = "ﱝ"; + }; + + tray.icon-size = 14; + }; + }]; + style = '' + * { + border-radius: 0px; + border: none; + font-family: Inter, "mplus Nerd Font"; + font-size: 13px; + min-height: 0; + } + + window#waybar { + background-color: #282828; + color: #ebdbb2; + } + + #window { + color: #fbf1c7; + padding-left: 10px; + padding-right: 10px; + } + + #tags { + padding: 0px; + margin: 0px; + } + + #tags button { + padding: 0px; + margin: 0px; + color: #a89984; + background: transparent; + } + + #tags button.occupied { + color: #fbf1c7; + } + + #tags button.focused { + background-color: #458588; + color: #fbf1c7; + } + + #tags button.urgent { + background-color: #cc241d; + color: #fbf1c7; + } + + #tray, + #pulseaudio, + #battery, + #network, + #cpu, + #memory, + #clock { + color: #fbf1c7; + padding-left: 5px; + padding-right: 5px; + } + + #tray, + #pulseaudio, + #battery, + #cpu, + #memory, + #network { + border-right: 1px solid #a89984; + } + + #pulseaudio.high { + color: #fabd2f; + } + + #pulseaudio.very_high { + color: #fb4944; + } + + #pulseaudio.muted { + color: #a8997a; + } + + ''; + systemd.enable = false; + }; +}