Tags: Artikel mit dem Tag «Desktopdev» durchstöbern
Servicemenüs für Dolphin (neu)
Wenn man häufig ein paar einfache Scripte über verschiedene Dateien laufen lassen will, kann man die ensprechenden Befehle mit Dolphin über ein frei einstellbares Servicemenü aufrufen. Man benötigt lediglich eine besonders formatierte .desktop-Datei und dann kann man das Skript in Zukunft über das Kontextmenü aufrufen.
Die Datei sieht z.B. so aus:
[Desktop Entry] Encoding=UTF-8 Type=Service ServiceTypes=KonqPopupMenu/Plugin,all/allfiles Actions=timeBu [Desktop Action timeBu] Name=Create backup Name[de]=Backup erstellen Icon=document-revert Exec=cp %U %U.`date +%%Y-%%m-%%d.%%H-%%M-%%S` && kdialog --title "Backup" --passivepopup "Backup of `basename %U` created. " 5
Unter ServiceTypes kann man die mine-typen angeben, bei denen das Script im Aktionen-Menü angezeigt werden soll, unter Name steht der Text, der dann angezeigt wird. Man kann Übersetzungen anbieten. Das Icon ist am besten eines der KDE-Icons. Nach Exec steht dann der Code, der ausgeführt werden soll. Mit %U lässt sich der Dateiname der ausgewählten Datei referenzieren, %% wird zu % umgewandelt. Diese Datei kommt dann in den Ordner:
~/.kde4/share/kde4/services/ServiceMenus
Neben dem Beispiel habe ich auch noch ein Menüeintrag erstellt, um optipng auszuführen:
auf ähnliche weise lassen sich auch andere praktische Sachen verwirklichen. Ich habe z.B. noch Servicemenüs für Konqueror erstellt, die sich mit einem Skript konvertieren lassen. Eine paar duzend Servicemenüs finden sich auch auf kde-apps.org.
Qt4 Designer und Ruby - erste Schritte
Vor Kurzem habe ich ein bisschen mit Ruby herumgespielt und festgestellt, dass es keine ordentliche und aktuelle Kurzeinführung gibt, wie man die Interfaces aus dem Qt4 Designer mit Ruby Programmen verbindet. Darum habe ich die ersten Schritte hier kurz zusammengefasst:
Als erstes installiert man die Qt4-Development-Tools und die Ruby-Qt-Komponenten mit dem Paketmanager.
Interface im Qt4 Designer erstellen
Dann kann man sich ans Buttons zusammenklicken machen. Das Beispielinterface sieht im Qt Designer so aus:
Ich habe zwei QPushButtons und ein QListWidget in Layouts gepackt. Was es an Widgets gibt und was diese können steht in der Qt4 Dokumentation. In der Ruby API heißen die Klassen stets Qt::Name stat QName. Beim Basteln wichtig ist, dass ObjectName irgendwie Sinn hat, weil damit die Widgets dann benutzt werden können.
Rubycode mit rbuic erstellen
Als nächstes muss man die vom Designer erzeugte XML-Datei mit der Endung .ui in Ruby-Code umwandeln. Dazu gitb es rbuic bzw. rbuic4:
rbuic4 Sample.ui -o Sample.ui.rb
Jetzt haben wir ein Rubyscript in dem das Interface erstellt wird.
Interface in Rubyscript einbinden
Jetzt ist es Zeit dem Interface etwas Leben einzuhauchen. Dazu verbindet man die Signale - wer Webinterfaces Programmiert kennt das als „Events“ - mit den Entsprechenden Slots, die so ähnlich wie callbacks funktionieren. Das geht recht fix mit QMetaObject::connectSlotsByName. Damit dies funktioniert müssen die Funktionen, die aufgerufen werden sollen das Namensmuster on_ObjectName_Signal einhalten, wobei der ObjectName vorher im Designer festgelegt wurde und das Signal heißt z.B. triggered.
Wie man die GUI-Komponente in der Anwendung benutzt, z.B. hier durch Subclassing, und anderes will ich direkt am Beispiel erklären:
#!/usr/bin/ruby
#Laden der Qt-Klasse:
require 'Qt'
#Manchmal auch:
#require 'Qt4'
#Laden des generierten Interfaces:
require 'Sample.ui.rb'
#Initialisieren der Anwendung
app = Qt::Application.new ARGV
#Eine Klasse, um das Verhalten des Interfaces festzulegen:
class AppCommunicate < Qt::MainWindow
#Die Liste der Slots
#Sie werden von setupUi automatisch verbunden
slots :on_actionQuit_triggered, :on_add_clicked, :on_rem_clicked
def initialize
puts "init"
@item_count=0
#Da wir vererben initialisieren wir so:
super
#Jetzt erstellen wir das Interface
@ui=Ui_MainWindow.new
#Und weisen es dem MainWindow zu
@ui.setupUi self
#Man könnte Slots auch manuell verbinden:
#connect a.actionQuit, SIGNAL('triggered()'), $qApp, SLOT('quit()')
end
#Ein Handler für das Beenden:
def on_actionQuit_triggered
puts "Shutting down."
#So wird die Anwendung gestoppt:
$qApp.quit
end
# "add" ist der name des Buttons, bei click wird dieses signal gesendet
def on_add_clicked
puts "Adding item"
#Es gibt attr_readers für alle Widgets
#So können wir ihre Methoden aufrufen
@ui.listWidget.addItem("Hallo Welt ##{@item_count} at #{Time.now.ctime}")
#Hier könnten z.B. Daten der Anwendung ausgegeben werden
#Zu demonstrationszwecken nummerieren wir die Einträge sichtbar
@item_count+=1
end
def on_rem_clicked
puts "Removing item"
#In cpp könten wir die items deleten
#Aber in ruby loopen wir über die markierten indizes
@ui.listWidget.selectedIndexes.each do |i|
#und nehmen sie aus der Liste
@ui.listWidget.takeItem i.row
#da wir keine Referenz speichern löscht sie der GC
end
end
end
#Wir erstellen eine Instanz unseres Verhaltens
wdg=AppCommunicate.new do |w|
#Wir müssen das Interface zeigen
#Wird auch alle child-widgets zeigen
w.show
end
#Hier wird die GUI-Schleife gestartet:
app.exec
#TADA!
Wer das ganze ausprobieren will, kann sich die Beispieldateien hier herunterladen:
Ich hoffe das war hilfreich, ich finde es doch hin und wieder ganz nett ein Interface zu haben, vor allem für Scripte, die länger laufen und interaktiv sein sollen.
KDE4 Twitter Benachrichtigungen
Da ich gerne das Webinterface von twitter benutze, aber auch gleich wissen will, ob jemand etwas neues getwittert hat, habe ich ein kleines Bash-Script geschrieben, welches eine Meldung aufploppen lässt, sollte jemand einen neuen tweet schreiben.
Es benutzt kdialog, die Meldungen integrieren sich also Problemlos in den KDE-Desktop. Es ist auch recht kurz und einfach.
Einfach herunterladen und in $PATH ablegen. Zum Starten genügt:
nohup twitterNotify.sh &
Da es nicht sonderlich viel Aufwand betreibt, um die XML-Antworten der Twitter-API zu parsen kann nicht zu viel Information übermittelt werden, außer woher die tweets kommen.
YaSvenT - eine PHP-GTK-Anwendung
Zugegeben - PHP ist nicht unbedingt die beste Programmiersprache wenn es um Desktop-Anwendungen geht. Doch um einen Einstieg in GUI-Programmierung zu finden, wollte ich erstmal mit einer mir gut bekannten Programmiersprache anfangen. Und mit den Objekten von PHP5 ist der Unterschied zu z.B. Java auch nicht mehr allzu groß, wenn auch deutlich spürbar. Also habe ich mich daran gemacht ein GUI-Basiertes Server-Kontrollzentrum zu basteln.
Einmal konfiguriert kann es Backups von MySQL-Datenbanken und den Dateien machen, das Error-Log anzeigen, das Access-Log in eine SQlite-Datenbank umwandeln und daraus einen HTML-Bericht erstellen, und Programme wie SSH-Konsole, Webbrowser, MySQL-Tunnel oder SFTP-Browser auf einen Klick vorkonfiguriert öffnen. Das ist recht praktisch, wenn man nicht den Ganzen Tag URLs und Befehlsfolgen tippen will. Da ich für das Meist sowieso schon Shell-Skripte hatte, lag das Ziel hauptsächlich darin, ein nettes GUI zu basteln.
Mit PHP Desktop-Anwendungen zu basteln hat den Nachteil, dass unter gängigen Linux-Distributionen zwar alles funktionieren dürfte, allerdings unter Windows PHP und GTK benötigt wird. Außerdem ist die Dokumentation von PHP-GTK noch nicht auf der vom übrigen PHP gewohnten Qualität. Einige Widgets sind nicht oder unvollständig gelistet, Beispiele sind teilweise rar und Englisch-Kenntnisse wären ratsam. Ich denke die nächste GUI-Anwendung werde ich in Java versuchen und dann vergleichen, aber mir kam es nicht so vor, als würde ich in einer Perl-Skriptesammlung für die Personal Homepage coden, und ich denke PHP ist langsam erwachsen.
Servicemenüs für Konqueror und Dolphin
Tipp: Lesen Sie einen neuen Artikel zum Thema: Servicemenüs für Dolphin (neu).
Einer der Hauptvorteile von Linux für mich ist, dass es von Programmieren für Programmieren gemacht ist. Das hat den Nebeneffekt, das man sich teilweise auskennen muss, aber den immensen Vorteil, dass, kennt man sich ein bisschen aus, man schon recht nette Dinge anstellen kann. Zum Beispiel kann man Scripts via Mausklick mit Dateien füttern, indem man die Servicemenüs von Konqueror bzw. Dolphin benutzt. Wie das geht hier.
Zuerst einmal brauchen wir ein Programm, dass Dateien will. Als Beispiel md5sum. Mich hat es immer genervt, nur um mal eben eine Datei zu prüfen in der Konsole zumzufummeln. Deshalb erstellen wir ein Servicemenü:
[Desktop Entry] ServiceTypes=all/allfiles X-KDE-Submenu=Check... Actions=md5sum;sha1sum;sha512sum [Desktop Action md5sum] Name=md5-Checksumme berechnen Icon=kugardata Exec=kdialog --msgbox"`md5sum %U`" [Desktop Action sha1sum] Name=sha1-Checksumme berechnen Icon=kugardata Exec=kdialog --msgbox "`sha1sum %U`" [Desktop Action sha512sum] Name=sha512-Checksumme berechnen Icon=kugardata Exec=kdialog --msgbox "`sha512sum %U`"
Zuerst ein Desktop Entry, der den Ordner für die Prüfsummen-Aktionen einstellt. Wir wollen alle Dateien prüfen, deshalb ServiceTypes=all/allfiles, hier könnten wir auch andere Bezeichener einsetzten, nämlich die, die im KDE-Kontrollzentrum unter KDE-Komponenten bei Dateizuordnungen zu finden sind. Es wäre also auch etwas wie image/jpg denkbar.
Dann folgen die Aktionen. Die Namen von den Aktionen werden auch unter Actions eingetragen. Sie bestehen aus einem Icon, der über den Namen des Icons im Aktuellen Iconset definiert wird, einem Anzeigenamen und dem Auszuführenden Programm. Hier wird es wieder etwas interessanter:
Anstatt einfach nur md5sum einzugeben öffnen wir einen kdialog und übergeben ihm die Ausgebe von md5sum. Das geschieht mit den seltsamen Anführungszeichen die man meist irgendwo auf der Taste neben Back Space findet. Da wo %U steht kommt dann der Dateiname hin.
Das ganze kommt dann in eine iwas.desktop Datei und in einen Servicemenü Ordner. Der findet sich normalerweise an einer dieser Positionen:
~/.kde4/share/apps/dolphin/servicemenus ~/.kde/share/apps/konqueror/servicemenus ~/.kde/share/apps/dolphin/servicemenus
Edit: Auf neueren KDE4 Versionen muss man noch dieses Skript nach dem Verschieben in den konqueror-Ordner laufen lassen:
http://www.kde-apps.org/content/show.php/KDE4-servicemenus?content=80131
Wenn alles glatt läuft kann man sie sofort verwenden.
Ein Servicemenü wollte ich noch veröffentlichen. Um Dateien über Instant Messenger und IRC oder große Dateien per Mail bedient man sich gerne einer Dateiupload-Seite, wie z.B. senduit. Diese kann man natürlich in ein Servicemenü integrieren. Das folgende Python-Script im ~/bin-Ordner als ausführbar markieren und das Servicemenü installieren und schon kann es los gehen.
Ein wirkliches muss ist das KDE Image Menu, kurz KIM, mit dem sich Bilder umwandlen, komprimieren, drehen, spiegel und verkleinern lassen. Es ist verfügbar auf kde-apps.org und erspart sehr viel GIMP-Öffnen.





