portables "Taste einlesen", nicht blockierend

portables "Taste einlesen", nicht blockierend

am 31.05.2006 21:16:31 von Torsten Mohr

Hallo,

gibt es eine Möglichkeit unter Linux und Win32 portabel
zu detektieren ob eine Taste gedrückt wurde?

Also sowas wie:

while(1) {
$a = getch();
if(defined($a)) {
print "Taste gedrückt\n";
}

mach_was();
}

Danke für Tips,
Torsten.

Re: portables "Taste einlesen", nicht blockierend

am 31.05.2006 21:33:49 von Paul Hink

Torsten Mohr wrote:

> gibt es eine Möglichkeit unter Linux und Win32 portabel zu
> detektieren ob eine Taste gedrückt wurde?

Term::ReadKey könnte das sein, das du suchst.

Paul

Re: portables "Taste einlesen", nicht blockierend

am 01.06.2006 14:06:36 von Torsten Mohr

Hi,

> Term::ReadKey könnte das sein, das du suchst.

danke für den Tip, paßt genau.

Re: portables "Taste einlesen", nicht blockierend

am 01.06.2006 21:50:35 von Robert Berghaus

Hallo Torsten

Probier doch mal folgendes:

#!perl -w
use Term::ReadKey;
use warnings;
ReadMode('ultra-raw');
$char = ReadKey(0);
$ichar = ord($char);
printf("Dezimal: %.3d\tHex: %.2x\n", $ichar, $ichar);
ReadMode('normal');
exit;

Ich habe das unter Windows (Perl 5.8.7) und unter OS2 (Perl 5.8.0)
getestet und bekomme bei der Entertaste kein vernünftiges Ergebnis
(unter Linux funktioniert es übrigens einwandfrei).
Jede andere Taste liefert das gewünschte Ergebnis (ESC: Dezimal: 027
Hex: 1b), nur Enter scheint bis zum nächsten Tastendruck gepuffert zu
werden. Wenn ich nach Enter die Leertaste drücke (oder eine andere) so
wird der Code für Enter ausgegeben (0d).

Bisher habe ich noch nicht herausgefunden, woran das liegt. Mit einer
älteren Perlversion (5.4.55) unter OS2 funkioniert es übrigens wieder
einwandfrei.

Schönen Gruß aus dem Bergischen Land
Robert

Re: portables "Taste einlesen", nicht blockierend

am 02.06.2006 08:12:35 von f.ballandt

Guten Morgen allerseits,

eine osübergreifend gleich arbeitende Kommandozeile wünsche ich mir
schon seit langem.
Meine Systeme: cygwin, mswin, linux in verschiedenen Versionen
Das ganze ist dann auch noch terminalabhängig. Schön wäre gleiches
Verhalten dann auch noch z.B. in der Emacs(e)shell.
Das Verhalten bei Sonderzeichen ist dann noch ein anderes Thema.


Derzeit sieht mein angepaßtes Readkey so aus:

sub ReadKey1
{
my$i;
if (($^O eq "MSWin32") or ($^O eq "cygwin"))#seit update cygwinperl

#von 5.8.6 auf 5.8.7
#if ($^O eq "MSWin32")#alte variante cygwinperl von 5.8.6
{
ReadMode 3;
$i=ReadKey($_[0]);
ReadMode 0;
}
else
{
system("stty -echo") if ($_[0] and $stty);
system 'stty -icanon eol \001' if $stty;#zeilenendezeichen
my$flags = fcntl(STDIN, F_GETFL, 0)or die "Can't get flags for the
socket: $!\n";
#+nichtblockierend
fcntl(STDIN, F_SETFL, $flags | O_NONBLOCK)or die "Can't set flags for
the socket: $!\n";
$i= <>;
$i=substr($i,0,1) if defined $i;#im emacs kommts mit enter

#-nichtblockierend
fcntl(STDIN, F_SETFL, $flags)or die "Can't set flags for the socket: $!\n";
#system "stty", 'icanon', 'eol', '^@';#zeilenendezeichen ASCII null;
system 'stty icanon eol ^@' if $stty;#zeilenendezeichen ASCII null
}
system("stty echo") if ($_[0] and $stty);
return $i;
}


Frank

Re: portables "Taste einlesen", nicht blockierend

am 02.06.2006 11:25:25 von Ferry Bolhar

Torsten Mohr:

> gibt es eine Möglichkeit unter Linux und Win32 portabel
> zu detektieren ob eine Taste gedrückt wurde?
^^^^^^^^

Was ist das für ein Wort?

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: portables "Taste einlesen", nicht blockierend

am 02.06.2006 16:12:22 von Robert Berghaus

Hallo

Kannst Du das Verhalten bei der Entertaste nachvollziehen? Alles andere
funktioniert (die Cursortasten liefern 2 Codes, Ctrl-C liefert 3...).
Ich werde mal versuchen, Dein Beispiel nach OS2 umzusetzen.

Schönen Gruß aus dem Bergischen Land
Robert


f.ballandt schrieb:
> Guten Morgen allerseits,
>
> eine osübergreifend gleich arbeitende Kommandozeile wünsche ich mir
> schon seit langem.
> Meine Systeme: cygwin, mswin, linux in verschiedenen Versionen
> Das ganze ist dann auch noch terminalabhängig. Schön wäre gleiches
> Verhalten dann auch noch z.B. in der Emacs(e)shell.
> Das Verhalten bei Sonderzeichen ist dann noch ein anderes Thema.
>
>
> Derzeit sieht mein angepaßtes Readkey so aus:
>
> sub ReadKey1
> {
> my$i;
> if (($^O eq "MSWin32") or ($^O eq "cygwin"))#seit update cygwinperl
> #von 5.8.6 auf 5.8.7
> #if ($^O eq "MSWin32")#alte variante cygwinperl von 5.8.6
> {
> ReadMode 3;
> $i=ReadKey($_[0]);
> ReadMode 0;
> }
> else
> {
> system("stty -echo") if ($_[0] and $stty);
> system 'stty -icanon eol \001' if $stty;#zeilenendezeichen
> my$flags = fcntl(STDIN, F_GETFL, 0)or die "Can't get flags for the
> socket: $!\n";
> #+nichtblockierend
> fcntl(STDIN, F_SETFL, $flags | O_NONBLOCK)or die "Can't set flags
> for the socket: $!\n";
> $i= <>;
> $i=substr($i,0,1) if defined $i;#im emacs kommts mit enter
>
> #-nichtblockierend
> fcntl(STDIN, F_SETFL, $flags)or die "Can't set flags for the socket:
> $!\n";
> #system "stty", 'icanon', 'eol', '^@';#zeilenendezeichen ASCII null;
> system 'stty icanon eol ^@' if $stty;#zeilenendezeichen ASCII null
> }
> system("stty echo") if ($_[0] and $stty);
> return $i;
> }
>
>
> Frank

Re: portables "Taste einlesen", nicht blockierend

am 02.06.2006 17:18:56 von Frank Seitz

Ferry Bolhar wrote:
> Torsten Mohr:
>>
>>gibt es eine Möglichkeit unter Linux und Win32 portabel
>>zu detektieren ob eine Taste gedrückt wurde?
> ^^^^^^^^
>
> Was ist das für ein Wort?

to detect - erkennen

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: portables "Taste einlesen", nicht blockierend

am 06.06.2006 09:58:56 von Ferry Bolhar

Frank Seitz:

>>>gibt es eine Möglichkeit unter Linux und Win32 portabel
>>>zu detektieren ob eine Taste gedrückt wurde?
> > ^^^^^^^^
> >
> > Was ist das für ein Wort?
>
> to detect - erkennen

Na also - es gibt auch ein deutsches Wort dafür! ;-)

Ich finde, man kann es mit den Anglizismen auch übertreiben...

LG, Ferry

--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at

Re: portables "Taste einlesen", nicht blockierend

am 06.06.2006 13:44:38 von Torsten Mohr

Hallo,

>>>>gibt es eine Möglichkeit unter Linux und Win32 portabel
>>>>zu detektieren ob eine Taste gedrückt wurde?
>> > ^^^^^^^^
>> >
>> > Was ist das für ein Wort?
>>
>> to detect - erkennen
>
> Na also - es gibt auch ein deutsches Wort dafür! ;-)
>
> Ich finde, man kann es mit den Anglizismen auch übertreiben...

da ich den Teil verbrochen habe konnte ich auch nicht widerstehen
und habs mal im Duden nachgeschaut.

"detektieren" war nicht drin, aber "Detektor". Demnach ist es
kein Anglizismus sondern ein -- Lateinizismus sagt man nicht, oder?

Das mit dem portablen "Taste einlesen" funktioniert übrigens, danke
für die Tips.


Grüße,
Torsten.