diff --git a/homeManagerModules/desktop/default.nix b/homeManagerModules/desktop/default.nix index 5ef7d91d..df2ae18b 100644 --- a/homeManagerModules/desktop/default.nix +++ b/homeManagerModules/desktop/default.nix @@ -7,6 +7,7 @@ }: { imports = [ ./hyprland + ./river ./sway ./wayland ]; diff --git a/homeManagerModules/desktop/river/README.md b/homeManagerModules/desktop/river/README.md new file mode 100644 index 00000000..c8407ff1 --- /dev/null +++ b/homeManagerModules/desktop/river/README.md @@ -0,0 +1,157 @@ +# Sway + +## Features + +- Clamshell mode for laptops +- Default apps + theme integration +- Random wallpapers that cycle every 15 minutes +- Slick looks +- swayfx support + +## Desktop Utilities + +- Bluetooth: [blueberry.py](https://github.com/linuxmint/blueberry). +- Idle daemon: [swayidle](https://github.com/swaywm/swayidle). +- Launcher [rofi-wayland](https://github.com/lbonn/rofi). +- Notifications: [mako](https://github.com/emersion/mako). +- Panel: [waybar](https://github.com/Alexays/Waybar). +- Polkit: [mate-polkit](https://github.com/mate-desktop/mate-polkit). +- Wallpapers: [swaybg](https://github.com/swaywm/swaybg). +- WiFi: [networkmanager-dmenu](https://github.com/firecat53/networkmanager-dmenu). + +## Keybindings + +### Launching Apps + +- SUPER + B: Open Browser. +- SUPER + E: Open Text Editor. +- SUPER + F: Open File Manager. +- SUPER + R: Open Launcher. +- SUPER + T: Open Terminal. + +### Screenshots + +- PRINT // CTRL + F12: Take screenshot of monitor or selected area. + +### Session Control + +- SUPER CTRL + L: Lock screen. +- SUPER + M: Logout/shutdown dialog. + +### Workspaces + +#### Switching Workspaces + +- SUPER + {1..9}: Switch to numbered workspace. +- SUPER + Comma: Switch to previous numbered workspace. +- SUPER + Period: Switch to next numbered workspace. +- TOUCHPAD: 3 Finger Swipe Left/Up or Right/Down. + +#### Multi-Monitor Workspace Management + +- SUPER CTRL SHIFT + Down: Move current workspace to monitor below. +- SUPER CTRL SHIFT + Up: Move current workspace to monitor above. +- SUPER CTRL SHIFT + Left: Move current workspace to monitor left. +- SUPER CTRL SHIFT + Right: Move current workspace to monitor right. + +______________________________________________________________________ + +- SUPER CTRL SHIFT + J: Move current workspace to monitor below. +- SUPER CTRL SHIFT + K: Move current workspace to monitor above. +- SUPER CTRL SHIFT + H: Move current workspace to monitor left. +- SUPER CTRL SHIFT + L: Move current workspace to monitor right. + +### Window Management + +- SUPER + C: Kill focused window. +- SUPER + F11: Show/hide top panel. +- SUPER + TAB: Open Window list. +- SUPER + V: Toggle floating window. +- SUPER SHIFT + Backslash: Toggle vertical/horizontal splits. +- SUPER SHIFT + G: Toggle tabbed layout. +- SUPER SHIFT + W: Toggle fullscreen. + +#### Focus + +- SUPER + Down: Change focus down. +- SUPER + Up: Change focus up. +- SUPER + Left: Change focus left. +- SUPER + Right: Change focus right. + +______________________________________________________________________ + +- SUPER + J: Change focus down. +- SUPER + K: Change focus up. +- SUPER + H: Change focus left. +- SUPER + L: Change focus right. + +#### Movement + +- SUPER SHIFT + Down: Move window down. +- SUPER SHIFT + Up: Move window up. +- SUPER SHIFT + Left: Move window left. +- SUPER SHIFT + Right: Move window right. + +______________________________________________________________________ + +- SUPER SHIFT + J: Move window down. +- SUPER SHIFT + K: Move window up. +- SUPER SHIFT + H: Move window left. +- SUPER SHIFT + L: Move window right. + +#### Moving between Workspaces + +- SUPER SHIFT + {1..9}: Move to specified numbered workspace. +- SUPER SHIFT + Comma: Move to previous numbered workspace. +- SUPER SHIFT + Period: Move to next numbered workspace. + +#### Scratchpad + +- SUPER + S: Switch to scratchpad (overlay). +- SUPER SHIFT + S: Move window to scratchpad. + +### Modes + +These modes provide special submaps where you are free to use various key binds without pressing the full key combo, because certain keys are assumed. + +#### Resize Mode + +- CTRL ALT + R: Enter resize mode. + + - Down: Resize active window (0,10). + - Up: Resize active window (0,-10) + - Left: Resize active window (-10,0). + - Right: Resize active window (10,0). + + ______________________________________________________________________ + + - J: Resize active window (0,10). + - K: Resize active window (0,-10) + - H: Resize active window (-10,0). + - L: Resize active window (10,0). + +- ESCAPE: Exit resize mode. + +#### Move Mode + +- CTRL ALT + M: Enter move mode. + + - {1..0}: Move to numbered workspace. + - Comma: Move to previous numbered workspace. + - Period: Move to next numbered workspace. + + ______________________________________________________________________ + + - Down: Move window down. + - Up: Move window up. + - Left: Move window left. + - Right: Move window right. + + ______________________________________________________________________ + + - J: Move window down. + - K: Move window up. + - H: Move window left. + - L: Move window right. + +- ESCAPE: Exit move mode. diff --git a/homeManagerModules/desktop/river/default.nix b/homeManagerModules/desktop/river/default.nix new file mode 100644 index 00000000..f9286c33 --- /dev/null +++ b/homeManagerModules/desktop/river/default.nix @@ -0,0 +1,18 @@ +{ + config, + lib, + pkgs, + ... +}: { + config = lib.mkIf config.ar.home.desktop.river.enable { + ar.home.theme.gtk.hideTitleBar = true; + + wayland.windowManager.river = import ./settings.nix {inherit config lib pkgs;}; + + xdg.portal = { + enable = true; + configPackages = [pkgs.xdg-desktop-portal-wlr]; + extraPortals = [pkgs.xdg-desktop-portal-wlr]; + }; + }; +} diff --git a/homeManagerModules/desktop/river/settings.nix b/homeManagerModules/desktop/river/settings.nix new file mode 100644 index 00000000..67bd841b --- /dev/null +++ b/homeManagerModules/desktop/river/settings.nix @@ -0,0 +1,87 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.ar.home; + focused = config.lib.stylix.colors.base0D; + helpers = import ../wayland/helpers.nix {inherit config lib pkgs;}; + modifier = "Super"; + unfocused = config.lib.stylix.colors.base03; + urgent = config.lib.stylix.colors.base08; +in { + enable = true; + + extraConfig = '' + touchpad=`riverctl list-inputs|grep -i touchpad` + for t in ''${touchpad[@]}; do + riverctl input $t natural-scroll enabled + riverctl input $t click-method clickfinger + riverctl input $t tap enabled + riverctl input $t disable-while-typing enabled + done + + for i in $(seq 1 8) + do + tags=$((1 << ($i - 1))) + + # ${modifier}+[1-9] to focus tag [0-8] + riverctl map normal ${modifier} $i set-focused-tags $tags + + # ${modifier}+Shift+[1-9] to tag focused view with tag [0-8] + riverctl map normal ${modifier}+Shift $i set-view-tags $tags + + # ${modifier}+Control+[1-9] to toggle focus of tag [0-8] + riverctl map normal ${modifier}+Control $i toggle-focused-tags $tags + + # ${modifier}+Shift+Control+[1-9] to toggle tag [0-8] of focused view + riverctl map normal ${modifier}+Shift+Control $i toggle-view-tags $tags + done + ''; + + systemd.enable = true; + + settings = { + border-color-focused = "0x${focused}"; + border-color-unfocused = "0x${unfocused}"; + border-color-urgent = "0x${urgent}"; + border-width = 4; + + default-layout = "rivertile"; + + declare-mode = [ + "locked" + "normal" + ]; + + focus-follows-cursor = "normal"; + + map = { + normal = { + "${modifier} B" = "spawn ${lib.getExe cfg.defaultApps.webBrowser}"; + "${modifier} C" = "close"; + "${modifier} E" = "spawn ${lib.getExe cfg.defaultApps.editor}"; + "${modifier} F" = "spawn ${lib.getExe cfg.defaultApps.fileManager}"; + "${modifier} M" = ''spawn "${lib.getExe config.programs.rofi.package} -show power-menu -modi 'power-menu:${lib.getExe pkgs.rofi-power-menu} --choices=logout/lockscreen/suspend/shutdown/reboot'"''; + "${modifier} R" = "spawn '${lib.getExe config.programs.rofi.package} -show combi'"; + "${modifier} T" = "spawn ${lib.getExe cfg.defaultApps.terminal}"; + "${modifier}+Control L" = "spawn ${lib.getExe pkgs.swaylock}"; + "${modifier}+Shift V" = "toggle-float"; + }; + }; + + map-pointer.normal = { + "${modifier} BTN_LEFT" = "move-view"; + "${modifier} BTN_RIGHT" = "resize-view"; + }; + + rule-add = { + "" = "ssd"; + }; + + spawn = [ + "rivertile" + ]; + }; +} diff --git a/homeManagerModules/options.nix b/homeManagerModules/options.nix index 10ce5f2f..b5d27ffa 100644 --- a/homeManagerModules/options.nix +++ b/homeManagerModules/options.nix @@ -149,6 +149,14 @@ in { }; }; + river = { + enable = lib.mkOption { + description = "River with full desktop session components."; + default = false; #osConfig.ar.desktop.river.enable; + type = lib.types.bool; + }; + }; + windowManagerBinds = lib.mkOption { description = "Default binds for window management."; diff --git a/homeManagerModules/services/gammastep/default.nix b/homeManagerModules/services/gammastep/default.nix index 62fc4824..4b8d3310 100644 --- a/homeManagerModules/services/gammastep/default.nix +++ b/homeManagerModules/services/gammastep/default.nix @@ -13,9 +13,9 @@ in { }; systemd.user.services.gammastep = { - Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"); + Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"); Service.Restart = lib.mkForce "no"; - Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"; + Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"; }; }; } diff --git a/homeManagerModules/services/mako/default.nix b/homeManagerModules/services/mako/default.nix index a9c8924d..d202e216 100644 --- a/homeManagerModules/services/mako/default.nix +++ b/homeManagerModules/services/mako/default.nix @@ -36,7 +36,7 @@ in { systemd.user.services.mako = { Unit = { After = "graphical-session.target"; - BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"; + BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"; Description = "Lightweight Wayland notification daemon"; Documentation = "man:mako(1)"; PartOf = "graphical-session.target"; @@ -51,7 +51,7 @@ in { Type = "dbus"; }; - Install.WantedBy = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"; + Install.WantedBy = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"; }; }; } diff --git a/homeManagerModules/services/randomWallpaper/default.nix b/homeManagerModules/services/randomWallpaper/default.nix index 9bdd66bd..7cf663b5 100644 --- a/homeManagerModules/services/randomWallpaper/default.nix +++ b/homeManagerModules/services/randomWallpaper/default.nix @@ -14,7 +14,7 @@ in { systemd.user.services.randomWallpaper = { Unit = { After = "graphical-session.target"; - BindsTo = lib.optional (config.ar.home.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (config.ar.home.desktop.sway.enable) "sway-session.target"; + BindsTo = lib.optional (config.ar.home.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (config.ar.home.desktop.sway.enable) "sway-session.target" ++ lib.optional (config.ar.home.desktop.river.enable) "river-session.target"; Description = "Lightweight swaybg-based random wallpaper daemon."; PartOf = "graphical-session.target"; }; @@ -36,7 +36,7 @@ in { TasksMax = "infinity"; }; - Install.WantedBy = lib.optional (config.ar.home.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (config.ar.home.desktop.sway.enable) "sway-session.target"; + Install.WantedBy = lib.optional (config.ar.home.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (config.ar.home.desktop.sway.enable) "sway-session.target" ++ lib.optional (config.ar.home.desktop.river.enable) "river-session.target"; }; }; } diff --git a/homeManagerModules/services/swayidle/default.nix b/homeManagerModules/services/swayidle/default.nix index c1c35f8a..407b6397 100644 --- a/homeManagerModules/services/swayidle/default.nix +++ b/homeManagerModules/services/swayidle/default.nix @@ -57,7 +57,7 @@ in { }; systemd.user.services.swayidle = { - Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"); + Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"); Service = { Environment = lib.mkForce [ @@ -77,7 +77,7 @@ in { Restart = lib.mkForce "no"; }; - Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"; + Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"; }; }; } diff --git a/homeManagerModules/services/swayosd/default.nix b/homeManagerModules/services/swayosd/default.nix index 1bb5640d..daa9a309 100644 --- a/homeManagerModules/services/swayosd/default.nix +++ b/homeManagerModules/services/swayosd/default.nix @@ -17,9 +17,9 @@ in { }; systemd.user.services.swayosd = { - Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"); + Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"); Service.Restart = lib.mkForce "no"; - Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"; + Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"; }; xdg.configFile."swayosd/style.css" = { diff --git a/homeManagerModules/services/waybar/default.nix b/homeManagerModules/services/waybar/default.nix index 6a421e5d..794569c1 100644 --- a/homeManagerModules/services/waybar/default.nix +++ b/homeManagerModules/services/waybar/default.nix @@ -27,7 +27,9 @@ in { lib.optionals (cfg.desktop.hyprland.enable) ["hyprland/workspaces"] ++ lib.optionals (cfg.desktop.sway.enable) - ["sway/workspaces"]; + ["sway/workspaces"] + ++ lib.optionals (cfg.desktop.river.enable) + ["river/tags"]; modules-right = [ "tray" @@ -275,18 +277,23 @@ in { #scratchpad, #session, #submap, + #tags, #tray, #workspaces { margin: 0px 5px; padding: 0px 2.5px; } + #tags button, #workspaces button { border-radius: 0px; } + #tags button.active, + #tags button.focused, #workspaces button.active, - #workspaces button.focused { + #workspaces button.focused + { color: ${config.lib.stylix.colors.withHashtag.base0D}; } @@ -318,7 +325,7 @@ in { }; systemd.user.services.waybar = { - Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"); + Install.WantedBy = lib.mkForce (lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"); Service = { Environment = lib.mkForce [ @@ -350,7 +357,7 @@ in { Restart = lib.mkForce "no"; }; - Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target"; + Unit.BindsTo = lib.optional (cfg.desktop.hyprland.enable) "hyprland-session.target" ++ lib.optional (cfg.desktop.sway.enable) "sway-session.target" ++ lib.optional (cfg.desktop.river.enable) "river-session.target"; }; xdg.configFile."nwg-drawer/drawer.css".text = ''