Source code for blessed.dec_modes

"""Class definitions for DEC Private Modes and their Response values."""

# std imports
from typing import Any, Dict, Union


[docs] class DecModeResponse: """ Container for DEC Private Mode query response. Use helper properties :attr:`~DecModeResponse.supported`, :attr:`~DecModeResponse.enabled`, :attr:`~DecModeResponse.permanent`, and :attr:`~DecModeResponse.failed` to interpret responses rather than checking numeric values directly. """ # Response value constants. Values -1 and -2 are internal abstractions # for timeout or query failure, functionally equivalent to NOT_RECOGNIZED. NOT_QUERIED = -2 NO_RESPONSE = -1 NOT_RECOGNIZED = 0 SET = 1 RESET = 2 PERMANENTLY_SET = 3 PERMANENTLY_RESET = 4 def __init__(self, mode: Union[int, "DecPrivateMode"], value: int): """ Initialize response for a DEC private mode query. :param mode: DEC private mode number :type mode: int :param value: Response value from terminal :type value: int :raises TypeError: If mode is not an integer """ if isinstance(mode, DecPrivateMode): self._mode_value = mode.value elif isinstance(mode, int): self._mode_value = mode else: raise TypeError(f"Invalid mode got {mode!r}, DecPrivateMode or int expected") self._value = value @property def mode(self) -> "DecPrivateMode": """ The :class:`DecPrivateMode` instance for this response. :rtype: DecPrivateMode """ return DecPrivateMode(self._mode_value) @property def description(self) -> str: """ Description of what this mode controls. :rtype: str """ if isinstance(self.mode, DecPrivateMode): return self.mode.long_description return "Unknown mode" @property def value(self) -> int: """ Numeric response value for compatibility. Prefer using helper properties like :attr:`~DecModeResponse.enabled` instead of checking this value directly. :rtype: int """ return self._value @property def recognized(self) -> bool: """ Check if the terminal recognizes this mode. True for any DECRPM response value > 0 (SET, RESET, PERMANENTLY_SET, or PERMANENTLY_RESET). This indicates the terminal knows about the mode, but does not guarantee the application can use or control it. :rtype: bool :returns: True if terminal acknowledges this mode """ return self.value > 0 @property def supported(self) -> bool: """ Check if the mode is supported and usable by the terminal. True for values SET (1), RESET (2), and PERMANENTLY_SET (3). PERMANENTLY_RESET (4) is excluded: the terminal acknowledges the mode but it is permanently off and cannot be enabled, so it is not usable by applications. See also xterm patch #395 and the Contour synchronized-output spec which both treat value 4 as effectively unsupported. :rtype: bool :returns: True if mode is usable (changeable or permanently enabled) """ return self.value in {1, 2, 3} @property def enabled(self) -> bool: """ Check if the mode is currently enabled. :rtype: bool :returns: True if mode is set (temporarily or permanently) """ return self.value in {1, 3} @property def disabled(self) -> bool: """ Check if the mode is currently disabled. :rtype: bool :returns: True if mode is reset (temporarily or permanently) """ return self.value in {2, 4} @property def changeable(self) -> bool: """ Check if the mode setting can be changed. :rtype: bool :returns: True if mode can be toggled by applications """ return self.value in {1, 2} @property def permanent(self) -> bool: """ Check if the mode setting is permanent. :rtype: bool :returns: True if mode cannot be changed by applications """ return self.value in {3, 4} @property def failed(self) -> bool: """ Check if the query failed. :rtype: bool :returns: True if response indicates timeout or query failure """ return self.value < 0
[docs] def to_dict(self) -> Dict[str, Any]: """ Return response as a dictionary. :rtype: dict :returns: Dictionary with keys ``value``, ``value_description``, ``mode_description``, ``mode_name``, ``supported``, ``enabled``, and ``changeable``. """ return { 'value': self.value, 'value_description': str(self), 'mode_description': self.description, 'mode_name': self.mode.name, 'supported': self.supported, 'enabled': self.enabled, 'changeable': self.changeable, }
def __str__(self) -> str: """ Return the constant name for the response value. :rtype: str """ return { self.NOT_QUERIED: "NOT_QUERIED", self.NO_RESPONSE: "NO_RESPONSE", self.NOT_RECOGNIZED: "NOT_RECOGNIZED", self.SET: "SET", self.RESET: "RESET", self.PERMANENTLY_SET: "PERMANENTLY_SET", self.PERMANENTLY_RESET: "PERMANENTLY_RESET" }.get(self.value, "UNKNOWN") def __repr__(self) -> str: """ Return full representation with mode and response details. :rtype: str """ response_name = str(self) response_value = f"({self.value})" return f"{self.mode.name}({self._mode_value}) is {response_name}{response_value}"
[docs] class DecPrivateMode: """ DEC Private Mode with mnemonic name and description. Each instance provides: - :attr:`~DecPrivateMode.value`: Numeric private mode identifier - :attr:`~DecPrivateMode.name`: Mnemonic name or "UNKNOWN" for unrecognized modes - :attr:`~DecPrivateMode.long_description`: Full description of mode functionality """ # These are *not* DecPrivateModes, in that they are not negotiable using the # DEC Private Mode sequences, but are carried in the same way, and attached # to this class for type safety, as they carry meaning that they have a # "special encoding" that is evaluated on-demand on evaluation of # term.inkey().name as 'KEY_SHIFT_F1' or testing inkey().is_alt_shift('a'). # these key "events" have special late-binding evaluations depending on the # 'mode' they were sent as. SpecialInternalLegacyCSIModifier = -3 SpecialInternalModifyOtherKeys = -2 SpecialInternalKitty = -1 # VT/DEC standard modes (using canonical mnemonics where available) the # "official" constants as published should always be used, even if cryptic, # at least they are sure to match exactly to existing documentation DECCKM = 1 DECANM = 2 DECCOLM = 3 # https://vt100.net/docs/vt510-rm/DECCOLM.html DECSCLM = 4 # https://vt100.net/docs/vt510-rm/DECSCLM.html DECSCNM = 5 # https://vt100.net/docs/vt510-rm/DECSCNM.html DECOM = 6 # https://vt100.net/docs/vt510-rm/DECOM.html DECAWM = 7 # https://vt100.net/docs/vt510-rm/DECAWM.html DECARM = 8 # https://vt100.net/docs/vt510-rm/DECARM.html DECINLM = 9 DECEDM = 10 DECLTM = 11 DECKANAM = 12 DECSCFDM = 13 DECTEM = 14 DECEKEM = 16 DECPFF = 18 DECPEX = 19 OV1 = 20 BA1 = 21 BA2 = 22 PK1 = 23 AH1 = 24 DECTCEM = 25 DECPSP = 27 DECPSM = 29 SHOW_SCROLLBAR_RXVT = 30 DECRLM = 34 DECHEBM = 35 DECHEM = 36 DECTEK = 38 DECCRNLM = 40 DECUPM = 41 DECNRCM = 42 DECGEPM = 43 DECGPCM = 44 DECGPCS = 45 DECGPBM = 46 DECGRPM = 47 DECTHAIM = 49 DECTHAICM = 50 DECBWRM = 51 DECOPM = 52 DEC131TM = 53 DECBPM = 55 DECNAKB = 57 DECIPEM = 58 DECKKDM = 59 DECHCCM = 60 DECVCCM = 61 DECPCCM = 64 DECBCMM = 65 DECNKM = 66 DECBKM = 67 DECKBUM = 68 DECVSSM = 69 DECFPM = 70 DECXRLM = 73 DECSDM = 80 DECKPM = 81 WY_52_LINE = 83 WYENAT_OFF = 84 REPLACEMENT_CHAR_COLOR = 85 DECTHAISCM = 90 DECNCSM = 95 DECRLCM = 96 DECCRTSM = 97 DECARSM = 98 DECMCM = 99 DECAAM = 100 DECCANSM = 101 DECNULM = 102 DECHDPXM = 103 DECESKM = 104 DECOSCNM = 106 DECNUMLK = 108 DECCAPSLK = 109 DECKLHIM = 110 DECFWM = 111 DECRPL = 112 DECHWUM = 113 DECATCUM = 114 DECATCBM = 115 DECBBSM = 116 DECECM = 117 # Mouse reporting modes and xterm/rxvt extensions MOUSE_REPORT_CLICK = 1000 MOUSE_HILITE_TRACKING = 1001 MOUSE_REPORT_DRAG = 1002 MOUSE_ALL_MOTION = 1003 FOCUS_IN_OUT_EVENTS = 1004 MOUSE_EXTENDED_UTF8 = 1005 MOUSE_EXTENDED_SGR = 1006 ALT_SCROLL_XTERM = 1007 SCROLL_ON_TTY_OUTPUT_RXVT = 1010 SCROLL_ON_KEYPRESS_RXVT = 1011 FAST_SCROLL = 1014 MOUSE_URXVT = 1015 MOUSE_SGR_PIXELS = 1016 BOLD_ITALIC_HIGH_INTENSITY = 1021 # Keyboard and meta key handling modes META_SETS_EIGHTH_BIT = 1034 MODIFIERS_ALT_NUMLOCK = 1035 META_SENDS_ESC = 1036 KP_DELETE_SENDS_DEL = 1037 ALT_SENDS_ESC = 1039 # Selection, clipboard, and window manager hint modes KEEP_SELECTION_NO_HILITE = 1040 USE_CLIPBOARD_SELECTION = 1041 URGENCY_ON_CTRL_G = 1042 RAISE_ON_CTRL_G = 1043 REUSE_CLIPBOARD_DATA = 1044 EXTENDED_REVERSE_WRAPAROUND = 1045 ALT_SCREEN_BUFFER_SWITCH = 1046 # Alternate screen buffer and cursor save/restore combinations ALT_SCREEN_BUFFER_XTERM = 1047 SAVE_CURSOR_DECSC = 1048 ALT_SCREEN_AND_SAVE_CLEAR = 1049 # Terminal info and function key emulation modes TERMINFO_FUNC_KEY_MODE = 1050 SUN_FUNC_KEY_MODE = 1051 HP_FUNC_KEY_MODE = 1052 SCO_FUNC_KEY_MODE = 1053 # Legacy keyboard emulation modes LEGACY_KBD_X11R6 = 1060 VT220_KBD_EMULATION = 1061 SIXEL_PRIVATE_PALETTE = 1070 # VTE BiDi extensions BIDI_ARROW_KEY_SWAPPING = 1243 # iTerm2 extensions ITERM2_REPORT_KEY_UP = 1337 # XTerm readline and mouse enhancements READLINE_MOUSE_BUTTON_1 = 2001 READLINE_MOUSE_BUTTON_2 = 2002 READLINE_MOUSE_BUTTON_3 = 2003 BRACKETED_PASTE = 2004 READLINE_CHARACTER_QUOTING = 2005 READLINE_NEWLINE_PASTING = 2006 # Modern terminal extensions SYNCHRONIZED_OUTPUT = 2026 GRAPHEME_CLUSTERING = 2027 TEXT_REFLOW = 2028 PASSIVE_MOUSE_TRACKING = 2029 REPORT_GRID_CELL_SELECTION = 2030 COLOR_PALETTE_UPDATES = 2031 IN_BAND_WINDOW_RESIZE = 2048 BRACKETED_PASTE_MIME = 5522 # VTE bidirectional text extensions MIRROR_BOX_DRAWING = 2500 BIDI_AUTODETECTION = 2501 # mintty extensions AMBIGUOUS_WIDTH_REPORTING = 7700 SCROLL_MARKERS = 7711 REWRAP_ON_RESIZE_MINTTY = 7723 APPLICATION_ESCAPE_KEY = 7727 ESC_KEY_SENDS_BACKSLASH = 7728 GRAPHICS_POSITION = 7730 ALT_MODIFIED_MOUSEWHEEL = 7765 SHOW_HIDE_SCROLLBAR = 7766 FONT_CHANGE_REPORTING = 7767 GRAPHICS_POSITION_2 = 7780 SHORTCUT_KEY_MODE = 7783 MOUSEWHEEL_REPORTING = 7786 APPLICATION_MOUSEWHEEL = 7787 BIDI_CURRENT_LINE = 7796 # Terminal-specific extensions TTCTH = 8200 SIXEL_SCROLLING_LEAVES_CURSOR = 8452 CHARACTER_MAPPING_SERVICE = 8800 AMBIGUOUS_WIDTH_DOUBLE_WIDTH = 8840 WIN32_INPUT_MODE = 9001 KITTY_HANDLE_CTRL_C_Z = 19997 MINTTY_BIDI = 77096 INPUT_METHOD_EDITOR = 737769 # Comprehensive descriptions for each mode -- it would have been nice if all # 3 mode items (value, key, description) could be defined side-by-side but # we wish to have a int-derived and like-type and not do any metaclassing, # or otherwise "unpicklable" or difficult to reason about for compatibility _LONG_DESCRIPTIONS = { SpecialInternalLegacyCSIModifier: "Non-DEC Mode used internally by Keystroke", SpecialInternalModifyOtherKeys: "Non-DEC Mode used internally by Keystroke", SpecialInternalKitty: "Non_DEC Mode used internally by Keystroke", # DEC standard modes (1-117). The "classical" names are used instead of # more friendly mnemonics, that's because most of these are legacy and # unused and it makes it easier to find out about them. DECCKM: "Cursor Keys Mode", DECANM: "ANSI/VT52 Mode", DECCOLM: "Column Mode", DECSCLM: "Scrolling Mode", DECSCNM: "Screen Mode (light or dark screen)", DECOM: "Origin Mode", DECAWM: "Auto Wrap Mode", DECARM: "Auto Repeat Mode", DECINLM: "Interlace Mode / Mouse X10 tracking", DECEDM: "Editing Mode / Show toolbar (rxvt)", DECLTM: "Line Transmit Mode", DECKANAM: "Katakana Shift Mode / Blinking cursor (xterm)", DECSCFDM: ("Space Compression/Field Delimiter Mode / " "Start blinking cursor (xterm)"), DECTEM: "Transmit Execution Mode / Enable XOR of blinking cursor control (xterm)", DECEKEM: "Edit Key Execution Mode", DECPFF: "Print Form Feed", DECPEX: "Printer Extent", OV1: "Overstrike", BA1: "Local BASIC", BA2: "Host BASIC", PK1: "Programmable Keypad", AH1: "Auto Hardcopy", DECTCEM: "Text Cursor Enable Mode", DECPSP: "Proportional Spacing", DECPSM: "Pitch Select Mode", SHOW_SCROLLBAR_RXVT: "Show scrollbar (rxvt)", DECRLM: "Cursor Right to Left Mode", DECHEBM: "Hebrew (Keyboard) Mode / Enable font-shifting functions (rxvt)", DECHEM: "Hebrew Encoding Mode", DECTEK: "Tektronix 4010/4014 Mode", DECCRNLM: "Carriage Return/New Line Mode / Allow 80⇒132 mode (xterm)", DECUPM: "Unidirectional Print Mode / more(1) fix (xterm)", DECNRCM: "National Replacement Character Set Mode", DECGEPM: "Graphics Expanded Print Mode", DECGPCM: "Graphics Print Color Mode / Turn on margin bell (xterm)", DECGPCS: "Graphics Print Color Syntax / Reverse-wraparound mode (xterm)", DECGPBM: "Graphics Print Background Mode / Start logging (xterm)", DECGRPM: "Graphics Rotated Print Mode / Use Alternate Screen Buffer (xterm)", DECTHAIM: "Thai Input Mode", DECTHAICM: "Thai Cursor Mode", DECBWRM: "Black/White Reversal Mode", DECOPM: "Origin Placement Mode", DEC131TM: "VT131 Transmit Mode", DECBPM: "Bold Page Mode", DECNAKB: "Greek/N-A Keyboard Mapping Mode", DECIPEM: "Enter IBM Proprinter Emulation Mode", DECKKDM: "Kanji/Katakana Display Mode", DECHCCM: "Horizontal Cursor Coupling", DECVCCM: "Vertical Cursor Coupling Mode", DECPCCM: "Page Cursor Coupling Mode", DECBCMM: "Business Color Matching Mode", DECNKM: "Numeric Keypad Mode", DECBKM: "Backarrow Key Mode", DECKBUM: "Keyboard Usage Mode", DECVSSM: "Vertical Split Screen Mode / DECLRMM - Left Right Margin Mode", DECFPM: "Force Plot Mode", DECXRLM: "Transmission Rate Limiting", DECSDM: "Sixel Display Mode", DECKPM: "Key Position Mode", WY_52_LINE: "52 line mode (WY-370)", WYENAT_OFF: "Erasable/nonerasable WYENAT Off attribute select (WY-370)", REPLACEMENT_CHAR_COLOR: "Replacement character color (WY-370)", DECTHAISCM: "Thai Space Compensating Mode", DECNCSM: "No Clearing Screen on Column Change Mode", DECRLCM: "Right to Left Copy Mode", DECCRTSM: "CRT Save Mode", DECARSM: "Auto Resize Mode", DECMCM: "Modem Control Mode", DECAAM: "Auto Answerback Mode", DECCANSM: "Conceal Answerback Message Mode", DECNULM: "Ignore Null Mode", DECHDPXM: "Half Duplex Mode", DECESKM: "Secondary Keyboard Language Mode", DECOSCNM: "Overscan Mode", DECNUMLK: "NumLock Mode", DECCAPSLK: "Caps Lock Mode", DECKLHIM: "Keyboard LEDs Host Indicator Mode", DECFWM: "Framed Windows Mode", DECRPL: "Review Previous Lines Mode", DECHWUM: "Host Wake-Up Mode", DECATCUM: "Alternate Text Color Underline Mode", DECATCBM: "Alternate Text Color Blink Mode", DECBBSM: "Bold and Blink Style Mode", DECECM: "Erase Color Mode", # Mouse and xterm extensions (1000+) MOUSE_REPORT_CLICK: "Send Mouse X & Y on button press", MOUSE_HILITE_TRACKING: "Use Hilite Mouse Tracking", MOUSE_REPORT_DRAG: "Use Cell Motion Mouse Tracking", MOUSE_ALL_MOTION: "Use All Motion Mouse Tracking", FOCUS_IN_OUT_EVENTS: "Send FocusIn/FocusOut events", MOUSE_EXTENDED_UTF8: "Enable UTF-8 Mouse Mode", MOUSE_EXTENDED_SGR: "Enable SGR Mouse Mode", ALT_SCROLL_XTERM: "Enable Alternate Scroll Mode", SCROLL_ON_TTY_OUTPUT_RXVT: "Scroll to bottom on tty output", SCROLL_ON_KEYPRESS_RXVT: "Scroll to bottom on key press", FAST_SCROLL: "Enable fastScroll resource", MOUSE_URXVT: "Enable urxvt Mouse Mode", MOUSE_SGR_PIXELS: "Enable SGR Mouse PixelMode", BOLD_ITALIC_HIGH_INTENSITY: "Bold/italic implies high intensity", # Keyboard and meta key handling modes META_SETS_EIGHTH_BIT: 'Interpret "meta" key', MODIFIERS_ALT_NUMLOCK: "Enable special modifiers for Alt and NumLock keys", META_SENDS_ESC: "Send ESC when Meta modifies a key", KP_DELETE_SENDS_DEL: "Send DEL from the editing-keypad Delete key", ALT_SENDS_ESC: "Send ESC when Alt modifies a key", # Selection, clipboard, and window manager hint modes KEEP_SELECTION_NO_HILITE: "Keep selection even if not highlighted", USE_CLIPBOARD_SELECTION: "Use the CLIPBOARD selection", URGENCY_ON_CTRL_G: "Enable Urgency window manager hint when Control-G is received", RAISE_ON_CTRL_G: "Enable raising of the window when Control-G is received", REUSE_CLIPBOARD_DATA: "Reuse the most recent data copied to CLIPBOARD", EXTENDED_REVERSE_WRAPAROUND: "Extended Reverse-wraparound mode (XTREVWRAP2)", ALT_SCREEN_BUFFER_SWITCH: "Enable switching to/from Alternate Screen Buffer", # Alternate screen buffer and cursor save/restore combinations ALT_SCREEN_BUFFER_XTERM: "Use Alternate Screen Buffer", SAVE_CURSOR_DECSC: "Save cursor as in DECSC", ALT_SCREEN_AND_SAVE_CLEAR: "Save cursor as in DECSC and use alternate screen buffer", # Terminal info and function key emulation modes TERMINFO_FUNC_KEY_MODE: "Set terminfo/termcap function-key mode", SUN_FUNC_KEY_MODE: "Set Sun function-key mode", HP_FUNC_KEY_MODE: "Set HP function-key mode", SCO_FUNC_KEY_MODE: "Set SCO function-key mode", # Legacy keyboard emulation modes LEGACY_KBD_X11R6: "Set legacy keyboard emulation, i.e, X11R6", VT220_KBD_EMULATION: "Set VT220 keyboard emulation", SIXEL_PRIVATE_PALETTE: "Use private color registers for each graphic", # VTE BiDi extensions BIDI_ARROW_KEY_SWAPPING: "Arrow keys swapping (BiDi)", # iTerm2 extensions ITERM2_REPORT_KEY_UP: "Report Key Up", # XTerm readline and mouse enhancements READLINE_MOUSE_BUTTON_1: "Enable readline mouse button-1", READLINE_MOUSE_BUTTON_2: "Enable readline mouse button-2", READLINE_MOUSE_BUTTON_3: "Enable readline mouse button-3", BRACKETED_PASTE: "Set bracketed paste mode", READLINE_CHARACTER_QUOTING: "Enable readline character-quoting", READLINE_NEWLINE_PASTING: "Enable readline newline pasting", # Modern terminal extensions SYNCHRONIZED_OUTPUT: "Synchronized Output", GRAPHEME_CLUSTERING: "Grapheme Clustering", TEXT_REFLOW: "Text reflow", PASSIVE_MOUSE_TRACKING: "Passive Mouse Tracking", REPORT_GRID_CELL_SELECTION: "Report grid cell selection", COLOR_PALETTE_UPDATES: "Color palette updates", IN_BAND_WINDOW_RESIZE: "In-Band Window Resize Notifications", BRACKETED_PASTE_MIME: "Bracketed Paste MIME", # VTE bidirectional text extensions MIRROR_BOX_DRAWING: "Mirror box drawing characters", BIDI_AUTODETECTION: "BiDi autodetection", # mintty extensions AMBIGUOUS_WIDTH_REPORTING: "Ambiguous width reporting", SCROLL_MARKERS: "Scroll markers (prompt start)", REWRAP_ON_RESIZE_MINTTY: "Rewrap on resize", APPLICATION_ESCAPE_KEY: "Application escape key mode", ESC_KEY_SENDS_BACKSLASH: "Send ^\\ instead of the standard ^[ for the ESC key", GRAPHICS_POSITION: "Graphics position", ALT_MODIFIED_MOUSEWHEEL: "Alt-modified mousewheel mode", SHOW_HIDE_SCROLLBAR: "Show/hide scrollbar", FONT_CHANGE_REPORTING: "Font change reporting", GRAPHICS_POSITION_2: "Graphics position", SHORTCUT_KEY_MODE: "Shortcut key mode", MOUSEWHEEL_REPORTING: "Mousewheel reporting", APPLICATION_MOUSEWHEEL: "Application mousewheel mode", BIDI_CURRENT_LINE: "BiDi on current line", # Terminal-specific extensions TTCTH: "Terminal-to-Computer Talk-back Handler", SIXEL_SCROLLING_LEAVES_CURSOR: "Sixel scrolling leaves cursor to right of graphic", CHARACTER_MAPPING_SERVICE: "enable/disable character mapping service", AMBIGUOUS_WIDTH_DOUBLE_WIDTH: "Treat ambiguous width characters as double-width", WIN32_INPUT_MODE: "win32-input-mode", KITTY_HANDLE_CTRL_C_Z: "Handle Ctrl-C/Ctrl-Z mode", MINTTY_BIDI: "BiDi", INPUT_METHOD_EDITOR: "Input Method Editor (IME) mode", } # Reverse lookup mapping from numeric value to mnemonic name _VALUE_TO_NAME = {v: k for k, v in locals().items() if k.isupper() and isinstance(v, int) and not k.startswith('_')} def __init__(self, value: int): """ Initialize DEC Private Mode with numeric identifier. :param value: Numeric DEC private mode identifier :type value: int """ self.value = int(value) self.name = self._VALUE_TO_NAME.get(value, "UNKNOWN") def __repr__(self) -> str: """ Return representation in format, ``'NAME(value)'``. :rtype: str """ return f"{self.name}({self.value})" def __int__(self) -> int: """ Return the integer value of this mode. :rtype: int """ return self.value def __index__(self) -> int: """ Return integer value for use in contexts requiring an integer index. :rtype: int """ return self.value def __eq__(self, other: Any) -> bool: """ Compare with another :class:`DecPrivateMode` or int. :param other: Object to compare with :type other: DecPrivateMode or int :rtype: bool """ if isinstance(other, DecPrivateMode): return self.value == other.value if isinstance(other, int): return self.value == other return False def __hash__(self) -> int: """ Return hash based on numeric value. :rtype: int """ return hash(self.value) @property def long_description(self) -> str: """ Full description of this DEC private mode's functionality. :rtype: str :returns: Detailed description or "Unknown mode" for unrecognized modes """ return self._LONG_DESCRIPTIONS.get(self.value, "Unknown mode")