diff --git a/README.md b/README.md index 046cc30..d6d907c 100755 --- a/README.md +++ b/README.md @@ -23,6 +23,5 @@ each host should have these files: - better theming for hyprlock, rofi, dunst (accent for hyprlock & dunst, variants for rofi) - some way for border radius, border, tranparency theme options - tags for pip and popups in hyprland config - - make wl-clip-persist, polkit agent, and networkmanager applet systemd services? - - uh oh! it seems clipse is broken. the listen-shell service stops after you open the gui + - remove exec-once stuff and use systemd services instead - gtk cursors are MESSED UP. top priority rn diff --git a/hosts/goopnet-interface/default.nix b/hosts/goopnet-interface/default.nix index 027737a..78c1cf9 100755 --- a/hosts/goopnet-interface/default.nix +++ b/hosts/goopnet-interface/default.nix @@ -17,11 +17,11 @@ # debug strace ltrace lsof # apps - firefox qalculate-gtk krita inkscape onlyoffice-desktopeditors vlc nicotine-plus transmission_4-gtk font-manager obs-studio kdePackages.kdenlive + firefox qalculate-gtk krita inkscape onlyoffice-desktopeditors vlc nicotine-plus transmission_4-gtk font-manager # compatibility wineWowPackages.waylandFull winetricks # misc - bat file which packwiz yt-dlp hyfetch + bat file which packwiz yt-dlp wl-screenrec wl-clipboard grim hyfetch # games prismlauncher ] ++ (with pkgs.my; [ diff --git a/modules/desktop/batsignal.nix b/modules/desktop/batsignal.nix index 2ed6d78..9b2c3c1 100644 --- a/modules/desktop/batsignal.nix +++ b/modules/desktop/batsignal.nix @@ -6,18 +6,18 @@ let in { options.modules.desktop.batsignal = { enable = mkEnableOption "Enable batsignal, a battery notification service"; + package = mkOption { + type = types.package; + default = pkgs.batsignal; + }; }; config = mkIf cfg.enable { - hm.services.batsignal = { - enable = true; - - extraArgs = [ - # -w 20 -c 10 -d 5 -- set battery levels - # -p -- notify on plug/unplug - # -m 2 -- set interval to 2 seconds - "-w 20" "-c 10" "-d 5" "-p" "-m 2" - ]; - }; + modules.desktop.execOnStart = [ + # -w 20 -c 10 -d 5 -- set battery levels + # -p -- notify on plug/unplug + # -m 2 -- set interval to 2 seconds + "${lib.getExe cfg.package} -w 20 -c 10 -d 5 -p -m 2" + ]; }; } diff --git a/modules/desktop/clipse.nix b/modules/desktop/clipse.nix index e29b7b2..f512a53 100644 --- a/modules/desktop/clipse.nix +++ b/modules/desktop/clipse.nix @@ -9,28 +9,28 @@ in { package = mkOption { type = types.package; default = pkgs.clipse; - example = "pkgs.clipse"; }; }; config = mkIf cfg.enable { - hm.systemd.user.services.clipse = { - Unit = { - Description = "clipse, a generic clipboard manager"; - After = [ "graphical-session-pre.target" ]; - PartOf = [ "graphical-session.target" ]; - }; + # runtime dependencies + user.packages = with pkgs; [ wl-clipboard ]; - Install = { - WantedBy = [ "graphical-session.target" ]; - }; + modules.desktop.execOnStart = [ "${lib.getExe cfg.package} -listen-shell" ]; + hm.wayland.windowManager.hyprland.settings = let + class = "clipse"; + in { + windowrulev2 = [ + "float, class:^${class}$" + "size 622 652, class:^${class}$" + "center, class:^${class}$" + "stayfocused, class:^${class}$" + "dimaround, class:^${class}$" + ]; - Service = { - Type = "simple"; - ExecStart = "${lib.getExe cfg.package} -listen-shell"; - Restart = "on-failure"; - RestartSec = 5; - }; + bind = [ + "$mod, V, exec, ${lib.getExe pkgs.wezterm} start --class ${class} -e '${lib.getExe cfg.package}'" + ]; }; }; } diff --git a/modules/desktop/default.nix b/modules/desktop/default.nix index 420d503..a2e4d0b 100644 --- a/modules/desktop/default.nix +++ b/modules/desktop/default.nix @@ -9,6 +9,11 @@ in { type = types.nullOr (types.enum ["x11" "wayland"]); description = "What display protocol to use"; }; + execOnStart = mkOption { + type = types.listOf types.str; + description = "List of commands to run on startup"; + default = null; + }; }; config = mkMerge [ @@ -52,18 +57,9 @@ in { SDL_VIDEODRIVER = "wayland"; CLUTTER_BACKEND = "wayland"; }; - - hm.home.packages = with pkgs; [ - wl-clipboard - wl-clipboard-x11 # compat with xclip - ]; }) (mkIf (cfg.envProto == "x11") { services.xserver.excludePackages = [ pkgs.xterm ]; - - hm.home.packages = with pkgs; [ - xclip - ]; }) ]; } diff --git a/modules/desktop/dunst.nix b/modules/desktop/dunst.nix index 1bef859..e5c70e0 100644 --- a/modules/desktop/dunst.nix +++ b/modules/desktop/dunst.nix @@ -11,7 +11,6 @@ in { config = mkIf cfg.enable { hm.services.dunst = { enable = true; - settings = with config.colorScheme.palette; { global = { follow = "mouse"; diff --git a/modules/desktop/gammastep.nix b/modules/desktop/gammastep.nix index 01b800e..ee78e84 100644 --- a/modules/desktop/gammastep.nix +++ b/modules/desktop/gammastep.nix @@ -9,10 +9,9 @@ in { }; config = mkIf cfg.enable { + modules.desktop.execOnStart = [ "${pkgs.gammastep}/bin/gammastep-indicator" ]; hm.services.gammastep = { enable = true; - tray = true; - # portland, oregon latitude = 45.3112; longitude = -122.4055; diff --git a/modules/desktop/hyprland.nix b/modules/desktop/hyprland.nix index 0ae38ad..a6d202c 100644 --- a/modules/desktop/hyprland.nix +++ b/modules/desktop/hyprland.nix @@ -88,10 +88,10 @@ in { ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" ])); bindr = [ # "bind released" - "SUPER, Super_L, exec, ${lib.getExe config.modules.desktop.nwg-drawer.package}" + "SUPER, Super_L, exec, ${lib.getExe pkgs.nwg-drawer}" ]; bind = let - screenshotScript = pkgs.writeShellScript "screenshot" '' + screenshotScript = pkgs.writeScript "screenshot" '' temp_file=$(mktemp) trap 'rm -f "$temp_file"' EXIT @@ -149,10 +149,9 @@ in { "$mod, bracketleft, workspace, e-1" "$mod, bracketright, workspace, e+1" - "$mod, R, exec, ${lib.getExe config.modules.desktop.rofi.package} -show run" - "$mod, T, exec, ${lib.getExe config.modules.software.system.wezterm.package}" + "$mod, R, exec, ${lib.getExe pkgs.rofi-wayland} -show run" + "$mod, T, exec, ${lib.getExe pkgs.wezterm}" "$mod, L, exec, ${lib.getExe config.modules.desktop.hyprlock.package}" - "$mod, V, exec, ${lib.getExe config.modules.software.system.wezterm.package} start --class 'clipse' -e '${lib.getExe config.modules.desktop.clipse.package}'" # screenshot # area @@ -165,6 +164,10 @@ in { ", XF86LaunchA, exec, ${screenshotScript} area" ", XF86LaunchB, exec, ${lib.getExe pkgs.rofi-rbw-wayland} -a copy -t password --clear-after 20" ", XF86ScreenSaver, exec, ${lib.getExe config.modules.desktop.hyprlock.package}" + + # alt-tab emulation + # doesnt activate when we let go of alt sadly + "ALT, Tab, exec, ${lib.getExe pkgs.rofi-wayland} -show window" ] ++ ( # workspaces # binds $mod + [shift +] {1..10} to [move to] workspace {1..10} @@ -202,7 +205,7 @@ in { "${lib.getExe pkgs.networkmanagerapplet}" # network applet "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1" # polkit agent "${lib.getExe pkgs.wl-clip-persist} --clipboard regular" # to fix wl clipboards disappearing - ]; + ] ++ config.modules.desktop.execOnStart; env = [ "XCURSOR_THEME,${config.modules.desktop.themes.cursorTheme.name}" @@ -221,17 +224,17 @@ in { }; windowrulev2 = [ - # TODO: dedupe - # commons - "float, class:^org.gnome.FileRoller$" - "size 1100 650, class:^org.gnome.FileRoller$" - "center, class:^org.gnome.FileRoller$" - "float, class:^org.gnome.Loupe$" - "size 1100 650, class:^org.gnome.Loupe$" - "center class:^org.gnome.Loupe$" - "float, class:^com.gabm.satty$" - "size 1100 650, class:^com.gabm.satty$" - "center 1100 650, class:^com.gabm.satty$" + # common popups + # we should totally dedupe these + "float, class:org.gnome.FileRoller" + "size 1100 650, class:org.gnome.FileRoller" + "center, class:org.gnome.FileRoller" + "float, class:org.gnome.Loupe" + "size 1100 650, class:org.gnome.Loupe" + "center class:org.gnome.Loupe" + "float, class:com.gabm.satty" + "size 1100 650, class:com.gabm.satty" + "center 1100 650, class:com.gabm.satty" "float, initialTitle:^Open Folder$" "size 1100 650, initialTitle:^Open Folder$" "center, initialTitle:^Open Folder$" @@ -250,29 +253,17 @@ in { "float, initialTitle:^File Upload$" "size 1100 650, initialTitle:^File Upload$" "center, initialTitle:^File Upload$" - "float, class:^clipse$" - "size 1100 650, class:^clipse$" - "center, class:^clipse$" - # privacy popups - "stayfocused, class:^clipse$" - "dimaround, class:^clipse$" - "stayfocused, class:^gcr-prompter$" - "dimaround, class:^gcr-prompter$" + + "float, class:\.exe$" + + # fix focus + "stayfocused, class:^gcr-prompter" + "dimaround, class:^gcr-prompter" "stayfocused, class:^pinentry-" "dimaround, class:^pinentry-" "stayfocused, class:^polkit-" "dimaround, class:^polkit-" - "float, class:\.exe$" - "rounding 0, class:\.exe$" - - # steam notifs - "rounding 0, title:^notificationtoasts_" - "pin, title:^notificationtoasts_" - "noborder, title:^notificationtoasts_" - "nofocus, title:^notificationtoasts_" - "noshadow, title:^notificationtoasts_" - # firefox pip "float, title:^Picture-in-Picture$" "pin, title:^Picture-in-Picture$" @@ -281,12 +272,11 @@ in { # discord pip "pin, initialTitle:^Discord Popout$" "float, initialTitle:^Discord Popout$" - "noborder, initialTitle:^Discord Popout$" # workspace moving - "workspace 1 silent, class:^firefox$" - "workspace 2 silent, class:^code$" - "workspace 4 silent, class:^vesktop$" + "workspace 1 silent, class:^firefox" + "workspace 2 silent, class:code" + "workspace 4 silent, class:vesktop" ]; layerrule = [ diff --git a/modules/desktop/nwg-drawer.nix b/modules/desktop/nwg-drawer.nix index 6f6564f..e159d6a 100644 --- a/modules/desktop/nwg-drawer.nix +++ b/modules/desktop/nwg-drawer.nix @@ -6,31 +6,9 @@ let in { options.modules.desktop.nwg-drawer = { enable = mkEnableOption "Enable nwg-drawer, a GTK based application launcher for wayland"; - package = mkOption { - type = types.package; - default = pkgs.nwg-drawer; - example = "pkgs.nwg-drawer"; - }; }; config = mkIf cfg.enable { - hm.systemd.user.services.nwg-drawer = { - Unit = { - Description = "nwg-drawer, a GTK based application launcher for wayland"; - After = [ "graphical-session-pre.target" ]; - PartOf = [ "graphical-session.target" ]; - }; - - Install = { - WantedBy = [ "graphical-session.target" ]; - }; - - Service = { - Type = "simple"; - ExecStart = "${lib.getExe cfg.package} -r -nofs -nocats -ovl -term wezterm -spacing 15 -fm nautilus"; - Restart = "on-failure"; - RestartSec = 5; - }; - }; + modules.desktop.execOnStart = [ "${lib.getExe pkgs.nwg-drawer} -r -nofs -nocats -ovl -term wezterm -spacing 15 -fm nautilus" ]; }; } diff --git a/modules/desktop/rofi.nix b/modules/desktop/rofi.nix index 5d4a5eb..d27c114 100644 --- a/modules/desktop/rofi.nix +++ b/modules/desktop/rofi.nix @@ -6,18 +6,12 @@ let in { options.modules.desktop.rofi = { enable = mkEnableOption "Enable rofi, a window switcher, run dialog and dmenu replacement"; - package = mkOption { - type = types.package; - default = pkgs.rofi-wayland-unwrapped; - example = "pkgs.rofi"; - }; }; config = mkIf cfg.enable { hm.programs.rofi = { enable = true; - package = cfg.package; - + package = pkgs.rofi-wayland; font = with config.modules.desktop.fonts.fonts.monospace; "${family} ${toString size}px"; extraConfig = { show-icons = true; diff --git a/modules/desktop/swww.nix b/modules/desktop/swww.nix index b2426ba..3c4fdb9 100644 --- a/modules/desktop/swww.nix +++ b/modules/desktop/swww.nix @@ -14,20 +14,21 @@ in { default = pkgs.swww; example = "pkgs.swww"; }; - setScript = mkOption { + startScript = mkOption { type = types.package; - default = pkgs.writeShellScript "swww-set" '' + default = pkgs.writeScript "swww-start" '' if [ ! -f "${lastWallpaper}" ]; then echo "$(ls ${wallpapersFolder} | shuf -n 1)" > "${lastWallpaper}" fi + ${cfg.package}/bin/swww-daemon & ${lib.getExe cfg.package} img "${wallpapersFolder}/$(cat ${lastWallpaper})" --transition-type none ''; }; swapScript = mkOption { type = types.package; - default = pkgs.writeShellScript "swww-swap" '' - file=$(ls ${wallpapersFolder} | ${lib.getExe config.modules.desktop.rofi.package} -dmenu -sep '\n' -i -p "select a wallpaper") + default = pkgs.writeScript "swww-swap" '' + file=$(ls ${wallpapersFolder} | ${lib.getExe pkgs.rofi-wayland} -dmenu -sep '\n' -i -p "select a wallpaper") wallpaper="${wallpapersFolder}/$file" [ ! -f "$wallpaper" ] && exit 1 @@ -41,24 +42,6 @@ in { config = mkIf cfg.enable { hm.home.packages = [ cfg.package ]; - hm.systemd.user.services.swww = { - Unit = { - Description = "swww, a Solution to your Wayland Wallpaper Woes"; - After = [ "graphical-session-pre.target" ]; - PartOf = [ "graphical-session.target" ]; - }; - - Install = { - WantedBy = [ "graphical-session.target" ]; - }; - - Service = { - Type = "simple"; - ExecStart = "${cfg.package}/bin/swww-daemon"; - ExecStartPost = "${cfg.setScript}"; - Restart = "on-failure"; - RestartSec = 5; - }; - }; + modules.desktop.execOnStart = [ "${cfg.startScript}" ]; }; } diff --git a/modules/desktop/themes/catppuccin/waybar.css b/modules/desktop/themes/catppuccin/waybar.css index b45b69d..47888ec 100644 --- a/modules/desktop/themes/catppuccin/waybar.css +++ b/modules/desktop/themes/catppuccin/waybar.css @@ -104,52 +104,24 @@ window#waybar.floating #window { color: @teal; } -#cpu { - color: @sapphire; -} - -@keyframes blink { - to { - color: @text; - } -} - -#memory { - animation-timing-function: linear; - animation-iteration-count: infinite; - animation-direction: alternate; - color: @lavender; -} -#memory.warning { - color: @peach; - animation-name: blink; - animation-duration: 3s; -} -#memory.critical { - color: @maroon; - animation-name: blink; - animation-duration: 2s; -} - #battery { - animation-timing-function: linear; - animation-iteration-count: infinite; - animation-direction: alternate; color: @green; } -/* this here is ditto */ + #battery.charging { color: @green; } -#battery.warning.discharging { + +#battery.warning:not(.charging) { color: @peach; - animation-name: blink; - animation-duration: 3s; } -#battery.critical.discharging { + +#battery.critical:not(.charging) { color: @maroon; - animation-name: blink; - animation-duration: 2s; +} + +#network { + color: @sapphire; } #backlight { @@ -159,9 +131,6 @@ window#waybar.floating #window { #pulseaudio { color: @pink; } -#pulseaudio.muted { - color: @overlay1; -} #custom-power { color: @red; @@ -180,58 +149,13 @@ window#waybar.floating #window { color: @text; } -box#playback { - background-color: transparent; - margin: 0 0; - padding: 0 0; -} - -#mpris { - background-color: @surface0; - margin: 0 0.25em; - padding: 0.15em 0.5em; - border-radius: 1em; -} -#mpris.playing { - color: @accent; - background: @surface0; -} -#mpris.paused, #mpris.stopped { - color: @overlay1; -} - -window decoration { - box-shadow: none; -} - -tooltip, window.popup menu { +tooltip { background: @base; border: 1px solid @surface2; - font-size: 12px; - color: @text; -} -tooltip *, window.popup { - font-family: CozetteVector, monospace; } tooltip * { padding: 0px; margin: 0px; color: @text; -} - -window.popup separator { - background-color: @surface0; -} - -window.popup menuitem:disabled { - color: @overlay1; -} - -window.popup menuitem:hover { - background-color: @accent; - color: @surface0; -} - -window.popup menuitem:hover > box { - background-color: transparent; + font-family: CozetteVector, monospace; } diff --git a/modules/desktop/waybar.nix b/modules/desktop/waybar.nix index 78f29eb..254bb00 100644 --- a/modules/desktop/waybar.nix +++ b/modules/desktop/waybar.nix @@ -14,15 +14,16 @@ in { }; config = mkIf cfg.enable { - # enables playerctld bus, required for waybar to read mpris - hm.services.playerctld.enable = true; + # runtime requirements for modules + user.packages = with pkgs; [ + # mpris + playerctl + ]; + + modules.desktop.execOnStart = [ "${lib.getExe cfg.package}" ]; hm.programs.waybar = { enable = true; - # essentially just the service - # peculiar how this is a program - systemd.enable = true; package = cfg.package; - settings = { mainBar = { layer = "top"; @@ -75,7 +76,7 @@ in { ]; }; "custom/power" = let - powerSelect = pkgs.writeShellScript "power-menu" '' + powerSelect = pkgs.writeScript "power-menu" '' cmd=$(echo '⏻ shutdown|↻ reboot| lock|⎋ exit desktop environment' | ${lib.getExe pkgs.rofi-wayland} -dmenu -sep '|' -i -p 'what to do ?' -theme-str 'window { height: 132px; }') case "$cmd" in "⏻ shutdown") @@ -171,17 +172,11 @@ in { cpu = { interval = 4; format = " {usage}% {avg_frequency}GHz"; - on-click = "${lib.getExe pkgs.gnome-system-monitor}"; }; memory = { interval = 4; format = " {percentage}%"; tooltip-format = "{used:0.1f}GiB/{avail:0.1f}GiB used\n{swapUsed:0.1f}GiB/{swapAvail:0.1f}GiB swap"; - on-click = "${lib.getExe pkgs.gnome-system-monitor}"; - states = { - warning = 80; - critical = 90; - }; }; power-profiles-daemon = { format = "{icon}"; @@ -217,11 +212,10 @@ in { ]; }; mpris = { - format = "♫ {dynamic}"; + format = "{status_icon} {dynamic}"; format-paused = "{status_icon} {dynamic}"; - dynamic-order = [ "artist" "title" ]; - tooltip-format = "{player} | {status_icon} {artist} - {title} from {album} ({position}/{length})"; - title-length = 48; + dynamic-order = [ "title" ]; + tooltip-format = "{player}: {dynamic}"; interval = 1; status-icons = { playing = "⏸"; diff --git a/modules/desktop/wob.nix b/modules/desktop/wob.nix index e8ee49d..30247f9 100644 --- a/modules/desktop/wob.nix +++ b/modules/desktop/wob.nix @@ -14,11 +14,14 @@ in { }; config = mkIf cfg.enable { - # uhm uh um - # i don't know how the code in home-manager is making the wob socket, but it is + modules.desktop.execOnStart = let + path = cfg.sockPath; + script = pkgs.writeScript "launch-wob" '' + rm -f ${path} && mkfifo ${path} && tail -f ${path} | ${lib.getExe pkgs.wob} + ''; + in [ (toString script) ]; hm.services.wob = { enable = true; - settings = { "" = { timeout = 1000; diff --git a/modules/software/system/wezterm.nix b/modules/software/system/wezterm.nix index 6242f3f..ba094b6 100644 --- a/modules/software/system/wezterm.nix +++ b/modules/software/system/wezterm.nix @@ -1,4 +1,4 @@ -{ lib, config, pkgs, ... }: +{ lib, config, ... }: with lib; let @@ -6,10 +6,6 @@ let in { options.modules.software.system.wezterm = { enable = mkEnableOption "Enable wezterm, a blazingly fast terminal emulator"; - package = mkOption { - type = types.package; - default = pkgs.wezterm; - }; }; config = mkIf cfg.enable { @@ -17,8 +13,6 @@ in { hm.programs.wezterm = { enable = true; - package = cfg.package; - extraConfig = let fonts = config.modules.desktop.fonts.fonts; in ''