Get single keystroke?
Ali Çehreli
acehreli at yahoo.com
Mon Mar 21 17:18:45 PDT 2011
On 03/21/2011 03:37 PM, Andrej Mitrovic wrote:
> 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.
Thanks for posting this.
It can be improved by moving the last tcsetattr to an earlier
scope(exit) statement:
termios ostate;
tcgetattr(1, &ostate);
scope (exit) tcsetattr(1, TCSADRAIN, &ostate);
Ali
More information about the Digitalmars-d-learn
mailing list