| | """ |
| | 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 |
| |
|