diff options
| author | 2026-05-13 13:43:38 +0100 | |
|---|---|---|
| committer | 2026-05-13 13:43:38 +0100 | |
| commit | af84673c80ae02091009a901770b505e756d002e (patch) | |
| tree | 772269c115c0fb41a32870f19df1c3d404b748d8 /dot_config | |
| parent | 2098f17c701b28ce2d0725a1e4837d628f4beb1d (diff) | |
| download | dotfiles-af84673c80ae02091009a901770b505e756d002e.tar.gz dotfiles-af84673c80ae02091009a901770b505e756d002e.tar.bz2 dotfiles-af84673c80ae02091009a901770b505e756d002e.zip | |
refactor(sway): apply display layout natively via include file
Persist the layout as a sway-include file (~/.config/sway/outputs.conf)
so sway's own parser applies output directives natively on every
reload. Eliminates the side-by-side flash that came from sway's
default "enable everything side-by-side" before exec_always could
override it.
- display-toggle.sh: write outputs.conf alongside the live swaymsg
commands, mirroring the same enable/disable/pos directives.
- sway/config: `include ~/.config/sway/outputs.conf` next to the
background line; downgrade exec_always back to plain exec since the
include handles reloads now (script only needs to run once at
startup to bootstrap the include file on first boot).
Diffstat (limited to 'dot_config')
| -rw-r--r-- | dot_config/sway/config | 6 | ||||
| -rwxr-xr-x | dot_config/sway/executable_display-toggle.sh | 31 |
2 files changed, 31 insertions, 6 deletions
diff --git a/dot_config/sway/config b/dot_config/sway/config index 73283c9..ac7acb3 100644 --- a/dot_config/sway/config +++ b/dot_config/sway/config @@ -40,6 +40,10 @@ seat * xcursor_theme Adwaita 24 # ── Output ──────────────────────────────────────────────────────────────────── output * bg #282828 solid_color +# Per-output enable/disable/position is written by display-toggle.sh and +# re-read by sway on every reload. Sway's `include` silently no-ops if the +# file doesn't exist (first boot, before the script has run). +include ~/.config/sway/outputs.conf # ── Window rules ────────────────────────────────────────────────────────────── for_window [class="feh"] floating enable @@ -238,7 +242,7 @@ bindsym $mod+t exec ~/.config/sway/tb-toggle.sh # ── Autostart ───────────────────────────────────────────────────────────────── exec systemctl --user import-environment DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_SESSION_DESKTOP PASSWORD_STORE_DIR exec dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP XDG_SESSION_TYPE XDG_SESSION_DESKTOP PASSWORD_STORE_DIR -exec_always "sleep 2 && ~/.config/sway/display-toggle.sh apply" +exec "sleep 2 && ~/.config/sway/display-toggle.sh apply" exec systemctl --user start sway-session.target exec ~/.config/sway/tb-autostart.sh diff --git a/dot_config/sway/executable_display-toggle.sh b/dot_config/sway/executable_display-toggle.sh index 08481dc..07fa59e 100755 --- a/dot_config/sway/executable_display-toggle.sh +++ b/dot_config/sway/executable_display-toggle.sh @@ -1,15 +1,29 @@ #!/bin/sh # Display mode manager: laptop-off ↔ side-by-side. # (no arg) toggle between modes (F7 / Super+x d). -# apply re-apply whatever is in the state file. Used by sway's -# exec_always at startup and on every config reload (sway -# reload re-enables all outputs side-by-side by default; -# this restores the user's chosen layout). First boot -# defaults to laptop-off when no state file exists. +# apply re-apply the saved mode (used by display-watcher after +# hotplug). First boot defaults to laptop-off. # init force laptop-off; used by the hotplug watcher when a # newly-plugged external should preempt whatever was saved. +# +# State is persisted as a sway-include file at $OUTPUTS_CONF so that +# sway's own config parser applies the layout natively on every reload +# — no side-by-side flash before override. The script also issues live +# swaymsg commands so toggles are immediate without needing a reload. STATE_FILE="${XDG_RUNTIME_DIR:-/tmp}/display-mode" +OUTPUTS_CONF="${XDG_CONFIG_HOME:-$HOME/.config}/sway/outputs.conf" + +write_conf() { + # $1 = mode (laptop-off | side-by-side | laptop-only) + # remaining args are the sway `output ...` directives, one per arg. + { + printf '# Auto-generated by display-toggle.sh; do not edit.\n' + printf '# Current mode: %s\n' "$1" + shift + for line in "$@"; do printf '%s\n' "$line"; done + } >"$OUTPUTS_CONF" +} OUTPUTS=$(swaymsg -t get_outputs -r) LAPTOP=$(echo "$OUTPUTS" | jq -r '[.[] | select(.name | test("^eDP")) | .name] | first // empty') @@ -21,6 +35,7 @@ if [ -z "$EXTERNAL" ]; then if [ -n "$LAPTOP" ]; then swaymsg output "$LAPTOP" enable pos 0 0 || true echo "laptop-only" >"$STATE_FILE" + write_conf "laptop-only" "output $LAPTOP enable pos 0 0" fi [ -z "${1:-}" ] && notify-send "Display" "No external display connected" exit 0 @@ -49,12 +64,18 @@ case "$NEXT" in swaymsg output "$EXTERNAL" enable || true swaymsg workspace number 1 || true echo "laptop-off" >"$STATE_FILE" + write_conf "laptop-off" \ + "output $LAPTOP disable" \ + "output $EXTERNAL enable" [ -z "${1:-}" ] && notify-send "Display" "Laptop screen off" ;; side-by-side) swaymsg output "$LAPTOP" enable pos 0 0 || true swaymsg output "$EXTERNAL" enable pos "$LAPTOP_WIDTH" 0 || true echo "side-by-side" >"$STATE_FILE" + write_conf "side-by-side" \ + "output $LAPTOP enable pos 0 0" \ + "output $EXTERNAL enable pos $LAPTOP_WIDTH 0" [ -z "${1:-}" ] && notify-send "Display" "Side by side" ;; esac |
