/ src / cli / keyboard.c
keyboard.c
 1  /*
 2   * keyboard.c
 3   *
 4   * Copyright (C) 1999 Jonathan St-André
 5   * Copyright (C) 1999 Hugo Villeneuve <hugo@hugovil.com>
 6   *
 7   * This file is released under the GPLv2
 8   */
 9  
10  #include <termios.h>
11  #include <unistd.h>
12  
13  static struct termios orig, newtio;
14  static int peek = -1;
15  
16  int
17  kbhit(void)
18  {
19  	char ch;
20  	int nread;
21  
22  	if (peek != -1)
23  		return 1;
24  
25  	newtio.c_cc[VMIN] = 0;
26  	tcsetattr(0, TCSANOW, &newtio);
27  	nread = read(0, &ch, 1);
28  	newtio.c_cc[VMIN] = 1;
29  	tcsetattr(0, TCSANOW, &newtio);
30  
31  	if (nread == 1) {
32  		peek = ch;
33  		return 1;
34  	}
35  
36  	return 0;
37  }
38  
39  int
40  getch(void)
41  {
42  	char ch;
43  
44  	if (peek != -1) {
45  		ch = peek;
46  		peek = -1;
47  		return ch;
48  	}
49  
50  	read(0, &ch, 1);
51  
52  	return ch;
53  }
54  
55  void
56  keyboard_init(void)
57  {
58  	tcgetattr(0, &orig);
59  	newtio = orig;
60  	newtio.c_lflag &= ~ICANON;
61  	newtio.c_lflag &= ~ECHO;
62  	newtio.c_lflag &= ~ISIG;
63  	newtio.c_cc[VMIN] = 1;
64  	newtio.c_cc[VTIME] = 0;
65  	tcsetattr(0, TCSANOW, &newtio);
66  }
67  
68  void
69  keyboard_reset(void)
70  {
71  	tcsetattr(0, TCSANOW, &orig);
72  }