122 Commits

Author SHA1 Message Date
Jason Hood
2cb2af78c8 Close the flush handles on detach 2018-04-26 10:02:58 +10:00
Jason Hood
3a16e68201 Create the flush thread on first use
Some processes just return from the entry point; this only exits the
thread, not the process.  It seems that when ANSICON created its flush
thread in DllMain, that became the primary thread, so when the entry
point returned the process was still waiting for the flush thread to
exit.  Creating the flush thread the first time it is used avoids this
problem, letting the process exit.
2018-02-16 17:18:25 +10:00
Jason Hood
c232c1ff37 Release v1.82 2018-02-13 16:12:07 +10:00
Jason Hood
a995352ff1 Use APIConsole for all console imports
Windows 10 has defined more console functions outside of `kernel32.dll`.
2018-02-13 12:31:40 +10:00
Jason Hood
392337b3b1 Wrap the cache in a critical section
Git's error messages were being truncated.  Turns out git used two
threads, one writing to the console and one to file.  This caused a
conflict in `IsConsoleHandle` when the cache was updated.  Making it a
critical section solves the issue.
2018-02-12 21:50:43 +10:00
Jason Hood
0366daad05 Flush and invalidate cache on closing handle 2018-02-12 21:49:43 +10:00
Jason Hood
af2c31c466 Add ANSICON_WRAP for programs that expect wrap
Some programs (notably less) rely on the right margin performing the
wrap.  Add such programs to the ANSICON_WRAP environment variable to
stop ANSICON suppressing the newline.
2018-02-12 16:44:55 +10:00
Jason Hood
a2c3595477 Release 1.81 2017-12-30 11:46:02 +10:00
Jason Hood
3c61ef860d Improve palette usage
Support the entire 256-color palette.  When specifying an index or RGB
color, find the nearest match in the console palette.  Preserve bold and
underline when setting color by index.	Getting all palette entries will
stop at 15 if the initial index is below that (i.e. `0;*` will get 0 to
15 and `16;*` will get 16 to 255).
2017-12-30 11:13:03 +10:00
Jason Hood
05e765c881 Fix buffer overflow
Turns out testing for an empty buffer outside the critical section
wasn't a good idea (testing in a virtual 10 started the thread between
the test and enter, causing buffer overflow in the small loop).
2017-12-26 18:43:56 +10:00
Jason Hood
44e5941a08 Fix CR and CRM issues
CR and BS would still be processed during CRM.	Fix all the partial CRM
sequences followed by a complete CRM sequence.

It's possible for some text files to have `\r\r\n` endings (Microsoft
converts LF to CRLF even when the CR is already there).  Collapse
multiple CRs to a single CR to catch this.  It is also necessary to
always delay flushing if the last character is CR, to see if the next
character is CR or LF.
2017-12-26 16:47:08 +10:00
Jason Hood
2120ff3efa Fix CR
Having CR go back to the beginning of a wrapped line is not a good idea
when it's followed by LF.
2017-12-24 23:44:26 +10:00
Jason Hood
75f707fc20 Hide cursor on move
Setting the cursor position on a non-active buffer still displays it on
the active buffer.  Hide the cursor, set the position, show the cursor
is a sufficient workaround.
2017-12-24 22:39:53 +10:00
Jason Hood
e8247f3aa7 Fix CRM
Small writes would not normally display controls.
2017-12-24 18:23:32 +10:00
Jason Hood
62f7d0240e Flush when idle
Flush 15ms after the last write.  This would typically be needed to show
a progress display.
2017-12-24 16:41:06 +10:00
Jason Hood
b258a2ea2d Fix standard controls in insert mode 2017-12-24 10:58:19 +10:00
Jason Hood
10575a0647 Recognise CR after wrap; update ANSICON_API docs
CR will match BS/CUB/HPB, moving back to previous line(s) after a wrap.

I hadn't updated the comment when I switched ANSICON_API from WriteFile
to WriteConsoleA.  Mention that is should be deleted when upgrading.
2017-12-24 10:11:57 +10:00
Jason Hood
9140e3bd56 Update documentation
Expand the install section, adding a note about using the Startup group.

Add a brief "How it Works" section to `readme.md`.
2017-12-23 22:04:44 +10:00
Jason Hood
4502a49bab Set margins per console; fix windowless processes
I had intended for margins to be set per process, but during testing I
was wondering why they weren't working, so per console it is.

In changing the above, I realised that `pState` may stay `NULL` when a
process is created without a window.  Initialise it to a default state,
updating it when the window becomes available.
2017-12-23 18:40:59 +10:00
Jason Hood
a37657ac52 Add DECSTR and RIS
Implement soft and hard resets (handling intermediate bytes a little
better in the process).
2017-12-23 16:44:32 +10:00
Jason Hood
c28b3597dd Add console input as a known limitation
Console input is echoed directly by the host, bypassing processing.
This means escape reverts back to a normal character (probably a good
thing) and the bottom margin is ignored (probably not so good).
2017-12-23 10:24:18 +10:00
Jason Hood
edaf7ccace Flush before accessing the console
Rather than flushing immediately after every write, only flush before
accessing the console.	This improves the speed, particularly for
programs that write character-by-character (which is basically every
program using Microsoft's printf).  Should it go wrong, there's a new
mode to restore the immediate flush: `\e[1+h`.
2017-12-22 18:08:51 +10:00
Jason Hood
d04feca91c Add mnemonics to sequence comments 2017-12-21 21:48:15 +10:00
Jason Hood
77fabb78e0 Add DECOM, DECSTBM, SD and SU
Margins always use the window, never the buffer; the exception is
`\e[+r` which will remove the margins ('\e[r' will set the margins to
the window).  With the margins set, the window will not scroll when the
cursor is at the bottom, outside of the margins.  In this case, the
display is not quite right, since I copy the line from another buffer,
rather than actually overwrite the existing line.
2017-12-21 20:55:47 +10:00
Jason Hood
9242785570 Recognise wrap when moving backwards
BS/CUB/HPB will move back to previous line(s) if the line has wrapped.
2017-12-19 10:28:53 +10:00
Jason Hood
80d9e7da78 Add IRM
Setting IRM will cause characters to be inserted, discarding anything
that goes beyond the edge.

Turn off the wrap flag when the cursor moves.

SM/RM allow more than one parameter.
2017-12-17 11:13:12 +10:00
Jason Hood
66c527a624 Tweak colors
SGR parameters 90-97 are bright foreground (leaving bold unchanged) and
100-107 are bright background (leaving underline/blink unchanged);
`38;5;#` & `48;5;#` will work for the first 16 colors, setting both
foreground & bold or background & underline (0-7 bold/underline off,
8-15 bold/underline on).
2017-12-16 12:37:43 +10:00
Jason Hood
410fc067a7 Fix DECNCSM sequence in readme 2017-12-11 12:04:07 +10:00
Jason Hood
7c14985a5d Modify DECSC/DECRC
Save/restore the attributes and G0 character set (the ANSI version still
only does the cursor).

Add the comment I missed when adding SCS; remove `DEC` from the sequence
descriptions.
2017-12-11 11:34:32 +10:00
Jason Hood
d20ab7471f Add tab handling
Support setting (HTS & DECST8C) and clearing (TBC) tabs, overriding the
console's own tab processing.  I've extended TBC with `\e[8g` to restore
console processing and added an extra parameter to DECST8C to set a
particular tab size.
2017-12-10 22:52:38 +10:00
Jason Hood
645f57e59c Fix parameters
Explicit zero parameters should still default to one.  Limit parameters
to a maximum value of 32767.
2017-12-09 22:16:47 +10:00
Jason Hood
c11447fc8b Add partial SCS support
Allow G0 to be set to the DEC Special Graphics Character Set or ASCII.
2017-12-09 21:01:13 +10:00
Jason Hood
0e87a03761 Add DA, DECCOLM, DECNSCM, DECSC & DECRC
DECSC (Save Cursor) & DECRC (Restore Cursor) are the same as their
ANSI.sys equivalents (`\e[s` & `\e[u`).

DA (Device Attributes) will respond with `\e[?62;1c` - VT220 with 132
columns.

Setting DECCOLM will size the buffer & window to 132 columns; resetting
will restore the original values (NOT set 80 columns).	Setting DECNSCM
will prevent the display from being erased; however, the first time
DECCOLM is used will scroll in a new window, if appropriate.
2017-12-09 11:11:52 +10:00
Jason Hood
eb997019c1 Add IND, NEL and RI
These controls always operate on the buffer, in keeping with LF.
2017-12-03 12:50:13 +10:00
Jason Hood
0c2f9b314e Strip readme.md to just the intro & requirements 2017-11-30 21:22:10 +10:00
Jason Hood
1a4d6b488f Add option -pu to unload from the parent 2017-11-30 21:05:41 +10:00
Jason Hood
523c478d67 Fix some things
Prevent `ESC LF` from performing the newline.
Only recognise `, ~`, not `,` anything.
Document BEL and the ignored sequences.
2017-11-30 11:38:15 +10:00
Jason Hood
1754f68ac9 Redefine the graphics SCAN characters 2017-11-29 11:42:47 +10:00
Jason Hood
e2f9b4e417 Add palette sequences
Recognise the xterm ESC]4 & ESC]104 OSC commands to set/reset colors.
Three color specs are recognised: `#RGB`, `#RRGGBB` and `R,G,B`; in
addition, multiple specs can be given (separated by commas) to
automatically increase the index.  I also allow `*` to query this index
and all subsequent ones.  Reset will restore the colors from when the
DLL was first loaded, not from the Console Properties.
2017-11-29 11:06:57 +10:00
Jason Hood
9fbe42a583 Escape control characters; fix CRM issues
Since ESC is now preserved for unrecognised sequences, I feel able to
use it to escape control characters in order to display them (e.g.
"\e\e" will display a single escape).

Control mode would not display the recognised controls (i.e. BEL, SO and
SI) and would not work if it was turned off in the same string.
2017-11-24 11:10:42 +10:00
Jason Hood
e44cbb848f Add + to use the buffer
Normally the display uses the window height; adding an intermediate
character of `+` will use the buffer height.  Report cursor position
will also output `+R` when used with `+n`.
2017-11-23 12:06:33 +10:00
Jason Hood
a4125753a4 Fix compiling with MinGW and TDM
MinGW lacks some definitions; TDM wants WINVER defined.

Assume a default `CC=cc` should really be `CC=gcc`.
2017-11-21 11:46:58 +10:00
Jason Hood
826b0b66ba Add DECPS Play Sound
There are some differences from the VT520: volume is ignored (although
silence is honored); duration is in 1/32 of a second up to and including
48 (1.5 seconds), after which it is in milliseconds (but still a maximum
of 8 seconds); notes are 1..25, anything else is frequency.
2017-11-19 12:07:28 +10:00
Jason Hood
aa8b0c6a36 Use the system default sound for the bell
Windows 7 uses Beep for the bell, which means if you accidentally view
a binary file, the console freezes until all the bells have finished.
Windows 10 uses PlaySound, which avoids the freeze, but prevents the
sound being played at all if the program immediately exits (in its own
host).	This uses PlaySound in its own thread, ignoring additional bells
whilst one is currently playing and waiting for it to finish before
terminating.
2017-11-17 21:53:58 +10:00
Jason Hood
8eb06aad27 Preserve ESC not part of a sequence
There are some instances when ESC should just be a normal character
(e.g. TCC uses it in aliases to clear the current line), so if no
sequence is recognised, pass the ESC through.
2017-11-07 11:35:42 +10:00
Jason Hood
43b3653c8a Fix problem with reporting cursor position
Turns out that sending duplicate characters would only send one (e.g.
"11" would just be "1").  Sending the key up events fixed it.
2017-11-03 23:04:51 +10:00
Jason Hood
2f3fe57b60 Hook CreateFile and CreateConsoleScreenBuffer
If console handles are created as GENERIC_WRITE, add GENERIC_READ in
order to be able to retrieve console information.  This fixes #93
(redirecting to CON).
2017-10-30 10:50:11 +10:00
Jason Hood
97dcb13634 Fix ANSICON's output when redirected to CON
ANSICON switches the standard streams to Unicode, but uses its own
routine to write directly to the console when appropriate.  However, the
newlines written by -e/-E/-t/-T were still done by the CRT, so when
output was redirected to CON, "\r\0\n\0" was being written.
2017-10-28 16:43:45 +10:00
Jason Hood
df5596f65f Increase cache to five handles
The cache is used to speed up detection of console handles, but with the
original three handles I was only thinking of actual console handles,
not general file handles.  Five handles implies: stdout, stderr,
CONOUT$, log file and output file.
2017-10-28 12:31:35 +10:00
Jason Hood
67f1d48801 Revert back to saving buffer cursor position
In v1.70 I had saved the cursor position relative to the window, but
that means should the window scroll, the cursor would appear to be
restored to the wrong position.  It will still be wrong should the
*buffer* be scrolled, but that can't really be helped (well, possibly
it could, but it would be more effort than it's worth).
2017-10-28 11:19:06 +10:00