Commit Graph

41 Commits

Author SHA1 Message Date
Ryan Prichard
274086bbf5 In winpty-agent, print an error message if the arguments are invalid.
* Some users might think they could run winpty-agent.exe.

 * Right now, when I run winpty-agent.exe from a cmd.exe command prompt
   window, it looks like winpty-agent.exe is segfaulting.  It *ought* to
   print an assertion failed dialog box.
2012-12-20 04:20:10 -08:00
Ryan Prichard
d02cccb256 MSVC compatibility: Remove the {Agent,WinPty}DebugClient.cc hack.
* With this hack, it's impossible to add all the .cc files to an MSVC
   project, because MSVC understandably thinks that
   agent/AgentDebugClient.cc and shared/DebugClient.cc are two separate
   C++ translation units.  I could rename DebugClient.cc, but it's better
   to just fix the problem with the Makefile.
2012-12-20 04:07:57 -08:00
Ryan Prichard
a7bc8fcf9d Rename Shared to shared and Misc to misc. 2012-04-01 02:13:21 -07:00
Ryan Prichard
8eb2da5850 Fix a typo. 2012-04-01 02:00:37 -07:00
Ryan Prichard
80d005e33e Start the agent's child process on the libwinpty client's desktop.
If I run a GUI program inside mintty using winpty, the GUI's window should
appear on the same desktop as mintty, not on the hidden desktop containing
the winpty console.

Even though STARTUPINFO.lpDesktop's type is LPTSTR (instead of LPCTSTR),
the documentation doesn't say anything about CreateProcess modifying the
lpDesktop string, so I didn't bother making a copy of desktop.c_str().
2012-03-31 00:55:49 -07:00
Ryan Prichard
b44bd6b655 Remove a piece of old Qt code from this Makefile. 2012-03-28 03:12:22 -07:00
Ryan Prichard
7eae3d9e33 Send "\r" instead of "\x1b[1G" because carriage return is simpler.
There's no other motivating reason for this change.  AFAIK, both of them
work equally well and do the same thing.
2012-03-28 03:12:13 -07:00
Ryan Prichard
6a29852ace Stop sending trailing whitespace in Terminal::sendLine.
* The intent of having the length variable was to avoid sending trailing
   whitespace for each line, but the previous code never read the variable.
   Instead, every line it sent was the width of the terminal window.

 * There was a bug where running console.exe inside a TERM=cygwin terminal
   resulted in excessive line feeds.  This change mitigates that bug, but
   doesn't fix it.  The problem is that the agent assumes that after it
   writes to the last column of a line, the cursor is still on the same
   line, but this isn't true for the TERM=cygwin terminal.
2012-03-28 03:10:37 -07:00
Ryan Prichard
0427aedadd Remove unused console font code from Win32Console::setSmallFont. 2012-03-28 01:09:52 -07:00
Ryan Prichard
dbc2d51fec Select a small console font on agent startup.
This maximizes the possible console size in terms of rows * cols.
2012-03-28 01:05:26 -07:00
Ryan Prichard
6585b72375 Use STD_{INPUT,OUTPUT}_HANDLE instead of reopening CONIN$ and CONOUT$.
Reopening the files is unnecessary.
2012-03-28 01:05:14 -07:00
Ryan Prichard
71aa4a59bb Rename pconsole to winpty.
* This avoids a name conflict with an existing unrelated project.

 * I think winpty is a better name anyway.  (i) It's more obviously
   Windows-related.  (ii) I think it more accurately describes what it
   does.  A "pseudo-console" ought to mirror the console API and allow
   replacing the implementation built-in to Windows.  This project is only
   trying to provide functionality similar to using the master interface of
   a Unix pty, but for native console programs.
2012-03-25 02:29:37 -07:00
Ryan Prichard
5010f5e1a6 Print an error message when CreateProcess fails.
I suspect that the library API (pconsole_open) should not be calling exit
if it can't start the agent process, but I don't want to deal with that
right now.
2012-03-24 17:19:55 -07:00
Ryan Prichard
32627354df Work on the agent debugging code.
* Suppress debug output unless the PCONSOLEDBG enviroment variable is
   set.

 * Rename Trace to trace to be consistent with the camelCaps naming
   convention.
2012-03-24 16:43:50 -07:00
Ryan Prichard
f75800fae6 Replace assert with ASSERT. 2012-03-24 16:41:15 -07:00
Ryan Prichard
44554d5e9d Add an MIT copyright notice to all the source files. 2012-03-23 03:11:34 -07:00
Ryan Prichard
d3667e38a8 Review the named pipe setup code.
The goal is to setup pipes between the libpconsole process and the new
agent process in a way that's secure and doesn't create an unnecessary
burden on the library's user.  This is apparently hard.

I think this code is good enough.
2012-03-23 02:19:09 -07:00
Ryan Prichard
d568fbdeb4 Add DsrSender.h. 2012-03-21 03:31:34 -07:00
Ryan Prichard
d418679741 Include stdint.h to provide int32_t.
* This fixed a libpconsole build error that happened with mingw-w64.
2012-03-21 03:30:18 -07:00
Ryan Prichard
0afc69c733 Move the three output binaries into a build directory. 2012-03-21 00:13:46 -07:00
Ryan Prichard
4cfb5e1c73 Expand a comment. 2012-03-20 23:46:12 -07:00
Ryan Prichard
0260b423a3 Continue working on console input.
* Remove most of the encoding table and instead generate the KeyDescriptor
   entries dynamically at startup.

 * I think I'm handling input tolerably well for TERM=xterm terminals, but
   I removed the support I had for rxvt for now.  I don't think it makes
   sense to fill out the table, but the new code I have for TERM=xterm is
   also bloated.
2012-03-20 04:15:25 -07:00
Ryan Prichard
1fdda9e1d4 Work on console input handling.
* If bytes are still queued after processing as many keypresses as
   possible, send a DSR to the console.  The console should respond with
   a DSR reply, which will flush out the input buffer without having to
   wait for a timeout.

 * Add ah hoc code for ALT-<character> rather than listing every character
   in the table.

 * When keypresses have Alt/Ctrl/Shift modifiers, generate extra
   INPUT_RECORDS to press and release each modifier.  EDIT.COM seemed to
   require these for some Ctrl-<key> keypresses I tried.
2012-03-20 02:04:46 -07:00
Ryan Prichard
d32e36032d Fix an bug in ConsoleInput::appendChar: set dwControlKeyState. 2012-03-19 22:14:34 -07:00
Ryan Prichard
98970ead5c Use ESC and CSI macros in ConsoleInput::keyDescriptorTable. 2012-03-19 22:14:06 -07:00
Ryan Prichard
ac76cbcc20 Initial checkin of improved console input handling.
* Generate Ctrl-C events by calling GenerateConsoleCtrlEvent.

   I noticed that calls to this routine don't behave exactly the same as
   a real Ctrl-C keypress.  In Python, pressing Ctrl-C immediately
   displays a new "KeyboardInterrupt" line.  Calling
   GenerateConsoleCtrlEvent has no immediate effect, but after pressing
   Enter, Python displays a stack trace where a KeyboardInterrupt was
   raised.  After some testing, I suspect the issue is that a real Ctrl-C
   keypress interrupts a blocking console read, but
   GenerateConsoleCtrlEvent does not.

   I also tried synthesizing Ctrl-C using (a) PostMessage with
   WM_{CHAR,KEYDOWN}, and (b) SendInput.  I couldn't get either to work.

 * Recognize ESC sequences.  The set of recognized sequences is ad hoc.

 * Recognize UTF-8-encoded characters and convert them to UTF-16.

 * The code currently uses a timeout to differentiate between pressing ESC
   and pressing a key that generates an ESC sequence.  I have a theory that
   I can use the "Device Status Report" ESC sequences to avoid this
   timeout.
2012-03-19 21:30:16 -07:00
Ryan Prichard
0554f9fbde In Agent::handleStartProcessPacket, call GetLastError immediately after
CreateProcess.
2012-03-19 21:17:43 -07:00
Ryan Prichard
6b87c54d0d Try to improve the way color works in the agent.
* Assume that either:
    - The console has a white-on-black color scheme.  This could be set
      at agent startup.
    - The remote terminal also has a white-on-black color scheme, OR...
    - With a different color scheme, the white/black colors could be
      reversed, but the console is still usable.

 * The COMMON_LVB_REVERSE_VIDEO flag apparently has no effect in a Windows
   console, so ignore it in the agent too.

 * Start handling Unicode characters.  I noticed that box drawing
   characters (mc.exe / edit.com) are displayed correctly now.  I'm calling
   WideCharToMultiByte once per character, though, and I'm wondering if
   this is inefficient.
2012-03-15 04:08:58 -07:00
Ryan Prichard
affceb9ffd Fix a bug involving the Terminal::finishOutput call.
Before the Qt removal, Terminal::finishOutput accepted a QPoint object with
a 32-bit line number.  Changing it to accept Coord introduced a bug because
the Coord line number is only 16-bits.  The moveTerminalToLine and sendLine
methods still accepted a 32-bit line number, though.

The result was, after 32768 lines of output, the
Terminal::moveTerminalToLine function would be called alternately with
truncated and untruncated line numbers (e.g. -32000 and 33536), and the
function would generate massive amounts of "cursor up" and "newline"
output.
2012-03-15 02:11:03 -07:00
Ryan Prichard
81dcc5efe7 Fix SmallRect::intersected.
* Win32Console::reposition's resize/move API calls were failing because of
   this bug.
2012-03-15 02:01:41 -07:00
Ryan Prichard
a4f26594f0 Various changes intended to help with debugging.
* Replace Buffer::isEof with Buffer::eof so I can use the agent-specific
   ASSERT macro instead of the standard assert().

 * If an API call in Win32Console fails, print a message using Trace.

 * Add Coord::toString and SmallRect::toString functions.
2012-03-15 01:59:12 -07:00
Ryan Prichard
76f25ae5dd Checkpoint work on the EventLoop and NamedPipe classes.
* Make the agent work correctly when the child process exits.
2012-03-14 02:37:18 -07:00
Ryan Prichard
3dcda5d15d Remove these two unused C++ files. 2012-03-13 22:39:27 -07:00
Ryan Prichard
119c5e0117 Finish removing the Qt dependency. 2012-03-13 22:39:14 -07:00
Ryan Prichard
c949e03164 Checkpoint work to replace the Qt event loop and I/O code. 2012-03-13 22:14:39 -07:00
Ryan Prichard
39e07ca4d2 Fix a typo. 2012-03-13 22:03:48 -07:00
Ryan Prichard
d8b8403651 Begin removing the Qt dependency.
* Replace QPoint and QSize with Coord, a C++ class derived from COORD.

 * Replace QRect with SmallRect, a C++ class derived from SMALL_RECT.

 * Turn Win32Console into a non-QObject class.
2012-03-13 00:16:51 -07:00
Ryan Prichard
00a6c3b90e Shut down the unix-adapter when the child process exits.
- In the agent, poll for the process exit at the same time we pull for
   output.  Once the child exits, record the exit code and close the data
   pipe.

 - In the unix-adapter, shut the program down once the input or output
   handlers abort.  Before exiting, query the agent for the exit code.

 - Also: in the unix-adapter, apparently receiving the SIGWINCH signal can
   interrupt both select and the InputHandler's read system call.  I hope
   it doesn't affect the blocking Win32 APIs, but I'm not really sure.
2012-02-20 03:30:43 -08:00
Ryan Prichard
90164c34a9 Get the agent + libpconsole + unix-adapter trio working.
- Update the Agent to use separate control and data pipes and to receive
   arbitrary-sized packets.  Handle child process creation in the agent.

 - Fix bugs in libpconsole:
    - Insert a space between the pipe names on the agent command line.
    - Don't close the desktop and window station until after connecting
      to the agent's pipes.

 - Change the format of the pconsole_start_process env parameter from an
   array of wide-character-string pointers to a single contiguous block of
   memory, like that accepted by CreateProcess.
2012-02-20 01:23:46 -08:00
Ryan Prichard
3abee55179 Work on agent's build system. 2012-01-21 17:39:22 -08:00
Ryan Prichard
7e4c06c2e1 Rename Agent to agent. 2012-01-21 17:32:26 -08:00