Files
whisper-local/whisper_local/inserter.py
T

46 lines
1.5 KiB
Python
Raw Normal View History

"""Text-Einfügung via Clipboard und wtype."""
import asyncio
import logging
logger = logging.getLogger(__name__)
PASTE_DELAY = 0.2 # Sekunden Wartezeit vor Clipboard-Restore
class Inserter:
async def _run(self, *cmd: str) -> tuple[bytes, int]:
"""Führt einen Befehl aus, gibt (stdout, returncode) zurück."""
proc = await asyncio.create_subprocess_exec(
*cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await proc.communicate()
if proc.returncode != 0:
logger.warning("Befehl fehlgeschlagen: %s (stderr: %s)", cmd, stderr.decode())
return stdout, proc.returncode
async def insert(self, text: str) -> None:
"""Fügt Text ins aktive Fenster ein via Clipboard + Ctrl+V."""
if not text:
return
# 1. Aktuelle Zwischenablage sichern
old_clipboard, _ = await self._run("wl-paste")
try:
# 2. Text in Zwischenablage kopieren
await self._run("wl-copy", text)
# 3. Ctrl+V simulieren
await self._run("wtype", "-M", "ctrl", "v", "-m", "ctrl")
# 4. Kurz warten, dann Clipboard wiederherstellen
await asyncio.sleep(PASTE_DELAY)
finally:
# Clipboard immer wiederherstellen
await self._run("wl-copy", old_clipboard.decode())
logger.info("Text eingefügt (%d Zeichen)", len(text))