From b6e61429d7b39f845c8dc2114951c8356dd6106e Mon Sep 17 00:00:00 2001 From: Jason Hood Date: Tue, 1 Mar 2011 21:01:37 +1000 Subject: [PATCH] Added DECTCEM to show/hide the cursor. --- ANSI.c | 28 +++++++-- ansicon.c | 4 +- ansicon.h | 2 +- ansicon.rc | 8 +-- readme.txt | 177 ++++++++++++++++++++++++++++++++++++++++------------- 5 files changed, 162 insertions(+), 57 deletions(-) diff --git a/ANSI.c b/ANSI.c index 559a947..87401d2 100644 --- a/ANSI.c +++ b/ANSI.c @@ -63,10 +63,11 @@ ignore sequences starting with \e[? & \e[>; close the handles opened by CreateProcess. - 25 & 26 February, 2011: + v1.40, 25 & 26 February, 1 March, 2011: hook GetProcAddress, addresses issues with .NET (work with PowerShell); implement SO & SI to use the DEC Special Graphics Character Set (enables - line drawing via ASCII); ignore \e(X & \e)X (where X is any character). + line drawing via ASCII); ignore \e(X & \e)X (where X is any character); + add \e[?25h & \e[?25l to show/hide the cursor (DECTCEM). */ #include "ansicon.h" @@ -478,17 +479,28 @@ void InterpretEscSeq( void ) int i; WORD attribut; CONSOLE_SCREEN_BUFFER_INFO Info; + CONSOLE_CURSOR_INFO CursInfo; DWORD len, NumberOfCharsWritten; COORD Pos; SMALL_RECT Rect; CHAR_INFO CharInfo; - // Just ignore \e[? & \e[> sequences. - if (prefix2 != 0) - return; - if (prefix == '[') { + if (prefix2 == '?' && (suffix == 'h' || suffix == 'l')) + { + if (es_argc == 1 && es_argv[0] == 25) + { + GetConsoleCursorInfo( hConOut, &CursInfo ); + CursInfo.bVisible = (suffix == 'h'); + SetConsoleCursorInfo( hConOut, &CursInfo ); + return; + } + } + // Ignore any other \e[? or \e[> sequences. + if (prefix2 != 0) + return; + GetConsoleScreenBufferInfo( hConOut, &Info ); switch (suffix) { @@ -828,6 +840,10 @@ void InterpretEscSeq( void ) } else // (prefix == ']') { + // Ignore any \e]? or \e]> sequences. + if (prefix2 != 0) + return; + if (es_argc == 1 && es_argv[0] == 0) // ESC]0;titleST { SetConsoleTitle( Pt_arg ); diff --git a/ansicon.c b/ansicon.c index 3deaadc..2323a88 100644 --- a/ansicon.c +++ b/ansicon.c @@ -49,8 +49,8 @@ -i implies -p. */ -#define PVERS L"1.32" -#define PDATE L"22 December, 2010" +#define PVERS L"1.40" +#define PDATE L"1 March, 2011" #include "ansicon.h" #include diff --git a/ansicon.h b/ansicon.h index 2d04920..608d062 100644 --- a/ansicon.h +++ b/ansicon.h @@ -28,7 +28,7 @@ void InjectDLL64( LPPROCESS_INFORMATION, LPCTSTR ); // ========== Auxiliary debug function #ifndef MYDEBUG -# define MYDEBUG 2 // 0 - no debugging +# define MYDEBUG 0 // 0 - no debugging // 1 - use OutputDebugString // 2 - use %temp%\ansicon.log #endif diff --git a/ansicon.rc b/ansicon.rc index d87cde3..6e53bae 100644 --- a/ansicon.rc +++ b/ansicon.rc @@ -7,8 +7,8 @@ #include 1 VERSIONINFO -FILEVERSION 1,3,2,0 -PRODUCTVERSION 1,3,2,0 +FILEVERSION 1,4,0,0 +PRODUCTVERSION 1,4,0,0 FILEOS VOS_NT FILETYPE VFT_APP { @@ -19,12 +19,12 @@ FILETYPE VFT_APP VALUE "Comments", "http://ansicon.adoxa.cjb.net/" VALUE "CompanyName", "Jason Hood" VALUE "FileDescription", "ANSI Console" - VALUE "FileVersion", "1.32" + VALUE "FileVersion", "1.40" VALUE "InternalName", "ansicon" VALUE "LegalCopyright", "Freeware" VALUE "OriginalFilename", "ansicon.exe" VALUE "ProductName", "ANSICON" - VALUE "ProductVersion", "1.32" + VALUE "ProductVersion", "1.40" } } diff --git a/readme.txt b/readme.txt index 237785b..362a728 100644 --- a/readme.txt +++ b/readme.txt @@ -1,9 +1,9 @@ ANSICON - Copyright 2005-2010 Jason Hood + Copyright 2005-2011 Jason Hood - Version 1.32. Freeware + Version 1.40. Freeware =========== @@ -46,22 +46,33 @@ Usage ===== + Options (case sensitive): + + -p Enable the parent process (i.e. the command shell used to + run ANSICON) to recognise escapes. + + -m Set the current (and default) attribute to grey on black + ("monochrome"), or the attribute following the `m' (please + use `COLOR /?' for attribute values). + + -e Echo the command line - the character after the `e' is + ignored, the remainder is displayed verbatim. + + -E As above, but no newline is added. + + -t Display ("type") each file (or standard input if none or the + name is "-") as though they are a single file. + + -T Display "==> FILE NAME <==", a blank line (or an error + message), the file and another blank line. + Running ANSICON with no arguments will start a new instance of the com- mand processor (the program defined by the `ComSpec' environment var- iable, typically `CMD.EXE'), or display standard input if it is redir- - ected. Passing the option `-p' (case sensitive) will enable the parent - process to recognise escapes (i.e. the command shell used to run ANSI- - CON). Use `-m' to set the current (and default) attribute to grey on - black ("monochrome"), or the attribute following the `m' (please use - `COLOR /?' for attribute values). The option `-e' will echo the command - line - the character after the `e' is ignored, the remainder is display- - ed verbatim; use `-E' to prevent a newline being written. The option - `-t' will display each file (or standard input if none or it is "-"), as - though they are a single file; `-T' will display the file name (in be- - tween "==> " and " <=="), a blank line (or an error message), the file - and another blank line. Anything else will be treated as a program and - its arguments. Eg: `ansicon -m30 -t file.ans' will display `file.ans' - using black on cyan as the default color. + ected. Any argument will be treated as a program and its arguments. + + Eg: `ansicon -m30 -t file.ans' will display `file.ans' using black on + cyan as the default color. Once installed, the ANSICON environment variable will be created. This variable is of the form "WxH (wxh)", where W & H are the width and @@ -90,38 +101,43 @@ clicking Environment Variables (using XP; Vista/7 may be different). - ========= - Sequences - ========= + ==================== + Sequences Recognised + ==================== The following escape sequences are recognised. - \e[#A CUU: CUrsor Up - \e[#B CUD: CUrsor Down - \e[#C CUF: CUrsor Forward - \e[#D CUB: CUrsor Backward - \e[#E CNL: Cursor Next Line - \e[#F CPL: Cursor Preceding Line - \e[#G CHA: Cursor Horizontal Absolute - \e[#;#H CUP: CUrsor Position - \e[#;#f HVP: Horizontal and Vertical Position - \e[s SCP: Save Cursor Position - \e[u RCP: Restore Cursor Position - \e[#J ED: Erase Display - \e[#K EL: Erase Line - \e[#L IL: Insert Lines - \e[#M DL: Delete Lines - \e[#@ ICH: Insert CHaracter - \e[#P DCH: Delete CHaracter - \e[#;#;#m SGM: Set Graphics Mode - \e[#n DSR: Device Status Report - \e[21t Report (xterm) window's title - \e]0;titleBEL Set (xterm) window's title (and icon) + \e[#A CUU CUrsor Up + \e[#B CUD CUrsor Down + \e[#C CUF CUrsor Forward + \e[#D CUB CUrsor Backward + \e[#E CNL Cursor Next Line + \e[#F CPL Cursor Preceding Line + \e[#G CHA Cursor Horizontal Absolute + \e[#;#H CUP CUrsor Position + \e[#;#f HVP Horizontal and Vertical Position + \e[s SCP Save Cursor Position + \e[u RCP Restore Cursor Position + \e[#J ED Erase Display + \e[#K EL Erase Line + \e[#L IL Insert Lines + \e[#M DL Delete Lines + \e[#@ ICH Insert CHaracter + \e[#P DCH Delete CHaracter + \e[#;#;#m SGM Set Graphics Mode + \e[#n DSR Device Status Report + \e[21t Report (xterm) window's title + \e]0;titleBEL Set (xterm) window's title (and icon) + \e[?25h DECTCEM DEC Text Cursor Enable Mode (show cursor) + \e[?25l DECTCEM DEC Text Cursor Enable Mode (hide cursor) + SO LS1 Lock shift G1 (see below) + SI LS0 Lock shift G0 `\e' represents the escape character (ASCII 27); `#' represents a - decimal number (optional, in most cases defaulting to 1). Regarding - SGM: bold will set the foreground intensity; underline and blink will - set the background intensity; conceal uses background as foreground. + decimal number (optional, in most cases defaulting to 1); BEL, SO and + SI are ASCII 7, 14 and 15. Regarding SGM: bold will set the foreground + intensity; underline and blink will set the background intensity; + conceal uses background as foreground. I make a distinction between "\e[m" and "\e[0;...m". Both will restore the original foreground/background colors (and so "0" should be the @@ -129,6 +145,69 @@ underline attributes, whilst the latter will explicitly reset them. + ================= + Sequences Ignored + ================= + + The following escape sequences are explicitly ignored. + + \e(? Designate G0 character set (`?' is anything). + \e)? Designate G1 character set (`?' is anything). + \e[?... Private sequence + \e[>... Private sequence + + The G0 character set is always ASCII; the G1 character set is always + the DEC Special Graphics Character Set. + + + ================================== + DEC Special Graphics Character Set + ================================== + + This is my interpretation of the set, as shown by + http://vt100.net/docs/vt220-rm/table2-4.html. + + + Char Unicode Code Point & Name + ---- ------------------------- + _ U+0020 Space (blank) + ` U+2666 Black Diamond Suit + a U+2592 Medium Shade + b U+2409 Symbol For Horizontal Tabulation + c U+240C Symbol For Form Feed + d U+240D Symbol For Carriage Return + e U+240A Symbol For Line Feed + f U+00B0 Degree Sign + g U+00B1 Plus-Minus Sign + h U+2424 Symbol For Newline + i U+240B Symbol For Vertical Tabulation + j U+2518 Box Drawings Light Up And Left + k U+2510 Box Drawings Light Down And Left + l U+250C Box Drawings Light Down And Right + m U+2514 Box Drawings Light Up And Right + n U+253C Box Drawings Light Vertical And Horizontal + o U+00AF Macron (SCAN 1) + p U+25AC Black Rectangle (SCAN 3) + q U+2500 Box Drawings Light Horizontal (SCAN 5) + r U+005F Low Line (SCAN 7) + s U+005F Low Line (SCAN 9) + t U+251C Box Drawings Light Vertical And Right + u U+2524 Box Drawings Light Vertical And Left + v U+2534 Box Drawings Light Up And Horizontal + w U+252C Box Drawings Light Down And Horizontal + x U+2502 Box Drawings Light Vertical + y U+2264 Less-Than Or Equal To + z U+2265 Greater-Than Or Equal To + { U+03C0 Greek Small Letter Pi + | U+2260 Not Equal To + } U+00A3 Pound Sign + ~ U+00B7 Middle Dot + + + G1-437.txt shows the glyphs according to code page 437; G1-UTF8.txt + according to UTF-8 (the file has no BOM). + + =========== Limitations =========== @@ -142,6 +221,9 @@ Building rubyinstaller on Win7 crashes (XP is fine). + Display of the DEC Special Graphics Character Set will depend on the + current font (the Symbols will probably not display correctly at all). + =============== Version History @@ -149,6 +231,11 @@ Legend: + added, - bug-fixed, * changed. + 1.40 - 1 March, 2011: + - hook GetProcAddress (now PowerShell works); + + add SO/SI, using the DEC Special Graphics Character Set for G1; + + add DECTCEM to show/hide the cursor. + 1.32 - 22 December, 2010: - fixed crash due to NULL lpNumberOfBytesWritten/lpNumberOfCharsWritten; - -p will test the parent process for validity; @@ -248,6 +335,8 @@ Luis Lavena and the Ruby people for additional improvements. + Leigh for documentation tweaks. + ======= Contact @@ -275,5 +364,5 @@ in the version text and a source diff is included. - ============================== - Jason Hood, 22 December, 2010. + ========================== + Jason Hood, 1 March, 2011.