Replace the libwinpty API.
The new API improves upon the old API in a number of ways:
* The old API provided a single data pipe for input and output, and it
provided the pipe in the form of a HANDLE opened with
FILE_FLAG_OVERLAPPED. Using a bare HANDLE is difficult in higher-level
languages, and overlapped/asynchronous I/O is hard to get right.
winpty_close closed the data pipe, which also didn't help things, though
I think the handle could have been duplicated.
Using a single handle for input and output complicates shutdown. When
the child process exits, the agent scrapes the final output, then closes
the data pipe once its written. It's possible that a winpty client will
first detect the closed pipe when it's writing *input* rather than
reading output, which seems wrong. (On the other hand, the agent
doesn't implement "backpressure" for either input or output (yet), and
if it did, it's possible that post-exit shutdown should interrupt a
blocked write into the console input queue. I need to think about it
more.)
The new API splits the data pipe into CONIN and CONOUT pipes, which are
accessed by filename. After `winpty_open` returns, the client queries
pipe names using `winpty_conin_name` and `winpty_conout_name`, then
opens them using any mechanism, low-level or high-level, blocking or
overlapped.
* The old libwinpty handled errors by killing the process. The new
libwinpty uses C++ exceptions internally and translates exceptions at
API boundaries using:
- a boolean error result (e.g. BOOL, NULL-vs-non-NULL)
- a potentially heap-allocated winpty_error_t object returned via an
optional winpty_error_ptr_t parameter. That parameter can be NULL.
If it isn't, then an error code and message can be queried from the
error object. The winpty_error_t object must be freed with
winpty_error_free.
* winpty_start_process is renamed to winpty_spawn. winpty_open and
winpty_spawn accept a "config" object which holds parameters. New
configuration options can be added without disturbing the source or
binary API.
* The winpty_get_exit_code and winpty_get_process_id APIs are removed.
The winpty_spawn function has an out parameter providing the child's
process and thread HANDLEs (duplicated from the agent via
DuplicateHandle). The winpty client can call GetExitCodeProcess and
GetProcessId (as well as the WaitForXXX APIs to wait for child exit).
2016-05-26 00:49:45 +00:00
|
|
|
# Next Version
|
|
|
|
|
|
|
|
The winpty library has a new API that should be easier for embedding.
|
|
|
|
|
2016-05-30 09:10:49 +00:00
|
|
|
User-visible changes:
|
|
|
|
|
|
|
|
* winpty now automatically puts the terminal into mouse mode when it detects
|
|
|
|
that the console has left QuickEdit mode. The `--mouse` option still forces
|
|
|
|
the terminal into mouse mode. In principle, an option could be added to
|
|
|
|
suppress terminal mode, but hopefully it won't be necessary. There is a
|
|
|
|
script in the `misc` subdirectory, `misc/ConinMode.ps1`, that can change
|
|
|
|
the QuickEdit mode from the command-line.
|
|
|
|
|
2016-05-29 05:20:03 +00:00
|
|
|
Bug fixes:
|
|
|
|
|
|
|
|
* By default, `winpty.dll` avoids calling `SetProcessWindowStation` within
|
|
|
|
the calling process.
|
|
|
|
[#58](https://github.com/rprichard/winpty/issues/58)
|
2016-06-01 00:34:57 +00:00
|
|
|
* Fixed an uninitialized memory bug that could have crashed winpty.
|
|
|
|
[#80](https://github.com/rprichard/winpty/issues/80)
|
2016-06-07 10:39:06 +00:00
|
|
|
* winpty now works better with very large and very small terminal windows.
|
|
|
|
It resizes the console font according to the number of columns.
|
|
|
|
[#61](https://github.com/rprichard/winpty/issues/61)
|
2016-05-29 05:20:03 +00:00
|
|
|
|
2016-05-20 23:05:59 +00:00
|
|
|
# Version 0.3.0 (2016-05-20)
|
2016-03-30 07:59:45 +00:00
|
|
|
|
|
|
|
User-visible changes:
|
|
|
|
|
2016-04-05 07:36:06 +00:00
|
|
|
* The UNIX adapter is renamed from `console.exe` to `winpty.exe` to be
|
|
|
|
consistent with MSYS2. The name `winpty.exe` is less likely to conflict
|
|
|
|
with another program and is easier to search for online (e.g. for someone
|
|
|
|
unfamiliar with winpty).
|
2016-05-20 02:35:12 +00:00
|
|
|
* The UNIX adapter now clears the `TERM` variable.
|
|
|
|
[#43](https://github.com/rprichard/winpty/issues/43)
|
2016-05-20 22:49:35 +00:00
|
|
|
* An escape character appearing in a console screen buffer cell is converted
|
|
|
|
to a '?'.
|
|
|
|
[#47](https://github.com/rprichard/winpty/issues/47)
|
2016-03-30 07:59:45 +00:00
|
|
|
|
2016-04-10 23:14:21 +00:00
|
|
|
Bug fixes:
|
|
|
|
|
|
|
|
* A major bug affecting XP users was fixed.
|
|
|
|
[#67](https://github.com/rprichard/winpty/issues/67)
|
|
|
|
* Fixed an incompatibility with ConEmu where winpty hung if ConEmu's
|
|
|
|
"Process 'start'" feature was enabled.
|
|
|
|
[#70](https://github.com/rprichard/winpty/issues/70)
|
2016-04-21 09:30:22 +00:00
|
|
|
* Fixed a bug where `cmd.exe` sometimes printed the message,
|
|
|
|
`Not enough storage is available to process this command.`.
|
|
|
|
[#74](https://github.com/rprichard/winpty/issues/74)
|
2016-04-10 23:14:21 +00:00
|
|
|
|
2016-03-30 07:59:45 +00:00
|
|
|
Many changes internally:
|
|
|
|
|
|
|
|
* The codebase is switched from C++03 to C++11 and uses exceptions internally.
|
|
|
|
No exceptions are thrown across the C APIs defined in `winpty.h`.
|
|
|
|
* This version drops support for the original MinGW compiler packaged with
|
|
|
|
Cygwin (`i686-pc-mingw32-g++`). The MinGW-w64 compiler is still supported,
|
|
|
|
as is the MinGW distributed at mingw.org. Compiling with MSVC now requires
|
|
|
|
MSVC 2013 or newer. Windows XP is still supported.
|
|
|
|
[ec3eae8df5](https://github.com/rprichard/winpty/commit/ec3eae8df5bbbb36d7628d168b0815638d122f37)
|
2016-04-04 11:41:42 +00:00
|
|
|
* Pipe security is improved. winpty works harder to produce unique pipe names
|
2016-03-30 07:59:45 +00:00
|
|
|
and includes a random component in the name. winpty secures pipes with a
|
|
|
|
DACL that prevents arbitrary users from connecting to its pipes. winpty now
|
|
|
|
passes `PIPE_REJECT_REMOTE_CLIENTS` on Vista and up, and it verifies that
|
2016-04-04 11:41:42 +00:00
|
|
|
the pipe client PID is correct, again on Vista and up. When connecting to a
|
|
|
|
named pipe, winpty uses the `SECURITY_IDENTIFICATION` flag to restrict
|
|
|
|
impersonation. Previous versions *should* still be secure.
|
2016-03-30 07:59:45 +00:00
|
|
|
* `winpty-debugserver.exe` now has an `--everyone` flag that allows capturing
|
|
|
|
debug output from other users.
|
2016-04-04 11:41:42 +00:00
|
|
|
* The code now compiles cleanly with MSVC's "Security Development Lifecycle"
|
|
|
|
(`/SDL`) checks enabled.
|
2016-03-30 07:59:45 +00:00
|
|
|
|
2016-02-26 03:21:22 +00:00
|
|
|
# Version 0.2.2 (2016-02-25)
|
2016-01-14 23:02:59 +00:00
|
|
|
|
2016-02-26 03:21:22 +00:00
|
|
|
Minor bug fixes and enhancements:
|
|
|
|
|
|
|
|
* Fix a bug that generated spurious mouse input records when an incomplete
|
|
|
|
mouse escape sequence was seen.
|
|
|
|
* Fix a buffer overflow bug in `winpty-debugserver.exe` affecting messages of
|
|
|
|
exactly 4096 bytes.
|
|
|
|
* For MSVC builds, add a `src/configurations.gypi` file that can be included
|
|
|
|
on the gyp command-line to enable 32-bit and 64-bit builds.
|
|
|
|
* `winpty-agent --show-input` mode: Flush stdout after each line.
|
|
|
|
* Makefile builds: generate a `build/winpty.lib` import library to accompany
|
|
|
|
`build/winpty.dll`.
|
2016-01-14 23:02:59 +00:00
|
|
|
|
2015-12-20 08:02:45 +00:00
|
|
|
# Version 0.2.1 (2015-12-19)
|
2015-11-29 09:50:06 +00:00
|
|
|
|
|
|
|
* The main project source was moved into a `src` directory for better code
|
|
|
|
organization and to fix
|
|
|
|
[#51](https://github.com/rprichard/winpty/issues/51).
|
2015-12-04 05:41:11 +00:00
|
|
|
* winpty recognizes many more escape sequences, including:
|
|
|
|
* putty/rxvt's F1-F4 keys
|
|
|
|
[#40](https://github.com/rprichard/winpty/issues/40)
|
|
|
|
* the Linux virtual console's F1-F5 keys
|
|
|
|
* the "application numpad" keys (e.g. enabled with DECPAM)
|
2015-12-01 11:03:58 +00:00
|
|
|
* Fixed handling of Shift-Alt-O and Alt-[.
|
2015-12-16 12:30:58 +00:00
|
|
|
* Added support for mouse input. The UNIX adapter has a `--mouse` argument
|
2015-12-16 10:21:22 +00:00
|
|
|
that puts the terminal into mouse mode, but the agent recognizes mouse
|
2015-12-20 08:02:45 +00:00
|
|
|
input even without the argument. The agent recognizes double-clicks using
|
|
|
|
Windows' double-click interval setting (i.e. GetDoubleClickTime).
|
2015-12-16 10:21:22 +00:00
|
|
|
[#57](https://github.com/rprichard/winpty/issues/57)
|
2015-11-29 09:50:06 +00:00
|
|
|
|
2015-12-04 05:41:11 +00:00
|
|
|
Changes to debugging interfaces:
|
|
|
|
|
|
|
|
* The `WINPTY_DEBUG` variable is now a comma-separated list. The old
|
|
|
|
behavior (i.e. tracing) is enabled with `WINPTY_DEBUG=trace`.
|
2015-12-16 12:30:58 +00:00
|
|
|
* The UNIX adapter program now has a `--showkey` argument that dumps input
|
|
|
|
bytes.
|
|
|
|
* The `winpty-agent.exe` program has a `--show-input` argument that dumps
|
|
|
|
`INPUT_RECORD` records. (It omits mouse events unless `--with-mouse` is
|
|
|
|
also specified.) The agent also responds to `WINPTY_DEBUG=trace,input`,
|
|
|
|
which logs input bytes and synthesized console events, and it responds to
|
|
|
|
`WINPTY_DEBUG=trace,dump_input_map`, which dumps the internal table of
|
|
|
|
escape sequences.
|
2015-12-04 05:41:11 +00:00
|
|
|
|
2015-11-14 02:22:05 +00:00
|
|
|
# Version 0.2.0 (2015-11-13)
|
|
|
|
|
|
|
|
No changes to the API, but many small changes to the implementation. The big
|
|
|
|
changes include:
|
|
|
|
|
|
|
|
* Support for 64-bit Cygwin and MSYS2
|
|
|
|
* Support for Windows 10
|
|
|
|
* Better Unicode support (especially East Asian languages)
|
|
|
|
|
|
|
|
Details:
|
|
|
|
|
|
|
|
* The `configure` script recognizes 64-bit Cygwin and MSYS2 environments and
|
|
|
|
selects the appropriate compiler.
|
|
|
|
* winpty works much better with the upgraded console in Windows 10. The
|
|
|
|
`conhost.exe` hang can still occur, but only with certain programs, and
|
|
|
|
is much less likely to occur. With the new console, use Mark instead of
|
|
|
|
SelectAll, for better performance.
|
|
|
|
[#31](https://github.com/rprichard/winpty/issues/31)
|
|
|
|
[#30](https://github.com/rprichard/winpty/issues/30)
|
|
|
|
[#53](https://github.com/rprichard/winpty/issues/53)
|
|
|
|
* The UNIX adapter now calls `setlocale(LC_ALL, "")` to set the locale.
|
|
|
|
* Improved Unicode support. When a console is started with an East Asian code
|
|
|
|
page, winpty now chooses an East Asian font rather than Consolas / Lucida
|
|
|
|
Console. Selecting the right font helps synchronize character widths
|
|
|
|
between the console and terminal. (It's not perfect, though.)
|
|
|
|
[#41](https://github.com/rprichard/winpty/issues/41)
|
|
|
|
* winpty now more-or-less works with programs that change the screen buffer
|
|
|
|
or resize the original screen buffer. If the screen buffer height changes,
|
|
|
|
winpty switches to a "direct mode", where it makes no effort to track
|
|
|
|
scrolling. In direct mode, it merely syncs snapshots of the console to the
|
|
|
|
terminal. Caveats:
|
|
|
|
* Changing the screen buffer (i.e. `SetConsoleActiveScreenBuffer`)
|
|
|
|
breaks winpty on Windows 7. This problem can eventually be mitigated,
|
|
|
|
but never completely fixed, due to Windows 7 bugginess.
|
|
|
|
* Resizing the original screen buffer can hang `conhost.exe` on Windows 10.
|
|
|
|
Enabling the legacy console is a workaround.
|
|
|
|
* If a program changes the screen buffer and then exits, relying on the OS
|
|
|
|
to restore the original screen buffer, that restoration probably will not
|
|
|
|
happen with winpty. winpty's behavior can probably be improved here.
|
|
|
|
* Improved color handling:
|
|
|
|
* DkGray-on-Black text was previously hiddenly completely. Now it is
|
|
|
|
output as DkGray, with a fallback to LtGray on terminals that don't
|
|
|
|
recognize the intense colors.
|
|
|
|
[#39](https://github.com/rprichard/winpty/issues/39).
|
|
|
|
* The console is always initialized to LtGray-on-Black, regardless of the
|
|
|
|
user setting, which matches the console color heuristic, which translates
|
|
|
|
LtGray-on-Black to "reset SGR parameters."
|
|
|
|
* Shift-Tab is recognized correctly now.
|
|
|
|
[#19](https://github.com/rprichard/winpty/issues/19)
|
|
|
|
* Add a `--version` argument to `winpty-agent.exe` and the UNIX adapter. The
|
|
|
|
argument reports the nominal version (i.e. the `VERSION.txt`) file, with a
|
|
|
|
"VERSION_SUFFIX" appended (defaulted to `-dev`), and a git commit hash, if
|
|
|
|
the `git` command successfully reports a hash during the build. The `git`
|
|
|
|
command is invoked by either `make` or `gyp`.
|
|
|
|
* The agent now combines `ReadConsoleOutputW` calls when it polls the console
|
|
|
|
buffer for changes, which may slightly reduce its CPU overhead.
|
|
|
|
[#44](https://github.com/rprichard/winpty/issues/44).
|
|
|
|
* A `gyp` file is added to help compile with MSVC.
|
|
|
|
* The code can now be compiled as C++11 code, though it isn't by default.
|
|
|
|
[bde8922e08](https://github.com/rprichard/winpty/commit/bde8922e08c3638e01ecc7b581b676c314163e3c)
|
|
|
|
* If winpty can't create a new window station, it charges ahead rather than
|
|
|
|
aborting. This situation might happen if winpty were started from an SSH
|
|
|
|
session.
|
|
|
|
* Debugging improvements:
|
|
|
|
* `WINPTYDBG` is renamed to `WINPTY_DEBUG`, and a new `WINPTY_SHOW_CONSOLE`
|
|
|
|
variable keeps the underlying console visible.
|
|
|
|
* A `winpty-debugserver.exe` program is built and shipped by default. It
|
|
|
|
collects the trace output enabled with `WINPTY_DEBUG`.
|
|
|
|
* The `Makefile` build of winpty now compiles `winpty-agent.exe` and
|
|
|
|
`winpty.dll` with -O2.
|
|
|
|
|
|
|
|
# Version 0.1.1 (2012-07-28)
|
|
|
|
|
|
|
|
Minor bugfix release.
|
|
|
|
|
|
|
|
# Version 0.1 (2012-04-17)
|
|
|
|
|
|
|
|
Initial release.
|