Better eww
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
{ lib, config, pkgs, ... }:
|
||||
let
|
||||
ensureDaemon = pkgs.custom.eww-ensure-daemon;
|
||||
|
||||
openOnCurrentScreen = pkgs.writeShellScriptBin "eww-open-on-current-screen" ''
|
||||
window="$1"
|
||||
shift
|
||||
|
||||
${ensureDaemon}/bin/eww-ensure-daemon || exit 1
|
||||
|
||||
screen="$(hyprctl monitors -j | ${lib.getExe pkgs.jq} -r '.[] | select(.focused == true) | .name' | head -n1)"
|
||||
|
||||
if [ -n "$screen" ]; then
|
||||
@@ -13,6 +17,21 @@ let
|
||||
exec ${lib.getExe pkgs.eww} open "$window" "$@"
|
||||
'';
|
||||
|
||||
# Escape hatch: tears down every eww process (including orphaned daemons that
|
||||
# own unreachable surfaces), clears the stale socket, and brings back a single
|
||||
# daemon with the bar. `pkill -x` matches the process name exactly so it can
|
||||
# never match a wrapper script or a shell that merely mentions eww.
|
||||
ewwReset = pkgs.writeShellScriptBin "eww-reset" ''
|
||||
${pkgs.systemd}/bin/systemctl --user stop eww.service >/dev/null 2>&1 || true
|
||||
${pkgs.procps}/bin/pkill -x -u "$(id -u)" eww >/dev/null 2>&1 || true
|
||||
sleep 1
|
||||
${pkgs.procps}/bin/pkill -9 -x -u "$(id -u)" eww >/dev/null 2>&1 || true
|
||||
rm -f "''${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"/eww-server_*
|
||||
|
||||
${ensureDaemon}/bin/eww-ensure-daemon || exit 1
|
||||
exec ${lib.getExe pkgs.eww} open bar --screen 0
|
||||
'';
|
||||
|
||||
# Wraps a static script file with a bash launcher that prepends Nix store
|
||||
# bin dirs to PATH — keeps the source files unchanged.
|
||||
mkScript = name: src: inputs: pkgs.writeShellScriptBin name ''
|
||||
@@ -43,7 +62,26 @@ let
|
||||
in {
|
||||
|
||||
config = lib.mkIf (config.usercfg.wm == "Wayland") {
|
||||
home.packages = [ pkgs.eww openOnCurrentScreen ];
|
||||
home.packages = [ pkgs.eww openOnCurrentScreen ensureDaemon ewwReset ];
|
||||
|
||||
# One explicitly-managed daemon, so no client ever races to spawn a rival.
|
||||
# ExecStartPre clears a socket left behind by an unclean exit, which would
|
||||
# otherwise make the fresh daemon look reachable to clients before it binds.
|
||||
systemd.user.services.eww = {
|
||||
Unit = {
|
||||
Description = "eww daemon";
|
||||
PartOf = [ "graphical-session.target" ];
|
||||
After = [ "graphical-session.target" ];
|
||||
};
|
||||
Service = {
|
||||
Type = "simple";
|
||||
ExecStartPre = "${pkgs.bash}/bin/bash -c 'rm -f \"\${XDG_RUNTIME_DIR:-/run/user/$(id -u)}\"/eww-server_*'";
|
||||
ExecStart = "${lib.getExe pkgs.eww} daemon --no-daemonize";
|
||||
Restart = "on-failure";
|
||||
RestartSec = 1;
|
||||
};
|
||||
Install.WantedBy = [ "graphical-session.target" ];
|
||||
};
|
||||
|
||||
xdg.configFile = lib.mkMerge [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user