waffensachkunde
Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.
/ app src main laufwaechter.ts
| 1 | /** |
| 2 | * Wer gerade prüft, soll das Fenster nicht versehentlich schließen. |
| 3 | * |
| 4 | * **Warum der Hauptprozess das wissen muss.** `close` entsteht dort – am |
| 5 | * Fensterkreuz, über Alt+F4 und über „Datei → Beenden“. Der Renderer bekommt |
| 6 | * davon nichts mit und kann die Frage deshalb nicht selbst stellen. |
| 7 | * |
| 8 | * **Warum ein Abgleich und keine Kantenmeldung.** Der Renderer schickt seinen |
| 9 | * Zustand auch beim Aufbau – also `false` nach einem Neuladen. Bliebe der |
| 10 | * Merker sonst hängen, hinge das Fenster für immer an einer Rückfrage zu |
| 11 | * einer Prüfung, die es nicht mehr gibt. Zusätzlich wird er vergessen, wenn |
| 12 | * ein neues Dokument geladen wird oder der Renderer stirbt: zwei unabhängige |
| 13 | * Wege, damit ein Absturz das Fenster nicht unschließbar macht. |
| 14 | */ |
| 15 | |
| 16 | import type { BrowserWindow, WebContents } from 'electron'; |
| 17 | |
| 18 | /** Kennungen der `webContents`, in denen gerade eine Prüfung läuft. */ |
| 19 | const laufend = new Set<number>(); |
| 20 | |
| 21 | /** Der Renderer meldet seinen Zustand – auch unverändert. */ |
| 22 | export function laufMelden(inhalt: WebContents, laeuft: boolean): void { |
| 23 | if (laeuft) { |
| 24 | laufend.add(inhalt.id); |
| 25 | } else { |
| 26 | laufend.delete(inhalt.id); |
| 27 | } |
| 28 | } |
| 29 | |
| 30 | /** Vergisst den Merker – bei neuem Dokument, Absturz oder Abbau. */ |
| 31 | export function laufVergessen(inhalt: WebContents): void { |
| 32 | laufend.delete(inhalt.id); |
| 33 | } |
| 34 | |
| 35 | /** Läuft in diesem Fenster gerade eine Prüfung? */ |
| 36 | export function laeuftPruefung(fenster: BrowserWindow): boolean { |
| 37 | return !fenster.webContents.isDestroyed() && laufend.has(fenster.webContents.id); |
| 38 | } |
| 39 | |
| 40 | /** Gegenstück für Tests. */ |
| 41 | export function laufwaechterLeeren(): void { |
| 42 | laufend.clear(); |
| 43 | } |