[[Vorlage(archiviert, )]] [[Vorlage(Fortgeschritten)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] [:Autostart: Automatischer Start von Programmen] }}} [[Inhaltsverzeichnis(2)]] Den Tasten auf der Fernbedienung müssen die gewünschten Funktionen zugeordnet werden. Der [:Lirc:LIRC]-Daemon (lircd) dekodiert zwar die gesendeten Signale, ist aber selbst nicht in der Lage, Befehle auszuführen. Dafür bringt das '''lirc'''-Paket ein eigenes Programm mit - [#irexec irexec]. Andere nützliche [http://www.lirc.org/html/programs.html Programme] {en} sind u.a. [#irxevent irxevent] und [#xte xte], die im Folgenden vorgestellt werden. Gemeinsam haben diese Programme, dass sie eine '''.lircrc'''-Datei benötigen. Empfehlenswert ist es, die letztlich genutzten Programme im Autostart[4] einzutragen. Voraussetzung ist natürlich eine funktionsfähige LIRC-Installation; ggf. muss das Paket {{{#!vorlage Paketinstallation liblircclient0, universe }}} installiert sein [1], um bestimmte Programme mit LIRC-Support steuern zu können. = .lircrc = '''.lircrc''' ist die [:Lirc:LIRC]-Datei, in der die Anweisungen gespeichert werden, mit denen über die Tasten der Fernbedienung Programme gesteuert und Befehle ausgeführt werden. Prinzipiell sind alle Befehle, die auch in einem Terminal ausgeführt werden können, über LIRC und '''.lircrc''' "ferngesteuert" ausführbar. '''.lircrc''' ist standardmäßig als versteckte Datei im [:Homeverzeichnis:] des Benutzers abgelegt (dort wird bei Ausführung von LIRC zunächst danach gesucht); damit sie von allen Benutzern verwendete werden kann, muss sie mit Root-Rechten als '''/etc/lircrc''', ggf. auch als '''/etc/lirc/lircrc''', abgelegt werden. Zum Steuern der Programme lassen sich verschiedene Wege wählen, hauptsächlich diese: - [#irexec irexec] ist ein LIRC-Programm, das Befehle ausführen kann; - '''liblirc_client''' ist eine Bibliothek, auf die Programme mit "integrierter" LIRC-Unterstützung zurückgreifen; z.B. verwendet [:VLC:] diese Bibliothek; außerdem muss oft ein Plugin installiert/aktiviert oder der LIRC-Support in den Einstellungen der Programme ermöglicht werden. == Syntax == Die '''.lircrc'''-Datei ist eine Textdatei, die in jedem Texteditor[3] erstell- und bearbeitbar ist. Der LIRC-daemon lircd liest bei jeder Betätigung einer Taste die Datei von oben nach unten aus, alle "Treffer" werden der Reihe nach ausgeführt - das ist zum Verständnis einiger Funktionen (z.B. [#mode mode] oder [#flags flags]) wichtig. Die Anweisungen in der Datei sind in Blöcken zusammengefasst, die jeweils mit einem `begin` eingeleitet und mit `end` abgeschlossen werden müssen, ansonsten ist eine Ausführung nicht möglich: {{{#!code text begin prog = irexec button = OK config = echo "So funktioniert die .lircrc" end }}} Diese kurze '''.lircrc''' würde, bei entsprechender Belegung der Taste, `So funktioniert die .lircrc` im Terminal ausgeben; `irexec` zu Testzwecken dafür im Vordergrund, also ohne `-d` laufen lassen. Es lassen sich natürlich wesentlich komplexere Nutzungen realisieren. == Neustart == Veränderungen an der '''.lircrc''' werden erst nach einem Neustart des Lirc-Daemons wirksam, der erfolgt im Terminal mit dem Befehl {{{#!vorlage Befehl sudo systemctl restart lirc.service }}} Ansonsten wird zunächst mit den alten Einstellungen weitergearbeitet. ||<-2 tablestyle="width: 75%" rowclass="titel"> Bestandteile der .lircrc || || Zeile || Erklärung || || [#prog prog] || Das Programm, an das sich der Befehl richtet, z.B. `irexec`. || || [#remote remote] || Der Name, den die Fernbedienung in der '''lircd.conf''' bekommen hat. || || [#button button] || Der Name, den die Taste in der '''lircd.conf''' bekommen hat. || || [#repeat repeat] || Anweisung, wie mit wiederholten Impulsen umgegangen werden soll. || || [#delay delay] || Anweisung, nach wie vielen Impulsen ein Befehl umgesetzt werden soll. || || [#config config] || Der Befehl, den das Programm ausführen soll. || || [#mode mode] || Schaltet in einen Programm-Modus, es werden die Befehle für diesen Modus ausgeführt. || || [#flags flags] || Spezielle Anweisungen ausführen. || || [#include include] || Externe Dateien mit Anweisungen einbinden. || || [#lircrcd lircrcd] || Verschiedene Programm-Modi synchronisieren. || Kurz gesagt: Welches Programm (`prog`) soll was tun (`config, mode, flags`), wenn welche Taste der Fernbedienung (`remote, button`) wie lange (`repeat, delay`) betätigt wird. === prog === Hierüber wird das Programm angesteuert, das per Fernbedienung Anweisungen erhalten soll. Dabei ist [#irexec irexec] das LIRC-eigene Programm, über das sich alle Befehle, die auch in einem Terminal verwendet werden können, ausführen lassen. Außerdem lassen sich alle Programme mit eigener LIRC-Unterstützung angeben. Sonderfall sind etliche [:KDE:]-Programme, die über irexec und [:D-Bus:]-Befehle gesteuert werden (z.B. [:Kaffeine:], [:Amarok:]). === remote === Diese Angabe ist nur nötig, wenn mehrere Fernbedienungen verwendet werden sollen; der Standardwert ist der Platzhalter "'''*'''", der aber nicht explizit angegeben werden muss. Der Name der Fernbedienung findet sich im Normalfall in der verwendeten [:Lirc#lircd.conf-einrichten:lircd.conf]. Mehr zum Sonderfall mit mehreren Fernbedienungen auf [http://www.lirc.org/html/configure.html#multiple lirc.org] {en}. === button === Der Name der Taste, die verwendet werden soll. Dabei muss der Name so geschrieben werden, wie er in der '''lircd.conf'''-Datei verzeichnet ist, allerdings unterscheidet lircd nicht zwischen Groß- und Kleinschreibung. Im Zweifelsfall kann über das Programm [http://www.lirc.org/html/irw.html irw] {en} der jeweils verwendete Tastenname aufgerufen werden. Es lassen sich auch Tastensequenzen festlegen, in dem mehrere `button`-Zeilen hintereinander verwendet werden (sinnvoll, wenn z.B. ein versehentliches Ausführen eines potentiell "gefährlichen" Befehls - shutdown o.ä. - verhindert werden soll). Tastensequenzen verwenden so lange die zu Anfang genutzte Fernbedienung bis explizit eine andere angegeben wird; die `remote`-Anweisung muss daher immer vor den `button`-Anweisungen stehen. Tastensequenzen funktionieren ggf. auch dann, wenn den Tasten noch anderen Funktionen zugeordnet sind; es werden allerdings sofort auch diese Funktionen ausgeführt; die zweite/letzte Taste sollte dann aber auch (wenn nicht z.B. der Modus gewechselt wurde) zum Ausführen der "gesicherten" Anweisung führen. Eine [#quit `flags = quit`]-Anweisung zwischen zwei `button`-Zeilen bleibt dabei interessanterweise wirkungslos; nach dem letzten `button` gesetzt funktioniert sie aber normal. In Sequenzen kann auch die selbe Taste mehrfach verwendet werden. === repeat === Diese Anweisung legt fest, was bei anhaltendem Druck auf eine Taste geschieht. Der Standard-Wert (der auch ohne Angabe verwendet wird) ist `0`; er führt dazu, dass wiederholte Impulse ignoriert werden. Andere Werte (positve Ganzzahl `n`) führen dazu, dass die Anweisung in `config` jedes `n`-te Mal des Tastendruckes ausgeführt wird, __nicht__ aber wie oft; das ist abhängig von der Länge des Tastendrucks! Wenn eine Dauerfunktion (wie z.B. für die Lautstärkeregelung) gewünscht wird, kann mit einer `repeat`-Anweisung festgelegt werden, wie schnell die Änderung vonstatten gehen soll. Ein Dauerdruck erzeugt im Normalfall eine ständige Wiederholung des Impulses, diese wird dann jedes festgelegt Mal ausgeführt. Falls trotz einer solchen Angabe keine Wiederholung des Befehls ausgeführt wird, liegt eventuell ein [:Lirc#Doppeltes-Ausfuehren-von-Befehlen: Problem] in der Konfiguration der verwendeten '''lircd.conf''' und dem verwendeten `toggle_bit_mask` bzw. `pre_data`-Wert vor. === delay === Hier lässt sich, ebenfalls durch eine positive Ganzzahl `n`, festlegen, wie viele Impulse ignoriert werden, bis die in der `repeat`-Anweisung festgelegte Konfiguration ausgeführt wird. Standard ist ebenfalls `0`, damit ist diese Funktion zunächst ausgeschaltet. Sinnvoll ist die Verwendung z.B. dann, wenn bei schneller Wiederhol-Rate der Fernbedienung (der `gap`-Wert in der '''lircd.conf''' steht für die Zeitspanne zwischen den Impulsen in msec) mehrfaches Senden und Ausführen von Befehlen verhindert werden soll. Die Verwendung ohne einen `repeat`-Wert führt dazu, dass der Befehl erst verzögert, aber dann auch nur einmal, ausgeführt wird (`repeat = 0` und `delay = 0`-Angaben sind allerdings überflüssig, weil Standard...). === config === Hier steht der eigentliche Befehl, der von dem mit `prog` angesteuerten Programm ausgeführt werden soll. Es lassen sich (für irexec) in einer Zeile beliebig viele Befehle hintereinander aufreihen (getrennt durch die Zeichenfolge `&&`), die auf den einen Tastendruck hin ausgeführt werden sollen. Programme mit LIRC-Support lassen das allerdings nicht unbedingt zu (so z.B. [:VLC:]). Zwei (oder mehrere) hintereinander folgende `config`-Zeilen werden im Wechsel ausgeführt, sodass beim ersten Druck die erste, beim erneutem Druck dann die zweite `config`-Zeile (etc.) abgearbeitet wird; so lassen sich z.B. Play/Plause-Wechsel-Funktionen erstellen, falls sie in einem Programm nicht vorgesehen sind. irexec kann jeden Befehl ausführen, der auch im Terminal verwendbar ist; damit lassen sich alle Programme, Skripte, oder Befehle - auch mit ggf. gewünschten Parametern - starten; z.B. kann so einem Musik-Player gleich die abzuspielende Playlist mit auf den Weg gegeben werden. Um Zeichenfolgen zu übergeben, die nicht ohne weiteres darstellbar sind, lassen sich alle in [:Programmiersprache#C:C] üblichen "escape"-Sequenzen ( wie `\n` = line-feed, `\r` = [[Vorlage(Tasten, return)]], `\t` = [[Vorlage(Tasten, tab)]], `\e` = [[Vorlage(Tasten, escape)]], `\` = ASCII-Code in oktaler Darstellung, `\x` = ASCII-code in hexadezimaler Darstellung, `\\` = backslash) verwenden. Auch die [[Vorlage(Tasten, CTRL)]]-Taste lässt sich so darstellen : `\C` steht z.B. für [[Vorlage(Tasten, CTRL + C)]]. Welche Befehle für Programme mit LIRC-Support verwendet werden können, lässt sich meist in der Programmdokumentation in Erfahrung bringen oder wird in den FAQs der jeweiligen Web-Seite der Programme erklärt. Hilfreich kann auch eine Websuche nach dem gewünschten Programm und `lircrc` sein. Damit Programme mit integrierter LIRC-Unterstützung, die mit einem irexec-Befehl gestartet werden, die Verwendung der Fernbedienung für andere Anwendungen nicht blockieren, sollte ans Ende der programmaufrufenden `config`-Zeile ein `&`-Zeichen gestellt werden (z.B. `config = rhythmbox &`). Wenn es fehlt, werden die Befehle für weitere Anwendungen solange nicht ausgeführt, wie das aktuell gesteuerte Programm läuft; diese Anweisungen werden zunächst gespeichert und dann erst nach Abschluss des laufenden Programms ausgeführt - was zu unbeabsichtigten Folgen führen kann. Wer z.B. wiederholt die Taste zum Starten eines Programms gedrückt hatte, sieht sich später mit immer neuem Starten dieses Programms konfrontiert, so oft, wie die Taste zuvor - vermeintlich wirkungslos - gedrückt worden war... === mode === Hiermit lassen sich Befehle für ein Programm oder eine Funktion zusammenfassen. Ein "Modus" wird zunächst mit einer Taste gestartet (z.B. zusammen mit dem Startaufruf eines Programms; der Wechsel in den Modus erfolgt sofort); die Konfigurationsblöcke für diesen Modus werden mit `begin ` und `end ` eingeschlossen. Damit lassen sich die Steuerbefehle für verschiedene Programme trennen und die selben Tasten in verschiedenen Programmen für unterschiedliche Funktionen verwenden, ohne dass sie sich "ins Gehege kommen". Innerhalb eines `mode`-Blocks lassen sich keine weiteren `mode`-Blöcke verschachteln; diese müssen immer außerhalb definiert werden. Da LIRC die '''.lircrc''' grundsätzlich bei jedem Tastendruck von oben nach unten ausliest, kann es mit Modi u.U. zu ungewolltem Ausführen von Befehlen kommen. Die `mode`-Anweisungsblöcke werden __zusätzlich__ dann verwendet, wenn der entsprechende Modus gestartet wurde; allerdings schließt die Verwendung einer Taste in einem Modus __nicht__ aus, dass auch ein Befehl dieser Taste außerhalb eines Modus ausgeführt wird. Wer also z.B. die ''"OK"''-Taste mit einer Funktion (ohne Modus) belegt hat, und die ''"OK"''-Taste auch in einem Modus verwendet, wird feststellen, dass beide Funktionen ausgeführt werden, wenn die Taste innerhalb des Modus gedrückt wird. Die Reihenfolge ist dabei abhängig von der Position der Konfigurationsblöcke in der '''.lircrc'''. Abhilfe kann das [#flags quit-Flag] schaffen; außerdem sollte man ggf. die `mode`-Blöcke an den Anfang der '''.lircrc''' stellen, __vor__ die "allgemeinen" Anweisungen und vor jene, die den jeweiligen Modus aufrufen (mehr dazu siehe [#Die-Relevanz-der-Reihenfolge Die Relevanz der Reihenfolge]). Programme mit integriertem LIRC-Support lassen sich, wenn sie innerhalb einer `mode`-Funktion gesteuert werden sollen, anscheinend nur mit einem Modus verwenden, der den Namen des betreffenden Programms hat; sie lassen sich in anderen Modi nicht aufrufen, sondern suchen "ihren" Modus. (Wer z.B. einen `mode = music` erstellt und darin versucht, `prog = rhythmbox`-Befehle aufzurufen, dürfte keinen Erfolg haben, der Modus muss anscheinend `mode = rhythmbox` heißen). Außerdem lesen Programme mit LIRC-Support beim Start die '''.lircrc''' aus und starten dann automatisch in dem Modus mit dem Namen der Anwendung, wenn dieser vorhanden ist. Ein explizites Starten des Modus ist nicht nötig, die Programme können so mit der Fernbedienung gesteuert werden wie es im Modus festgelegt ist. Das kann allerdings bei Start mehrerer Programme dazu führen, dass die Modi nicht mehr sauber getrennt werden und alle Programme gleichzeitig auf denselben Tastendruck reagieren. Eigentlich soll [#lircrcd lircrcd] das wohl verhindern; falls das nicht funktioniert, kann das Problem umgangen werden, in dem die Programme immer nur per Fernbedienung __mit__ dem entsprechenden Modus-Eintrag gestartet werden. Die `mode`-Funktion lässt sich auch ohne andere Anweisungen verwenden; so kann z.B. innerhalb eines Modus mit einem Tastendruck direkt in einen anderen Modus umgeschaltet werden; das kann sinnvoll sein, wenn zwischen zwei laufenden Anwendungen direkt umgeschaltet, oder eine Anwendung gesteuert werden soll, die zunächst nicht über die Fernbedienung gestartet wurde, deren Modus aber an den Startaufruf gekoppelt war. Aus der offiziellen [http://www.lirc.org/html/configure.html#lircrc_format LIRC-Dokumentation] {en} noch folgendes Zitat: > Caveat: In order to avoid many identical entries all actions that modify the mode a program currently is in are independent of the prog token. Übersetzung: "Achtung: Um eine Vielzahl gleichlautender Einträge zu vermeiden, sind alle Aktionen, die den Modus eines Programmes, in dem es sich gerade befindet, modifizieren, unabhängig von der "`prog`"-Anweisung." Theoretisch soll das wohl bedeuten, dass, wenn für ein Programm der Modus geändert wird, im neuen `mode`-Block auf die `prog`-Anweisung verzichtet werden kann. In der Praxis aber lassen sich ggf. Programme mit LIRC-Support sowieso nur in dem Modus mit dem eigenen Namen steuern... Im Zweifelsfall daher weiterhin eine `prog`-Anweisung verwenden. === flags === Unter "flags" werden spezielle Steueranweisungen verstanden, die sich im Zusammenhang mit bestimmten anderen Anweisungen verwenden lassen. Sie werden mit "`flags = `" aufgerufen. ||<-2 tablestyle="width: 98%" rowclass="titel"> Verwendbare "flags" || || Name || Funktion || || `once` || Nur zusammen mit einer `mode`-Anweisung verwendbar; bewirkt, dass der dazugehörige `config`-Befehl nur das erste Mal, wenn der Modus aufgerufen wird, an die entsprechende Anwendung übergeben wird - oder erst dann wieder, nachdem der Modus explizit verlassen wurde. Nutzungsmöglichkeit: Mit einem bestimmten Modus-Aufruf gleichzeitig ein Programm zu starten. || || `quit` || [[Anker(quit)]]Normalerweise werden bei einem Tastendruck alle Anweisungs-Blöcke daraufhin überprüft, ob sie ausgeführt werden müssen. Mit diesem "flag" lässt sich das Ausführen weiterer Befehle, die mit der Taste verbunden sind, sofort unterbinden. Verwendung: sinnvoll, wenn nur die Funktion einer Taste innerhalb eines Modus ausgeführt werden soll, und nicht die außerhalb des Modus (dabei Reihenfolge der betroffenen Blöcke/Modi innerhalb der '''.lircrc''' beachten!). Wenn z.B. mit einer Taste ein Modus-Wechsel erfolgt, wird dieser sofort ausgeführt; ohne das `quit`-Flag würden dann auch weitere "Treffer", die nach dieser Anweisung in der '''.lircrc''' stehen, direkt ausgeführt. || || `mode` || Nur innerhalb eines Modus verwendbar; führt dazu, dass der aktuelle Modus verlassen wird. Dabei wird nicht in einen eventuell zuvor verwendeten Modus zurückgeschaltet, sondern es werden alle Modi beendet! Ggf. statt dessen `mode = ` zum Wiederaufruf verwenden. || || `startup_mode` || Lässt ein Programm unmittelbar den Modus verwenden, der in einer nachfolgenden `mode`-Anweisung spezifiziert ist. || || `toggle_reset` || Verwendbar, wenn mehrere `config`- Zeilen in einem Block benutzt werden. Im Normalfall "merkt" lircd sich, welche `config`-Zeile ausgeführt wurde, und ruft bei weiterem Tastendruck die nächste Zeile auf. `toggle-reset` führt dazu, dass , wenn zwischenzeitlich (eine) andere Taste(n) verwendet wurde(n), bei erneutem Aufruf wieder der Befehl der ersten Zeile ausgeführt wird. || === include === Die '''.lircrc'''-Datei kann, um bei umfangreicheren Vorhaben mit mehreren zu steuernden Programmen/Funktionen die Übersicht zu behalten, unterteilt werden; die einzelnen Dateien können dann mit `include /Pfad/zur/Datei` aufgerufen werden. `includes` werden dabei in der Reihenfolge genauso verarbeitet, wie andere Anweisungen: Trifft LIRC auf einen `include`-Befehl, wird zunächst die angegebene Datei (von oben nach unten) ausgelesen, um dann in der eigentlichen '''.lircrc''' weiter fortzufahren. So lassen sich Funktionen, die in allen Programmen zur Verfügung stehen sollen (z.B. Lautstärkeregelung), in einer Datei zusammenfassen, und die Steuerbefehle für die einzelnen Programme jeweils in einer entsprechend benannten Datei ablegen. Sie können dann gemeinsam, z.B. in einem Modus-Eintrag, aufgerufen werden: {{{#!code text ... begin rhythmbox include ~.lirc/volume include ~.lirc/rhythmbox end rhythmbox begin vlc include ~.lirc/volume include ~.lirc/vlc end vlc }}} === lircrcd === Weiteres Zitat aus der offiziellen Dokumentation: > If you start a LIRC client program, it reads your ~/.lircrc and reacts only on prog= entries which point to itself. All programs should give you the possibility to use an alternative config file. If you have included more than one program in your .lircrc, then start all these programs, they react only to their according entries in .lircrc. This also leads to a disadvantage of the mode concept. If you don't start all client programs at a time the mode they have to maintain may differ between applications. Also key sequences might not be recognized equally because all programs then don't have the same starting point. In order to solve this problem there is the new lircrcd program since version 0.8.0. lircrcd's purpose is to synchronise all clients and maintain the current mode. In order to use the lircrcd feature you have to explicitly enable it by adding the following line at the beginning of the file: > >#! lircrcd Übersetzt:\\ "Wenn ein Programm mit LIRC-Support gestartet wird, liest es die '''~/.lircrc'''-Datei aus und reagiert nur auf `prog =`-Einträge, die auf eben dieses verweisen. Alle Programme sollten die Möglichkeit bieten, eine alternative Konfigurations-Datei zu verwenden. Wenn in eine '''.lircrc'''-Datei mehr als ein Programm aufgenommen wurde, und dann all diese Programme starten, reagieren sie nur auf ihre entsprechenden '''.lircrc'''-Einträge. Das zeigt auch einen Nachteil des Modus-Konzeptes auf. Wenn nicht alle Programme mit LIRC-Unterstützung gleichzeitig starten, kann der Modus, den sie verwalten müssen, zwischen Anwendungen differieren. Auch könnten Tasten-Sequenzen nicht als gleiche/entsprechend erkannt werden, denn dann haben nicht alle Programme den selben Startzeitpunkt. Um dieses Problem zu lösen, existiert seit Version 0.8.0 das neue Programm lircrcd. Aufgabe von lircrcd ist es, alle Programme mit LIRC-Support zu synchronisieren, und den derzeitigen Modus zu verwalten. Um diese Funktion nutzen zu können, muss sie explizit durch Aufnahme der Zeile `#! lircrcd` am Anfang der '''.lircrc''' ermöglicht werden." Christoph Bartelmus (der LIRC-Entwickler) erläutert diesen Passus folgendermaßen: > [Verwendung der .lircrc] ohne lircrcd:\\ > Jedes Programm hat jeweils eine Variable, die heißt: mode > > Da die Programme in der Regel nicht gleichzeitig gestartet werden, kann es > leicht vorkommen, dass sich mode von Programm A und mode von Programm B > voneinander unterscheiden. Das Verhalten ist dann nicht leicht > nachvollziehbar. > > Mit lircrcd:\\ > Es gibt nur noch eine Variable mode, die von lircrcd verwaltet wird und > alle Programme fragen bei lircrcd nach, wie der Inhalt von mode ist. > Also sind alle im gleichen Modus, unabhängig davon wann sie gestartet > wurden. Bei der Verwendung ohne lircrcd "suchen" die Programme mit LIRC-Support ohne explizite Modus-Angabe (also wenn sie von "außerhalb" gestartet wurden) nach Einträgen in der '''.lircrc''', aber auch in den Modus-Blöcken! Das kann dazu führen, dass bei mehreren so gestarteten Programmen ohne `mode`-Angabe nicht eindeutig ist, welcher Befehl ausgeführt werden soll. Ggf. werden bei Tastenbelegung für mehrere Programme die Anweisungen gleichzeitig ausgeführt, z.T. aber wird nicht unbedingt nach Reihenfolge abgearbeitet; das Verhalten wird damit unberechenbar. lircrcd soll diese "Modi" der Programme synchronisieren. Mit der Verwendung von lircrcd scheinen "außerhalb" gestartete Programme ohne Modusangabe allerdings nur auf der "Grundebene" der '''.lircrc''' nach entsprechenden `prog`-Anweisungen zu suchen. Wenn sich dort aber keine finden lassen, weil sie alle im entsprechenden `mode`-Block stehen, funktionieren die Tasten ohne einen expliziten Wechsel in den entsprechenden Modus nicht. Ggf. kann dann eine `prog`-Anweisung außerhalb des `mode`-Blocks mit einem entsprechendem Moduswechsel das Programm "auf die richtige Spur" setzen. Die Verwendung dieser Funktion mit [:Rhythmbox:] (und auch [:Totem:]) ist dabei anscheinend fehlerhaft; `prog`-Anweisungen werden mit der Verwendung von `#! lircrcd` ggf. nicht ausgelesen/ausgeführt (siehe auch [topic:wie-funktioniert-lircrcd:hier] im Forum). Abhilfe schafft es wohl nur, auf lircrcd zu verzichten, und alle Programme immer mit einer entsprechenden `mode`-Anweisung mit der Fernbedienung zu starten. Dann kommt es nicht zu Problemen mit unklaren Modi (siehe [#Beispiele Beispiele]). == Die Relevanz der Reihenfolge == lircd liest die '''.lircrc''' bei jedem empfangenen Impuls von oben nach unten aus. Anweisungen in `mode`-Blöcken werden bei aufgerufenem Modus __zusätzlich__ zu den "Grundbefehlen" berücksichtigt. Das hat entscheidende Auswirkungen für die Funktion der '''.lircrc''', kann aber auch gezielt eingesetzt werden. Zunächst ein kurzes Beispiel, bei dem das Vertauschen von Blöcken zu völlig unterschiedlichen Ergebnissen führt: {{{#!code=text begin order begin button = OK prog = irexec config = echo "Dieses wird zuletzt ausgegeben" end end order begin button = OK prog = irexec config = echo "Dieses wird zuerst ausgegeben" mode = order flags = quit end }}} Als Ergebnis wird beim ersten Tastendruck `Dieses wird zuerst ausgegeben` erscheinen, beim zweiten ist der Modus gewechselt, und auch die Anweisung im `order`-Block erscheint. Sie steht __vor__ der zweiten Block, also werden beide Anweisungen so ausgegeben: {{{ Dieses wird zuletzt ausgegeben Dieses wird zuerst ausgegeben }}} und ebenfalls für jeden weiteren Tastendruck. Das `quit`-Flag hat keinen Einfluss, da keine weitere Anweisung folgt. Werden die Blöcke vertauscht {{{#!code=text begin button = OK prog = irexec config = echo "Dieses wird zuerst ausgegeben" mode = order flags = quit end begin order begin button = OK prog = irexec config = echo "Dieses wird zuletzt ausgegeben" end end order }}} führt dies beim ersten Tastendruck ebenfalls zu {{{ Dieses wird zuerst ausgegeben }}} Allerdings wird es auch bei jedem weiteren Druck ausgegeben. Es erfolgt zwar eine Wechsel in den `order`-Modus, allerdings verhindert das `quit`-Flag die Ausführung der zweiten Funktion. __Ohne__ `quit`-Flag würde beim zweiten (und jedem weiteren Tastendruck) {{{ Dieses wird zuerst ausgegeben Dieses wird zuletzt ausgegeben }}} erscheinen. __Mit__ `quit`-Flag im `order`-Block würde ab dem zweiten Druck nur noch {{{ Dieses wird zuerst ausgegeben }}} produziert; die Ausgabe der anderen Anweisung würde unterbunden. Daher sollte man, wenn man tatsächlich die Möglichkeit haben möchte, alle Tasten - ohne Ausführung weiterer Befehle - in allen Modi zu verwenden, - die `mode`-Blöcke __vor__ die anderen Anweisungen stellen - in den Anweisungen der `mode`-Blöcke ggf. ein `quit`-Flag setzen. Allerdings kann man die Reihenfolge des Abarbeitens der '''.lircrc'''-Blöcke auch gezielt verwenden: Wer z.B. in mehreren Programm-Modi Tasten mit der selben Funktion belegen möchte (Start eines anderen Programms, Lautstärkeregelung etc.), kann für diese Befehle einen eigenen "Steuer"-Modus erstellen. Dieser muss dann in der '''.lircrc''' __nach__ den Programm-Modi stehen; die in den Programm-Modi verwendete Taste braucht nur noch die Anweisung `mode = steuermodus`, womit sofort in diesen Modus gewechselt wird. Ohne `quit`-Flag im Programm-Modus wird dann die Anweisung umgehend im neuen Modus ausgeführt; mit einem weiteren Modus-Wechsel/`flags = mode` in dieser Anweisung sind ganze "Befehlsketten" realisierbar (siehe auch [#Beispiele Beispiele]). == Spezielle Programme für die .lircrc == === irexec === [http://www.lirc.org/html/irexec.html irexec] {en} ist im '''lirc'''-Paket enthalten. irexec sendet beliebige Befehle auf der Kommandozeilen-Ebene und ermöglicht es so, alle Programme oder Befehle zu starten und zu steuern, soweit diese auch in einem Terminal bedienbar sind. Dabei greift es auf '''.lircrc''' im [:Homeverzeichnis:] zurück. Damit die Befehle umgesetzt werden, muss irexec (zunächst im Terminal) als normaler Benutzer gestartet werden: {{{#!vorlage Befehl irexec -d }}} Um den Befehl nicht nach jedem Systemstart manuell aufrufen zu müssen sollte die '''~/.profile''' die folgende Zeile enthalten: {{{ /usr/bin/irexec -d }}} Möchte man das zentral für jedem Systembenutzer konfigurieren, so kann der Aufruf auch in '''/etc/profile''' hinzugefügt werden. ==== irexec als Debugging-Werkzeug ==== Um zu überprüfen, ob die '''.lircrc'''-Datei formal funktionsfähig ist, kann irexec verwendet werden. Im Terminal nicht als Hintergrund-Prozess gestartet (__ohne__ die Option `-d`), liest irexec die Datei aus und meldet Syntaxfehler, wenn die Konfiguration fehlerhaft ist, also z.B. `end`-Einträge fehlen, oder Modi formal falsch gesetzt sind. Inwieweit allerdings "semantische" Fehler vorliegen, lässt sich so nicht feststellen. Unerwartete Ergebnisse treten - verständlicherweise - z.B. dann auf, wenn in einem Modus versehentlich die selbe Taste für verschiedene Funktionen verwendet werden soll (das ist natürlich möglich und manchmal auch sinvoll). === irxevent === irxevent befindet sich im Paket {{{#!vorlage Paketinstallation lirc-x, universe }}} [http://www.lirc.org/html/irxevent.html irxevent] {en} ist in der Lage, einzelne Tasten oder Tastenkombinationen auf dem Keyboard an bestimmte Anwendungen zu schicken. Zappte man bisher z.B. mit den Pfeiltasten auf der Tastatur durch seine Senderliste, kann das nun auch per Fernbedienung erledigt werden. Die Syntax in '''.lircrc''' unter `config` ist dabei: `Key` (d.h. es folgt eine Taste) `` (beschrieben unter '''/usr/share/doc/lirc/irxevent.keys''') ``, als Beispiel `config = Key alt-ctrl-t x-session-manager`. Bei entsprechender Tastenkombination lässt sich so zum Beispiel der Zoom von Compiz ausführen. Genauere Informationen finden sich in der [:man: manpage] des Programms. Damit die Befehle umgesetzt werden können, muss irxevent (zunächst im Terminal) als normaler Benutzer gestartet werden: {{{#!vorlage Befehl irxevent -d }}} Auch hier gilt: Um es dann dauerhaft nutzen zu können, empfiehlt es sich, es schon beim Systemstart, z.B. durch Eintrag in die [:rc.local:], aufzurufen. === xte === Manchmal kennt man den genauen Namen eines Programms, das aufgerufen wird, wenn man die Tastenkombination ''XY'' drückt, gar nicht. Oder man möchte die Zifferntasten in allen Anwendungen so nutzen wie den Numblock der Tastatur. Abhilfe schafft dabei das Programm xte. Mit ihm lassen sich vom Terminal aus alle Tasten des Keyboards simulieren, sodass für den Rechner kein Unterschied zwischen einem "echten" Tastendruck und dem Befehl von xte erkennbar ist. xte befindet sich im Paket {{{#!vorlage Paketinstallation xautomation, universe }}} Um das Programm in Verbindung mit LIRC nutzen zu können, wird es in '''.lircrc''' mittels irexec gestartet. Die relevante Zeile sieht dabei folgendermaßen aus: `config = xte 'key 1'`, oder für eine Tastenkombination: `config = xte 'keydown Alt_L' 'keydown 2' 'keyup Alt_L' 'keyup 2'`. Die Namen der Tasten sind in der manpage des Programms beschrieben. == Automatisches Erstellen einer .lircrc == Um automatisch eine '''.lircrc'''-Datei zu erstellen, kann das Programm '''mythbuntu-lirc-generator''' verwendet werden (gleichnamiges Paket (''universe'') installieren). Es generiert mit den Angaben aus der '''lircd.conf''' eine Steuerungsdatei, die bei Bedarf weiter ausgebaut werden kann. Dabei werden Konfigurationen für die Programme [:MythTV:], [:Archiv/Elisa_Media_Center: Elisa], [:MPlayer:], [:Totem:], [:VLC:] und [:XINE:] erstellt. Es wird eine kurze '''.lircrc '''erstellt, mit `include`-Befehlen werden die Konfigurationen für die einzelnen Programme aus dem angelegten Ordner '''~/.lirc''' aufgerufen (die automatisch erstellten `repeat = 0` und `delay = 0`-Anweisungen sind so allerdings überflüssig). === Basisdateien === '''.lircrc''' {{{#!code text #Custom lircrc generated via mythbuntu-lirc-generator #All application specific lircrc files are within ~/.lirc include ~/.lirc/mythtv include ~/.lirc/mplayer include ~/.lirc/xine include ~/.lirc/vlc include ~/.lirc/xmame include ~/.lirc/xmess include ~/.lirc/totem include ~/.lirc/elisa }}} '''~/.lirc/totem''' {{{#!code text # LIRCRC Auto Generated by Mythbuntu Lirc Generator # Author(s): Mario Limonciello, Nick Fox # Created for use with Mythbuntu begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = INFO config = show_playing repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Play config = play_pause repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = PAUSE config = pause repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Mute config = mute repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Vol- config = volume_down repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Up config = up repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Vol+ config = volume_up repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Down config = down repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Right config = right repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = FF config = seek_forward repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = DVD config = play_dvd repeat = 0 delay = 0 end begin remote = Terratec_Cinergy_HT_PCI_ prog = totem button = Left config = left repeat = 0 delay = 0 end }}} == Beispiele == Als Veranschaulichung einiger Möglichkeiten eine kommentierte '''.lircrc''', über die die Programme [:VLC:] und [:Rhythmbox:] gesteuert werden können. Ebenfalls ist die Mausbedienung per Fernbedienung vorgesehen, außerdem ist das Herunterfahren des Rechners möglich (funktioniert so allerdings nur unter [:GNOME:]). Die `echo`-Anweisungen in den `config`-Zeilen sind optional, sie geben die jeweils ausgeführte Aktion im Terminal wieder. So kann kontrolliert werden, ob die `mode`-Wechsel wie gewünscht vonstatten gehen (Voraussetzung: irexec wird nicht als daemon ausgeführt). Der Wechsel der Arbeitsflächen mit [#xte xte] funktioniert natürlich nur, wenn die entsprechende Tastenkombinationen entsprechend eingestellt sind (siehe dazu auch im [post:1840983:Forum]). {{{#!code text # Programm-Modi, Befehle werden per "include" aus einzelnen Dateien ausgelesen: begin rhythmbox include ~/.lirc/rhythmbox include ~/.lirc/maus end rhythmbox begin kaffeine include ~/.lirc/kaffeine end kaffeine begin vlc include ~/.lirc/vlc include ~/.lirc/maus end vlc begin maus include ~/.lirc/maus end maus begin shut # "Sicherheitstaste" um aus versehentlich aufgerufenem Herunterfahr-Modus zurückzukommen: begin button = BACK prog = irexec config = echo "mode normal aus shut" mode = normal end # Tasten-Sequenz zum tatsächlichen Herunterfahren: begin prog = irexec button = DELETE button = POWER config = gnome-power-cmd.sh shutdown end end shut # Befehle des Normal-Modus: begin normal # Starttasten für die Programme; gleichzeitig wird in den entsprechenden Modus gewechselt und auf eine andere Arbeitsfläche geschaltet: begin prog = irexec button = TV config = echo "mode kaffeine aus startup" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 4' 'keyup Control_L' 'keyup Shift_L' 'keyup 4' && kaffeine & mode = kaffeine end # VLC wird hier gleich als DVB-T-Player mit entsprechender channels.conf gestartet: begin prog = irexec button = VIDEO config = echo "mode vlc aus startup" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 2' 'keyup Control_L' 'keyup Shift_L' 'keyup 2' && vlc /pfad/zur/channels.conf & mode = vlc end begin prog = irexec button = DVD config = echo "mode rhythmbox aus startup" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 3' 'keyup Control_L' 'keyup Shift_L' 'keyup 3' && rhythmbox & mode = rhythmbox end # Tasten zum Wechseln des Modus: begin button = TEXT prog = irexec config = echo "mode maus aus mode normal" mode = maus end begin button = POWER prog = irexec config = echo "mode shut aus mode normal" mode = shut end # Aufruf von laufenden Programmen mit Wechsel auf entsprechend Arbeitsfläche (wird auch aus den einzelnen Modi heraus verwendet): begin button = GREEN prog = irexec config = echo "mode vlc aus mode normal"&& xte 'keydown Control_L' 'keydown Shift_L' 'keydown 2' 'keyup Control_L' 'keyup Shift_L' 'keyup 2' mode = vlc end begin button = RED prog = irexec config = echo "mode kaffeine aus mode normal" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 4' 'keyup Control_L' 'keyup Shift_L' 'keyup 4' && dcop kaffeine KaffeineIface pause mode = kaffeine end begin button = YELLOW prog = irexec config = echo "mode rhythmbox aus startup" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 3' 'keyup Control_L' 'keyup Shift_L' 'keyup 3' && rhythmbox-client --no-start --play & mode = rhythmbox end end normal # Inbetriebnahme der Fernbedienung mit der BACK-Taste: begin button = BACK prog = irexec config = echo "mode normal start" mode = normal end }}} Dazu die entsprechende '''~/.lirc/vlc''' für ein Programm mit LIRC-Support: {{{#!code text ## VLC ## begin prog = vlc button = PLAY config = key-play end begin prog = vlc button = PAUSE config = key-play-pause end begin prog = vlc button = STOP config = key-stop end begin prog = vlc button = MUTE config = key-vol-mute end begin prog = vlc button = VOLUMEDOWN config = key-vol-down repeat = 2 delay = 10 end begin prog = vlc button = VOLUMEUP config = key-vol-up repeat = 2 delay = 10 end begin prog = vlc button = CHANNELUP config = key-next end begin prog = vlc button = CHANNELDOWN config = key-prev end begin prog = vlc button = PIC config = key-fullscreen end begin prog = vlc button = REWIND config = key-slower end begin prog = vlc button = FORWARD config = key-faster end # Navigation im DVD-Menü begin prog = vlc button = LEFT config = key-nav-left end begin prog = vlc button = DOWN config = key-nav-down end begin prog = vlc button = UP config = key-nav-up end begin prog = vlc button = RIGHT config = key-nav-right end begin prog = vlc button = OK config = key-nav-activate end begin prog = vlc button = DVDMENU config = key-disc-menu end # Beenden des Programm, Rückkehr zu mode normal und Arbeitsfläche 1: begin button = HOME prog = irexec config = echo "mode normal aus vlc quit" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 1' 'keyup Control_L' 'keyup Shift_L' 'keyup 1' end # Hier ist die HOME-Taste bewusst mit einem zweiten Befehl belegt, da es sich um verschiedene Programme handelt, die gleichzeitig bedient werden (irecex und VLC): begin prog = vlc button = HOME config = key-quit mode = normal end # Rückkehr zu mode normal, um z.B. ein weiteres Progamm per Fernbedienung starten zu können; VLC wird stummgeschaltet; gleichzeitig Wechsel auf Arbeitsfläche 1: begin prog = vlc button = BACK config = key-vol-mute end begin button = BACK prog = irexec config = echo "mode normal aus vlc" && xte 'keydown Control_L' 'keydown Shift_L' 'keydown 1' 'keyup Control_L' 'keyup Shift_L' 'keyup 1' mode = normal end # Tasten, um zu bereits laufenden Anwendungen zu wechseln (über mode normal); VLC wird stummgeschaltet, die laufende Anwendung mit Sound/Forsetzung fortgeführt: begin prog = vlc button = RED config = key-vol-mute mode = normal end begin prog = vlc button = BLUE config = key-vol-mute mode = normal end begin prog = vlc button = YELLOW config = key-vol-mute mode = normal end # Lautstärke für VLC einschalten, wenn aus anderen Anwendungen in den VLC-Modus gewechselt wird (Taste länger drücken): begin prog = vlc button = GREEN config = key-vol-mute repeat = 1 delay = 5 end # Tasten, um andere Anwendungen zu starten; VLC wird stummgeschaltet, Aufruf über mode normal: begin prog = vlc button = TV config = key-vol-mute mode = normal end begin prog = vlc button = MUSIC config = key-vol-mute mode = normal end begin prog = vlc button = DVD config = key-vol-mute mode = normal end }}} {{{#!vorlage Hinweis Unter [:KDE4:] ist eine Steurung so nicht mehr möglich. Die Steuerung erfolgt mit [:D-Bus:]-Aufrufe, siehe [:Kaffeine#Fernbedienung:Kaffeine - Fernbedienung]. Die Grundfunktionen lassen sich bei laufendem Kaffeine-Programm mit {{{#!vorlage Befehl qdbus org.kde.kaffeine /Player \}}} ausgeben. }}} == Programme beenden == Um Programme zu bedienen, die keinen "eigenen" Befehl zum Beenden haben, kann folgendes Skript von [user:bulderbacke:] per Tastendruck gestartet werden: {{{#!code bash #!/bin/bash # von http://xbmc.org/forum/showthread.php?s=a6f0736b696c88149143ce0077b2a448&t=30230 export USER= export LOG=/tmp/irscript-_restart.log # Test to see if is still running if [ -n "$(pidof )" ] ; then # Send gentle kill signal killall echo `date` "Killed ! (soft)" >> $LOG # takes a second or two to die with the soft kill sleep 2 # still running? Send hard kill signal if [ -n "$(pidof )" ] ; then # If it's still around, kill it -9 killall -9 ; echo `date` "Killed ! (hard)" >> $LOG fi else echo `date` "Starting " >> $LOG --lirc --fullscreen; fi & }}} Skript herunterladen und ausführbar machen, `` durch den gewünschten Programmnamen ersetzen und unter einem aussagekräftigen Namen abspeichern (z.B. als '''start-stop-.sh'''). Das Skript versucht zunächst, das Programm "einfach" zu beenden und überprüft dann, ob es geklappt hat. Wenn nicht, kommt ein "härterer" `killall`-Befehl zum Einsatz. Wenn es zuvor nicht lief, wird das Programm gestartet - wenn möglich mit LIRC-Support und im Fullscreen-Modus. Da ganze wird dann noch in einem Log ('''/tmp/irscript-_restart.log''') mitgeschnitten. Eine Anweisung in der '''.lircrc''' zum Aufruf könnte so aussehen: {{{#!code text begin prog = irexec button = HOME config = /Pfad/zum/Script/start-stop-.sh end }}} = Maus per Fernbedienung steuern = Mit [#xte xte] ist es sehr einfach, auch die Maus-Funktionen per Fernbedienung zu steuern; hier eine '''.lircrc'''-Beispielkonfiguration, in der der Ziffernblock der Fernbedienung zur Navigation verwendet wird, die [[Vorlage(Tasten, lmt)]] wird mit 5, die [[Vorlage(Tasten, rmt)]] mit 0 "geklickt". {{{#!code text #Maussteuerung per xte begin prog = irexec button = 2 config = xte 'mousermove 0 -15' repeat = 1 end begin prog = irexec button = 3 config = xte 'mousermove 15 -15' repeat = 1 end begin prog = irexec button = 1 config = xte 'mousermove -15 -15' repeat = 1 end begin prog = irexec button = 8 config = xte 'mousermove 0 15' repeat = 1 end begin prog = irexec button = 7 config = xte 'mousermove -15 15' repeat = 1 end begin prog = irexec button = 9 config = xte 'mousermove 15 15' repeat = 1 end begin prog = irexec button = 4 config = xte 'mousermove -15 0' repeat = 1 end begin prog = irexec button = 6 config = xte 'mousermove 15 0' repeat = 1 end begin prog = irexec button = 5 config = xte 'mouseclick 1' end begin prog = irexec button = 0 config = xte 'mouseclick 2' end }}} = Links = - [http://www.lirc.org/html/configure.html#lircrc_format Offizielle .lircrc-Dokumentation] {en} - [https://www.g-loaded.eu/2006/01/10/how-to-configure-and-use-lirc/ LIRC-Tutorial] {en} #tag: Multimedia, Kommunikation