keystroke

Post Reply
Message
Author
User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

keystroke

#1 Post by killerhippy »

Hi,

hatte ich schon bei Hardware gepostet, da antwortet bloss keiner, daher hier nochmal:
---schnipp---
Hi,

ich wuerde gerne folgendes machen koennen:

---
der compi ist 'hot', aber niemand ist eingeloggert.

bei einem event blinkt numlock, zb 'mailblink' meldet mir mail

-> ich moechte dann eine bestimmte taste druecken, um einen Vorgang auszuloesen!
---

nun, ein joystick laesst sich zu sowas ja *bewegen*, wie kuerzlich hier zu lesen war.


geht das auch mit Tasten, zb F12 ???

wer hat da 'n Tip?
---schnapp---

selber kann ich nur (wenig) bash und perl. Habe aber keine Idee, wie das zu machen waere.
Es gibt keine dumme Fragen!

Killerhippy

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

Re: keystroke

#2 Post by jochen »

Hi Killerhippy!

Seit Du die Frage gestellt hast, bin ich am knobeln. Ich hatte früher schon mal so einen Fall, wo ich das brauchte, hatte aber die Details vergessen. Jetzt habe ich wieder (nach einigem recherchieren und probieren) alles auf der Leitung.

Also: Du kannst natürlich hingehen und C und den Umgang mit der curses-Bibliothek (unter Linux ncurses) lernen. Der Vorteil wäre, dass Du tatsächlich einfach die Funktionstasten verwenden kannst und dass Du davon nicht dümmer wirst <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">. Aber so viel Aufwand wolltest Du - glaub ich - nicht reinstecken.

Also machen wir's mit der Shell! Ist auch nur ein klitzekleiner Trick dabei... <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#!/bin/sh

readkey() {
OLDSTTY=`stty -g` # Sichern der Terminaleinstellungen
stty -icanon min 1 time 0 # Jedes einzelne Zeichen weitergeben
dd bs=1 count=1 # Exakt ein Zeichen lesen & ausgeben
stty $OLDSTTY # Terminaleinstellungen restaurieren
}

echo -n "Bitte drücken Sie eine Taste: "
TASTE=`readkey`
echo
echo "Sie drückten $TASTE"
exit 0
</font><hr></pre></blockquote>
Der Trick steckt in der Funktion readkey(). Mittels stty stellt man das Terminal so ein, dass es jede einzelne eingelesene Zeichen direkt weitergibt (min 1) und dabei keinen timeout hat (time 0). dd liest dann genau ein Zeichen von stdin und schreibt's auf stdout. Die Zuweisung <pre>TASTE=`readkey`</pre> setzt das Zeichen in die Variable, und dann braucht nur noch ein 'case "$TASTE" in ....' zu folgen und Dein Programm ist so gut wie fertig. Na ja, fast. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

Ach ja: Wenn Du so Passwort-Abfragen realisieren willst, setze zusätzlich bei stty noch ein "-echo" dazu, dann wird die gedrückte Taste vom Terminal nicht mehr angezeigt. Und wenn auch Backspace oder Strg-C ein Zeichen statt einer Funktion ergeben soll, setze "-isig" dazu. Funktionstasten liefern statt eines einzelnen Zeichens leider eine Zeichenfolge (F10: ^[[21~, ^[ steht dabei für ein ESC), daher wirst Du die nicht unbedingt verwenden können.

Dein Programm kann jetzt schon mal auf Tastendruck 'ne Aktion starten. Problem: Niemand ist eingeloggert. Nun, auch der getty ist ein Programm wie jedes andere und läuft, ohne dass jemand eingeloggert sein muss. Also trägt man sein Skript in die /etc/inittab ein, wie die gettys auch:<pre>ms:2345:respawn:/pfad/zu/meinem/skript </dev/tty12 >/dev/tty12 2>/dev/tty12</pre>Damit ist das Programm in den Runleveln 2, 3, 4 und 5 auf tty12 zu finden. Also (Strg-)Alt-F12 drücken, um's zu sehen.

Habe gerade alles noch mal getestet, funktioniert also wirklich <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">. Ist sogar einigermassen portabel, sofern das stty-Kommando die Parameter "min" und "time" unterstützt. Ist leider nicht bei jeder UNIX-Variante der Fall!

Viel Spass beim weiteren Basteln!
Die grösste Lüge der EDV? "Mal eben..."

User avatar
killerhippy
Posts: 529
Joined: 19. May 2000 19:36
Contact:

Re: keystroke

#3 Post by killerhippy »

Hi Jochen,

vielen Dank fuer deine soooooo grooooosse Antwort fuer mein kleines insel-probby. Find ich ja stark!

Inzwischen hatte ich mir keyb-so-undso installiert und gelesen, das spawn mit der inittab und der keymap verwendet werden kann. Fand ich cool, nur hatte ich nicht genug Zeit, und jetzt ist der konsolenfont erstmal englisch und mein one-keystroke wartet auch noch...

Aber die Situation ist klar, das Probby hat ne Loesung, vielen Dank fuer Deine Antwort.
Es gibt keine dumme Fragen!

Killerhippy

Post Reply