⚙️ 🤖 FlipDrop: Floating-Fenster als XDND-Drag-Quelle für Screenshots bauen #1

Closed
opened 2026-08-23 21:12:54 +02:00 by holm · 1 comment
Owner
Dimension Bewertung Einschätzung
Aufwand █████░░░░░ Mittel — Electron-Grundgerüst plus XDND-Drag, überschaubar
Nutzen ████████░░ Hoch — Screenshot-Weitergabe ist täglicher Reibungspunkt
Bruchhäufigkeit ███░░░░░░░ Niedrig — X11/XDND ist stabil, ändert sich selten
Nachhaltigkeit ████████░░ Hoch — einmal gebaut, dauerhaft nutzbar
Dringlichkeit █████░░░░░ Mittel — Workaround existiert (Dateimanager), ist aber lästig

Anforderung

Kleines, immer-obenauf-Fenster unter X11/i3, das als Drag-and-Drop-Quelle für
Screenshots dient.

  • Zeigt den Inhalt eines Verzeichnisses, Default ~/SyncDir/Screenshots
  • Sortierung nach ctime absteigend (neuester Screenshot oben)
  • Große Bildvorschau statt Dateinamen-Liste — der Screenshot soll erkennbar sein,
    ohne ihn zu öffnen
  • Datei per Drag-and-Drop nach außen ziehbar; Zielanwendungen: VSCodium, Browser,
    Terminal
  • Klick kopiert den Dateipfad ins Clipboard via xclip

Umsetzung

  • Electron/Node, Plattform Linux/X11
  • Drag nach außen über webContents.startDrag({ file, icon }) im Main-Prozess,
    ausgelöst per IPC aus dem Renderer — Electron erledigt damit das XDND-Protokoll,
    ein eigener XDND-Stack ist nicht nötig
  • Fenster-Eigenschaften: alwaysOnTop, skipTaskbar, kleine Default-Größe;
    i3-Verhalten ggf. über Fenster-Klasse/for_window-Regel steuern
  • Verzeichnis-Watch (fs.watch/chokidar), damit ein neuer Screenshot sofort oben
    auftaucht

Offene Punkte

  • §§§TODO Verzeichnis konfigurierbar machen (CLI-Arg / Config-Datei)?
  • §§§TODO Drag-Icon: Thumbnail des Bildes oder generisches Icon?
  • §§§TODO Verhalten bei Nicht-Bild-Dateien im Verzeichnis

Abnahme

Ein Screenshot lässt sich aus dem Fenster heraus in VSCodium, einen Browser und ein
Terminal ziehen und kommt dort als Datei bzw. Pfad an; ein Klick legt den Pfad im
Clipboard ab.

🤖 angelegt von Claude w01 (API/Token holm)

| Dimension | Bewertung | Einschätzung | |---|---|---| | Aufwand | `█████░░░░░` | Mittel — Electron-Grundgerüst plus XDND-Drag, überschaubar | | Nutzen | `████████░░` | Hoch — Screenshot-Weitergabe ist täglicher Reibungspunkt | | Bruchhäufigkeit | `███░░░░░░░` | Niedrig — X11/XDND ist stabil, ändert sich selten | | Nachhaltigkeit | `████████░░` | Hoch — einmal gebaut, dauerhaft nutzbar | | Dringlichkeit | `█████░░░░░` | Mittel — Workaround existiert (Dateimanager), ist aber lästig | ## Anforderung Kleines, immer-obenauf-Fenster unter X11/i3, das als **Drag-and-Drop-Quelle** für Screenshots dient. - Zeigt den Inhalt eines Verzeichnisses, Default `~/SyncDir/Screenshots` - Sortierung nach **ctime absteigend** (neuester Screenshot oben) - **Große Bildvorschau** statt Dateinamen-Liste — der Screenshot soll erkennbar sein, ohne ihn zu öffnen - Datei per **Drag-and-Drop nach außen** ziehbar; Zielanwendungen: VSCodium, Browser, Terminal - **Klick kopiert den Dateipfad** ins Clipboard via `xclip` ## Umsetzung - Electron/Node, Plattform Linux/X11 - Drag nach außen über `webContents.startDrag({ file, icon })` im Main-Prozess, ausgelöst per IPC aus dem Renderer — Electron erledigt damit das XDND-Protokoll, ein eigener XDND-Stack ist nicht nötig - Fenster-Eigenschaften: `alwaysOnTop`, `skipTaskbar`, kleine Default-Größe; i3-Verhalten ggf. über Fenster-Klasse/`for_window`-Regel steuern - Verzeichnis-Watch (`fs.watch`/`chokidar`), damit ein neuer Screenshot sofort oben auftaucht ## Offene Punkte - §§§TODO Verzeichnis konfigurierbar machen (CLI-Arg / Config-Datei)? - §§§TODO Drag-Icon: Thumbnail des Bildes oder generisches Icon? - §§§TODO Verhalten bei Nicht-Bild-Dateien im Verzeichnis ## Abnahme Ein Screenshot lässt sich aus dem Fenster heraus in VSCodium, einen Browser und ein Terminal ziehen und kommt dort als Datei bzw. Pfad an; ein Klick legt den Pfad im Clipboard ab. > 🤖 angelegt von Claude w01 (API/Token holm)
Author
Owner

Erledigt — Commit 18d68f6 (feat: FlipDrop-App — Floating-Fenster als XDND-Drag-Quelle) auf dev, signiert und gepusht.

Was gebaut wurde

Electron-App: main.js, preload.js, renderer/index.html, dazu Starter flipdrop.sh und shell.nix. Das Fenster liegt immer obenauf (X11/i3) und zeigt ein Verzeichnis (Default ~/SyncDir/Screenshots) nach ctime absteigend — bewusst nicht nach mtime, weil bei Nextcloud-/SyncDir-Kopien die mtime die des Originals bleibt und der frische Screenshot dann nicht oben steht. Maximal 200 Einträge, Auto-Refresh per fs.watch, große Bildvorschau.

Bedienung: Klick = Pfad ins Clipboard (CLIPBOARD und PRIMARY), Doppelklick = öffnen, Ziehen = XDND, +/- Spaltenzahl 1–4 (in localStorage gemerkt), r/F5 neu laden, q/Esc schließen. Aufrufparameter -d/--dir=, Env FLIPDROP_DIR, FLIPDROP_GEOM (Default 380 900), FLIPDROP_POS (Default 60 60).

Tests — alle vier bestanden (live durch holm)

Drop-Ziel Ergebnis
VSCodium ✓ Drag funktioniert
Browser (claude.ai) ✓ Drag funktioniert
Terminal ✓ Drag funktioniert
Clipboard-Fallback ✓ Pfad landet in CLIPBOARD und PRIMARY

Zwei Befunde

  1. ELECTRON_RUN_AS_NODE-Falle. Aus einem VSCodium-Terminal gestartet erbt der Prozess ELECTRON_RUN_AS_NODE=1; Electron läuft dann als reines Node und stirbt sofort mit Cannot find module 'electron' — sieht nach kaputtem Setup aus, ist aber nur die geerbte Variable. flipdrop.sh räumt sie samt der VSCODE_*-Geschwister vor dem Start ab. Beim direkten electron .-Aufruf muss man das selbst tun.
  2. i3 legt das Fenster tiled an. Ohne Regel sitzt FlipDrop im Tiling statt zu schweben. flipdrop.sh hilft einmalig per xdotool + i3-msg nach; dauerhaft besser ist die for_window-Regel in der i3-Config:
    for_window [class="(?i)flipdrop"] floating enable, sticky enable, border pixel 2, resize set 380 900, move position 60 60
    

Beides steht als eigener Abschnitt im README. Kein Tag, kein Release, kein Merge nach main — das bleibt separater Entscheidung vorbehalten.

🤖 Kommentar von Claude w01 (API/Token holm)

**Erledigt** — Commit `18d68f6` (`feat: FlipDrop-App — Floating-Fenster als XDND-Drag-Quelle`) auf `dev`, signiert und gepusht. ## Was gebaut wurde Electron-App: `main.js`, `preload.js`, `renderer/index.html`, dazu Starter `flipdrop.sh` und `shell.nix`. Das Fenster liegt immer obenauf (X11/i3) und zeigt ein Verzeichnis (Default `~/SyncDir/Screenshots`) nach **ctime** absteigend — bewusst nicht nach mtime, weil bei Nextcloud-/SyncDir-Kopien die mtime die des Originals bleibt und der frische Screenshot dann nicht oben steht. Maximal 200 Einträge, Auto-Refresh per `fs.watch`, große Bildvorschau. Bedienung: Klick = Pfad ins Clipboard (CLIPBOARD **und** PRIMARY), Doppelklick = öffnen, Ziehen = XDND, `+`/`-` Spaltenzahl 1–4 (in `localStorage` gemerkt), `r`/F5 neu laden, `q`/Esc schließen. Aufrufparameter `-d`/`--dir=`, Env `FLIPDROP_DIR`, `FLIPDROP_GEOM` (Default `380 900`), `FLIPDROP_POS` (Default `60 60`). ## Tests — alle vier bestanden (live durch holm) | Drop-Ziel | Ergebnis | |---|---| | VSCodium | ✓ Drag funktioniert | | Browser (claude.ai) | ✓ Drag funktioniert | | Terminal | ✓ Drag funktioniert | | Clipboard-Fallback | ✓ Pfad landet in CLIPBOARD und PRIMARY | ## Zwei Befunde 1. **`ELECTRON_RUN_AS_NODE`-Falle.** Aus einem VSCodium-Terminal gestartet erbt der Prozess `ELECTRON_RUN_AS_NODE=1`; Electron läuft dann als reines Node und stirbt sofort mit `Cannot find module 'electron'` — sieht nach kaputtem Setup aus, ist aber nur die geerbte Variable. `flipdrop.sh` räumt sie samt der `VSCODE_*`-Geschwister vor dem Start ab. Beim direkten `electron .`-Aufruf muss man das selbst tun. 2. **i3 legt das Fenster tiled an.** Ohne Regel sitzt FlipDrop im Tiling statt zu schweben. `flipdrop.sh` hilft einmalig per `xdotool` + `i3-msg` nach; dauerhaft besser ist die `for_window`-Regel in der i3-Config: ``` for_window [class="(?i)flipdrop"] floating enable, sticky enable, border pixel 2, resize set 380 900, move position 60 60 ``` Beides steht als eigener Abschnitt im README. Kein Tag, kein Release, kein Merge nach `main` — das bleibt separater Entscheidung vorbehalten. > 🤖 Kommentar von Claude w01 (API/Token holm)
holm closed this issue 2026-08-23 21:23:54 +02:00
Sign in to join this conversation.
No description provided.