2 * Copyright (C) 1984-2000 Mark Nudelman
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Less License, as specified in the README file.
7 * For more information about less, or for information on how to
8 * contact the author, see the README file.
13 * Routines dealing with getting input from the keyboard (i.e. from the user).
21 #if MSDOS_COMPILER==WIN32C
23 extern char WIN32getch();
24 static DWORD console_mode;
31 * Open keyboard for input.
36 #if MSDOS_COMPILER==WIN32C
37 /* Need this to let child processes inherit our console handle */
38 SECURITY_ATTRIBUTES sa;
39 memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
40 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
41 sa.bInheritHandle = TRUE;
42 tty = (int) CreateFile("CONIN$", GENERIC_READ,
44 OPEN_EXISTING, 0L, NULL);
45 GetConsoleMode((HANDLE)tty, &console_mode);
46 /* Make sure we get Ctrl+C events. */
47 SetConsoleMode((HANDLE)tty, ENABLE_PROCESSED_INPUT);
52 * Open a new handle to CON: in binary mode
53 * for unbuffered keyboard read.
57 tty = open("CON", OPEN_READ);
58 #if MSDOS_COMPILER==DJGPPC
60 * Setting stdin to binary causes Ctrl-C to not
61 * raise SIGINT. We must undo that side-effect.
63 (void) __djgpp_set_ctrl_c(1);
68 * If that doesn't work, use file descriptor 2,
69 * which in Unix is usually attached to the screen,
70 * but also usually lets you read from the keyboard.
73 /* The __open() system call translates "/dev/tty" to "con". */
74 tty = __open("/dev/tty", OPEN_READ);
76 tty = open("/dev/tty", OPEN_READ);
90 #if MSDOS_COMPILER==WIN32C
91 SetConsoleMode((HANDLE)tty, console_mode);
92 CloseHandle((HANDLE)tty);
97 * Get a character from the keyboard.
107 #if MSDOS_COMPILER && MSDOS_COMPILER != DJGPPC
109 * In raw read, we don't see ^C so look here for it.
112 #if MSDOS_COMPILER==WIN32C
123 result = iread(tty, &c, sizeof(char));
124 if (result == READ_INTR)
129 * Don't call error() here,
130 * because error calls getchr!
136 * Various parts of the program cannot handle
137 * an input character of '\0'.
138 * If a '\0' was actually typed, convert it to '\340' here.
142 } while (result != 1);