From 41371775e3793f623e0ed720a35b093131430466 Mon Sep 17 00:00:00 2001 From: Kiritow <1362050620@qq.com> Date: Fri, 11 May 2018 16:33:23 +0800 Subject: [PATCH] Add getch() implement without conio.h --- ConsoleUI/ColorUI.cpp | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/ConsoleUI/ColorUI.cpp b/ConsoleUI/ColorUI.cpp index fc2dda6..00c06b2 100644 --- a/ConsoleUI/ColorUI.cpp +++ b/ConsoleUI/ColorUI.cpp @@ -1,12 +1,49 @@ #include "ColorUI.h" #include -#include // getch #ifdef _WIN32 #include +#include // getch #else #include +/// Fix getch() without conio.h +#include + +struct termios _old, _new; +/* Initialize new terminal i/o settings */ +void initTermios(int echo) +{ + tcgetattr(0, &_old); /* grab old terminal i/o settings */ + new = old; /* make new settings same as old settings */ + new.c_lflag &= ~ICANON; /* disable buffered i/o */ + new.c_lflag &= echo ? ECHO : ~ECHO; /* set echo mode */ + tcsetattr(0, TCSANOW, &_new); /* use these new terminal i/o settings now */ +} +/* Restore old terminal i/o settings */ +void resetTermios(void) +{ + tcsetattr(0, TCSANOW, &old); +} +/* Read 1 character - echo defines echo mode */ +char getch_(int echo) +{ + char ch; + initTermios(echo); + ch = getchar(); + resetTermios(); + return ch; +} +/* Read 1 character without echo */ +char getch(void) +{ + return getch_(0); +} +/* Read 1 character with echo */ +char getche(void) +{ + return getch_(1); +} #endif namespace _cns