Created
November 4, 2018 16:00
-
-
Save hapylestat/1101cc1a5bde125cc5d56c6a401a4f35 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/us/sbin/env python3 | |
| def read_single_keypress(): | |
| """Waits for a single keypress on stdin. | |
| This is a silly function to call if you need to do it a lot because it has | |
| to store stdin's current setup, setup stdin for reading single keystrokes | |
| then read the single keystroke then revert stdin back after reading the | |
| keystroke. | |
| Returns the character of the key that was pressed (zero on | |
| KeyboardInterrupt which can happen when a signal gets handled) | |
| """ | |
| import termios, fcntl, sys, os | |
| fd = sys.stdin.fileno() | |
| # save old state | |
| flags_save = fcntl.fcntl(fd, fcntl.F_GETFL) | |
| attrs_save = termios.tcgetattr(fd) | |
| # make raw - the way to do this comes from the termios(3) man page. | |
| attrs = list(attrs_save) # copy the stored version to update | |
| # iflag | |
| attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK | |
| | termios.ISTRIP | termios.INLCR | termios. IGNCR | |
| | termios.ICRNL | termios.IXON ) | |
| # oflag | |
| attrs[1] &= ~termios.OPOST | |
| # cflag | |
| attrs[2] &= ~(termios.CSIZE | termios. PARENB) | |
| attrs[2] |= termios.CS8 | |
| # lflag | |
| attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON | |
| | termios.ISIG | termios.IEXTEN) | |
| termios.tcsetattr(fd, termios.TCSANOW, attrs) | |
| # turn off non-blocking | |
| fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK) | |
| # read a single keystroke | |
| try: | |
| ret = sys.stdin.read(1) # returns a single character | |
| except KeyboardInterrupt: | |
| ret = '\x03' | |
| finally: | |
| # restore old state | |
| termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save) | |
| fcntl.fcntl(fd, fcntl.F_SETFL, flags_save) | |
| return ret | |
| while True: | |
| ch = read_single_keypress() | |
| print(str(ord(ch)) + " ", end='', flush=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment