From b0280b6acd58b38b2bce935f8cb4f9fa25958b6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 25 Jun 2022 03:26:16 -0300 Subject: [PATCH] Updated efsw. Updated github actions build files. eterm: Windows fixes. Some refactor. --- .github/workflows/eepp-linux-build-check.yml | 3 +- .github/workflows/eepp-macos-build-check.yml | 3 +- .../workflows/eepp-windows-build-check.yml | 3 +- src/thirdparty/efsw | 2 +- src/tools/eterm/eterm.cpp | 16 ++-- src/tools/eterm/system/autohandle.cpp | 2 +- src/tools/eterm/system/autohandle.hpp | 4 + src/tools/eterm/system/pipe.cpp | 4 +- src/tools/eterm/system/process.cpp | 26 +++--- src/tools/eterm/system/process.hpp | 4 +- src/tools/eterm/system/processfactory.cpp | 5 +- src/tools/eterm/terminal/iterminaldisplay.cpp | 2 + src/tools/eterm/terminal/iterminaldisplay.hpp | 4 + src/tools/eterm/terminal/pseudoterminal.cpp | 15 ++-- src/tools/eterm/terminal/terminaldisplay.cpp | 82 ++++++++++++++++--- src/tools/eterm/terminal/terminaldisplay.hpp | 18 +++- src/tools/eterm/terminal/terminalemulator.cpp | 16 +++- src/tools/eterm/terminal/terminalemulator.hpp | 3 + src/tools/eterm/terminal/windowserrors.hpp | 2 +- 19 files changed, 156 insertions(+), 58 deletions(-) diff --git a/.github/workflows/eepp-linux-build-check.yml b/.github/workflows/eepp-linux-build-check.yml index 102eaa4a2..9e2eecb47 100644 --- a/.github/workflows/eepp-linux-build-check.yml +++ b/.github/workflows/eepp-linux-build-check.yml @@ -7,10 +7,9 @@ jobs: runs-on: ubuntu-18.04 steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 2 - ref: develop - name: Checkout submodules run: | git submodule update --init --recursive diff --git a/.github/workflows/eepp-macos-build-check.yml b/.github/workflows/eepp-macos-build-check.yml index d797e267f..c69c24056 100644 --- a/.github/workflows/eepp-macos-build-check.yml +++ b/.github/workflows/eepp-macos-build-check.yml @@ -7,10 +7,9 @@ jobs: runs-on: macos-latest steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 2 - ref: develop - name: Checkout submodules run: | git submodule update --init --recursive diff --git a/.github/workflows/eepp-windows-build-check.yml b/.github/workflows/eepp-windows-build-check.yml index 69cb25b77..725ba4557 100644 --- a/.github/workflows/eepp-windows-build-check.yml +++ b/.github/workflows/eepp-windows-build-check.yml @@ -9,10 +9,9 @@ jobs: MSBUILD_PATH: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\ steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 2 - ref: develop - name: Checkout submodules run: | git submodule update --init --recursive diff --git a/src/thirdparty/efsw b/src/thirdparty/efsw index 41feca17c..b60a4e6ef 160000 --- a/src/thirdparty/efsw +++ b/src/thirdparty/efsw @@ -1 +1 @@ -Subproject commit 41feca17c0a4ec85b78552d8cb7eb641149b8735 +Subproject commit b60a4e6eff88999e122a50b33dbdf61a97bc5969 diff --git a/src/tools/eterm/eterm.cpp b/src/tools/eterm/eterm.cpp index 3d26ccafe..2705f3eef 100644 --- a/src/tools/eterm/eterm.cpp +++ b/src/tools/eterm/eterm.cpp @@ -59,9 +59,11 @@ void inputCallback( InputEvent* event ) { void mainLoop() { win->getInput()->update(); - terminal->update(); - if ( terminal->isDirty() ) { + if ( terminal ) + terminal->update(); + + if ( terminal && terminal->isDirty() ) { win->clear(); terminal->draw(); win->display(); @@ -93,16 +95,8 @@ EE_MAIN_FUNC int main( int, char*[] ) { fontMono->loadFromFile( "assets/fonts/DejaVuSansMono.ttf" ); if ( !terminal || terminal->hasTerminated() ) { - std::string shell; - const char* shellenv = getenv( "SHELL" ); - if ( shellenv != nullptr ) { - shell = shellenv; - } else { - shell = "/bin/bash"; - } - terminal = TerminalDisplay::create( win, fontMono, PixelDensity::dpToPx( 11 ), - win->getSize().asFloat(), shell, {}, "" ); + win->getSize().asFloat() ); } win->getInput()->pushCallback( &inputCallback ); diff --git a/src/tools/eterm/system/autohandle.cpp b/src/tools/eterm/system/autohandle.cpp index ca0041b56..3a090140f 100644 --- a/src/tools/eterm/system/autohandle.cpp +++ b/src/tools/eterm/system/autohandle.cpp @@ -83,7 +83,7 @@ EE::AutoHandle::operator EE::AutoHandle::type() const noexcept { // On Windows we deal with the Windows API, which means HANDLE is used as the handle to files // and pipes constexpr EE::AutoHandle::type EE::AutoHandle::invalid_value() { - return static_cast( 0 ); + return nullptr; } #else // On non-Windows OS'es we deal with file descriptors diff --git a/src/tools/eterm/system/autohandle.hpp b/src/tools/eterm/system/autohandle.hpp index ea8424b8a..c78cefdc4 100644 --- a/src/tools/eterm/system/autohandle.hpp +++ b/src/tools/eterm/system/autohandle.hpp @@ -58,6 +58,10 @@ class AutoHandle final { const type* get() const; + type handle() const { + return m_hHandle; + } + void release() const; private: diff --git a/src/tools/eterm/system/pipe.cpp b/src/tools/eterm/system/pipe.cpp index 081343e19..88ab4d93b 100644 --- a/src/tools/eterm/system/pipe.cpp +++ b/src/tools/eterm/system/pipe.cpp @@ -34,7 +34,7 @@ int Pipe::read( char* buf, size_t n, bool block ) { DWORD read; if ( !block ) { - if ( !PeekNamedPipe( (HANDLE)m_hInput, nullptr, 0, nullptr, &available, nullptr ) ) { + if ( !PeekNamedPipe( m_hInput.handle(), nullptr, 0, nullptr, &available, nullptr ) ) { PrintLastWinApiError(); return -1; } @@ -42,7 +42,7 @@ int Pipe::read( char* buf, size_t n, bool block ) { return 0; } - if ( !ReadFile( (HANDLE)m_hInput, buf, (DWORD)n, &read, nullptr ) ) { + if ( !ReadFile( m_hInput.handle(), buf, (DWORD)n, &read, nullptr ) ) { PrintLastWinApiError(); return -1; } diff --git a/src/tools/eterm/system/process.cpp b/src/tools/eterm/system/process.cpp index 4c2e2f80b..a21015d7f 100644 --- a/src/tools/eterm/system/process.cpp +++ b/src/tools/eterm/system/process.cpp @@ -57,7 +57,7 @@ void Process::checkExitStatus() { int status = 0; int p = waitpid( m_pid, &status, WNOHANG ); if ( p < 0 ) { - perror( "Process::CheckExitStatus(waitpid)" ); + perror( "Process::checkExitStatus(waitpid)" ); } if ( p == 0 ) { return; @@ -84,7 +84,7 @@ void Process::waitForExit() { int status = 0; int p = waitpid( m_pid, &status, 0 ); if ( p < 0 ) { - perror( "Process::WaitForExit(waitpid)" ); + perror( "Process::waitForExit(waitpid)" ); return; } m_status = ProcessStatus::EXITED; @@ -221,32 +221,33 @@ static std::wstring stringToWideString( const std::string& str ) { #define HANDLE_WIN_ERR( err ) HRESULT_FROM_WIN32( err ), PrintWinApiError( err ) static HRESULT InitializeStartupInfoAttachedToPseudoConsole( STARTUPINFOEXW* pStartupInfo, - void* hPC ) { + HPCON hPC ) { HRESULT hr{ E_UNEXPECTED }; if ( pStartupInfo ) { - PSIZE_T attrListSize{}; + SIZE_T attrListSize{}; pStartupInfo->StartupInfo.cb = sizeof( STARTUPINFOEXW ); - pStartupInfo->StartupInfo.dwFlags = STARTF_USESTDHANDLES; + //pStartupInfo->StartupInfo.dwFlags = STARTF_USESTDHANDLES; // Get the size of the thread attribute list. - InitializeProcThreadAttributeList( NULL, 1, 0, attrListSize ); + InitializeProcThreadAttributeList( NULL, 1, 0, &attrListSize ); // Allocate a thread attribute list of the correct size pStartupInfo->lpAttributeList = reinterpret_cast( - HeapAlloc( GetProcessHeap(), 0, *attrListSize ) ); + HeapAlloc( GetProcessHeap(), 0, attrListSize ) ); // Initialize thread attribute list if ( pStartupInfo->lpAttributeList && InitializeProcThreadAttributeList( pStartupInfo->lpAttributeList, 1, 0, - attrListSize ) ) { + &attrListSize ) ) { // Set Pseudo Console attribute hr = UpdateProcThreadAttribute( pStartupInfo->lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE, hPC, sizeof( hPC ), NULL, NULL ) ? S_OK : HANDLE_WIN_ERR( GetLastError() ); + printf( "errrr1: %ld", hr ); } else { hr = HANDLE_WIN_ERR( GetLastError() ); } @@ -379,7 +380,7 @@ std::unique_ptr Process::createWithPipe( const std::string& program, return std::unique_ptr( new Process( std::move( hProcess ), NULL ) ); } - PrintWinApiError( GetLastError() ); + // PrintWinApiError( GetLastError() ); return nullptr; } @@ -388,6 +389,9 @@ std::unique_ptr Process::createWithPseudoTerminal( const std::string& program, const std::vector& args, const std::string& workingDirectory, Terminal::PseudoTerminal& pseudoTerminal ) { + SetEnvironmentVariableA( "WSLENV", "TERM/u" ); + SetEnvironmentVariableA( "TERM", "st-256color" ); + HRESULT hr{ E_UNEXPECTED }; AutoHandle hProcess{}; @@ -407,7 +411,8 @@ Process::createWithPseudoTerminal( const std::string& program, const std::vector std::wstring workingDir = stringToWideString( workingDirectory ); if ( ( hr = InitializeStartupInfoAttachedToPseudoConsole( &startupInfo, - pseudoTerminal.m_phPC ) ) != S_OK ) { + pseudoTerminal.m_phPC ) ) != S_OK ) { + printf( "InitializeStartupInfoAttachedToPseudoConsole failed\n" ); PrintErrorResult( hr ); goto fail; } @@ -427,6 +432,7 @@ Process::createWithPseudoTerminal( const std::string& program, const std::vector : HANDLE_WIN_ERR( GetLastError() ); if ( hr != S_OK ) { + printf( "CreateProcessW failed\n" ); goto fail; } diff --git a/src/tools/eterm/system/process.hpp b/src/tools/eterm/system/process.hpp index 6a9162e3c..18e150b1c 100644 --- a/src/tools/eterm/system/process.hpp +++ b/src/tools/eterm/system/process.hpp @@ -28,7 +28,7 @@ #include "../terminal/pseudoterminal.hpp" #include "iprocess.hpp" -#ifndef WIN32 +#ifndef _WIN32 #include #include #else @@ -75,7 +75,7 @@ class Process final : public IProcess { ProcessStatus m_status; bool m_leaveRunning; int m_exitCode; -#ifdef WIN32 +#ifdef _WIN32 AutoHandle m_hProcess; LPPROC_THREAD_ATTRIBUTE_LIST m_lpAttributeList; diff --git a/src/tools/eterm/system/processfactory.cpp b/src/tools/eterm/system/processfactory.cpp index 058b94cc3..73f6bc883 100644 --- a/src/tools/eterm/system/processfactory.cpp +++ b/src/tools/eterm/system/processfactory.cpp @@ -20,14 +20,15 @@ std::unique_ptr ProcessFactory::createWithPseudoTerminal( auto pseudoTerminal = Terminal::PseudoTerminal::create( numColumns, numRows ); if ( !pseudoTerminal ) { - fprintf( stderr, "Failed to create pseudo terminal\n" ); + fprintf( stderr, + "ProcessFactory::createWithPseudoTerminal: Failed to create pseudo terminal\n" ); return nullptr; } auto process = System::Process::createWithPseudoTerminal( program, args, workingDirectory, *pseudoTerminal ); if ( !process ) { - fprintf( stderr, "Failed to spawn process\n" ); + fprintf( stderr, "ProcessFactory::createWithPseudoTerminal: Failed to spawn process\n" ); return nullptr; } diff --git a/src/tools/eterm/terminal/iterminaldisplay.cpp b/src/tools/eterm/terminal/iterminaldisplay.cpp index acea9238c..f244d7546 100644 --- a/src/tools/eterm/terminal/iterminaldisplay.cpp +++ b/src/tools/eterm/terminal/iterminaldisplay.cpp @@ -73,3 +73,5 @@ void ITerminalDisplay::setClipboard( const char* ) {} const char* ITerminalDisplay::getClipboard() const { return ""; } + +void ITerminalDisplay::onProcessExit( int /*exitCode*/ ) {} diff --git a/src/tools/eterm/terminal/iterminaldisplay.hpp b/src/tools/eterm/terminal/iterminaldisplay.hpp index 301387b0f..3b41929f6 100644 --- a/src/tools/eterm/terminal/iterminaldisplay.hpp +++ b/src/tools/eterm/terminal/iterminaldisplay.hpp @@ -77,9 +77,13 @@ class ITerminalDisplay { virtual void drawEnd() = 0; protected: + friend class TerminalEmulator; + int mMode; TerminalCursorMode mCursorMode; TerminalEmulator* mEmulator; + + virtual void onProcessExit( int exitCode ); }; }} // namespace EE::Terminal diff --git a/src/tools/eterm/terminal/pseudoterminal.cpp b/src/tools/eterm/terminal/pseudoterminal.cpp index bb5e5794c..e856ff3d3 100644 --- a/src/tools/eterm/terminal/pseudoterminal.cpp +++ b/src/tools/eterm/terminal/pseudoterminal.cpp @@ -119,6 +119,9 @@ std::unique_ptr PseudoTerminal::create( int columns, int rows ) win.ws_col = columns; win.ws_row = rows; +#if EE_PLATFORM == EE_PLATFORM_EMSCRIPTEN + return nullptr; +#else if ( openpty( master.get(), slave.get(), nullptr, NULL, &win ) != 0 ) { perror( "PseudoTerminal::Create(openpty)" ); return nullptr; @@ -126,6 +129,7 @@ std::unique_ptr PseudoTerminal::create( int columns, int rows ) return std::unique_ptr( new PseudoTerminal( columns, rows, std::move( master ), std::move( slave ) ) ); +#endif } #else @@ -172,7 +176,7 @@ int PseudoTerminal::write( const char* s, size_t n ) { DWORD c = (DWORD)n; DWORD r = 0; while ( n > 0 ) { - if ( !WriteFile( (HANDLE)m_hOutput.get(), s, (DWORD)( n > lim ? lim : n ), &r, nullptr ) ) { + if ( !WriteFile( (HANDLE)m_hOutput, s, (DWORD)( n > lim ? lim : n ), &r, nullptr ) ) { PrintLastWinApiError(); return -1; } @@ -184,11 +188,11 @@ int PseudoTerminal::write( const char* s, size_t n ) { } int PseudoTerminal::read( char* buf, size_t n, bool block ) { - DWORD available; + DWORD available = 0; DWORD read; if ( !block ) { - if ( !PeekNamedPipe( (HANDLE)m_hInput.get(), nullptr, 0, nullptr, &available, nullptr ) ) { + if ( !PeekNamedPipe( m_hInput.handle(), nullptr, 0, nullptr, &available, nullptr ) ) { PrintLastWinApiError(); return -1; } @@ -196,7 +200,7 @@ int PseudoTerminal::read( char* buf, size_t n, bool block ) { return 0; } - if ( !ReadFile( (HANDLE)m_hInput.get(), buf, (DWORD)n, &read, nullptr ) ) { + if ( !ReadFile( m_hInput.handle(), buf, available, &read, nullptr ) ) { PrintLastWinApiError(); return -1; } @@ -231,8 +235,7 @@ std::unique_ptr PseudoTerminal::create( int columns, int rows ) assert( ptySize.X > 0 ); assert( ptySize.Y > 0 ); - hr = CreatePseudoConsole( ptySize, (HANDLE)hPipePTYIn.get(), (HANDLE)hPipePTYOut.get(), 0, - &hPC ); + hr = CreatePseudoConsole( ptySize, hPipePTYIn.handle(), hPipePTYOut.handle(), 0, &hPC ); } if ( hr != S_OK ) { diff --git a/src/tools/eterm/terminal/terminaldisplay.cpp b/src/tools/eterm/terminal/terminaldisplay.cpp index bdcab70d1..e9cce2d31 100644 --- a/src/tools/eterm/terminal/terminaldisplay.cpp +++ b/src/tools/eterm/terminal/terminaldisplay.cpp @@ -315,8 +315,8 @@ static const Color colormapped[256] = { std::shared_ptr TerminalDisplay::create( EE::Window::Window* window, Font* font, const Float& fontSize, - const Sizef& pixelsSize, - std::shared_ptr&& terminalEmulator ) { + const Sizef& pixelsSize, + std::shared_ptr&& terminalEmulator ) { std::shared_ptr terminal = std::shared_ptr( new TerminalDisplay( window, font, fontSize, pixelsSize ) ); terminal->mTerminal = std::move( terminalEmulator ); @@ -335,9 +335,18 @@ static Sizei gridSizeFromTermDimensions( Font* font, const Float& fontSize, std::shared_ptr TerminalDisplay::create( EE::Window::Window* window, Font* font, const Float& fontSize, - const Sizef& pixelsSize, const std::string& program, - const std::vector& args, const std::string& workingDir, - IProcessFactory* processFactory ) { + const Sizef& pixelsSize, std::string program, + const std::vector& args, const std::string& workingDir, + IProcessFactory* processFactory ) { + if ( program.empty() ) { +#ifdef _WIN32 + program = "cmd.exe"; +#else + const char* shellenv = getenv( "SHELL" ); + program = shellenv != nullptr ? shellenv : "/bin/bash"; +#endif + } + bool freeProcessFactory = processFactory == nullptr; if ( processFactory == nullptr ) processFactory = eeNew( ProcessFactory, () ); @@ -350,11 +359,15 @@ TerminalDisplay::create( EE::Window::Window* window, Font* font, const Float& fo if ( !pseudoTerminal ) { fprintf( stderr, "Failed to create pseudo terminal\n" ); + if ( freeProcessFactory ) + eeSAFE_DELETE( processFactory ); return nullptr; } if ( !process ) { fprintf( stderr, "Failed to spawn process\n" ); + if ( freeProcessFactory ) + eeSAFE_DELETE( processFactory ); return nullptr; } @@ -363,6 +376,9 @@ TerminalDisplay::create( EE::Window::Window* window, Font* font, const Float& fo terminal->mTerminal = TerminalEmulator::create( std::move( pseudoTerminal ), std::move( process ), terminal ); + terminal->mProgram = program; + terminal->mArgs = args; + terminal->mWorkingDir = workingDir; if ( freeProcessFactory ) eeSAFE_DELETE( processFactory ); @@ -371,7 +387,7 @@ TerminalDisplay::create( EE::Window::Window* window, Font* font, const Float& fo } TerminalDisplay::TerminalDisplay( EE::Window::Window* window, Font* font, const Float& fontSize, - const Sizef& pixelsSize ) : + const Sizef& pixelsSize ) : ITerminalDisplay(), mWindow( window ), mFont( font ), @@ -431,6 +447,15 @@ void TerminalDisplay::setPadding( const Sizef& padding ) { } } +const std::shared_ptr& TerminalDisplay::getTerminal() const { + return mTerminal; +} + +void TerminalDisplay::attach( TerminalEmulator* terminal ) { + ITerminalDisplay::attach( terminal ); + onSizeChange(); +} + void TerminalDisplay::update() { if ( mFocus && isBlinkingCursor() && mClock.getElapsedTime().asSeconds() > 0.7 ) { mMode ^= MODE_BLINK; @@ -753,6 +778,9 @@ inline static void drawbox( float x, float y, float w, float h, Color fg, Color } void TerminalDisplay::draw( const Vector2f& pos ) { + if ( !mEmulator ) + return; + mDrawing = true; auto fontSize = (Float)mFont->getFontHeight( mFontSize ); @@ -976,12 +1004,46 @@ Vector2i TerminalDisplay::positionToGrid( const Vector2i& pos ) { void TerminalDisplay::onSizeChange() { Sizei gridSize( gridSizeFromTermDimensions( mFont, mFontSize, mSize - mPadding * 2.f ) ); - if ( gridSize.getWidth() != mTerminal->getNumColumns() || - gridSize.getHeight() != mTerminal->getNumRows() ) { - mTerminal->resize( gridSize.getWidth(), gridSize.getHeight() ); + if ( mTerminal ) { + if ( gridSize.getWidth() != mTerminal->getNumColumns() || + gridSize.getHeight() != mTerminal->getNumRows() ) { + mTerminal->resize( gridSize.getWidth(), gridSize.getHeight() ); + } + } else if ( mEmulator ) { + if ( gridSize.getWidth() != mEmulator->getNumColumns() || + gridSize.getHeight() != mEmulator->getNumRows() ) { + mEmulator->resize( gridSize.getWidth(), gridSize.getHeight() ); + } } } +void TerminalDisplay::onProcessExit( int ) { + if ( !mTerminal || mProgram.empty() ) + return; + + auto processFactory = eeNew( ProcessFactory, () ); + + Sizei termSize( mColumns, mRows ); + std::unique_ptr pseudoTerminal = nullptr; + std::vector argsV( mArgs.begin(), mArgs.end() ); + auto process = processFactory->createWithPseudoTerminal( + mProgram, argsV, mWorkingDir, termSize.getWidth(), termSize.getHeight(), pseudoTerminal ); + + if ( !pseudoTerminal ) { + eeSAFE_DELETE( processFactory ); + fprintf( stderr, "TerminalDisplay::onProcessExit: Failed to create pseudo terminal\n" ); + } + + if ( !process ) { + eeSAFE_DELETE( processFactory ); + fprintf( stderr, "TerminalDisplay::onProcessExit: Failed to spawn process\n" ); + } + + mTerminal->setPtyAndProcess( std::move( pseudoTerminal ), std::move( process ) ); + + eeSAFE_DELETE( processFactory ); +} + void TerminalDisplay::onTextInput( const Uint32& chr ) { if ( !mTerminal ) return; @@ -1007,7 +1069,7 @@ static Uint32 sanitizeMod( const Uint32& mod ) { } void TerminalDisplay::onKeyDown( const Keycode& keyCode, const Uint32& /*chr*/, const Uint32& mod, - const Scancode& scancode ) { + const Scancode& scancode ) { Uint32 smod = sanitizeMod( mod ); auto scIt = terminalKeyMap.Shortcuts().find( keyCode ); diff --git a/src/tools/eterm/terminal/terminaldisplay.hpp b/src/tools/eterm/terminal/terminaldisplay.hpp index e834218b9..66ce735ab 100644 --- a/src/tools/eterm/terminal/terminaldisplay.hpp +++ b/src/tools/eterm/terminal/terminaldisplay.hpp @@ -110,8 +110,8 @@ class TerminalDisplay : public ITerminalDisplay { static std::shared_ptr create( EE::Window::Window* window, Font* font, const Float& fontSize, const Sizef& pixelsSize, - const std::string& program, const std::vector& args, - const std::string& workingDir, IProcessFactory* processFactory = nullptr ); + std::string program = "", const std::vector& args = {}, + const std::string& workingDir = "", IProcessFactory* processFactory = nullptr ); virtual void resetColors(); virtual int resetColor( int index, const char* name ); @@ -174,6 +174,10 @@ class TerminalDisplay : public ITerminalDisplay { void setPadding( const Sizef& padding ); + const std::shared_ptr& getTerminal() const; + + virtual void attach( TerminalEmulator* terminal ); + protected: EE::Window::Window* mWindow; std::vector mBuffer; @@ -186,8 +190,6 @@ class TerminalDisplay : public ITerminalDisplay { Sizef mPadding; Vector2f mPosition; Sizef mSize; - int mColumns{ 0 }; - int mRows{ 0 }; std::atomic mDirty{ true }; std::atomic mDrawing{ false }; Vector2i mCursor; @@ -197,6 +199,12 @@ class TerminalDisplay : public ITerminalDisplay { bool mFocus{ true }; Clock mClock; Clock mLastDoubleClick; + int mColumns{ 0 }; + int mRows{ 0 }; + + std::string mProgram; + std::vector mArgs; + std::string mWorkingDir; TerminalDisplay( EE::Window::Window* window, Font* font, const Float& fontSize, const Sizef& pixelsSize ); @@ -206,6 +214,8 @@ class TerminalDisplay : public ITerminalDisplay { Vector2i positionToGrid( const Vector2i& pos ); void onSizeChange(); + + virtual void onProcessExit( int exitCode ); }; #endif // ETERMINALDISPLAY_HPP diff --git a/src/tools/eterm/terminal/terminalemulator.cpp b/src/tools/eterm/terminal/terminalemulator.cpp index 0b0f4977e..9d3fce16e 100644 --- a/src/tools/eterm/terminal/terminalemulator.cpp +++ b/src/tools/eterm/terminal/terminalemulator.cpp @@ -1966,7 +1966,7 @@ static int wcwidth( Rune wc ) { void TerminalEmulator::tputc( Rune u ) { char c[UTF_SIZ]; int control; - int width; + int width = 1; size_t len; TerminalGlyph* gp; @@ -2363,6 +2363,13 @@ void TerminalEmulator::mousereport( const TerminalMouseEventType& type, const Ve ttywrite( buf, len, 0 ); } +void TerminalEmulator::setPtyAndProcess( PtyPtr&& pty, ProcPtr&& process ) { + mStatus = STARTING; + mExitCode = 1; + mPty = std::move( pty ); + mProcess = std::move( process ); +} + void TerminalEmulator::xsetpointermotion( int ) { // TODO: Figure something out } @@ -2434,7 +2441,12 @@ void TerminalEmulator::terminate() { } } -void TerminalEmulator::onProcessExit( int /*exitCode*/ ) {} +void TerminalEmulator::onProcessExit( int exitCode ) { + auto dpy = mDpy.lock(); + if ( !dpy ) + return; + dpy->onProcessExit( exitCode ); +} void TerminalEmulator::setClipboard( const char* str ) { auto dpy = mDpy.lock(); diff --git a/src/tools/eterm/terminal/terminalemulator.hpp b/src/tools/eterm/terminal/terminalemulator.hpp index 14f3361a1..6d4e0868b 100644 --- a/src/tools/eterm/terminal/terminalemulator.hpp +++ b/src/tools/eterm/terminal/terminalemulator.hpp @@ -46,6 +46,7 @@ #include using namespace EE; +using namespace EE::System; using namespace EE::Math; using namespace EE::Window; @@ -181,6 +182,8 @@ class TerminalEmulator final { const bool& isDirty() const { return mDirty; } + void setPtyAndProcess( PtyPtr&& pty, ProcPtr&& process ); + private: DpyPtr mDpy; PtyPtr mPty; diff --git a/src/tools/eterm/terminal/windowserrors.hpp b/src/tools/eterm/terminal/windowserrors.hpp index 91f071030..b2365d766 100644 --- a/src/tools/eterm/terminal/windowserrors.hpp +++ b/src/tools/eterm/terminal/windowserrors.hpp @@ -46,7 +46,7 @@ static void PrintWinApiError( DWORD error ) { // Free the buffer. LocalFree( messageBuffer ); - std::cerr << "ERROR: " << message << std::endl; + std::cerr << "ERROR WinAPI: " << message << std::endl; } static void PrintLastWinApiError( void ) {