The panel powered off at 330s but nothing ever suspended, so a lid-open idle
laptop kept drawing 6-7W indefinitely; only lid *close* suspended (logind's
default HandleLidSwitch). logind IdleAction stays Ignore on purpose -- it
cannot run swaymsg/hyprlock hooks, hypridle's before_sleep_cmd can.
Plain suspend, not suspend-then-hibernate: swap is zram-only.
screen-capture.sh was a single non-executable line containing a `slur` typo,
so it never ran and nothing referenced it; rewritten as a working region
capture to ~/Pictures plus clipboard.
xdg-desktop-portal/portals.conf pins the wlr backend for sway, and swaync is
pulled in via graphical-session.target.wants so the portal's
Requisite=graphical-session.target is satisfied (the reason screen sharing
previously never started).
swayfx: with `border pixel` the visible line is child_border, not `border`
(which only paints title bars). Focused child_border was $base00 = black on
black, i.e. invisible; both are now the same gray.
keybinds: restore `floating_modifier $mod normal` (was `none`) and drop the
`pkill -RTMIN+10 i3blocks` tail from the volume binds -- i3blocks is not in
use, waybar is.
windows: drop a stray trailing semicolon; waybar: remove the unused
sway/submap module.
The previous file used swaylock-EFFECTS options, which the packaged swaylock
ignores. Documents that swaylock reads $XDG_CONFIG_HOME/swaylock/config on
every invocation, including hypridle's before_sleep_cmd and the $mod+m
keybind.
watchdog: covers both observed deadlock flavours -- the loud one that repeats
"Received invalid input AtomicChangeDone at state Discarded", and the silent
one that logs nothing and just never leaves VariantInProgress.
shikane-recover-on-reload.sh (new, previously referenced by sway/config but
never committed): shikanectl reload -> sleep 2 -> watchdog check, falling
back to a service restart when reload cannot recover.
clamshell-mode.sh: documents why the laptop panel is no longer enabled
unconditionally on lid-open, which raced shikane's "External Display" profile
(eDP-1 disabled by design) and produced "Atomic commit failed: Device or
resource busy" churn.
recover-output-after-resume.sh existed to work around the old ThinkPad's
/etc/modprobe.d/i915.conf, which forced PSR2 and the deepest display
C-states; the flip pending across suspend never completed, so every later
commit returned EBUSY and only a full modeset cleared it.
That file is gone and this laptop's iGPU is driven by `xe` (Panther Lake has
no i915 support at all), so the original cause cannot recur. The modeset is
now conditional on the user journal actually reporting "Atomic commit
failed"/"Page-flip failed" within the last 3 minutes.
Unconditional disable/enable + `shikanectl reload` on every resume was itself
a hazard: it is the exact sequence that re-triggers the shikane
VariantInProgress deadlock the watchdog exists to recover from.
hypridle.conf's comment no longer references the deleted i915.conf.
Migration from the ThinkPad X1 Carbon (2880x1800) to the Framework Laptop
13 Pro, whose panel is CSOT MND508ZB1-1 = 2880x1920 3:2 @120Hz and exposes
only 2880x1920@120000Hz / @60000Hz.
shikane was requesting [email protected], a mode this panel cannot provide,
so the variant could never be satisfied: it sat in NoVariantApplied for the
whole session, with 61 historical "Discarded" events. Both profiles now use
2880x1920@120Hz (including the disabled eDP-1 block, whose mode string still
has to resolve). Verified: profile now reaches VariantApplied.
Scale is 1.75 -> 1645x1097 logical, ~147 effective DPI, chosen to reproduce
the ~145 DPI of the old panel at 1.67. 1.75 is exactly representable as
float32, which sway stores scale in; 1.6 and 1.67 are not. 2.0 would be the
only integer (1:1, unresampled) scale but yields just 1440x960 logical.
The .config/sway/config hunk also adds the matching `output $laptop` baseline
so sway does not start at scale 2.0 and re-flow when shikane applies 1.75,
and carries previously-uncommitted session wiring for the scripts below.
shikane's config.toml was previously unversioned; it now lives in this repo
and ~/.config/shikane is a symlink, matching the existing convention.
sway:
- config: re-apply shikane profile after every reload
(exec_always shikanectl reload); restart waybar on reload
(exec_always pkill+waybar); enable default_border pixel 2;
add tlpctl power-saver at startup
- keybinds: disable floating_modifier (was "$mod normal") -
experiment for windows popping out via accidental mod+click
- windows: case-insensitive pydm title match for floating rule
- swayfx + waybar style: unified 5-color palette (base00-0F) with
doc headers; waybar theme restyled to match the sway palette
- waybar config: scratchpad module in left bar, "S{count}" format
- new quickshell shell.qml bar
systemd user units:
- shikane.service: bind to graphical-session/sway-session targets,
Type=simple, Restart=on-failure (2s) with start limits so crashes
recover without giving up permanently
- new sway-session.target and its wants/ symlinks
opencode:
- load AGENTS.md as instructions (new file)
- move OpenWebUI API key from hardcoded to {env:OPENWEBUI_API_KEY}
- Start xdg-desktop-portal-wlr and sway-session.target for proper portal init
- Re-enable systemd/dbus environment import for Wayland session vars
- Move hypridle startup earlier
- Switch waybar left modules from hyprland/* to sway/*
- Replace sway window module with hyprland submap in waybar
- Move clock to right side and update display format
- Enable battery time display and update workspace button styling
- Update nvim llm plugin model ID, backend URL, and FIM tokens
- Uncomment default terminal and add GTK/Qt wayland env vars in sway
modified: .config/sway/config
deleted: .config/sway/waybar
new file: .config/sway/waybar/config.jsonc
new file: .config/sway/waybar/style.css
new file: .config/systemd/user/default.target.wants/shikane.service
new file: .config/systemd/user/shikane.service
modified: .zshrc
new file: applications/application.desktop