#!/usr/bin/env python3 # # Copyright © 2018, 2020 Christian Persch # # This library is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . import argparse import enum import inspect import pathlib import sys import typing from dataclasses import dataclass, field # Types class Type(enum.IntEnum): ECMA = enum.auto() # CSI n [h|l] WHAT = enum.auto() # CSI ? n [h|l] GT = enum.auto() # CSI > n [h|l] class Flags(enum.Flag): NONE = 0 WRITABLE = enum.auto() class Source(enum.Enum): CONTOUR = enum.auto() DEC = enum.auto(), DRCSTERM = enum.auto(), ECMA48 = enum.auto() # eq ISO 6429 HP = enum.auto() KITTY = enum.auto() ITERM2 = enum.auto() RLOGIN = enum.auto() SCO = enum.auto() VTE = enum.auto() WYSE = enum.auto() XDG = enum.auto() XTERM = enum.auto() @classmethod def from_name(cls, name): if name.startswith('CONTOUR'): return cls.CONTOUR elif name.startswith('DEC') or name.endswith('_DEC'): return cls.DEC elif name.startswith('DRCS'): return cls.DRCSTERM elif name.endswith('_ECMA'): return cls.ECMA35 elif name.startswith('HP') or name.endswith('_HP'): return cls.HP elif name.startswith('KITTY'): return cls.KITTY elif name.startswith('ITERM'): return cls.ITERM2 elif name.startswith('RLOGIN'): return cls.RLOGIN elif name.startswith('SCO'): return cls.SCO elif name.startswith('VTE'): return cls.VTE elif name.startswith('WY'): return cls.WYSE elif name.startswith('XDG'): return cls.XDG elif name.startswith('XTERM'): return cls.XTERM else: return cls.ECMA48 #raise ValueError(f'Could not determine source for mode {name}') # Control Sequence @dataclass(eq=True, order=True) class NamedMode: ''' A named mode ''' mtype: Type number: int name: str default: bool flags: Flags=Flags.NONE source: typing.Optional[Source]=None alias: typing.Optional[typing.List[str]]=None comment: str=None sloc_file: str=None sloc_line: int=-1 def __post_init__(self): if self.source is None: self.source = Source.from_name(self.name) if self.sloc_file is None or self.sloc_line == -1: fname = f'mode_{self.mtype.name}' stack = inspect.stack() depth = -1 for _frame in stack: depth += 1 if _frame.function == fname: depth += 1 break if depth == -1 or depth >= len(stack): raise ValueError('{self.name} source location not found') else: frame = stack[depth] self.sloc_file = frame.filename self.sloc_line = frame.lineno del stack def mode_ECMA(name, number, **kwargs): return NamedMode(mtype=Type.ECMA, name=name, number=number, **kwargs) def mode_WHAT(name, number, **kwargs): return NamedMode(mtype=Type.WHAT, name=name, number=number, **kwargs) def mode_GT(name, number, **kwargs): return NamedMode(mtype=Type.GT, name=name, number=number, **kwargs) # All known modes, ordered by type, source, and number modes = [ # Modes for SM_ECMA/RM_ECMA (CSI n [h|l]) # # Most of these are not implemented in VTE. # # References: ECMA-48 § 7 # WY370 mode_ECMA('GATM', 1, default=False), mode_ECMA('KAM', 2, default=False), mode_ECMA('CRM', 3, default=False), # IRM - insertion replacement mode # # Default: reset # # References: ECMA-48 § 7.2.10 # VT525 # mode_ECMA('IRM', 4, default=False, flags=Flags.WRITABLE), mode_ECMA('SRTM', 5, default=False), mode_ECMA('ERM', 6, default=False), mode_ECMA('VEM', 7, default=False), # BDSM - Bi-Directional Support Mode # # Reset state is explicit mode, set state is implicit mode # # References: ECMA-48 # ECMA TR/53 # Terminal-wg/bidi # # Default in ECMA: reset # Default in Terminal-wg/bidi and VTE: set # mode_ECMA('BDSM', 8, default=True, flags=Flags.WRITABLE), # DCSM defaults to RESET in ECMA, forced to SET in Terminal-wg/bidi# mode_ECMA('DCSM', 9, default=True), mode_ECMA('HEM', 10, default=False), # ECMA-48 § F.4.1 Deprecated mode_ECMA('PUM', 11, default=False), # SRM - local echo send/receive mode # If reset, characters entered by the keyboard are shown on the # screen as well as being sent to the host; if set, the # keyboard input is only sent to the host. # # Default: set # # References: ECMA-48 § 7.2.15 # VT525 # # Removed in VTE 0.60: issue #69 # mode_ECMA('SRM', 12, default=True), mode_ECMA('FEAM', 13, default=False), mode_ECMA('FETM', 14, default=False), mode_ECMA('MATM', 15, default=False), mode_ECMA('TTM', 16, default=False), mode_ECMA('SATM', 17, default=False), mode_ECMA('TSM', 18, default=False), # ECMA-48 § F.5.1 Removed mode_ECMA('EBM', 19, default=False), # LNM - line feed/newline mode # If set, the cursor moves to the first column on LF, FF, VT, # and a Return key press sends CRLF. # If reset, the cursor column is unchanged by LF, FF, VT, # and a Return key press sends CR only. # # Default: reset # # References: ECMA-48 § F.5.2 Removed! # VT525 # mode_ECMA('LNM', 20, default=False), mode_ECMA('GRCM', 21, default=True), # ECMA-48 § F.4.2 Deprecated mode_ECMA('ZDM', 22, default=False), # WYDSCM - display disable mode # If set, blanks the screen; if reset, shows the data. # # Default: reset # # References: WY370 # mode_ECMA('WYDSCM', 30, default=False), # WHYSTLINM - status line display mode # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYSTLINM', 31, default=False), # WYCRTSAVM - screen saver mode # Like DECCRTSM. # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYCRTSAVM', 32, default=False), # WYSTCURM - steady cursor mode # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYSTCURM', 33, default=False), # WYULCURM - underline cursor mode # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYULCURM', 34, default=False), # WYCLRM - width change clear disable mode # If set, the screen is not cleared when the column mode changes # by DECCOLM or WY161. # Note that this does not affect DECSCPP. # This is the same as DECNCSM mode. # # Default: set (set-up) # # References: WY370 # mode_ECMA('WYCLRM', 35, default=True), # WYDELKM - delete key definition # # Default: reset (set-up) # # References: WY370 # # Note: Same as DECBKM mode_ECMA('WYDELKM', 36, default=False), # WYGATM - send characters mode # If set, sends all characters; if reset, only erasable characters. # Like GATM above. # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYGATM', 37, default=False), # WYTEXM - send full screen/scrolling region to printer # Like DECPEX mode. # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYTEXM', 38, default=False), # WYEXTDM - extra data line # If set, the last line of the screen is used as data line and not # a status line; if reset, the last line of the screen is used # as a status line. # # Default: reset # # References: WY370 # mode_ECMA('WYEXTDM', 40, default=True), # WYASCII - WY350 personality mode # If set, switches to WY350 personality. # # Default: reset (set-up) # # References: WY370 # mode_ECMA('WYASCII', 42, default=True), # ************************************************************************ # Modes for SM_DEC/RM_DEC (CSI ? n [h|l]) # # Most of these are not implemented in VTE. # # References: VT525 # XTERM # KITTY # MINTTY # MLTERM # RLogin # URXVT # WY370 # # DEC: # DECCKM - cursor keys mode # # Controls whether the cursor keys send cursor sequences, or application # sequences. # # Default: reset # # References: VT525 # mode_WHAT('DEC_APPLICATION_CURSOR_KEYS', 1, default=False, flags=Flags.WRITABLE), # DECCOLM: 132 column mode # # Sets page width to 132 (set) or 80 (reset) columns. # # Changing this mode resets the top, bottom, left, right margins; # clears the screen (unless DECNCSM is set); resets DECLRMM; and clears # the status line if host-writable. # # Default: reset # # References: VT525 # mode_WHAT('DEC_132_COLUMN', 3, default=False, flags=Flags.WRITABLE), # DECANM - ansi-mode # Resetting this puts the terminal into VT52 compatibility mode. # To return to ECMA-48 mode, use ESC < (1/11 3/12). # # Default: set # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECANM', 2, default=True), # DECSCLM - scrolling mode # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECSCLM', 4, default=False), # DECSCNM - screen mode # If set, displays reverse; if reset, normal. # # Default: reset # # References: VT525 # mode_WHAT('DEC_REVERSE_IMAGE', 5, default=False, flags=Flags.WRITABLE), # DECOM - origin mode # If set, the cursor is restricted to within the page margins. # # On terminal reset, DECOM is reset. # # Default: reset # # References: VT525 # mode_WHAT('DEC_ORIGIN', 6, default=False, flags=Flags.WRITABLE), # DECAWM - auto wrap mode # # Controls whether text wraps to the next line when the # cursor reaches the right margin. # # Default: reset # # References: VT525 # mode_WHAT('DEC_AUTOWRAP', 7, default=False, flags=Flags.WRITABLE), # DECARM - autorepeat mode # Controls whether keys auytomatically repeat while held pressed # for more than 0.5s. # Note that /some/ keys do not repeat regardless of this setting. # # Default: set # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECARM', 8, default=True), mode_WHAT('XTERM_MOUSE_X10', 9, default=False, flags=Flags.WRITABLE), mode_WHAT('DECLTM', 11, default=False), mode_WHAT('DECEKEM', 16, default=False), # DECPFF - print FF mode # Controls whether the terminal terminates a print command by # sending a FF to the printer. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECCPFF', 18, default=False), # DECPEX - print extent mode # If set, print page prints only the scrolling region; # if reset, the complete page. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECPEX', 19, default=False), # DECTCEM - text cursor enable # If set, the text cursor is visible; if reset, invisible. # # Default: set # # References: VT525 # mode_WHAT('DEC_TEXT_CURSOR', 25, default=True, flags=Flags.WRITABLE), # DECLRM - RTL mode # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECRLM', 34, default=False), # DECHEBM - hebrew/north-american keyboard mapping mode # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECHEBM', 35, default=False), # DECHEM - hebrew encoding mode # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECHEM', 36, default=False), mode_WHAT('XTERM_DECCOLM', 40, default=False, flags=Flags.WRITABLE), # DECNRCM - NRCS mode # Operates in 7-bit (set) or 8-bit (reset) mode. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECNRCM', 42, default=False), # DECGEPM - Graphics Expanded Print Mode # # Default: reset # # References: VT330 # mode_WHAT('DECGEPM', 43, default=False), # DECGPCM - Graphics Print Colour Mode # # Default: reset # # References: VT330 # # Note: Conflicts with XTERM_MARGIN_BELL # #mode_WHAT('DECGPCM', 44, default=False), # DECGCPS - Graphics Print Colour Syntax # If set, uses RGB colour format; if reset, uses HLS colour format. # # Default: reset # # References: VT330 # # Note: conflicts with XTERM_REVERSE_WRAP # #mode_WHAT('DECGPCS', 45, default=False), # DECGPBM - Graphics Print Background Mode # # Default: reset # # References: VT330 # # Note: conflicts with XTERM_LOGGING (which VTE does not implement) # #mode_WHAT('DECGPBM', 46, default=False), # DECGRPM - Graphics Rotated Print Mode # # Default: reset # # References: VT330 # # Note: conflicts with XTERM_ALTBUF # #mode_WHAT('DECGRPM', 47, default=False), mode_WHAT('XTERM_ALTBUF', 47, default=False, flags=Flags.WRITABLE), mode_WHAT('DEC131TM', 53, default=False), # DECNAKB - greek/north-american keyboard mapping mode # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECNAKB', 57, default=False), # DECIPEM - enter/return to/from pro-printer emulation mode # Switches the terminal to (set)/from (reset) the ibm pro # printer protocol. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECIPEM', 58, default=False), # Kanji/Katakana Display Mode, from VT382-Kanji mode_WHAT('DECKKDM', 59, default=True), # DECHCCM - horizontal cursor coupling mode # Controls what happens when the cursor moves out of the left or # right margins of the window. # If set, the window pans to keep the cursor in view; if reset, # the cursor disappears. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECHCCM', 60, default=False), # DECVCCM - vertical cursor coupling mode # Controls what happens when the cursor moves out of the top or # bottom of the window, When the height of the window is smaller # than the page. # If set, the window pans to keep the cursor in view; if reset, # the cursor disappears. # # Default: set # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECVCCM', 61, default=True), # DECPCCM - page cursor coupling mode # # Default: set # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECPCCM', 64, default=True), # DECNKM - numeric/application keypad mode # Controls whether the numeric keypad sends application (set) # or keypad (reset) sequences. # # Default: reset # # References: VT525 # mode_WHAT('DEC_APPLICATION_KEYPAD', 66, default=False, flags=Flags.WRITABLE), # DECBKM - backarrow key mode # WYDELKM # # If set, the Backspace key works as a backspace key # sending the BS control; if reset, it works as a Delete # key sending the DEL control. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECBKM', 67, default=False, alias=['WYDELKM']), # DECKBUM - typewriter/data rpocessing keys mode # # If set, the keyboard keys act as data processing keys; # if reset, as typewriter keys. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECKBUM', 68, default=False), # DECLRMM - vertical split-screen mode # Controls whether a DECSLRM is executed. # On set, resets line attributes to single width and single height, # and while set, the terminal ignores any changes to line attributes. # # Default: reset # # References: VT525 # # Needs to be implemented if DECSLRM is implemented, to resolve a # conflict between DECSLRM and SCOSC. # # aka DECVSSM # mode_WHAT('DECLRMM', 69, default=False), # DECXRLM - transmit rate limit # If set, limits the transmit rate; if reset, the rate is # unlimited. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECXRLM', 73, default=False), # DECSDM - sixel display mode (scrolling) # If set, SIXEL scrolling is disabled; when reset, SIXEL scrolling # is enabled. # # Default: reset # # References: ? # # Note: Conflicts with WY161 # mode_WHAT('DECSDM', 80, default=False, flags=Flags.WRITABLE), # DECKPM - key position mode # If set, the keyboard sends extended reports (DECEKBD) that include # the key position and modifier state; if reset, it sends character codes. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECKPM', 81, default=False), # Thai Space Compensating Mode, from VT382-Thai mode_WHAT('DECTHAISCM', 90, default=False), # DECNCSM - no clear screen on DECOLM # If set, the screen is not cleared when the column mode changes # by DECCOLM. # Note that this does not affect DECSCPP. # # Default: set # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECNCSM', 95, default=False), # DECRLCM - RTL copy mode # If set, copy/paste from RTL; if reset, from LTR. # Only enabled when the keyboard language is set to hebrew. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECRLCM', 96, default=False), # DECCRTSM - CRT save mode # When set, blanks the terminal after the inactivity timeout # (set with DECCRTST). # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECRCRTSM', 97, default=False), # DECARSM - auto resize mode # Sets whether changing page arrangements automatically # changes the lines per screen. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECARSM', 98, default=False), # DECMCM - modem control mode # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECMCM', 99, default=False), # DECAAM - auto answerback mode # # Default: reset # # References: VT525 # mode_WHAT('DECAAM', 100, default=False), # DECCANSM - conceal answerback message mode # # Default: reset # # References: VT525 # # Unimplemented, since we don't support answerback at all. # mode_WHAT('DECANSM', 101, default=False), # DECNULM - null mode # If set, pass NUL to the printer; if reset, discard NUL. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECNULM', 102, default=False), # DECHDPXM - half-duplex mode # Whether to use half-duplex (set) or full-duplex (reset) mode. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECHDPXM', 103, default=False), # DECESKM - enable secondary keyboard language mode # If set, use the secondary keyboard mapping (group 2); if reset, # use the primary (group 1). # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECESKM', 104, default=False), # DECOSCNM - overscan mode # (monochrome terminal only) # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECOSCNM', 106, default=False), # DECNUMLK - num lock mode # # Set the num lock state as if by acting the NumLock key. # Set means NumLock on; reset means off. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECNUMLK', 108, default=False), # DECCAPSLK - caps lock mode # # Set the caps lock state as if by acting the CapsLock key. # Set means CapsLock on; reset means off. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECCAPSLK', 109, default=False), # DECKLHIM - keyboard LED host indicator mode # If set, the keyboard LEDs show the state from the host # (see DECLL); if reset, the local state. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECKLHIM', 110, default=False), # DECFWM - framed window mode # If set, session window frames are drawn with frame border and icon. # # Default: reset # # References: VT525 # # VTE does not support sessions. # mode_WHAT('DECFWM', 111, default=False), # DECRPL - review previous lines mode # If set, allows to view the scrollback. # # Default: set (VTE) # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECRPL', 112, default=True), # DECHWUM - host wake-up mode # If set, the terminal exits CRT save and energy save mode # when a character is received from the host. # # Default: ? # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECHWUM', 113, default=False), # DECTCUM - alternate text color underline mode # # If set, text with the undeerline attribute is underlined as # well as being displayed in the alternate coolor (if # specified); if reset, it is only displayed in the # alternate color. # # Default: ? # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECATCUM', 114, default=False), # DECTCBM - alternate text color blink mode # # If set, text with the blink attribute blinks as well # as being displayed in the alternate color (if # specified); if reset, it is only displayed in the # alternate color. # # Default: ? # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECATCBM', 115, default=False), # DECBBSM - bold and blink style mode # # If set, the bold or blink attributes affect both foreground # and background color; if reset, those affect only the foreground # color. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECBBSM', 116, default=False), # DECECM - erase color mode # # If set, erased text or new cells appearing on the screen by scrolling # are assigned the screen background color; if reset, they are assigned # the text background color. # # Default: reset # # References: VT525 # # Probably not worth implementing. # mode_WHAT('DECECM', 117, default=False), # Contour: mode_WHAT('CONTOUR_BATCHED_RENDERING', 2026, default=False), # DRCSTerm: # DRCSMM_V1 # Whether to enable DRCSMMv1 unicode mapping # # Default: reset # # References: DRCSTerm # mode_WHAT('DRCSMM_V1', 8800, default=False), # KiTTY: mode_WHAT('KITTY_STYLED_UNDERLINES', 2016, default=True), mode_WHAT('KITTY_EXTENDED_KEYBOARD', 2017, default=False), # MinTTY: mode_WHAT('MINTTY_REPORT_CJK_AMBIGUOUS_WIDTH', 7700, default=False), mode_WHAT('MINTTY_REPORT_SCROLL_MARKER_IN_CURRENT_LINE', 7711, default=False), mode_WHAT('MINTTY_APPLICATION_ESCAPE', 7727, default=False), mode_WHAT('MINTTY_ESCAPE_SENDS_FS',7728, default=False), # MINTTY_SIXEL_SCROLL_END_POSITION: # If set, sixel scrolling moves the cursor to the left margin on the # next line; if reset, moves the cursor to the right of the inserted # graphic. # # Default: reset # # References: MinTTY mode_WHAT('MINTTY_SIXEL_SCROLL_END_POSITION',7730, default=False), mode_WHAT('MINTTY_SCROLLBAR', 7766, default=False), mode_WHAT('MINTTY_REPORT_FONT_CHANGES', 7767, default=False), mode_WHAT('MINTTY_SHORTCUT_OVERRIDE', 7783, default=False), mode_WHAT('MINTTY_ALTBUF_MOUSEWHEEL_TO_CURSORKEYS', 7786, default=False), mode_WHAT('MINTTY_MOUSEWHEEL_APPLICATION_KEYS', 7787, default=False), mode_WHAT('MINTTY_BIDI_DISABLE_IN_CURRENT_LINE', 7796, default=False), # MINTTY_SIXEL_SCROLL_CURSOR_RIGHT: # If set, sixel scrolling moves the cursor to the right of the # inserted graphic; if reset, MINTTY_SIXEL_SCROLL_END_POSITION # takes effect. # # Default: reset # # References: MinTTY mode_WHAT('MINTTY_SIXEL_SCROLL_CURSOR_RIGHT', 8452, default=False, alias=['RLOGIN_SIXEL_SCROLL_CURSOR_RIGHT']), # MinTTY also knows mode 77096 "BIDI disable", and 77000..77031 # "Application control key", all of which are outside of the supported # range CSI parameters in VTE, so we don't list them here and VTE will # never support them. # RLogin: # RLogin has many private modes # [https://github.com/kmiya-culti/RLogin/blob/master/RLogin/TextRam.h#L131]: # 1406..1415, 1420..1425, 1430..1434, 1436, 1452..1481, # 8400..8406, 8416..8417, 8428..8429, 8435, 8437..8443, # 8446..8458, # and modes 7727, 7786, 8200 (home cursor on [ED 2]), # 8800 (DRCSMM_V1), 8840 (same as 8428). # # We're not going to implement them, but avoid these ranges # when assigning new mode numbers. # # The following are the ones from RLogin that MLTerm knows about: #mode_WHAT('RLOGIN_APPLICATION_ESCAPE', 7727, default=False) #mode_WHAT('RLOGIN_MOUSEWHEEL_TO_CURSORKEYS', 7786, default=False) # Ambiguous-width characters are wide (reset) or narrow (set) mode_WHAT('RLOGIN_AMBIGUOUS_WIDTH_CHARACTERS_NARROW', 8428, default=False), # XTERM also knows this one #mode_WHAT('RLOGIN_SIXEL_SCROLL_CURSOR_RIGHT', 8452, default=False), # [u]RXVT: mode_WHAT('RXVT_TOOLBAR', 10, default=False), mode_WHAT('RXVT_SCROLLBAR', 30, default=False), # Conflicts with DECHEBM #mode_WHAT('RXVT_SHIFT_KEYS', 35, default=False), mode_WHAT('RXVT_SCROLL_OUTPUT', 1010, default=False), mode_WHAT('RXVT_SCROLL_KEYPRESS', 1011, default=False), mode_WHAT('RXVT_MOUSE_EXT', 1015, default=False), # Bold/blink uses normal (reset) or high intensity (set) colour mode_WHAT('RXVT_INTENSITY_STYLES', 1021, default=True), # WYSE: # WYTEK - TEK 4010/4014 personality # If set, switches to TEK 4010/4014 personality. # # Default: reset # # References: WY370 # mode_WHAT('WYTEK', 38, default=False, alias=['DECTEK']), # WY161 - 161 column mode # If set, switches the terminal to 161 columns; if reset, # to 80 columns. # # Default: reset # # References: WY370 # # Note: Conflicts with DECSDM #mode_WHAT('WY161', 80, default=False), # WY52 - 52 lines mode # If set, switches the terminal to 52 lines; if reset, # to 24 lines. # # Default: reset # # References: WY370 # mode_WHAT('WY52', 83, default=False), # WYENAT - enable separate attributes # If set, SGR attributes may be set separately for eraseable # and noneraseable characters. If reset, the same SGR attributes # apply to both eraseable and noneraseable characters. # # # Default: reset # # References: WY370 # mode_WHAT('WYENAT', 84, default=False), # WYREPL - replacement character color # # Default: reset # # References: WY370 # mode_WHAT('WYREPL', 85, default=False), # VTE: # Whether to swap the Left and Right arrow keys if the cursor # stands over an RTL paragraph. # # Default: set # # Reference: Terminal-wg/bidi # mode_WHAT('VTE_BIDI_SWAP_ARROW_KEYS', 1243, default=True, flags=Flags.WRITABLE), # Whether box drawing characters in the U+2500..U+257F range # are to be mirrored in RTL context. # # Default: reset # # Reference: Terminal-wg/bidi # mode_WHAT('VTE_BIDI_BOX_MIRROR', 2500, default=False, flags=Flags.WRITABLE), # Whether BiDi paragraph direction is autodetected. # # Default: reset # # Reference: Terminal-wg/bidi # mode_WHAT('VTE_BIDI_AUTO', 2501, default=False, flags=Flags.WRITABLE), # XTERM: mode_WHAT('XTERM_ATT610_BLINK', 12, default=False), mode_WHAT('XTERM_CURSOR_BLINK', 13, default=False), mode_WHAT('XTERM_CURSOR_BLINK_XOR', 14, default=False), mode_WHAT('XTERM_CURSES_HACK', 41, default=False), mode_WHAT('XTERM_MARGIN_BELL', 44, default=False), mode_WHAT('XTERM_REVERSE_WRAP', 45, default=False), mode_WHAT('XTERM_LOGGING', 46, default=False), mode_WHAT('XTERM_MOUSE_VT220', 1000, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_MOUSE_VT220_HIGHLIGHT', 1001, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_MOUSE_BUTTON_EVENT', 1002, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_MOUSE_ANY_EVENT', 1003, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_FOCUS', 1004, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_MOUSE_EXT', 1005, default=False), mode_WHAT('XTERM_MOUSE_EXT_SGR', 1006, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_ALTBUF_SCROLL', 1007, default=True, flags=Flags.WRITABLE), mode_WHAT('XTERM_8BIT_META', 1034, default=False), mode_WHAT('XTERM_NUMLOCK', 1035, default=False), mode_WHAT('XTERM_META_SENDS_ESCAPE', 1036, default=True, flags=Flags.WRITABLE), mode_WHAT('XTERM_DELETE_IS_DEL', 1037, default=False), mode_WHAT('XTERM_ALT_SENDS_ESCAPE', 1039, default=False), mode_WHAT('XTERM_KEEP_SELECTION', 1040, default=False), mode_WHAT('XTERM_SELECT_TO_CLIPBOARD', 1041, default=False), mode_WHAT('XTERM_BELL_URGENT', 1042, default=False), mode_WHAT('XTERM_PRESENT_ON_BELL', 1043, default=False), mode_WHAT('XTERM_KEEP_CLIPBOARD', 1044, default=False), mode_WHAT('XTERM_ALLOW_ALTBUF', 1046, default=True), mode_WHAT('XTERM_OPT_ALTBUF', 1047, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_SAVE_CURSOR', 1048, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_OPT_ALTBUF_SAVE_CURSOR', 1049, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_FKEYS_TERMCAP', 1050, default=False), mode_WHAT('XTERM_FKEYS_SUN', 1051, default=False), mode_WHAT('XTERM_FKEYS_HP', 1052, default=False), mode_WHAT('XTERM_FKEYS_SCO', 1053, default=False), mode_WHAT('XTERM_FKEYS_LEGACY', 1060, default=False), mode_WHAT('XTERM_FKEYS_VT220', 1061, default=False), # XTERM_SIXEL_PRIVATE_COLOR_REGISTERS: # When set, each SIXEL graphic uses newly initialised colour registers. # When reset, changes to colour registers from one SIXEL image are # saved and used for the next SIXEL graphic. # # Default: set # # References: XTERM # mode_WHAT('XTERM_SIXEL_PRIVATE_COLOR_REGISTERS', 1070, default=True, flags=Flags.WRITABLE), mode_WHAT('XTERM_READLINE_BUTTON1_MOVE_POINT', 2001, default=False), mode_WHAT('XTERM_READLINE_BUTTON2_MOVE_POINT', 2002, default=False), mode_WHAT('XTERM_READLINE_DBLBUTTON3_DELETE', 2003, default=False), # Whether to surround pasted text with CSI ~ sequences # # Default: reset # # References: XTERM # mode_WHAT('XTERM_READLINE_BRACKETED_PASTE', 2004, default=False, flags=Flags.WRITABLE), mode_WHAT('XTERM_READLINE_PASTE_QUOTE', 2005, default=False), mode_WHAT('XTERM_READLINE_PASTE_LITERAL_NL', 2006, default=False), # ************************************************************************ # Modes for SM_HP/RM_HP (CSI > n [h|l]) # # None of these are not implemented in VTE. # # References: HP 2397A # HP: # HP_MULTIPAGE: # If set, the terminal has multiple pages of 24 lines of display memory. # If reset, the terminal only has one page of 24 lines of display memory # # Default: reset # # References: HP 2397A mode_GT('HP_MULTIPAGE', 1, default=False), # HP_MEMLOCK: # # Default: reset # # References: HP 2397A mode_GT('HP_MEMLOCK', 2, default=False), ] # Output generator ''' Write copyright header ''' def write_header(outfile): outfile.write(''' /* Generated by modes.py; do not edit! */ /* * Copyright © 2018, 2020 Christian Persch * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ ''') ''' Write sequences ''' def write_modes(output, mtype): outfile = open(output.as_posix(), 'w') write_header(outfile) outfile.write(''' #if !defined(MODE) || !defined(MODE_FIXED) #error "Must define MODE and MODE_FIXED before including this file" #endif ''') for m in sorted([m for m in modes if m.mtype == mtype], key=lambda m: m.number): if m.flags & Flags.WRITABLE: outfile.write(f'MODE(' f'{m.name}, ' f'{m.number})\n') else: value = 'ALWAYS_SET' if m.default else 'ALWAYS_RESET' outfile.write(f'MODE_FIXED(' f'{m.name}, ' f'{m.number}, ' f'{value})\n') # main ''' main ''' if __name__ == '__main__': parser = argparse.ArgumentParser(description='modes include file generator') parser.add_argument('--destdir', type=pathlib.Path, default=pathlib.PosixPath('.'), help='Output directory') try: args = parser.parse_args() except Exception as e: print(f'Failed to parse arguments: {e}') sys.exit(1) write_modes(args.destdir / "modes-ecma.hh", Type.ECMA) write_modes(args.destdir / "modes-dec.hh", Type.WHAT) # write_modes(args.destdir / "modes-hp.hh", Type.GT)