:mod:`!tty` --- Terminal control functions
==========================================

.. module:: tty
   :synopsis: Utility functions that perform common terminal control operations.

.. moduleauthor:: Steen Lumholt
.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>

**Source code:** :source:`Lib/tty.py`

--------------

The :mod:`tty` module defines functions for putting the tty into cbreak and raw
modes.

.. availability:: Unix.

Because it requires the :mod:`termios` module, it will work only on Unix.

The :mod:`tty` module defines the following functions:


.. function:: cfmakeraw(mode)

   Convert the tty attribute list *mode*, which is a list like the one returned
   by :func:`termios.tcgetattr`, to that of a tty in raw mode.

   .. versionadded:: 3.12


.. function:: cfmakecbreak(mode)

   Convert the tty attribute list *mode*, which is a list like the one returned
   by :func:`termios.tcgetattr`, to that of a tty in cbreak mode.

   This clears the ``ECHO`` and ``ICANON`` local mode flags in *mode* as well
   as setting the minimum input to 1 byte with no delay.

   .. versionadded:: 3.12

   .. versionchanged:: 3.12.2
      The ``ICRNL`` flag is no longer cleared. This matches Linux and macOS
      ``stty cbreak`` behavior and what :func:`setcbreak` historically did.


.. function:: setraw(fd, when=termios.TCSAFLUSH)

   Change the mode of the file descriptor *fd* to raw. If *when* is omitted, it
   defaults to :const:`termios.TCSAFLUSH`, and is passed to
   :func:`termios.tcsetattr`. The return value of :func:`termios.tcgetattr`
   is saved before setting *fd* to raw mode; this value is returned.

   .. versionchanged:: 3.12
      The return value is now the original tty attributes, instead of ``None``.


.. function:: setcbreak(fd, when=termios.TCSAFLUSH)

   Change the mode of file descriptor *fd* to cbreak. If *when* is omitted, it
   defaults to :const:`termios.TCSAFLUSH`, and is passed to
   :func:`termios.tcsetattr`. The return value of :func:`termios.tcgetattr`
   is saved before setting *fd* to cbreak mode; this value is returned.

   This clears the ``ECHO`` and ``ICANON`` local mode flags as well as setting
   the minimum input to 1 byte with no delay.

   .. versionchanged:: 3.12
      The return value is now the original tty attributes, instead of ``None``.

   .. versionchanged:: 3.12.2
      The ``ICRNL`` flag is no longer cleared. This restores the behavior
      of Python 3.11 and earlier as well as matching what Linux, macOS, & BSDs
      describe in their ``stty(1)`` man pages regarding cbreak mode.


.. seealso::

   Module :mod:`termios`
      Low-level terminal control interface.

