Jackie
Jackie

Reputation: 23487

Getting key without enter on OSX

Please make sure you are using OSX!

gcc info:

Using built-in specs. Target: i686-apple-darwin11 Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~28/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~28/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1 Thread model: posix gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

I am trying to get a char from keypress and display it. I am trying to do this without the Curses library (will be used for Android and OSX among others and I don't feel like porting). Based on another post I came up with the following....

#include <stdio.h>
#include <termios.h>
#include <time.h>
#include <string.h>

static char ch;
void getkey() {
  struct termios orig_term_attr;
  struct termios new_term_attr;

  /* set the terminal to raw mode */
  tcgetattr(fileno(stdin), &orig_term_attr);
  memcpy(&new_term_attr, &orig_term_attr, sizeof(struct termios));
  new_term_attr.c_lflag &= ~(ECHO|ICANON);
  new_term_attr.c_cc[VTIME] = 0;
  new_term_attr.c_cc[VMIN] = 0;
  tcsetattr(fileno(stdin), TCSANOW, &new_term_attr);

  /* read a character from the stdin stream without blocking */
  /*   returns EOF (-1) if no character is available */
  char test = fgetc(stdin); 
  if(test != -1)
    printf("Value is : %c \n",test);
  ch = test;
  /* restore the original terminal attributes */
  tcsetattr(fileno(stdin), TCSANOW, &orig_term_attr);
}

int main()
{
  do
  {
    getkey();
    int ch2 = (int) ch;
    if(ch2 != -1){
      printf("%c \n",ch);
  }
  }while(1==1);
}

But this doesn't seem to clear the buffer so when I type a then b the c I see...

aababc

This is currently being compiled and run on My OSX box with the commands gcc tect.c and ./a.out

I would like it to be abc

Upvotes: 2

Views: 189

Answers (1)

Maxime Ch&#233;ramy
Maxime Ch&#233;ramy

Reputation: 18821

Your code works but you print the character twice:

printf("Value is : %c \n",test);
printf("%c \n",ch);

I've tried myself:

Value is : a 
a 
Value is : b 
b 
Value is : c 
c 
Value is : d 
d 

By the way, you should not use a global variable but return the key instead...

Upvotes: 1

Related Questions