|
4 | 4 |
|
5 | 5 | from termios import *
|
6 | 6 |
|
7 |
| -__all__ = ["setraw", "setcbreak"] |
| 7 | +__all__ = ["cfmakeraw", "cfmakecbreak", "setraw", "setcbreak"] |
8 | 8 |
|
9 |
| -# Indexes for termios list. |
| 9 | +# Indices for termios list. |
10 | 10 | IFLAG = 0
|
11 | 11 | OFLAG = 1
|
12 | 12 | CFLAG = 2
|
|
15 | 15 | OSPEED = 5
|
16 | 16 | CC = 6
|
17 | 17 |
|
18 |
| -def setraw(fd, when=TCSAFLUSH): |
19 |
| - """Put terminal into a raw mode.""" |
20 |
| - mode = tcgetattr(fd) |
21 |
| - mode[IFLAG] = mode[IFLAG] & ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON) |
22 |
| - mode[OFLAG] = mode[OFLAG] & ~(OPOST) |
23 |
| - mode[CFLAG] = mode[CFLAG] & ~(CSIZE | PARENB) |
24 |
| - mode[CFLAG] = mode[CFLAG] | CS8 |
25 |
| - mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON | IEXTEN | ISIG) |
| 18 | +def cfmakeraw(mode): |
| 19 | + """Make termios mode raw.""" |
| 20 | + # Clear all POSIX.1-2017 input mode flags. |
| 21 | + # See chapter 11 "General Terminal Interface" |
| 22 | + # of POSIX.1-2017 Base Definitions. |
| 23 | + mode[IFLAG] &= ~(IGNBRK | BRKINT | IGNPAR | PARMRK | INPCK | ISTRIP | |
| 24 | + INLCR | IGNCR | ICRNL | IXON | IXANY | IXOFF) |
| 25 | + |
| 26 | + # Do not post-process output. |
| 27 | + mode[OFLAG] &= ~OPOST |
| 28 | + |
| 29 | + # Disable parity generation and detection; clear character size mask; |
| 30 | + # let character size be 8 bits. |
| 31 | + mode[CFLAG] &= ~(PARENB | CSIZE) |
| 32 | + mode[CFLAG] |= CS8 |
| 33 | + |
| 34 | + # Clear all POSIX.1-2017 local mode flags. |
| 35 | + mode[LFLAG] &= ~(ECHO | ECHOE | ECHOK | ECHONL | ICANON | |
| 36 | + IEXTEN | ISIG | NOFLSH | TOSTOP) |
| 37 | + |
| 38 | + # POSIX.1-2017, 11.1.7 Non-Canonical Mode Input Processing, |
| 39 | + # Case B: MIN>0, TIME=0 |
| 40 | + # A pending read shall block until MIN (here 1) bytes are received, |
| 41 | + # or a signal is received. |
26 | 42 | mode[CC][VMIN] = 1
|
27 | 43 | mode[CC][VTIME] = 0
|
28 |
| - tcsetattr(fd, when, mode) |
29 | 44 |
|
30 |
| -def setcbreak(fd, when=TCSAFLUSH): |
31 |
| - """Put terminal into a cbreak mode.""" |
32 |
| - mode = tcgetattr(fd) |
33 |
| - mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON) |
| 45 | +def cfmakecbreak(mode): |
| 46 | + """Make termios mode cbreak.""" |
| 47 | + # Do not map CR to NL on input. |
| 48 | + mode[IFLAG] &= ~(ICRNL) |
| 49 | + |
| 50 | + # Do not echo characters; disable canonical input. |
| 51 | + mode[LFLAG] &= ~(ECHO | ICANON) |
| 52 | + |
| 53 | + # POSIX.1-2017, 11.1.7 Non-Canonical Mode Input Processing, |
| 54 | + # Case B: MIN>0, TIME=0 |
| 55 | + # A pending read shall block until MIN (here 1) bytes are received, |
| 56 | + # or a signal is received. |
34 | 57 | mode[CC][VMIN] = 1
|
35 | 58 | mode[CC][VTIME] = 0
|
36 |
| - tcsetattr(fd, when, mode) |
| 59 | + |
| 60 | +def setraw(fd, when=TCSAFLUSH): |
| 61 | + """Put terminal into raw mode.""" |
| 62 | + mode = tcgetattr(fd) |
| 63 | + new = list(mode) |
| 64 | + cfmakeraw(new) |
| 65 | + tcsetattr(fd, when, new) |
| 66 | + return mode |
| 67 | + |
| 68 | +def setcbreak(fd, when=TCSAFLUSH): |
| 69 | + """Put terminal into cbreak mode.""" |
| 70 | + mode = tcgetattr(fd) |
| 71 | + new = list(mode) |
| 72 | + cfmakecbreak(new) |
| 73 | + tcsetattr(fd, when, new) |
| 74 | + return mode |
0 commit comments