Zerga15
Anmeldungsdatum: 30. Oktober 2015
Beiträge: Zähle...
|
Liebe Gemeinde, mir fehlt schon ein gedanklicher Ansatz, um folgende Problemstellung zu lösen. Von den Fähigkeiten her kann ich mich als erfahrenen Anwender bezeichnen. Vorgaben: Ich sitze an einem Rechner und bin via SSH im selben Netzwerk mit einem zweiten Rechner verbunden. Der zweite Rechner ist an einem Beamer als Monitor angeschlossen. Der Hintergrund ist schwarz, die Leiste ebenfalls und ausgeblendet. Die Bedienung erfolgt vollständig via Kommandozeile (SSH bzw xdotool). Vorrangig werden Medien abgespielt, zB Filme, Bilder. Problem: Es tritt der Fall auf, dass ich möglichst schnell (Geschwindigkeit vor Schönheit) eine Textinformation auf den Beamer bekommen möchte. Dieses Informationsbedürfnis kann spontan auftreten, ich kann es also nicht vorbereiten (Grafikdatei vorher fertigmachen und aufrufen). Frage: Gibt es dafür einen gedanklichen Ansatz, der eine zuverlässige Durchführung verspricht? Ich würde gern auf grafische Eingaben verzichten, zB habe ich die Erfahrung gemacht dass x2go nicht immer stabil läuft.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13922
|
Zerga15 schrieb: Problem: Es tritt der Fall auf, dass ich möglichst schnell (Geschwindigkeit vor Schönheit) eine Textinformation auf den Beamer bekommen möchte. Dieses Informationsbedürfnis kann spontan auftreten, ich kann es also nicht vorbereiten (Grafikdatei vorher fertigmachen und aufrufen). Frage: Gibt es dafür einen gedanklichen Ansatz, der eine zuverlässige Durchführung verspricht? Ich würde gern auf grafische Eingaben verzichten, ...
Evtl. mit wall. Z. B:.
:~ $ wall 'Das ist eine Textinformation'
Broadcast message from xxx@yyyyyy (pts/0) (Fri Dec 7 09:34:47 2018):
Das ist eine Textinformation
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Zerga15 schrieb: Problem: Es tritt der Fall auf, dass ich möglichst schnell (Geschwindigkeit vor Schönheit) eine Textinformation auf den Beamer bekommen möchte. Dieses Informationsbedürfnis kann spontan auftreten, ich kann es also nicht vorbereiten (Grafikdatei vorher fertigmachen und aufrufen).
Reicht dir eine Desktop-Benachrichtigung? Dann könnte man man mit notify-send (vgl. Benachrichtigungsdienst (Abschnitt „Eigene-Nachrichten-ausgeben“) arbeiten.
|
Zerga15
(Themenstarter)
Anmeldungsdatum: 30. Oktober 2015
Beiträge: 22
|
lubux schrieb: Zerga15 schrieb: Problem: Es tritt der Fall auf, dass ich möglichst schnell (Geschwindigkeit vor Schönheit) eine Textinformation auf den Beamer bekommen möchte. Dieses Informationsbedürfnis kann spontan auftreten, ich kann es also nicht vorbereiten (Grafikdatei vorher fertigmachen und aufrufen). Frage: Gibt es dafür einen gedanklichen Ansatz, der eine zuverlässige Durchführung verspricht? Ich würde gern auf grafische Eingaben verzichten, ...
Evtl. mit wall. Z. B:.
:~ $ wall 'Das ist eine Textinformation'
Broadcast message from xxx@yyyyyy (pts/0) (Fri Dec 7 09:34:47 2018):
Das ist eine Textinformation
Hab ich ausprobiert. Allerdings gelingt es mir nicht, vom SSH-Client eine Nachricht an einer am Server geöffneten Konsole auszugeben. Andersrum funktioniert es: Ein am Server eingegebenes wall ergibt in der am Client geöffneten und mit dem Server verbundenen Konsole eine Ausgabe. Bliebe noch das Problem, über SSH am Server ein Terminal zu öffnen, das dann auch einen entsprechenden broadcast ausgeben kann. Aber die Idee ist super, ich teste mal weiter. seahawk1986 schrieb: Zerga15 schrieb: Problem: Es tritt der Fall auf, dass ich möglichst schnell (Geschwindigkeit vor Schönheit) eine Textinformation auf den Beamer bekommen möchte. Dieses Informationsbedürfnis kann spontan auftreten, ich kann es also nicht vorbereiten (Grafikdatei vorher fertigmachen und aufrufen).
Reicht dir eine Desktop-Benachrichtigung? Dann könnte man man mit notify-send (vgl. Benachrichtigungsdienst (Abschnitt „Eigene-Nachrichten-ausgeben“) arbeiten.
Hier habe ich leider das Problem, dass ich aus einer tiefsitzenden Angst vor Benachrichtigungen diese komplett abgeschaltet habe. Der Beamer läuft auf einer Bühne mit Theaterstücken, und da darf nicht einfach ein wildgewordenes Programm mit einer Benachrichtigung um sich schmeißen. Das wäre dann eine absolute Katastrophe. Oder gibt es eine Methode, ausschließlich eine solche Benachrichtigung aufploppen zu lassen? Es muss aber absolut ausgeschlossen sein, dass irgendein etwas anderes aufploppt. Dann kann ich nicht mehr schlafen 😀 Es würde zB helfen, die Benachrichtungserweiterung von Xubuntu via Kommandozeile von "Bitte nicht stören" auf "normal" und danach wieder zurück zu stellen. Gibts sowas?
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Gegebenenfalls einfach mit xmessage (x11-utils) machen. Als Beispiel: DISPLAY=:0 xmessage -center -buttons '' -timeout 3 'HALLO WELT!' Alternativ mit zenity.
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Zerga15 schrieb: Hier habe ich leider das Problem, dass ich aus einer tiefsitzenden Angst vor Benachrichtigungen diese komplett abgeschaltet habe. Der Beamer läuft auf einer Bühne mit Theaterstücken, und da darf nicht einfach ein wildgewordenes Programm mit einer Benachrichtigung um sich schmeißen. Das wäre dann eine absolute Katastrophe.
Da würde ich mir ja lieber auf einer Minimalinstallation selber eine Desktop-Session zusammenstellen, dann muss man nur das hinzufügen, was man braucht, alles andere fehlt automatisch. Oder gibt es eine Methode, ausschließlich eine solche Benachrichtigung aufploppen zu lassen? Es muss aber absolut ausgeschlossen sein, dass irgendein etwas anderes aufploppt. Dann kann ich nicht mehr schlafen 😀
Da gäbe es durchaus Möglichkeiten - Dunst ist z.B. eine recht gut anpassbare Implementierung des Benachrichtigungsdienstes (Farben, Größe und Position sowie Schriftart und -größe der Meldungen sind anpassbar). xfc4-notifyd sollte man dann entfernen, damit die beiden Programme nicht um die selbe DBus-Addresse konkurrieren. In der Konfigurationsdatei von dunst (als ~/.config/dunst/dunstrc ablegen) kann man Regeln für Feldinhalte angeben, die intern mit fnmatch geprüft werden - wenn man die aktuelle Git-Version selber mit einer Anpassung baut, die fnmatch() statt 0 das Flag FNM_EXTMATCH mitgibt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 | diff --git a/Makefile b/Makefile
index 9737a64..5fbadb0 100644
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,7 @@ $(error "$(PKG_CONFIG) failed!")
endif
endif
-CFLAGS := ${DEFAULT_CPPFLAGS} ${CPPFLAGS} ${DEFAULT_CFLAGS} ${CFLAGS} ${INCS}
+CFLAGS := ${DEFAULT_CPPFLAGS} ${CPPFLAGS} ${DEFAULT_CFLAGS} ${CFLAGS} ${INCS} -D_GNU_SOURCE
LDFLAGS := ${DEFAULT_LDFLAGS} ${LDFLAGS} ${LIBS}
SRC := $(sort $(shell find src/ -name '*.c'))
diff --git a/src/rules.c b/src/rules.c
index d23c580..ed8829b 100644
--- a/src/rules.c
+++ b/src/rules.c
@@ -99,12 +99,12 @@ void rule_init(struct rule *r)
*/
bool rule_matches_notification(struct rule *r, struct notification *n)
{
- return ( (!r->appname || (n->appname && !fnmatch(r->appname, n->appname, 0)))
- && (!r->summary || (n->summary && !fnmatch(r->summary, n->summary, 0)))
- && (!r->body || (n->body && !fnmatch(r->body, n->body, 0)))
- && (!r->icon || (n->icon && !fnmatch(r->icon, n->icon, 0)))
- && (!r->category || (n->category && !fnmatch(r->category, n->category, 0)))
- && (!r->stack_tag || (n->stack_tag && !fnmatch(r->stack_tag, n->stack_tag, 0)))
+ return ( (!r->appname || (n->appname && !fnmatch(r->appname, n->appname, FNM_EXTMATCH)))
+ && (!r->summary || (n->summary && !fnmatch(r->summary, n->summary, FNM_EXTMATCH)))
+ && (!r->body || (n->body && !fnmatch(r->body, n->body, FNM_EXTMATCH)))
+ && (!r->icon || (n->icon && !fnmatch(r->icon, n->icon, FNM_EXTMATCH)))
+ && (!r->category || (n->category && !fnmatch(r->category, n->category, FNM_EXTMATCH)))
+ && (!r->stack_tag || (n->stack_tag && !fnmatch(r->stack_tag, n->stack_tag, FNM_EXTMATCH)))
&& (r->match_transient == -1 || (r->match_transient == n->transient))
&& (r->msg_urgency == URG_NONE || r->msg_urgency == n->urgency));
}
|
kann man erweiterte Ausdrücke fürs globbing nutzen und damit auch exklusive Filter anlegen:
FNM_EXTMATCH
If this flag (a GNU extension) is set, extended patterns are supported, as
introduced by 'ksh' and now supported by other shells. The extended format is as
follows, with pattern-list being a '|' separated list of patterns.
[...]
'!(pattern-list)'
The pattern matches if the input string cannot be matched with any of the patterns
in the pattern-list.
Wenn man dann einen App-Namen nimmt, den niemand anderes für Benachrichtigungen nutzt, filtert man effektiv alle anderen Benachrichtigungen:
| [hide_non_special]
appname = "!(superspecial)"
format = ""
|
Mit obiger Regel werden nur noch Benachrichtigungen angezeigt, wenn der Appname superspecial ist, also man z.B. sowas verwendet, wenn man die Benachrichtigung verschickt:
| notify-send -a superspecial "Das ist ein Titel" "Hier kommt der Text für die Meldung\nAuf Wunsch explizit\nmit mehreren Zeilen"
|
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13922
|
Zerga15 schrieb:
Allerdings gelingt es mir nicht, vom SSH-Client eine Nachricht an einer am Server geöffneten Konsole auszugeben.
Bei mir funktioniert es vom ssh-Client zum sshd-Server, mit z. B.:
ssh <user>@<IP-Server> wall 'Das ist eine Nachricht.' EDIT: Z. B.:
Broadcast message from xxx@yyyyy (somewhere) (Sat Dec 8 10:41:44 2018):
Das ist eine Nachricht EDIT 2: Oder Du kompilierst dir einen Server und einen Client (mit source code aus dem Internet), die per UDP kommunizieren können. Falls Du Interesse hast, kann ich dir den source coder bzw. die Quelle, hier posten und zeigen wie das funktioniert.
|
Zerga15
(Themenstarter)
Anmeldungsdatum: 30. Oktober 2015
Beiträge: 22
|
mrkramps schrieb: Gegebenenfalls einfach mit xmessage (x11-utils) machen. Als Beispiel: DISPLAY=:0 xmessage -center -buttons '' -timeout 3 'HALLO WELT!' Alternativ mit zenity.
Hab mal angefangen mit zenity zu basteln, ich glaube das ist für mich die richtige Lösung. Ich habe folgendes Skript erstellt: #! /bin/bash
MESSG=$(zenity --entry --text "Bitte Nachricht eingeben:" --title "Nachricht") 2> /dev/null
echo Die ausgegebene Nachricht lautet "$MESSG"
ssh nutzer@rechner "zenity --display=:0 --width=400 --height=300 --timeout=4 --info --text "$MESSG" --title "Regieanweisung" 2> /dev/null
exit Nach dem ersten Leerzeichen gibt es aus $MESSG nichts mehr aus, wenn es über SSH geht - ebenso bei '--title'. Lokal ist die Ausgabe vollständig. Wie kann ich das verbessern? Vielen Dank auch für die anderen Denkanstöße!
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13922
|
Zerga15 schrieb: Nach dem ersten Leerzeichen gibt es aus $MESSG nichts mehr aus, wenn es über SSH geht - ebenso bei '--title'. Lokal ist die Ausgabe vollständig. Wie kann ich das verbessern?
BTW: Da es im selben Netz ist, könntest Du statt ssh auch den lauschenden (und abgesicherten) Xorg-Server verwenden.
|
Zerga15
(Themenstarter)
Anmeldungsdatum: 30. Oktober 2015
Beiträge: 22
|
lubux schrieb: Zerga15 schrieb: Nach dem ersten Leerzeichen gibt es aus $MESSG nichts mehr aus, wenn es über SSH geht - ebenso bei '--title'. Lokal ist die Ausgabe vollständig. Wie kann ich das verbessern?
BTW: Da es im selben Netz ist, könntest Du statt ssh auch den lauschenden (und abgesicherten) Xorg-Server verwenden.
Sorry die Stille, es war viel zu tun. Wie stelle ich das denn an? seahawk1986 schrieb: Da würde ich mir ja lieber auf einer Minimalinstallation selber eine Desktop-Session zusammenstellen, dann muss man nur das hinzufügen, was man braucht, alles andere fehlt automatisch.
Das hat seine Reize, hab ich gar nicht dran gedacht. Welchen wm würdest du da nehmen?
|
seahawk1986
Anmeldungsdatum: 27. Oktober 2006
Beiträge: 11179
Wohnort: München
|
Zerga15 schrieb: #! /bin/bash
MESSG=$(zenity --entry --text "Bitte Nachricht eingeben:" --title "Nachricht") 2> /dev/null
echo Die ausgegebene Nachricht lautet "$MESSG"
ssh nutzer@rechner "zenity --display=:0 --width=400 --height=300 --timeout=4 --info --text "$MESSG" --title "Regieanweisung" 2> /dev/null
exit Nach dem ersten Leerzeichen gibt es aus $MESSG nichts mehr aus, wenn es über SSH geht - ebenso bei '--title'. Lokal ist die Ausgabe vollständig. Wie kann ich das verbessern? Vielen Dank auch für die anderen Denkanstöße!
Du musst die doppelten Anführungszeichen im String, den du an SSH übergibst, escapen:
| ssh nutzer@rechner "zenity --display=:0 --width=400 --height=300 --timeout=4 --info --text \"$MESSG\" --title \"Regieanweisung\"" 2> /dev/null
|
Zerga15 schrieb: seahawk1986 schrieb: Da würde ich mir ja lieber auf einer Minimalinstallation selber eine Desktop-Session zusammenstellen, dann muss man nur das hinzufügen, was man braucht, alles andere fehlt automatisch.
Das hat seine Reize, hab ich gar nicht dran gedacht. Welchen wm würdest du da nehmen?
Das hängt davon ab, was du brauchst. Openbox ist z.B. schlank und recht einfach anpassbar.
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Zerga15 schrieb: seahawk1986 schrieb: Da würde ich mir ja lieber auf einer Minimalinstallation selber eine Desktop-Session zusammenstellen, dann muss man nur das hinzufügen, was man braucht, alles andere fehlt automatisch.
Das hat seine Reize, hab ich gar nicht dran gedacht. Welchen wm würdest du da nehmen?
Im Prinzip kannst du dafür jeden der Fenstermanager nehmen. Einen schwarzen Hintergrund kann man überall einstellen, Leiste lässt sich eigentlich auch immer deaktivieren oder müsste eh als zusätzliche Komponente installiert werden. Spontan würde ich Openbox empfehlen, weil das gar keine eigene Leiste hat, gute Unterstützung aller Standards für Fensterverwaltung mitbringt, und sich sehr individuell konfigurieren lässt. Ist bei Bedarf auch relativ einfach ein Theme anzupassen. Für Bilder kann man das dann gut mit feh ergänzen und für Videos mit mpv. Beide verfügen über umfangreiche Befehlszeilenoptionen. Und Audio braucht ja überhaupt keine visuelle Ausgabe. feh kann auch als Dienst für das Setzen eines Hintergrundbilds verwendet werden, was ggf. ganz praktisch sein kann. Was deine Textausgabe mit bspw. Regieanweisungen betrifft, könnte man noch überlegen, ob man das nicht doch mit einem Skript bspw. als Bild generieren lässt. ImageMagick wäre dafür eine Option und die Ausgabe ließe sich ggf. auch direkt in feh pipen ohne die Bilddaten zu speichern. Alternativ könnte man auch mit Textersetzung (sed oder awk) in einer SVG- oder HTML-Datei arbeiten und das in einem dezenten Webbrowser wie surf 🇬🇧 (gleichnamiges Paket in den Quellen) wiedergeben. Oder HTML zu PS/PDF konvertieren und z. B. in mupdf oder zathura pipen.
|
mrkramps
Anmeldungsdatum: 10. Oktober 2006
Beiträge: 5523
Wohnort: south central EL
|
Das wäre sogar nur mit ImageMagick ohne weiteren Bildbetrachter möglich: convert -background black -fill white -font 'Liberation-Serif' -pointsize 48 -interline-spacing 12 -size 800x -gravity Center caption:'REGIEANWEISUNG:\nBitte jetzt die Bühne auf Akt II umbauen. Danke!' -bordercolor black -border 60 show: Die Verzögerung von Bildgenerierung bis Anzeige ist minimal.
|
Zerga15
(Themenstarter)
Anmeldungsdatum: 30. Oktober 2015
Beiträge: 22
|
mrkramps schrieb: Das wäre sogar nur mit ImageMagick ohne weiteren Bildbetrachter möglich: convert -background black -fill white -font 'Liberation-Serif' -pointsize 48 -interline-spacing 12 -size 800x -gravity Center caption:'REGIEANWEISUNG:\nBitte jetzt die Bühne auf Akt II umbauen. Danke!' -bordercolor black -border 60 show: Die Verzögerung von Bildgenerierung bis Anzeige ist minimal.
Die Verzögerung ist absolut akzeptabel. Leider lässt sich die Ausgabe des convert-Befehls nicht steuern, die Shell rutscht zurück in den Prompt und das Bild bleibt stehen. Das habe ich mit "wmctrl -c" in den Griff gekriegt. Danach hab ich ein wenig weiter experimentiert. Das folgende Skript legt eine Grafikdatei auf dem Server an und gibt sie mit feh aus, was ich viel schöner finde: #! /bin/bash
MESSG=$(zenity --entry --text "Bitte Nachricht eingeben:" --title "Nachricht") 2> /dev/null
echo Die ausgegebene Nachricht lautet \""$MESSG"\"
echo Die Ausgabe mit Taste unbekannt abbrechen!
ssh user@rechner "convert -background black -fill white -font 'Liberation-Serif' -pointsize 48 -interline-spacing 12 -size 800x -gravity Center caption:\"$MESSG\" -bordercolor black -border 60 ~/tmp.jpg 2> /dev/null"
ssh user@rechner "export DISPLAY=:0 && feh -Y -F ~/tmp.jpg"
exit Im Skripten bin ich leider ein Anfänger: Eine Schleife einzurichten, die die Ausgabe von feh über eine Tasteneingabe kontrolliert abbricht kriege ich nicht hin. Muss ich da auch über wmctrl gehen? Die direkte Übergabe an feh über eine Pipeline wäre bestimmt auch eleganter, übersteigt aber leider meine Fähigkeiten. Kannste mirn Tip geben?
|
Zerga15
(Themenstarter)
Anmeldungsdatum: 30. Oktober 2015
Beiträge: 22
|
Habs gelöst: #! /bin/bash
read -p "Nachricht eingeben: " nachricht
echo Ihre Nachricht lautet \"$nachricht\" und wird ausgegeben.
convert -background black -fill white -font 'Liberation-Serif' -pointsize 48 -interline-spacing 12 -size 800x -gravity Center caption:"$nachricht" -bordercolor black -border 60 ~/tmp.jpg 2> /dev/null
feh -Y -F ~/tmp.jpg
exit Lokal speichern, via SSH anmelden und das Skript lokal ausführen. Funktioniert!
|