Aufgabenautomatisierung in KDE mit DCOP

Aus LinuxUser 02/2005

Aufgabenautomatisierung in KDE mit DCOP

Sprich mit mir

Intensivnutzern von KDE reichen die Funktionen, die sie per Maus erreichen, oft nicht aus. Mit dem DCOP-Protokoll lassen sich viele Applikationen per Skript steuern. Anwender automatisieren so ihre Aufgaben und erstellen Serienbriefe und Rechnungen mit einem Tastendruck.

In der Desktop-Umgebung KDE konfigurieren Anwender fast alle der unzähligen Features mit der Maus – entweder im Kontrollzentrum oder in der jeweiligen Anwendung selbst. Doch wenn es um die Automatisierung von Aufgaben geht, müssen Skripte ran. Damit sie Zugriff auf den KDE-Desktop haben, gibt es das Desktop Communication Protocol, kurz DCOP.

Über dieses Protokoll ist es möglich, eine Applikation komplett ohne Maus fernzusteuern. Jede Anwendung bietet DCOP-Schnittstellen (Interfaces) an, die andere Programme nutzen können. So ist es mit einigen Funktionsaufrufen möglich, das Mail-Programm KMail zu starten und eine E-Mail zu versenden, ohne dass der Benutzer vor seinem Rechner sitzt.

Beim Start von KDE fährt automatisch der dcopserver genannte Prozess hoch, über den die komplette Kommunikation der Programme abläuft. Jedes Programm, das DCOP-Interfaces zur Verfügung stellt, registriert sich beim DCOP-Server und bekommt einen Namen zugewiesen. Programme, von denen immer nur eine Instanz läuft, erhalten als DCOP-Namen einfach ihren Programmnamen; andere bekommen zusätzlich ihre Prozess-ID (PID) angehängt. Startet etwa der Konqueror mit der PID 3657, lautet der zugehörige DCOP-Name konqueror-3657. Andere Applikationen greifen über diese Bezeichnung auf die Komponenten von Konqueror zu.

Abbildung 1: Kdcop zeigt alle beim DCOP-Server registrierten Schnittstellen an. Hier etwa die des Konqueror, der mit der Prozess-ID 3190 läuft.

Abbildung 1: Kdcop zeigt alle beim DCOP-Server registrierten Schnittstellen an. Hier etwa die des Konqueror, der mit der Prozess-ID 3190 läuft.

Unverbindlich angefragt

Für einen ersten Blick hinter die Kulissen empfiehlt sich das Programm kdcop (siehe Abbildung 1). Dieses nicht über das K-Menü erreichbare Systemwerkzeug gibt eine Übersicht über alle zur Zeit aktiven DCOP-fähigen Applikationen. In neueren KDE-Versionen sind sogar die Symbole des zugehörigen Programmes zu sehen, was die Zuordnung erheblich erleichtert.

Klappt der Benutzer einen Eintrag auf, sieht er alle verfügbaren Schnittstellen. Jede von ihnen ist für einen Teil des jeweiligen Programmes verantwortlich und enthält Funktionen, die sich direkt per Doppelklick oder über ein C++-Programm aufrufen lassen. Wie bei Funktionen eines Programmes nehmen auch DCOP-Funktionen Werte an und geben Werte zurück. Ausgaben erfolgen im unteren Teil von Kdcop.

Wer beispielsweise den aktuellen virtuellen Desktop ansehen oder ändern will, findet unter KWinInterface der Applikation KWin die passenden Funktionen currentDesktop() und setCurrentDesktop().

Neben Kdcop gibt es noch das Kommandozeilentool dcop. Ohne Parameter zeigt es alle aktiven DCOP-fähigen Programme an. Mit dem Namen einer Applikation aufgerufen, zeigt dcop die Schnittstellen. Setzt der Benutzer dann noch eine Schnittstelle als zweiten Parameter hinter den dcop-Aufruf, sieht er alle Funktionen (siehe Abbildung 2).

Abbildung 2: Das Kommandozeilenprogramm <code srcset=

dcop zeigt alle Programme, ihre Schnittstellen und deren Funktionen in einem Terminal an. Es lässt sich für kurze Shell-Skripte wunderbar verwenden.” width=”300″ height=”185″ /> Abbildung 2: Das Kommandozeilenprogramm dcop zeigt alle Programme, ihre Schnittstellen und deren Funktionen in einem Terminal an. Es lässt sich für kurze Shell-Skripte wunderbar verwenden.

Ein simples Beispiel verdeutlicht die Syntax von dcop: Der Aufruf dcop kwin KWinInterface setCurrentDesktop 2 befördert den Benutzer direkt auf den zweiten virtuellen Desktop.

dcop lässt sich ideal mit Programmen wie dem Wecker KAlarm verknüpfen. Um den Rechner zu einer festen Uhrzeit herunterzufahren, genügen folgende Schritte: In KAlarm eine neue Erinnerung erstellen und dann als Aktion Befehl auswählen. Dort trägt der Benutzer dann dcop ksmserver ksmserver logout 0 2 2 ein.

Die letzten drei Zahlen sind nicht willkürlich, sondern stehen für die Enumeratoren ShutdownConfirm, ShutdownType und ShutdownMode. Tabelle 1 erklärt die verschiedenen Optionen.

Tabelle 1: Die Parameter der Logout-Funktion

ShutdownConfirm
-1 Einstellungen aus dem Kontrollzentrum beachten
0 Ohne Bestätigung herunterfahren
1 Mit Bestätigung herunterfahren
ShutdownType
-1 Letzte Einstellung verwenden
0 Nur Abmelden
1 Abmelden und neustarten
2 Abmelden und herunterfahren
ShutdownMode
-1 Einstellungen aus dem Kontrollzentrum beachten
0 Neustarten, sobald alle aktiven KDE Sitzungen beendet sind
1 Nur herunterfahren, wenn keine Sitzungen aktiv sind, sonst nichts tun
2 Herunterfahren erzwingen
3 Benutzer per Dialogbox fragen, wie mit offenen Sitzungen verfahren werden soll

Office Scripting mit Python

Auch die Programme des KDE Office-Paketes KOffice lassen sich mit DCOP steuern. Dabei ist der Programmierer nicht auf C++ oder das Hilfsprogramm dcop festgelegt. Es gibt native Bindings für C, Perl, Python und sogar Ruby. Die nachfolgenden Beispiele verwenden die Bindungen für Python. Einer Einführung in diese Sprache widmet sich ein eigener Artikel ab Seite 30 in diesem Heft.

Um die Beispiele nachzuvollziehen, müssen die DCOP-Bindings installiert sein. Unter Debian heißt das Paket python-dcop, unter Suse kdebindings3-python.

Nach dem Start der Tabellenkalkulation KSpread zeigt der KDCOP-Browser eine verwirrende Vielfalt von Schnittstellen an. Am interesantesten für das Scripting ist die Default-Schnittstelle KoApplicationIface, die für alle KOffice-Programme identisch arbeitet.

Sie bietet Zugriff auf Dokumente, Ansichten und Fenster und verfügt mit dem createDocument-Aufruf zusätzlich noch über die Möglichkeit, neue Dokumente zu erstellen. Als Argument erwartet diese Funktion einen gültigen MIME-Type, zum Beispiel application/x-kspread für ein Tabellendokument. Dieser Aufruf ist bisweilen mit Vorsicht zu genießen: Ein ungültiger Parameter beendet die Applikation, ohne vorher Änderungen zu speichern. Dieses Fehlverhalten ist in der Entwicklerversion von KOffice aber bereits behoben.

Der gesamte Aufruf mit dem dcop-Kommandozeilentool lautet für KSpread:

dcop kspread-12422 KoApplicationIface createDocument application/x-kspread

Dabei steht 12422 für die Prozess-ID, unter die angesprochene Instanz von KSpread läuft. Die folgenden Zeilen machen erledigen das gleiche in Python:

import pcop
import pydcop
app = pydcop.anyAppCalled("kspread")
if app:
  app.default.createDocument("application/x-kspread")
else:
  print "KSpread läuft nicht!"

Die beiden Import-Anweisungen bringen Python die DCOP-Funktionen bei. Danach sucht der anyAppCalled-Befehl nach der ersten auffindbaren KSpread-Instanz und verwendet die Standard-Schnittstelle.

Falls das Skript kein laufendes KSpread findet, bleibt app leer, was zu einer entsprechenden Fehlermeldung führt. Anderenfalls ruft es das Interface und darin die DCOP-Funktion mit entsprechenden Parametern auf. Das funktioniert, weil Python wie die meisten anderen Skriptsprachen zur Laufzeit DCOP-Module und -Methoden in ihre Python-Äquivalente umwandelt.

Leider hapert es mit der Dokumentation der DCOP-Schnittstellen. Daher hat der Autor dieses Artikels unter [2] eine Auflistung der wichtigesten Schnittstellen erstellt.

Fütterungszeit

Applikationen per Skript zu bedienen, erweist sich vor allem beim Import von Daten nützlich. Im Beispiel aus Listing 1 erstellt ein Skript aus Daten eine Rechnung in KSpread. Der Einfachheit halber kommen die Daten hier aus einem Array. In der Praxis dienen eher Datenbanken, Text-Dateien oder sogar Geräte-Dateien als Quellen.

Listing 1

Rechnung mit KSpread und Python

#!/usr/bin/python
import pcop
import pydcop
import sys
products= [
("Server", 3000, 1 ),
("Workstation", 2000, 3 ),
("Flachbildschirme", 240, 4 )
]
app = pydcop.anyAppCalled("kspread")
if not app:
  print "KSpread läuft nicht!"
  sys.exit(-1)
table = app.default.getViews()[0].table()
curRow = 1;
table.cell(1, curRow).setText("Bezeichnung")
table.cell(2, curRow).setText("Preis")
table.cell(3, curRow).setText("Anzahl")
table.cell(4, curRow).setText("Ges. Preis")
for i in range(5):
  table.cell(i, curRow).setTextFontBold(True)
for product in products:
  curRow = curRow+1
  table.cell(1, curRow).setText(product[0])
  table.cell(2, curRow).setValue(product[1])
  table.cell(3, curRow).setValue(product[2])
  totalCell = table.cell(4, curRow)
  totalCell.setText("=C%i*B%i"%(curRow,curRow))
curRow = curRow+1
table.cell(1, curRow).setText("Gesamt")
table.cell(4, curRow).setText("=SUM(D2:D%s)"%(curRow-1))
for i in range(5):
  table.cell(i, curRow).setTextFontBold(True)

Das Skript definiert zunächst den Array products. Er enthält die Artikel sowie deren Preis und die Stückzahlen. Dann beginnt die Suche nach einer aktiven KSpread-Instanz. Zeile 19 holt sich im Erfolgsfall die Tabelle der ersten Ansicht.

Die Zeilen 23 bis 26 füllen die erste Zeile mit Spaltenüberschriften, Zeile 29 formatiert den Text fett. Damit KSpread die übergebenen Werte als Zahlen akzeptiert, müssen sie per setValue() gesetzt sein. Formeln, wie die zum Berechnen der Gesamtpreise, werden jedoch per setText() übergeben.

Über die View-Schnittstelle von KSpread wählt der Programmierer bestimmte Bereiche eines Tabellendokuments aus. Listing 2 zeigt ein Beispiel, in dem mehrere Zellen ausgewählt werden und per setSelectionBgColor einen blauen Hintergrund erhalten.

Listing 2

Formatierungen in KSpread

#!/usr/bin/python
import pcop
import pydcop
app = pydcop.anyAppCalled("kspread")
view = app.default.getViews()[0]
view.setSelection(( 2, 2, 4, 6 ))
view.setSelectionBgColor((100, 100, 240))

KWord

In der Textverarbeitung KWord lassen sich Dokumente per Skript komplett formatieren. KWord arbeitet grundsätzlich mit Rahmen und ähnelt somit eher einem Layout-Programm. Daraus folgt auch, dass es nicht direkt möglich ist, in ein Dokument zu schreiben. Vielmehr muss der Programmierer einen Rahmen angeben, in den er sein Skript hineinschreiben lässt.

Listing 3 zeigt, wie dabei vorzugehen ist. Zunächst holt das Programm ein gültiges Dokument von der ersten gefundenen KWord-Instanz (Zeile 6). Das Skript geht davon aus, dass es in der ausgewählten Vorlage mindestens einen Rahmen gibt. Diesen wäht es aus allen vorhandenen Rahmen aus (Zeile 8).

Listing 3

KWord-Dokumente formatieren

#!/usr/bin/python
import pcop
import pydcop
res = pydcop.anyAppCalled("kword").default.getDocuments()
document = res[0]
document.textFrameSet(0).startEditing()
edit.insertText("Linux")
edit.setBold(True)
edit.insertText("User")
edit.setBold(False)
edit.newParagraph()
edit.insertText("Hallo Welt!");
edit.moveCursorUp(False);
document.saveAs("/home/danimo/documents/mydocument.kwd")

Die Funktion startEditing() erlaubt den Zugriff auf die eigentliche Textschnittstelle. Textformatierungen lassen sich beliebig ein- und ausschalten, neue Absätze hinzufügen (Zeile 15) und vieles mehr. Mit den Cursormethoden bewegt sich der Programmierer im Text hin und her. Diese Methoden erwarten einen Wahrheitswert als Argument. Ist er True, wählt KWord bei der Bewegung den Bereich aus, äquivalent zum Drücken der Shift-Taste bei der Navigation mit der Tastatur. Der Aufruf document.saveAs() in Zeile 18 speichert die Datei am gewünschten Ort ab.

Auf diese Weise lassen sich Serienbriefe aus allen möglichen Datenqellen erstellen. Der Programmierer ist dann nicht mehr auf die von KWord zur Verfügung gestellten Quellen beschränkt.

Alle KOffice-Programme speichern die Daten des Dokumentenerstellers als Meta-Informationen im Dokument mit ab. Um diese Meta-Informationen zu ändern, gibt es mehrere DCOP-Methoden innerhalb der Dokumentenschnittstelle. Mit ihnen lässt sich ganz einfach etwa ein Anonymisierskript schreiben:

import pcop
import pydcop
document = pydcop.anyAppCalled("kword").default.getDocuments()[0]
document.setDocumentInfoAuthorName("")
document.setDocumentInfoEmail("")
document.setDocumentInfoCompanyName("")

Mächtig mächtig

Außer den KOffice-Applikationen besitzen viele andere KDE-Programme nützliche DCOP-Schnittstellen. Leider sind die meisten davon undokumentiert, weshalb hier oft probieren angesagt ist. Erfahrene Programmierer schauen sich im Quellcode der betreffenden Applikation nach den nötigen Schnittstellen um.

Wer sich eingehender mit Office-Scripting befassen will, dem sei das KOffice-Python-Modul [2] empfohlen, das die Arbeit mit KOffice über DCOP zusätzlich erleichtert.

Glossar

MIME-Type

Die Multipurpose Internet Mail Extension diente ursprünglich zum Auszeichnen von E-Mail-Anhängen, wurde danach aber auch etwa bei Web Servern eingesetzt, die den Client bereits vor der Datenübermittlung über den zu erwartenden Datentyp informieren. Auch auf dem Desktop finden MIME-Typen zur Identifizierung und Kategorisierung von Dateien immer mehr Verbreitung. KDE erlaubt das verknüpfen eines MIME-Typs mit entsprechenden Dateiendungen sowie Programmen, die mit ihnen umgehen.

Infos

[1] Scott Wheeler, DCOP-Scripting: Linux-Magazin 01/2004, S. xXx

[2] KOffice-Python-Modul: http://www.kde-apps.org/content/show.php?content=18638

[3] Übersicht der KOffice DCOP Interfaces: http://developer.kde.org/~danimo/doc/dcop/koffice/

LinuxUser 02/2005 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben