Module lib.tools.keyboard_linux
Getch utilities for linux and osx
Expand source code
# Distributed under Pycameresp License
# Copyright (c) 2023 Remi BERTHOLET
""" Getch utilities for linux and osx """
import sys
import os
import select
MAXINT = 100000000
def getch(raw = True, duration=MAXINT, interchar=0.01):
""" Wait a key pressed on keyboard and return it """
return read_keyboard(duration, raw, get_char)
def kbhit(duration=0.001):
""" Indicates if a key is pressed or not """
return read_keyboard(duration, True, test_char)
def get_char(stdins):
""" Get character """
if stdins != []:
return stdins[0].read()
return b""
def test_char(stdins):
""" Test a character """
if stdins != []:
return True
return False
def read_keyboard(duration=0.001, raw=True, callback=None):
""" Read keyboard on os/x, linux """
import tty
import termios
import fcntl
fd = sys.stdin.fileno()
oldattr = termios.tcgetattr(fd)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
try:
newattr = oldattr[:]
newattr[3] = newattr[3] & ~termios.ICANON
newattr[3] = newattr[3] & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
if raw:
tty.setraw(fd)
result = b""
try:
inp, outp, err = select.select([sys.stdin], [], [], duration)
except Exception as err:
pass
result = callback(inp)
finally:
# Reset the terminal:
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
termios.tcsetattr(fd, termios.TCSAFLUSH, oldattr)
return result
def kbflush(duration=0.5):
""" Flush all keys not yet read """
Functions
def get_char(stdins)-
Get character
Expand source code
def get_char(stdins): """ Get character """ if stdins != []: return stdins[0].read() return b"" def getch(raw=True, duration=100000000, interchar=0.01)-
Wait a key pressed on keyboard and return it
Expand source code
def getch(raw = True, duration=MAXINT, interchar=0.01): """ Wait a key pressed on keyboard and return it """ return read_keyboard(duration, raw, get_char) def kbflush(duration=0.5)-
Flush all keys not yet read
Expand source code
def kbflush(duration=0.5): """ Flush all keys not yet read """ def kbhit(duration=0.001)-
Indicates if a key is pressed or not
Expand source code
def kbhit(duration=0.001): """ Indicates if a key is pressed or not """ return read_keyboard(duration, True, test_char) def read_keyboard(duration=0.001, raw=True, callback=None)-
Read keyboard on os/x, linux
Expand source code
def read_keyboard(duration=0.001, raw=True, callback=None): """ Read keyboard on os/x, linux """ import tty import termios import fcntl fd = sys.stdin.fileno() oldattr = termios.tcgetattr(fd) oldflags = fcntl.fcntl(fd, fcntl.F_GETFL) try: newattr = oldattr[:] newattr[3] = newattr[3] & ~termios.ICANON newattr[3] = newattr[3] & ~termios.ECHO termios.tcsetattr(fd, termios.TCSANOW, newattr) fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) if raw: tty.setraw(fd) result = b"" try: inp, outp, err = select.select([sys.stdin], [], [], duration) except Exception as err: pass result = callback(inp) finally: # Reset the terminal: fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) termios.tcsetattr(fd, termios.TCSAFLUSH, oldattr) return result def test_char(stdins)-
Test a character
Expand source code
def test_char(stdins): """ Test a character """ if stdins != []: return True return False