|
NAMETerm::VT102 - a class to emulate a DEC VT102 terminalSYNOPSISuse Term::VT102; my $vt = Term::VT102->new ('cols' => 80, 'rows' => 24); while (<>) { $vt->process ($_); } DESCRIPTIONThe VT102 class provides emulation of most of the functions of a DEC VT102 terminal. Once initialised, data passed to a VT102 object is processed and the in-memory "screen" modified accordingly. This "screen" can be interrogated by the external program in a variety of ways.This allows your program to interface with full-screen console programs by running them in a subprocess and passing their output to a VT102 class. You can then see what the application has written on the screen by querying the class appropriately. OPTIONSSetting cols or rows in the new() hash allows you to change the size of the terminal being emulated. If you do not specify a size, the default is 80 columns by 24 rows.After initialisation, you can read and set the following terminal options using the option_read() and option_set() methods: LINEWRAP line wrapping; 1=on, 0=off. Default is OFF. LFTOCRLF treat LF (\n) as CRLF (\r\n); 1=on, 0=off. Default OFF. IGNOREXOFF ignore XON/XOFF characters; 1=on (ignore). Default ON. METHODSThe following methods are provided:
CALLBACKSCallbacks are the processing loop's way of letting your main program know that something has happened. They are called while in a process() loop.To specify a callback, use the callback_set interface, giving a reference to the function to call. Your function should take five scalar arguments: the VT102 object being processed, the name of the callback, and two arguments whose value depends on the callback, as shown below. The final argument is the private data scalar you passed when you called callback_set. The name of the callback is passed to the callback function so that you can have one function to handle all callbacks if you wish. Available callback names are: BELL BEL (beep, \007) character received CLEAR screen about to be cleared OUTPUT data (arg1) to be sent back to data source ROWCHANGE screen row (row number is argument 1) content has changed SCROLL_DOWN about to scroll down (arg1=top row, arg2=num to scroll) SCROLL_UP about to scroll up (ditto) UNKNOWN unknown/unsupported code (arg1=name, arg2=code/sequence) STRING string received (arg1=source, eg PM, APC, arg2=string) XICONNAME xterm icon name to be changed to arg1 XWINTITLE xterm title name to be changed to arg1 LINEFEED line feed about to be processed (arg1=row) GOTO cursor about to be moved (args=new pos) Note that the wording of the above is significant in terms of exactly when the callback is called. For instance, CLEAR is called just before the screen is cleared, whereas ROWCHANGE is called after the given row has been changed. A good callback handler for OUTPUT is to simply syswrite() argument 1 to your data source - eg if you're reading from a telnet session, write that argument straight to it. It is used for cursor position request responses and suchlike. Note that SCROLL_DOWN is called when scrolling down, so text is about to move UP the screen; arg1 will be the row number of the bottom of the scrolling region, and arg2 will be the number of rows to be scrolled. Likewise, SCROLL_UP is called when text is about to move down; arg1 will be the row number of the top of the scrolling region. The STRING callback is called for escape sequences that contain a string that would otherwise be ignored, such as DSC, PM, and APC. The first argument is the escape sequence that contained the string, such as DSC, and the second argument is the string itself. This callback doesn't get called for OSC strings. The LINEFEED callback can be thought of as "line completed", it's called when LF, NEL or IND are about to be processed or just before a line wraps, so it generally indicates that an application has finished updating a particular line on the screen. Handy for scrollback buffer processing. The GOTO callback is only called just before the cursor is explicitly moved, by one of CUU, CUD, VPR, CUF, HPR, CUB, CNL, CPL, CHA, HPA, CUP, HVP. The parameters give the destination column and row, without taking scrolling and boundaries into account. Finally, note that ROWCHANGE is only triggered when text is being entered; screen scrolling or screen clearance does not trigger it, that would trigger a SCROLL_DOWN or SCROLL_UP or CLEAR. Line or character insertion or deletion will cause one or more ROWCHANGE callbacks, however. SUPPORTED CODESThe following sequences are supported:007 (BEL) beep 010 (BS) backspace 011 (HT) horizontal tab to next tab stop 012 (LF) line feed 013 (VT) line feed 014 (FF) line feed 015 (CR) carriage return 021 (XON) resume transmission (only if option IGNOREXOFF is cleared) 023 (XOFF) stop transmission (only if option IGNOREXOFF is cleared) 030 (CAN) interrupt escape sequence 032 (SUB) interrupt escape sequence 033 (ESC) start escape sequence 177 (DEL) ignored 233 (CSI) same as ESC [ ESC 7 (DECSC) save state ESC 8 (DECRC) restore most recently saved state ESC H (HTS) set tab stop at current column ESC g visual beep - treated as BEL ESC # 8 (DECALN) DEC screen alignment test - fill screen with E's CSI @ (ICH) insert blank characters CSI A (CUU) move cursor up CSI B (CUD) move cursor down CSI C (CUF) move cursor right CSI D (CUB) move cursor left CSI E (CNL) move cursor down and to column 1 CSI F (CPL) move cursor up and to column 1 CSI G (CHA) move cursor to column in current row CSI H (CUP) move cursor to row, column CSI J (ED) erase display CSI K (EL) erase line CSI L (IL) insert blank lines CSI M (DL) delete lines CSI P (DCH) delete characters on current line CSI X (ECH) erase characters on current line CSI a (HPR) move cursor right CSI c (DA) return ESC [ ? 6 c (VT102) CSI d (VPA) move to row (current column) CSI e (VPR) move cursor down CSI f (HVP) move cursor to row, column CSI m (SGR) set graphic rendition CSI n (DSR) device status report CSI r (DECSTBM) set scrolling region to (top, bottom) rows CSI s (CUPSV) save cursor position CSI u (CUPRS) restore cursor position CSI ` (HPA) move cursor to column in current row CSI g (TBC) clear tab stop (CSI 3 g = clear all stops) LIMITATIONSUnknown escape sequences and control characters are ignored. All escape sequences pertaining to character sets are ignored.The following known control characters / sequences are ignored: 005 (ENQ) trigger answerback message 016 (SO) activate G1 charset, carriage return 017 (SI) activate G0 charset The following known escape sequences are ignored: ESC %@ (CSDFL) select default charset (ISO646/8859-1) ESC %G (CSUTF8) select UTF-8 ESC %8 (CSUTF8) select UTF-8 (obsolete) ESC (8 (G0DFL) G0 charset = default mapping (ISO8859-1) ESC (0 (G0GFX) G0 charset = VT100 graphics mapping ESC (U (G0ROM) G0 charset = null mapping (straight to ROM) ESC (K (G0USR) G0 charset = user defined mapping ESC (B (G0TXT) G0 charset = ASCII mapping ESC )8 (G1DFL) G1 charset = default mapping (ISO8859-1) ESC )0 (G1GFX) G1 charset = VT100 graphics mapping ESC )U (G1ROM) G1 charset = null mapping (straight to ROM) ESC )K (G1USR) G1 charset = user defined mapping ESC )B (G1TXT) G1 charset = ASCII mapping ESC *8 (G2DFL) G2 charset = default mapping (ISO8859-1) ESC *0 (G2GFX) G2 charset = VT100 graphics mapping ESC *U (G2ROM) G2 charset = null mapping (straight to ROM) ESC *K (G2USR) G2 charset = user defined mapping ESC +8 (G3DFL) G3 charset = default mapping (ISO8859-1) ESC +0 (G3GFX) G3 charset = VT100 graphics mapping ESC +U (G3ROM) G3 charset = null mapping (straight to ROM) ESC +K (G3USR) G3 charset = user defined mapping ESC > (DECPNM) set numeric keypad mode ESC = (DECPAM) set application keypad mode ESC N (SS2) select G2 charset for next char only ESC O (SS3) select G3 charset for next char only ESC P (DCS) device control string (ended by ST) ESC X (SOS) start of string ESC ^ (PM) privacy message (ended by ST) ESC _ (APC) application program command (ended by ST) ESC \ (ST) string terminator ESC n (LS2) invoke G2 charset ESC o (LS3) invoke G3 charset ESC | (LS3R) invoke G3 charset as GR ESC } (LS2R) invoke G2 charset as GR ESC ~ (LS1R) invoke G1 charset as GR The following known CSI (ESC [) sequences are ignored: CSI q (DECLL) set keyboard LEDs The following known CSI (ESC [) sequences are only partially supported: CSI h (SM) set mode (only support CSI ? 25 h, cursor on/off) CSI l (RM) reset mode (as above) EXAMPLESFor some examples, including how to interface Term::VT102 with Net::Telnet or a command such as SSH, please see the examples/ directory in the distribution.AUTHORSCopyright (C) 2003 Andrew Wood "<andrew dot wood at ivarch dot com>". Distributed under the terms of the Artistic License 2.0.Credit is also due to: Charles Harker <CHarker at interland.com> - reported and helped to diagnose a bug in the handling of TABs Steve van der Burg <steve.vanderburg at lhsc.on.ca> - supplied basis for an example script using Net::Telnet Chris R. Donnelly <cdonnelly at digitalmotorworks.com> - added support for DECTCEM, partial support for SM/RM Paul L. Stoddard - reported a possible bug in cursor movement handling Joerg Walter - provided a patch for Unicode handling THINGS TO WATCH OUT FORMake sure that your code understands NULL (\000) - you will get this in strings where nothing has been printed on the screen. For instance, the sequence "12\e[C34" ("12", "CUF (move right)", "34") you might think would yield the string "12 34", but in fact it can also yield "12\00034" - that is, "12" followed by a zero byte followed by "34". This is because the screen's contents defaults to zeroes, not spaces.To avoid that, use row_plaintext, which will convert NULLs to spaces, instead of row_text. Different types of terminal disagree on certain corner cases. For example, gnome-terminal and screen handle TAB stops and TABbing past the end of the screen in slightly different ways. Term::VT102 is closer to screen in the way it handles this sort of thing. SEE ALSOconsole_codes(4), IO::Pty(3)
Visit the GSP FreeBSD Man Page Interface. |