Howto/Yakuake Steuerung über DBUS

Achtung!

Die Verwendung dieses Howto geschieht auf eigene Gefahr. Bei Problemen mit der Anleitung melde dies bitte in der dazugehörigen Diskussion und wende dich zusätzlich an den Verfasser des Howtos.

Hinweis:

Diese Howto-Anleitung wurde zuletzt von ChickenLipsRfun2eat am 31.03.2020 unter Kubuntu 20.04 (dailybuild, beta) erfolgreich getestet.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Hauptartikel zu Yakuake

  2. qdbus verwenden

  3. Grundlagen in bash-Scripting

Inhaltsverzeichnis
  1. Aufbau
    1. Einschränkungen
      1. Weitere Session
    2. Windows, Tabs und Sessions
  2. Fenster manipulieren
  3. Tabs manipulieren
    1. Titel ändern
    2. Titel ermitteln
    3. SessionID ermitteln
  4. Sessions manipulieren
    1. Sessions: Informationen
    2. Sessions: hinzufügen, entfernen, wechsel...
    3. Sessions: Befehle ausführen
    4. Sessions: aufteilen (split)
    5. Sessions: Tastatureingaben blockieren
    6. Sessions: Aktivität überwachen
  5. Beispiele
    1. Status des Sessionschutzes ermitteln
    2. Tab mit ssh-Verbindung öffnen
    3. Profilwechsel
  6. Links
    1. intern
    2. extern

Yakuake bietet sehr viele Möglichkeiten zur Automatisierung und Manipulation durch D-BUS-Methoden. Im folgenden werden einzelne Möglichkeiten beschrieben und am Ende einige Beispiele gegeben. Die D-BUS-Methoden lassen sich seit Version 3.0.5 auch aufrufen, bevor Yakuake selbst gestartet wurde.

Aufbau

Einschränkungen

qdbus org.kde.yakuake gibt eine Übersicht der Möglichkeiten:

...
/Sessions
/Sessions/1...n
/Windows
/Windows/1..n
...
/yakuake
/yakuake/sessions
/yakuake/tabs
/yakuake/window

Die Sessions- und Windows-Pfade beziehen sich direkt auf die verwendeten KParts 🇬🇧, hier - dem verwendbaren Teil von Konsole. Ein weiteres Beispiel für die Verwendung ist im Dateimanager Dolphin beim Druck auf F4. Die Konsole-KParts erlauben bspw. den Profilwechsel oder auch eine zweite Session innerhalb einer Yakuake-Instanz. Da dies schnell verwirrend werden kann, wird hier nur die Funktionsweise angedeutet, hat aber im weiteren Artikel keine Relevanz. Es wird lediglich auf Konsole verwiesen.

Weitere Session

Wir öffnen Yakuake mit mehreren Tabs ( + Strg + T ).

In einem Tab führen wir aus:

qdbus org.kde.yakuake /Windows/1 org.kde.konsole.Window.newSession 

Nun kann innerhalb dieses Tabs das Fenster mit

qdbus org.kde.yakuake /Windows/1 org.kde.konsole.Window.nextSession 

gewechselt werden.

Falls man das nutzen möchte bietet sich das umbelegen der Tasten an. Bspw. + für den Wechsel der Sitzung, und + für den Wechsel der Tabs.

Windows, Tabs und Sessions

Zum besseren Verständnis:

Fenster manipulieren

Hier bietet Yakuake lediglich den Wechsel zwischen Anzeigen und Verstecken an, was die selbe Funktion darstellt, die auch von der eingestellten Taste (Standard:F12) ausgelöst wird.

qdbus org.kde.yakuake /yakuake/window org.kde.yakuake.toggleWindowState  

Tabs manipulieren

Titel ändern

Mit

qdbus org.kde.yakuake /yakuake/tabs org.kde.yakuake.setTabTitle SESSION_ID TITEL 

lässt sich der Titel eines Tabs ändern.

Titel ermitteln

Den aktuell verwendeten Titel bekommt man mit

qdbus org.kde.yakuake /yakuake/tabs org.kde.yakuake.tabTitle SESSION_ID 

Hinweis: Yakuake beginnt beim zählen mit 0. Tab 1 ist also das zweite Register von links.

SessionID ermitteln

Die SessionID kann man über

qdbus org.kde.yakuake /yakuake/tabs org.kde.yakuake.sessionAtTab TAB_NUMMER 

ermitteln.

Sessions manipulieren

Sessions: Informationen

Die Tabelle bietet eine Übersicht der möglichen Befehle und Abfragen. Aus Gründen der Übersichtlichkeit wurde der Pfad org.kde.yakuake. entfernt. Die Befehle können wie folgt ausgeführt werden:

qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.BEFEHL PARAMETER 

Lese-Befehl(e) Rückgabe-Typ Parameter Beschreibung
activeSessionId
activeTerminalId
int - Gibt die Session- oder Terminal-ID des Tabs an, die sich im Vordergrund befindet. Dies gilt auch, wenn sich Yakuake selbst im Hintergrund befindet.
hasUnclosableSessions bool - Ermittelt, ob in einer der Sessions noch ein Prozess läuft.
isSessionClosable bool int sessionID Ermittelt, ob eine bestimmte Session einen laufenden Prozess enthält, oder beendet werden kann.
terminalIdList QString - Gibt eine Zahlenfolge der verfügbaren Terminal-IDs aus.
terminalIdsForSessionId QString int sessionID Gibt die Terminal-IDs für eine bestimmte SessionID aus.

Sessions: hinzufügen, entfernen, wechseln

Yakuake bietet mehrere Möglichkeiten eine neue Session zu öffnen. Der Rückgabewert ist ein Integer (Ganzzahl), die die hochgezählte Session-Nummer enthält. Diese kann zur weiteren Manipulation verwendet werden. Die Tabelle bietet eine Übersicht der möglichen Befehle und Abfragen. Aus Gründen der Übersichtlichkeit wurde der Pfad org.kde.yakuake. entfernt. Die Befehle können wie folgt ausgeführt werden:

qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.BEFEHL PARAMETER 

Methode Beschreibung Screenshot
hinzufügen
addSession Öffnet eine einfache Session
addSessionQuad Öffnet eine Session mit vier Konsolenfenstern BILD
addSessionTwoHorizontal Session mit zwei Konsolenfenstern nebeneinander BILD
addSessionTwoVertical Session mit zwei Konsolenfenstern untereinander BILD
entfernen
removeSession SESSION_ID Session mit Hilfe der SessionID entfernen.
removeTerminal TERMINAL_ID Ein Terminal innerhalb einer Session entfernen.
aktivieren
raiseSession SESSION_ID Session anhand ihrer ID in den Vordergrund holen.
Sperren
setSessionClosable SESSION_ID BOOL Eine Session kann vor versehentlichem Schließen geschützt, oder dieser Schutz wieder aufgehoben werden.

Sessions: Befehle ausführen

Unabhängig vom derzeit aktivierten Yakuake und der aktivierten Session lassen sich Befehle in den vorhandenen Terminals ausführen.

qdbus org.kde.yakuake /yakuake/sessions  org.kde.yakuake.runCommandInTerminal TERMINAL_ID "BEFEHL" 

Um Befehle im derzeit aktiven Terminal auszuführen kann

qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.runCommand "BEFEHL" 

verwendet werden.

Sessions: aufteilen (split)

Bestehende Terminals, so wie Sessions können in mehrere Terminals aufgeteilt werden.

#Vertikale Aufteilung
qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.splitSessionLeftRight SESSION_ID
qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.splitTerminalLeftRight TERMINAL_ID

#horizontale Aufteilung
qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.splitSessionTopBottom SESSION_ID
qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.splitTerminalTopBottom TERMINAL_ID 

Sessions: Tastatureingaben blockieren

Mit Hilfe dieser Methoden kann man "nur lesen"-Terminals oder Sessions erstellen in denen Tastatureingaben gesperrt sind. Man kann dort aber Befehle mittels runCommand absetzen.

Die Tabelle bietet eine Übersicht der möglichen Befehle und Abfragen. Aus Gründen der Übersichtlichkeit wurde der Pfad org.kde.yakuake. entfernt. Die Befehle können wie folgt ausgeführt werden:

qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.BEFEHL PARAMETER 

Befehl(e) Rückgabe-Typ Parameter
hasTerminalsWithKeyboardInputDisabled bool int sessionID
hasTerminalsWithKeyboardInputEnabled bool int sessionID
setSessionKeyboardInputEnabled void int sessionID, bool enabled
setTerminalKeyboardInputEnabled void int sessionID, bool enabled

Sessions: Aktivität überwachen

Yakuake bietet eine Möglichkeit Terminalprozesse zu überwachen. Dabei ist es möglich, sowohl die Aktivität, als auch die Inaktivität als Auslöser zu definieren. Der Auslöser sendet eine Benachrichtigung über das KDE-Benachrichtigungssystem. Über den DBUS lässt sich dieses Signal abfangen und weiterverarbeiten.

Die Tabelle bietet eine Übersicht der möglichen Befehle und Abfragen. Aus Gründen der Übersichtlichkeit wurde der Pfad org.kde.yakuake. entfernt. Die Befehle können wie folgt ausgeführt werden:

qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.BEFEHL PARAMETER 

Lese-Befehl(e) Rückgabe-Typ Parameter Änderungsbefehl Parameter
hasTerminalsWithMonitorActivityEnabled
hasTerminalsWithMonitorActivityDisabled
bool - setSessionMonitorActivityEnabled int terminalId, bool enabled
hasTerminalsWithMonitorSilenceEnabled
hasTerminalsWithMonitorSilenceDisabled
bool int sessionID setSessionMonitorSilenceEnabled int terminalId, bool enabled

Beispiele

Status des Sessionschutzes ermitteln

1
2
3
4
5
#!/bin/bash
IFS=',' #Feldtrenner auf Komma setzen
for i in $(qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.sessionIdList); do
    echo "Session:$i is closable: $(qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.isSessionClosable $i)"
done

Tab mit ssh-Verbindung öffnen

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

#neue Session hinzufügen und ID in $newSession speichern
newSession=$(qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.addSession)

#Session schützen
qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.setSessionClosable $newSession FALSE

#Titel des Tabs der Session ändern
qdbus org.kde.yakuake /yakuake/tabs org.kde.yakuake.setTabTitle $newSession "SSH-Session"

#terminalID herausfinden: (ACHTUNG: Erstellt man mit split weitere Terminals, so enthält die terminalID eine Liste!
terminalID=$(qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.terminalIdsForSessionId $newSession)

#Befehl zur Verbindung ins Terminal absetzen
qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.runCommandInTerminal $terminalID "ssh user@server -p22 -i /Pfad/zum/PublicKey"

Hinweis: Verwendet man keinen PublicKey, so muss selbstverständlich das Passwort eingegeben werden, bevor die Verbindung hergestellt werden kann.

Profilwechsel

Voraussetzung: Es müssen in Konsole eingerichtete Profile vorhanden sein.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# Kein Profilname übergeben?
if [ "$#" -lt 1 ]; then printf "Bitte einen Profilnamen angeben.\n"; exit 1; fi

# Prüfen, ob das erste Argument als Konsole-Profil existiert
found=0;
for i in $(konsole --list-profiles); do
  if [ "$1" == "$i" ]; then found=1; fi
done

if [ $found -eq 0 ]; then echo "$1 ist ein unbekannter Profilname. Möglich sind:$(konsole --list-profiles)"; exit 1; fi

# iteriere über die bestehenden sessions und ändere das aktuelle Profil.
IFS=,
lst=$(qdbus org.kde.yakuake /yakuake/sessions org.kde.yakuake.terminalIdList)
for i in $lst; do 
  ((i++))
  qdbus org.kde.yakuake /Sessions/$i org.kde.konsole.Session.setProfile "$1"
done

Alternativ steht der Befehl konsoleprofile zur Verfügung.

Hinweis:

Das Standardprofil von Yakuake entspricht NICHT dem Standardprofil von Konsole. Der Wert muss also separat gesetzt werden, entweder über das Menü oder in den jeweiligen rc-Dateien.

intern

extern