1 /* Noncanonical Mode Example
2 Copyright (C) 1991-2023 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, see <https://www.gnu.org/licenses/>.
23 /* Use this variable to remember original terminal attributes. */
25 struct termios saved_attributes
;
28 reset_input_mode (void)
30 tcsetattr (STDIN_FILENO
, TCSANOW
, &saved_attributes
);
38 /* Make sure stdin is a terminal. */
39 if (!isatty (STDIN_FILENO
))
41 fprintf (stderr
, "Not a terminal.\n");
45 /* Save the terminal attributes so we can restore them later. */
46 tcgetattr (STDIN_FILENO
, &saved_attributes
);
47 atexit (reset_input_mode
);
50 /* Set the funny terminal modes. */
51 tcgetattr (STDIN_FILENO
, &tattr
);
52 tattr
.c_lflag
&= ~(ICANON
|ECHO
); /* Clear ICANON and ECHO. */
54 tattr
.c_cc
[VTIME
] = 0;
55 tcsetattr (STDIN_FILENO
, TCSAFLUSH
, &tattr
);
68 read (STDIN_FILENO
, &c
, 1);
69 if (c
== '\004') /* @kbd{C-d} */
72 write (STDOUT_FILENO
, &c
, 1);