From 95900a8244a74eaa78dfffe65943c89820a1b7c3 Mon Sep 17 00:00:00 2001 From: GrenderG Date: Thu, 6 Apr 2017 01:30:16 +0200 Subject: [PATCH] Entering and exiting raw mode is now working perfectly. --- tte | Bin 8664 -> 9256 bytes tte.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/tte b/tte index 321ab5891132f4a58bf0388160764e3b4c6ce201..25a8c6b7fc45dbee31f23e93da0c78770549af6b 100755 GIT binary patch literal 9256 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 Xn{aXe`MF5zvsnEbl|i*b>8$@hZ-YL- delta 2120 zcmZ`)eQZ-z6hH6vb8qYCI@f)4En6lN<*nmmEHO&EN_fSA8*I9$&=uOrV1b2}g+yfF zbXf&r;TW<+Ou!hkD1WFU0sTX^F+Tlg)2P#EtP06yQ2B%CqG9#i*ZYvnc$#;A_x#Se z_ndpry|=^4bSUk1p3(<^Nv;KOmmXX4u5{9*l5o;=>{~g{FXprcbO?h!V@^pLb3-&- zk)vS+ek^?ET72L|>%k{2?Pmu*AMlsI|Hj`(JjFO9Heg!k7Rqr-EEX2A*07w0`EW{b zdAqx|Zj%$c<$8!j63OVcosn(ZcSbs+UEQ!J9*tp(z6cZgqUV;$D`9O@xG@x2CbOU- z=;)`3K)OJRofCUYyYhhSjhu6Jby?V$4ctCw>ri`aReH1-HuWj}x6I06!=-#5D6ftt z4Ktg_r1VdiFRG6Bn(WGt$R%5SmRg%PKs}~!XZG1lmZbVUrn6*bCsqAzrn9}A9aZ(M zq<5y-048<6hEr2pl)ltYO8<@9&8^`pqaC!z%9XL(1_oD75X_vTk#{<6-X{RgueEnT zo3b=Op!CmKmDJ7Nvh!>zmbYW`1!l-*$oUmU!sd%C%}!a;J}6ry;na=cLLIVjUT>ZkYy`o6oH z&F&|Bgkm)jR?-sQA>2059cNiPLxSmwegKP6GnyDX6OKr6Es|3k0q90WoAT zit7qYW&kPy#OV8A9>)tB^UhFrnp{P!v;2So%jExj6H*Tql1Z}xORWz&YxotUbE!(q zh#Re21V4Ug^$P7cWnH~Y;U*VHem$X>>ls}@?P>f~9X8tJMMIpXwe4nhRum?;xju+3 zjzUWF`QvuCqm!r6%W(jY*^2R?eUdV1aTE*8xkzV*AraXjahz zX%($-N<|yQ@JF)Sp+`jrBvo|6Fhd-09;Y}$VUeyB0$5iV2~YAoaw!9pQAY$T*!k{h zyv+IL1w1Q{0Bp8z3Twq414^zf;*be+8_276^7qpJtzS` z-H`ibE%A2Z+5Na*s)=_3t&z{D**0KHQL(T?ZTGX*^Cq8R;mpIttFimeQO_ZkK*NF< z6O5)g+2WCB%Qgs@5%eR&gkfT}>oLSxKc*^brK{YR?$CHey)(nr40loh zC9f=Lm$pWajox}kGe4}&yea`qd26LKXVZEd_ts-WgHvx$_FV=BsrMb9R`scVI+XbU>iXm8z`G(~g}V$0}Dj xw0Z^jzoi+km3y(K$}I#iShZR-mf*`(k4yWwxx`A_y?B)$NT^Q diff --git a/tte.c b/tte.c index f8e622c..868574c 100644 --- a/tte.c +++ b/tte.c @@ -1,7 +1,87 @@ +/*** Include section ***/ + +#include +#include +#include +#include +#include #include +/*** Data section ***/ + +struct termios orig_termios; + +/*** Terminal section ***/ + +void die(const char* s) { + // perror looks for global errno variable and then prints + // a descriptive error mesage for it. + perror(s); + exit(1); +} + +void disableRawMode() { + if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios) == -1) + die("Failed to disable raw mode"); +} + +void enableRawMode() { + // Save original terminal state into orig_termios. + if (tcgetattr(STDIN_FILENO, &orig_termios) == -1) + die("Failed to get current terminal state"); + // At exit, restore the original state. + atexit(disableRawMode); + + // Modify the original state to enter in raw mode. + struct termios raw = orig_termios; + // This disables Ctrl-M, Ctrl-S and Ctrl-Q commands. + // (BRKINT, INPCK and ISTRIP are not estrictly mandatory, + // but it is recommended to turn them off in case any + // system needs it). + raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); + // Turning off all output processing (\r\n). + raw.c_oflag &= ~(OPOST); + // Setting character size to 8 bits per byte (it should be + // like that on most systems, but whatever). + raw.c_cflag |= (CS8); + // Using NOT operator on ECHO | ICANON | IEXTEN | ISIG and + // then bitwise-AND them with flags field in order to + // force c_lflag 4th bit to become 0. This disables + // chars being printed (ECHO) and let us turn off + // canonical mode in order to read input byte-by-byte + // instead of line-by-line (ICANON), ISIG disables + // Ctrl-C command and IEXTEN the Ctrl-V one. + raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); + // read() function now returns as soon as there is any + // input to be read. + raw.c_cc[VMIN] = 0; + // Forcing read() function to return every 1/10 of a + // second if there is nothing to read. + raw.c_cc[VTIME] = 1; + + if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw) == -1) + die("Failed to set raw mode"); +} + +/*** Init section ***/ + int main() { - char c; - while (read(STDIN_FILENO, &c, 1) == 1); + enableRawMode(); + + while (1) { + char c = '\0'; + // Ignoring EAGAIN to make it work on Cygwin. + if (read(STDIN_FILENO, &c, 1) == -1 && errno != EAGAIN) + die("Error reading input"); + + if (isprint(c)) + printf("%d ('%c')\r\n", c, c); + else + printf("%d\n\r", c); + + if (c == 'q') + break; + } + return 0; } \ No newline at end of file