Get single keystroke?
Andrej Mitrovic
andrej.mitrovich at gmail.com
Mon Mar 21 15:37:54 PDT 2011
On 3/21/11, teo <teo.ubuntu at yahoo.com> wrote:
> On Mon, 21 Mar 2011 23:22:17 +0100, Andrej Mitrovic wrote:
>
>> Woops forgot to add import std.stdio, here's a fixed version:
>>
>> import std.stdio : writefln;
>> import std.c.stdio;
>> import std.c.linux.termios;
>>
>> extern(C) void cfmakeraw(termios *termios_p);
>>
>> void main()
>> {
>> termios ostate; /* saved tty state */ termios
>> nstate; /* values for editor mode */
>>
>> // Open stdin in raw mode
>> /* Adjust output channel */
>> tcgetattr(1, &ostate); /* save old state */
>> tcgetattr(1, &nstate); /* get base of new
>> state */ cfmakeraw(&nstate);
>> tcsetattr(1, TCSADRAIN, &nstate); /* set mode */
>>
>> // Read characters in raw mode
>> writefln("The key hit is %s", cast(char)fgetc(stdin));
>>
>> // Close
>> tcsetattr(1, TCSADRAIN, &ostate); // return to original mode
>> }
>
> It looks like this can be dangerous, because the terminal can be left in
> an unusable state. Please read this:
> http://groups.google.com/group/comp.os.linux.development.apps/
> browse_thread/thread/0667d16089e2b6fc
>
H mentions using tcgetattr to save old state and restoring it with
tcsetattr. This is what this code does. Btw this code is not mine,
Walter posted it and I just added the cfmakeraw prototype. So kudos
goes to him.
More information about the Digitalmars-d-learn
mailing list