staging.inyokaproject.org

Text in aktuellem Fenster ausgeben

Status: Gelöst | Ubuntu-Version: Ubuntu 24.04 (Noble Numbat)
Antworten |

altesCoon

Anmeldungsdatum:
7. November 2022

Beiträge: Zähle...

Halli hallo.

Ich suche eine Möglichkeit, per Skript (Shell, lieber noch Python) unter Ubuntu 24.04 (mit KDE-Plasma) einen Text (z.B. den in der Zwischenablage, gerne aber auch unabhängig davon) im aktuellen Fenster auszugeben. Ich möchte also STRG+V per Programm simulieren. Starten würde ich mein Programm per Kurzbefehl, also mit einer bestimmten Tastenkombination. Außerdem suche ich dasselbe auch für Wayland (Arch + Plasma).

Hat jemand Hinweise für mich?

Viele Grüße Peter

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@altesCoon: Für X11 ist der Klassiker wohl xdotool, also für das Beispiel xdotool key ctrl+v. Für Python könntest Du einen Blick auf pyautogui werfen. Da wäre es pyautogui.hotkey("ctrl", "v").

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Es gibt das ydotool: https://man.archlinux.org/man/ydotool.1.en - da Wayland was den Zugriff auf Fenster anderer Programme angeht deutlich restriktiver ist als X, geht das über virtuelle Eingabegeräte (der Kernel bietet dafür das uinput Kernel Modul an), die von einem mit erhöhten Rechten laufenden Daemon betrieben werden, dem ein Client Anweisungen zukommen lassen kann. Wenn ich das im Code richtig sehe, schreibt der Client da die benötigten Structs direkt in einen Unix-Socket (ReimuNotMoe/ydotool/blob/master/Client/ydotool.c), so dass man da auch einen Python-Client dafür nutzen könnte, der sich mit https://docs.python.org/3/library/struct.html entsprechende Binärdaten erstellt.

In Python könnte man sich das z.B. mit python-evdev selber bauen: https://python-evdev.readthedocs.io/en/latest/tutorial.html#injecting-input - der Nachteil bei dem Ansatz ist, dass man auf vom Kernel unterstützte Tastennamen beschränkt ist, was z.B. die Eingabe von beliebigen Unicode-Zeichen erschwert.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

altesCoon schrieb:

Ich suche eine Möglichkeit, per Skript (Shell, lieber noch Python) unter Ubuntu 24.04 (mit KDE-Plasma) einen Text (z.B. den in der Zwischenablage, gerne aber auch unabhängig davon) im aktuellen Fenster auszugeben. Ich möchte also STRG+V per Programm simulieren.

Das ist aber eine Eingabe. Die Ausgabe erfolgt dann, weil das Terminal oder anderes Programm die Eingabe empfängt und damit etwas tut. Du willst im Prinzip Tastatureingaben an den Prozess im Fenster schicken.

altesCoon

(Themenstarter)

Anmeldungsdatum:
7. November 2022

Beiträge: 45

Danke für all Eure Antworten.

Unter X11 läuft es jetzt bei mir mit

1
2
printf "$textvariable" | xclip -selection clipboard
xdotool key ctrl+v

Danke für die Hinweise!

Unter Arch/KDE Plasma/Wayland verwende ich wl-copy für das Kopieren in die Zwischenablage und versuche den Inhalt per wtype oder ydotool an das aktuelle Fenster zu schicken.

wtype läuft nicht in meinem Setting:

wtype "hallo"
Compositor does not support the virtual keyboard protocol

An anderer Stelle las ich, dass KDE und Gnome dies nicht unterstützen.

Bleibt ydotool. Daran beiße ich mir gerade die Zähne aus und bin traurig, dass es nicht irgendwo umfänglich beschrieben wird. Inzwischen meine ich zu wissen, dass ydotoold als Hintergundservice laufen muss. Das scheitert bei mir:

systemctl --user start ydotool.service
systemctl --user status ydotool.service
× ydotool.service - Starts ydotoold service
     Loaded: loaded (/usr/lib/systemd/user/ydotool.service; disabled
; preset: enabled)
     Active: failed (Result: exit-code) since Wed 2025-09-10 20:34:47 CEST; 36s ago
   Duration: 28ms
 Invocation: a54eba2f96964ea3a8eadffd8ed245e4
    Process: 24045 ExecStart=/usr/bin/ydotoold (code=exited, status=2)
   Main PID: 24045 (code=exited, status=2)

Sep 10 20:34:47 pt systemd[770]: ydotool.service: Scheduled restart job, restart counter is at 5.
Sep 10 20:34:47 pt systemd[770]: ydotool.service: Start request repeated too quickly.
Sep 10 20:34:47 pt systemd[770]: ydotool.service: Failed with result 'exit-code'.
Sep 10 20:34:47 pt systemd[770]: Failed to start Starts ydotoold service.

Auch ein direkter Start wird verweigert (keine Ahnung, was der bewirken sollte und ob das überhaupt ein sinnvolles Vorgehen ist):

ydotoold
You're advised to run this program as root, or YMMV.
failed to open uinput device: Permission denied

Meinen User habe ich zur Gruppe input hinzugefügt. Warum? Keine Ahnung. Stand an verschiedenen Stellen, wurde aber nicht erläutert. Hat leider nicht weitergeholfen.

Ich finde keine verständliche Beschreibung des Gesamtsystems, nach der ich mir ein Vorgehen erschließen könnte. Nur immer wieder unvollständige Hinweise. Ich komme nicht weiter. Ein Start als sudo ist für mich nicht praktikabel, da das Ganze in einem User-Script laufen soll.

Kann mir hier jemand weiterhelfen?

Viele Grüße Peter

altesCoon

(Themenstarter)

Anmeldungsdatum:
7. November 2022

Beiträge: 45

rklm schrieb:

Du willst im Prinzip Tastatureingaben an den Prozess im Fenster schicken.

Exakt, danke für die Klarstellung.

Der Weg über die Zwischenablage ist eigentlich ziemlich uncool. Er scheint mir bisher leider der einzig gangbare Weg zu sein. Ich freue mich über Hinweise zu Alternativen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

altesCoon schrieb:

Ich finde keine verständliche Beschreibung des Gesamtsystems, nach der ich mir ein Vorgehen erschließen könnte. Nur immer wieder unvollständige Hinweise. Ich komme nicht weiter. Ein Start als sudo ist für mich nicht praktikabel, da das Ganze in einem User-Script laufen soll.

Wie schon weiter oben geschrieben: ytoold erzeugt mit Hilfe des Kernel-Moduls uinput ein virtuelles Eingabegerät und einen Socket, auf den Clients die gewünschten Tastendrücke schreiben dürfen.

Also muss der Kernel das Modul uinput geladen haben, damit ydotoold funktionieren kann - ist das bei deinem System der Fall (beim Ubuntu-Kernel ist das normalerweise als automatisch geladenes Modul einkompiliert, bei Arch Linux muss man es explizit laden)?

lsmod | grep uinput 

Händisch kannst du das so machen:

sudo modprobe uinput 

Damit es beim Start des Systems automatisch geladen wird, kannst du das Modul in eine Datei in /etc/modprobe.d/uinput.conf schreiben - vgl. Kernel_module

Wenn dein User bereits in der Gruppe input ist (und du dich seitdem du ihn in die Gruppe aufgenommen hast einmal ab- und wieder angemeldet oder das System neu gestartet hast), sollte sich die Systemd-Unit in der Session für ydotool starten lassen:

systemctl --user start ydotool 

Damit die Service Unit beim Start der Session immer automatisch gestartet wird, kannst du sie so aktivieren:

systemctl --user enable ydotool 

Ruth-Wies

Avatar von Ruth-Wies

Anmeldungsdatum:
12. April 2023

Beiträge: 450

altesCoon schrieb:

Bleibt ydotool.

Welche Version? Die angestaubte (v0.1.8 vom Okt. 2019) aus den offiziellen Paketquellen? Seit dem sind ja einige Commits ins Land gegangen – äh, in die aktuellere Version geflossen.

1.0.4 ist immerhin in debian testing angekommen. https://tracker.debian.org/pkg/ydotool – Spät, aber besser als gar nicht. – Hilft in Ubuntu nur nicht viel.

altesCoon

(Themenstarter)

Anmeldungsdatum:
7. November 2022

Beiträge: 45

Ruth-Wies schrieb:

Bleibt ydotool.

Welche Version? Die angestaubte (v0.1.8 vom Okt. 2019) aus den offiziellen Paketquellen?

Es ist die 1.0.4-2

altesCoon

(Themenstarter)

Anmeldungsdatum:
7. November 2022

Beiträge: 45

Danke, seahawk, für die ausführliche Zusammenfassung. Danach begreife ich tatsächlich einigermaßen, was abgeht und worauf es ankommt. Tatsächlich funktioniert ydotool jetzt mit Wayland, sowohl in Hyprland als auch in Plasma.

Allerdings: Ich habe nichts verändert, mich lediglich abgemeldet (um in Hyprland zu testen) und wieder angemeldet (zurück in Plasma). Und siehe da: Dein wichtigster Hinweis war wohl:

Wenn dein User bereits in der Gruppe input ist (und du dich seitdem du ihn in die Gruppe aufgenommen hast einmal ab- und wieder angemeldet oder das System neu gestartet hast) ...

Das versäumte Neuanmelden bei meinen Tests gestern hat mich daran gehindert, mein Ziel zu erreichen ☺

Also: In Hyprland und Plasma unter Wayland kann ich nun:

- Einen Text in die Zwischenablage kopieren:

1
wl-copy "$textvariable"

- mit ydotool den Text im aktiven Fenster mit STRG+v ausgeben:

1
ydotool key 29:1 47:1 47:0 29:0 # CRTL+V

Damit ist mein Problem gelöst.

Dieser Weg verwendet die Zwischenablage, womit ich leben kann. Unter Hyprland habe ich zusätzlich die Möglichkeit, die Zwischenablage links liegen zu lassen und mit wtype zu arbeiten:

1
wtype "$textvariable"

Das funktioniert unter Plasma leider nicht.

Was dagegen ebenfalls funktioniert, ist:

1
ydotool type "$textvariable"

Hierbei allerdings werden Umlaute ignoriert. Somit bleibt mir mit ydotool nur der Weg über die Zwischenablage.

Das Modul uinput war bei mir bereits geladen ohne mein Zutun, sowohl in Hyprland als auch in Plasma, beides unter dem aktuellen Arch.

Herzlichen Dank für die Hilfe!

Viele Grüße Peter

Antworten |