A Windows software package providing an interface similar to a Unix pty-master for communicating with Windows console programs.
Go to file
Ryan Prichard 4dddde3562 Switch from std::[w]stringstream/std::cout to [W]StringBuilder/fwrite
Remove all references to the iostream and sstream headers from code in the
src directory.

This change reduces the sizes of winpty.dll and winpty-agent.exe.  For
example:

Cygwin's x86_64-w64-mingw32-g++ 4.9.2 compiler:
 - winpty.dll:       622 KiB to 513 KiB
 - winpty-agent.exe: 742 KiB to 572 KiB

MSVC 2015, using gyp + configurations.gypi targeting x64:
 - winpty.dll:       985 KiB to 545 KiB
 - winpty-agent.exe: 1108 KiB to 642 KiB
2016-03-24 22:19:25 -05:00
misc Split out misc/{buffer-tests,console-handles.md} to a new repo 2016-02-24 20:44:58 -06:00
ship Use precompiled headers when compiling with GCC. 2016-02-29 04:33:42 -06:00
src Switch from std::[w]stringstream/std::cout to [W]StringBuilder/fwrite 2016-03-24 22:19:25 -05:00
.gitattributes Mark *.gypi as text 2015-12-29 18:40:08 -06:00
.gitignore gyp improvements: 2015-12-29 18:33:55 -06:00
configure Makefile: stop reading environ variables and avoid spawning processes 2016-02-26 04:21:22 -06:00
LICENSE Update the LICENSE copyright year 2016-02-25 21:27:47 -06:00
Makefile Use precompiled headers when compiling with GCC. 2016-02-29 04:33:42 -06:00
README.rst Remove support for the MinGW compiler packaged with Cygwin. 2016-02-26 00:12:24 -06:00
RELEASES.md Update release notes for 0.2.2. 2016-02-25 21:21:22 -06:00
VERSION.txt Bump the version 2016-02-26 00:12:22 -06:00

======
winpty
======

winpty is a Windows software package providing an interface similar to a Unix
pty-master for communicating with Windows console programs.  The package
consists of a library (libwinpty) and a tool for Cygwin and MSYS for running
Windows console programs in a Cygwin/MSYS pty.

The software works by starting the ``winpty-agent.exe`` process with a new,
hidden console window, which bridges between the console API and terminal
input/output escape codes.  It polls the hidden console's screen buffer for
changes and generates a corresponding stream of output.

The Unix adapter allows running Windows console programs (e.g. CMD, PowerShell,
IronPython, etc.) under ``mintty`` or Cygwin's ``sshd`` with
properly-functioning input (e.g. arrow and function keys) and output (e.g. line
buffering).  The library could be also useful for writing a non-Cygwin SSH
server.

Prerequisites
=============

You need the following to build winpty:

* A Cygwin or MSYS installation
* GNU make
* A MinGW g++ toolchain capable of compiling C++11 code to build ``winpty.dll``
  and ``winpty-agent.exe``
* A g++ toolchain targeting Cygwin or MSYS to build ``console.exe``

Winpty requires two g++ toolchains as it is split into two parts. The
``winpty.dll`` and ``winpty-agent.exe`` binaries interface with the native
Windows command prompt window so they are compiled with the native MinGW
toolchain.  The console.exe binary interfaces with the MSYS/Cygwin terminal so
it is compiled with the MSYS/Cygwin toolchain.

MinGW appears to be split into two distributions -- MinGW (creates 32-bit
binaries) and MinGW-w64 (creates both 32-bit and 64-bit binaries).  Either
one is generally acceptable.

Cygwin packages
---------------

The default g++ compiler for Cygwin targets Cygwin itself, but Cygwin also
packages MinGW-w64 compilers.  As of this writing, the necessary packages are:

* Either ``mingw64-i686-gcc-g++`` or ``mingw64-x86_64-gcc-g++``.  Select the
  appropriate compiler for your CPU architecture.
* ``gcc-g++``
* ``make``

As of this writing (2016-01-23), only the MinGW-w64 compiler is acceptable.
The MinGW compiler (e.g. from the ``mingw-gcc-g++`` package) is no longer
maintained and is too buggy.

MSYS packages
-------------

For the original MSYS, use the ``mingw-get`` tool (MinGW Installation Manager),
and select at least these components:

* ``mingw-developer-toolkit``
* ``mingw32-base``
* ``mingw32-gcc-g++``
* ``msys-base``
* ``msys-system-builder``

When running ``./configure``, make sure that ``mingw32-g++`` is in your
``PATH``.  It will be in the ``C:\MinGW\bin`` directory.

MSYS2 packages
--------------

For MSYS2, use ``pacman`` and install at least these packages:

* ``msys/gcc``
* ``mingw32/mingw-w64-i686-gcc`` or ``mingw64/mingw-w64-x86_64-gcc``.  Select
  the appropriate compiler for your CPU architecture.
* ``make``

Build
=====

In the project directory, run ``./configure``, then ``make``.

This will produce three binaries:

* ``build/winpty.dll``
* ``build/winpty-agent.exe``
* ``build/console.exe``

Using the Unix adapter
======================

To run a Windows console program in ``mintty`` or Cygwin ``sshd``, prepend
``console.exe`` to the command-line::

    $ build/console.exe c:/Python27/python.exe
    Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 10 + 20
    30
    >>> exit()
    $

Debugging winpty
================

winpty comes with a tool for collecting timestamped debugging output.  To use
it:

1. Run ``winpty-debugserver.exe`` on the same computer as winpty.
2. Set the ``WINPTY_DEBUG`` environment variable to ``trace`` for the
   ``console.exe`` process and/or the process using ``libwinpty.dll``.

winpty also recognizes a ``WINPTY_SHOW_CONSOLE`` environment variable.  Set it
to 1 to prevent winpty from hiding the console window.

Copyright
=========

This project is distributed under the MIT license (see the ``LICENSE`` file in
the project root).

By submitting a pull request for this project, you agree to license your
contribution under the MIT license to this project.