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