|
""" |
|
Interface for an output. |
|
""" |
|
|
|
from __future__ import annotations |
|
|
|
from abc import ABCMeta, abstractmethod |
|
from typing import TextIO |
|
|
|
from prompt_toolkit.cursor_shapes import CursorShape |
|
from prompt_toolkit.data_structures import Size |
|
from prompt_toolkit.styles import Attrs |
|
|
|
from .color_depth import ColorDepth |
|
|
|
__all__ = [ |
|
"Output", |
|
"DummyOutput", |
|
] |
|
|
|
|
|
class Output(metaclass=ABCMeta): |
|
""" |
|
Base class defining the output interface for a |
|
:class:`~prompt_toolkit.renderer.Renderer`. |
|
|
|
Actual implementations are |
|
:class:`~prompt_toolkit.output.vt100.Vt100_Output` and |
|
:class:`~prompt_toolkit.output.win32.Win32Output`. |
|
""" |
|
|
|
stdout: TextIO | None = None |
|
|
|
@abstractmethod |
|
def fileno(self) -> int: |
|
"Return the file descriptor to which we can write for the output." |
|
|
|
@abstractmethod |
|
def encoding(self) -> str: |
|
""" |
|
Return the encoding for this output, e.g. 'utf-8'. |
|
(This is used mainly to know which characters are supported by the |
|
output the data, so that the UI can provide alternatives, when |
|
required.) |
|
""" |
|
|
|
@abstractmethod |
|
def write(self, data: str) -> None: |
|
"Write text (Terminal escape sequences will be removed/escaped.)" |
|
|
|
@abstractmethod |
|
def write_raw(self, data: str) -> None: |
|
"Write text." |
|
|
|
@abstractmethod |
|
def set_title(self, title: str) -> None: |
|
"Set terminal title." |
|
|
|
@abstractmethod |
|
def clear_title(self) -> None: |
|
"Clear title again. (or restore previous title.)" |
|
|
|
@abstractmethod |
|
def flush(self) -> None: |
|
"Write to output stream and flush." |
|
|
|
@abstractmethod |
|
def erase_screen(self) -> None: |
|
""" |
|
Erases the screen with the background color and moves the cursor to |
|
home. |
|
""" |
|
|
|
@abstractmethod |
|
def enter_alternate_screen(self) -> None: |
|
"Go to the alternate screen buffer. (For full screen applications)." |
|
|
|
@abstractmethod |
|
def quit_alternate_screen(self) -> None: |
|
"Leave the alternate screen buffer." |
|
|
|
@abstractmethod |
|
def enable_mouse_support(self) -> None: |
|
"Enable mouse." |
|
|
|
@abstractmethod |
|
def disable_mouse_support(self) -> None: |
|
"Disable mouse." |
|
|
|
@abstractmethod |
|
def erase_end_of_line(self) -> None: |
|
""" |
|
Erases from the current cursor position to the end of the current line. |
|
""" |
|
|
|
@abstractmethod |
|
def erase_down(self) -> None: |
|
""" |
|
Erases the screen from the current line down to the bottom of the |
|
screen. |
|
""" |
|
|
|
@abstractmethod |
|
def reset_attributes(self) -> None: |
|
"Reset color and styling attributes." |
|
|
|
@abstractmethod |
|
def set_attributes(self, attrs: Attrs, color_depth: ColorDepth) -> None: |
|
"Set new color and styling attributes." |
|
|
|
@abstractmethod |
|
def disable_autowrap(self) -> None: |
|
"Disable auto line wrapping." |
|
|
|
@abstractmethod |
|
def enable_autowrap(self) -> None: |
|
"Enable auto line wrapping." |
|
|
|
@abstractmethod |
|
def cursor_goto(self, row: int = 0, column: int = 0) -> None: |
|
"Move cursor position." |
|
|
|
@abstractmethod |
|
def cursor_up(self, amount: int) -> None: |
|
"Move cursor `amount` place up." |
|
|
|
@abstractmethod |
|
def cursor_down(self, amount: int) -> None: |
|
"Move cursor `amount` place down." |
|
|
|
@abstractmethod |
|
def cursor_forward(self, amount: int) -> None: |
|
"Move cursor `amount` place forward." |
|
|
|
@abstractmethod |
|
def cursor_backward(self, amount: int) -> None: |
|
"Move cursor `amount` place backward." |
|
|
|
@abstractmethod |
|
def hide_cursor(self) -> None: |
|
"Hide cursor." |
|
|
|
@abstractmethod |
|
def show_cursor(self) -> None: |
|
"Show cursor." |
|
|
|
@abstractmethod |
|
def set_cursor_shape(self, cursor_shape: CursorShape) -> None: |
|
"Set cursor shape to block, beam or underline." |
|
|
|
@abstractmethod |
|
def reset_cursor_shape(self) -> None: |
|
"Reset cursor shape." |
|
|
|
def ask_for_cpr(self) -> None: |
|
""" |
|
Asks for a cursor position report (CPR). |
|
(VT100 only.) |
|
""" |
|
|
|
@property |
|
def responds_to_cpr(self) -> bool: |
|
""" |
|
`True` if the `Application` can expect to receive a CPR response after |
|
calling `ask_for_cpr` (this will come back through the corresponding |
|
`Input`). |
|
|
|
This is used to determine the amount of available rows we have below |
|
the cursor position. In the first place, we have this so that the drop |
|
down autocompletion menus are sized according to the available space. |
|
|
|
On Windows, we don't need this, there we have |
|
`get_rows_below_cursor_position`. |
|
""" |
|
return False |
|
|
|
@abstractmethod |
|
def get_size(self) -> Size: |
|
"Return the size of the output window." |
|
|
|
def bell(self) -> None: |
|
"Sound bell." |
|
|
|
def enable_bracketed_paste(self) -> None: |
|
"For vt100 only." |
|
|
|
def disable_bracketed_paste(self) -> None: |
|
"For vt100 only." |
|
|
|
def reset_cursor_key_mode(self) -> None: |
|
""" |
|
For vt100 only. |
|
Put the terminal in normal cursor mode (instead of application mode). |
|
|
|
See: https://vt100.net/docs/vt100-ug/chapter3.html |
|
""" |
|
|
|
def scroll_buffer_to_prompt(self) -> None: |
|
"For Win32 only." |
|
|
|
def get_rows_below_cursor_position(self) -> int: |
|
"For Windows only." |
|
raise NotImplementedError |
|
|
|
@abstractmethod |
|
def get_default_color_depth(self) -> ColorDepth: |
|
""" |
|
Get default color depth for this output. |
|
|
|
This value will be used if no color depth was explicitly passed to the |
|
`Application`. |
|
|
|
.. note:: |
|
|
|
If the `$PROMPT_TOOLKIT_COLOR_DEPTH` environment variable has been |
|
set, then `outputs.defaults.create_output` will pass this value to |
|
the implementation as the default_color_depth, which is returned |
|
here. (This is not used when the output corresponds to a |
|
prompt_toolkit SSH/Telnet session.) |
|
""" |
|
|
|
|
|
class DummyOutput(Output): |
|
""" |
|
For testing. An output class that doesn't render anything. |
|
""" |
|
|
|
def fileno(self) -> int: |
|
"There is no sensible default for fileno()." |
|
raise NotImplementedError |
|
|
|
def encoding(self) -> str: |
|
return "utf-8" |
|
|
|
def write(self, data: str) -> None: |
|
pass |
|
|
|
def write_raw(self, data: str) -> None: |
|
pass |
|
|
|
def set_title(self, title: str) -> None: |
|
pass |
|
|
|
def clear_title(self) -> None: |
|
pass |
|
|
|
def flush(self) -> None: |
|
pass |
|
|
|
def erase_screen(self) -> None: |
|
pass |
|
|
|
def enter_alternate_screen(self) -> None: |
|
pass |
|
|
|
def quit_alternate_screen(self) -> None: |
|
pass |
|
|
|
def enable_mouse_support(self) -> None: |
|
pass |
|
|
|
def disable_mouse_support(self) -> None: |
|
pass |
|
|
|
def erase_end_of_line(self) -> None: |
|
pass |
|
|
|
def erase_down(self) -> None: |
|
pass |
|
|
|
def reset_attributes(self) -> None: |
|
pass |
|
|
|
def set_attributes(self, attrs: Attrs, color_depth: ColorDepth) -> None: |
|
pass |
|
|
|
def disable_autowrap(self) -> None: |
|
pass |
|
|
|
def enable_autowrap(self) -> None: |
|
pass |
|
|
|
def cursor_goto(self, row: int = 0, column: int = 0) -> None: |
|
pass |
|
|
|
def cursor_up(self, amount: int) -> None: |
|
pass |
|
|
|
def cursor_down(self, amount: int) -> None: |
|
pass |
|
|
|
def cursor_forward(self, amount: int) -> None: |
|
pass |
|
|
|
def cursor_backward(self, amount: int) -> None: |
|
pass |
|
|
|
def hide_cursor(self) -> None: |
|
pass |
|
|
|
def show_cursor(self) -> None: |
|
pass |
|
|
|
def set_cursor_shape(self, cursor_shape: CursorShape) -> None: |
|
pass |
|
|
|
def reset_cursor_shape(self) -> None: |
|
pass |
|
|
|
def ask_for_cpr(self) -> None: |
|
pass |
|
|
|
def bell(self) -> None: |
|
pass |
|
|
|
def enable_bracketed_paste(self) -> None: |
|
pass |
|
|
|
def disable_bracketed_paste(self) -> None: |
|
pass |
|
|
|
def scroll_buffer_to_prompt(self) -> None: |
|
pass |
|
|
|
def get_size(self) -> Size: |
|
return Size(rows=40, columns=80) |
|
|
|
def get_rows_below_cursor_position(self) -> int: |
|
return 40 |
|
|
|
def get_default_color_depth(self) -> ColorDepth: |
|
return ColorDepth.DEPTH_1_BIT |
|
|