waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src main laufwaechter.ts

1,6 KB Rohdatei
app/src/main/laufwaechter.ts — 43 Zeilen
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 }