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;
+ };
+}