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.
Josue's dotfiles
Uses GNU Stow to manage simlink. Place files as they where in $HOME
Usage
clone into $HOME
cd dotfiles
stow .
If stow is not installed use ./install.sh from .dotfiles repo
User services
shikane-watchdog
.config/systemd/user/shikane-watchdog.timer (every 2 min, user unit)
runs .config/sway/scripts/shikane-watchdog.sh, which restarts the
shikane user service if its state machine is stuck.
Why: shikane 1.1.1 deadlocks when a profile application is discarded
mid-way (e.g. by a failing DP atomic commit on the external display).
The daemon then keeps logging
[WARN shikane::variant] Received invalid input AtomicChangeDone at state Discarded
and shikanectl reload no longer recovers it. The watchdog detects
that signature in the journal and runs systemctl --user restart shikane
(re-applies the active profile in ~1s). It never restarts a healthy
or legitimately transitioning daemon.
systemctl --user status shikane-watchdog.timer # check it's active
systemctl --user disable --now shikane-watchdog.timer # disable