# Module `lib.tools.terminal`

Getch and vt100 utilities

Expand source code

    # Distributed under Pycameresp License
    # Copyright (c) 2023 Remi BERTHOLET
    """ Getch and vt100 utilities """
    import sys
    import tools.filesystem
    import tools.strings

    if tools.filesystem.ismicropython():
            from tools.keyboard_mcp import *
    elif sys.platform == "win32":
            from tools.keyboard_win32 import *
    else:
            from tools.keyboard_linux import *

    screen_size = None
    refresh_size = 0
    def refresh_screen_size():
            """ Refresh the screen size """
            global screen_size
            try:
                    sys.stdout.write("\x1B"+"7")      # Save cursor position
                    sys.stdout.write("\x1B[999;999f") # Set cursor position far
                    sys.stdout.write("\x1B[6n")       # Cursor position report
                    try:
                            sys.stdout.flush()
                    except:
                            pass

                    size = getch(raw=False, duration=2, interchar=0.2)
                    size = size[2:-1].split(";")
                    screen_size = int(size[0]), int(size[1])
                    if screen_size[0] < 5 or screen_size[1] < 5:
                            result = screen_size
                            screen_size = None
                    else:
                            result = screen_size
            except:
                    screen_size = None
                    result = (18,40)

            sys.stdout.write("\x1B"+"8") # Restore cursor position
            kbflush()
            return result

    def get_screen_size(force=False):
            """ Get the VT100 screen size """
            # pylint:disable=global-variable-not-assigned
            global screen_size, refresh_size
            refresh_size += 1
            if refresh_size == 5:
                    force = True
                    refresh_size = 0
            if screen_size is not None and force is False:
                    return screen_size
            else:
                    return refresh_screen_size()

## Functions

`def get_screen_size(force=False)`

  Get the VT100 screen size

  Expand source code

      def get_screen_size(force=False):
              """ Get the VT100 screen size """
              # pylint:disable=global-variable-not-assigned
              global screen_size, refresh_size
              refresh_size += 1
              if refresh_size == 5:
                      force = True
                      refresh_size = 0
              if screen_size is not None and force is False:
                      return screen_size
              else:
                      return refresh_screen_size()

`def refresh_screen_size()`

  Refresh the screen size

  Expand source code

      def refresh_screen_size():
              """ Refresh the screen size """
              global screen_size
              try:
                      sys.stdout.write("\x1B"+"7")      # Save cursor position
                      sys.stdout.write("\x1B[999;999f") # Set cursor position far
                      sys.stdout.write("\x1B[6n")       # Cursor position report
                      try:
                              sys.stdout.flush()
                      except:
                              pass

                      size = getch(raw=False, duration=2, interchar=0.2)
                      size = size[2:-1].split(";")
                      screen_size = int(size[0]), int(size[1])
                      if screen_size[0] < 5 or screen_size[1] < 5:
                              result = screen_size
                              screen_size = None
                      else:
                              result = screen_size
              except:
                      screen_size = None
                      result = (18,40)

              sys.stdout.write("\x1B"+"8") # Restore cursor position
              kbflush()
              return result