Fixa omladdningsloopen + churn; CI/släpp flyttat till x64-byggnoden
Some checks failed
check / check (push) Failing after 1m4s

- KRITISKT: notify-watchern reagerade på Access-events, så vår egen
  läsning av configen triggade ny omladdning i all oändlighet (var
  155:e ms). Panelen revs och byggdes om konstant → blinkande hover,
  klick som aldrig landade. Nu filtreras eventen till riktiga
  skrivningar (Modify/Create/Remove/Close-Write).
- Titeländringar (webbläsare/terminaler) bygger inte längre om UI:t;
  tooltips slås i stället upp färskt vid hover (query-tooltip), och
  klick/skroll/menyer agerar på färskt fönster-state vid eventtillfället.
- hotspots::rebuild är idempotent (skippar om config+skärmar oförändrade).
- Settings: markup-escape i rubriker (Kant & skugga-varningen).
- CI: check + release körs på byggnoden brasse-linux01 (runs-on
  linux-amd64) — waydock byggs BARA för x86_64, aldrig på Pi5:ns
  arm-runner. Ny release.yaml: vX.Y.Z-tagg bygger x64-binären och
  laddar upp till Gitea-släppsidan + rullande latest. release.sh är
  nu bara tagga-och-pusha.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-29 23:51:27 +02:00
parent 0ded844b3a
commit e4e4d39405
10 changed files with 230 additions and 70 deletions

View File

@@ -101,8 +101,24 @@ fn build_hotspot(
win
}
thread_local! {
static LAST_SIGNATURE: std::cell::RefCell<String> =
const { std::cell::RefCell::new(String::new()) };
}
/// Bygg om alla hotspot-ytor enligt configen (körs vid start + configbyte).
/// Idempotent: oförändrad hotspot-config + skärmuppsättning → ingen ombyggnad.
pub fn rebuild(ctx: &Rc<Ctx>) {
let n_monitors = gdk::Display::default()
.map(|d| d.monitors().n_items())
.unwrap_or(0);
let signature = format!("{:?}|{n_monitors}", ctx.cfg.borrow().hotspots);
let unchanged = LAST_SIGNATURE.with(|s| *s.borrow() == signature);
if unchanged {
return;
}
LAST_SIGNATURE.with(|s| *s.borrow_mut() = signature);
for win in ctx.hotspot_windows.borrow_mut().drain(..) {
win.destroy();
}