diff --git a/bin/assets/fonts/DejaVuSansMono.ttf b/bin/assets/fonts/DejaVuSansMono.ttf index ef1ccd09d..775bcd632 100644 Binary files a/bin/assets/fonts/DejaVuSansMono.ttf and b/bin/assets/fonts/DejaVuSansMono.ttf differ diff --git a/bin/assets/fonts/DejaVuSansMonoNerdFontComplete.ttf b/bin/assets/fonts/DejaVuSansMonoNerdFontComplete.ttf new file mode 100644 index 000000000..ef1ccd09d Binary files /dev/null and b/bin/assets/fonts/DejaVuSansMonoNerdFontComplete.ttf differ diff --git a/include/eepp/math/math.hpp b/include/eepp/math/math.hpp index 8fe21508f..59967d6ba 100644 --- a/include/eepp/math/math.hpp +++ b/include/eepp/math/math.hpp @@ -80,6 +80,15 @@ template inline T roundUp( T r ) { return ( r > 0.0f ) ? ceil( r ) : ceil( r - 0.5f ); } +/** Round the number always to the lower value */ +template inline T roundDown( T x ) { + T ipart; + T fpart = std::modf( x, &ipart ); + if ( fpart != 0.0 ) + return fpart <= 0.5 ? std::floor( x ) : std::ceil( x ); + return std::round( x ); +} + /** @return The number of digits in a number. */ template static T countDigits( T num ) { T count = 0; diff --git a/src/tools/eterm/eterm.cpp b/src/tools/eterm/eterm.cpp index 2705f3eef..1918a4fb1 100644 --- a/src/tools/eterm/eterm.cpp +++ b/src/tools/eterm/eterm.cpp @@ -92,7 +92,7 @@ EE_MAIN_FUNC int main( int, char*[] ) { win->setClearColor( RGB( 0, 0, 0 ) ); FontTrueType* fontMono = FontTrueType::New( "monospace" ); - fontMono->loadFromFile( "assets/fonts/DejaVuSansMono.ttf" ); + fontMono->loadFromFile( "assets/fonts/DejaVuSansMonoNerdFontComplete.ttf" ); if ( !terminal || terminal->hasTerminated() ) { terminal = TerminalDisplay::create( win, fontMono, PixelDensity::dpToPx( 11 ), diff --git a/src/tools/eterm/system/process.hpp b/src/tools/eterm/system/process.hpp index 18e150b1c..af7e82d9b 100644 --- a/src/tools/eterm/system/process.hpp +++ b/src/tools/eterm/system/process.hpp @@ -72,9 +72,9 @@ class Process final : public IProcess { Terminal::PseudoTerminal& pseudoTerminal ); private: - ProcessStatus m_status; - bool m_leaveRunning; - int m_exitCode; + ProcessStatus m_status{ ProcessStatus::RUNNING }; + bool m_leaveRunning{ false }; + int m_exitCode{ 1 }; #ifdef _WIN32 AutoHandle m_hProcess; LPPROC_THREAD_ATTRIBUTE_LIST m_lpAttributeList; diff --git a/src/tools/eterm/terminal/terminaldisplay.cpp b/src/tools/eterm/terminal/terminaldisplay.cpp index 9531601ad..440be8c7e 100644 --- a/src/tools/eterm/terminal/terminaldisplay.cpp +++ b/src/tools/eterm/terminal/terminaldisplay.cpp @@ -71,10 +71,10 @@ static TerminalShortcut shortcuts[] = { static TerminalMouseShortcut mouseShortcuts[] = { { EE_BUTTON_WUMASK, KEYMOD_SHIFT, TerminalShortcutAction::SCROLLUP_SCREEN, 0, 0, -1 }, { EE_BUTTON_WDMASK, KEYMOD_SHIFT, TerminalShortcutAction::SCROLLDOWN_SCREEN, 0, 0, -1 }, - { EE_BUTTON_WUMASK, KEYMOD_CTRL_SHIFT_ALT_META, TerminalShortcutAction::SCROLLUP_ROW, 0, 0, - -1 }, - { EE_BUTTON_WDMASK, KEYMOD_CTRL_SHIFT_ALT_META, TerminalShortcutAction::SCROLLDOWN_ROW, 0, 0, - -1 } }; + { EE_BUTTON_WUMASK, 0, TerminalShortcutAction::SCROLLUP_ROW, 0, 0, -1 }, + { EE_BUTTON_WDMASK, 0, TerminalShortcutAction::SCROLLDOWN_ROW, 0, 0, -1 }, + { EE_BUTTON_WUMASK, KEYMOD_CTRL, TerminalShortcutAction::FONTSIZE_GROW, 0, 0, 0 }, + { EE_BUTTON_WDMASK, KEYMOD_CTRL, TerminalShortcutAction::FONTSIZE_SHRINK, 0, 0, 0 } }; static TerminalKey keys[] = { /* keysym mask string appkey appcursor */ @@ -499,6 +499,14 @@ void TerminalDisplay::attach( TerminalEmulator* terminal ) { onSizeChange(); } +int TerminalDisplay::scrollSize() const { + return mEmulator ? mEmulator->scrollSize() : 0; +} + +int TerminalDisplay::rowCount() const { + return mEmulator ? mEmulator->rowCount() : 0; +} + void TerminalDisplay::update() { if ( mFocus && isBlinkingCursor() && mClock.getElapsedTime().asSeconds() > 0.7 ) { mMode ^= MODE_BLINK; @@ -555,6 +563,14 @@ void TerminalDisplay::action( TerminalShortcutAction action ) { mTerminal->kscrolldown( &arg ); break; } + case TerminalShortcutAction::FONTSIZE_GROW: { + setFontSize( getFontSize() + 1 ); + break; + } + case TerminalShortcutAction::FONTSIZE_SHRINK: { + setFontSize( getFontSize() - 1 ); + break; + } } } @@ -658,20 +674,23 @@ void TerminalDisplay::onMouseDown( const Vector2i& pos, const Uint32& flags ) { auto scIt = terminalKeyMap.MouseShortcuts().find( flags ); if ( scIt != terminalKeyMap.MouseShortcuts().end() ) { for ( auto& k : scIt->second ) { - if ( k.mask == 0 || k.mask == KEYMOD_CTRL_SHIFT_ALT_META || k.mask == smod ) { - if ( IS_SET( MODE_APPKEYPAD ) ? k.appkey < 0 : k.appkey > 0 ) - continue; + Uint32 kmask = sanitizeMod( k.mask ); - if ( IS_SET( MODE_NUMLOCK ) && k.appkey == 2 ) - continue; + if ( kmask != smod ) + continue; - if ( IS_SET( MODE_APPCURSOR ) ? k.appcursor < 0 : k.appcursor > 0 ) - continue; + if ( IS_SET( MODE_APPKEYPAD ) ? k.appkey < 0 : k.appkey > 0 ) + continue; - if ( !k.altscrn || ( k.altscrn == ( mEmulator->tisaltscr() ? 1 : -1 ) ) ) { - action( k.action ); - return; - } + if ( IS_SET( MODE_NUMLOCK ) && k.appkey == 2 ) + continue; + + if ( IS_SET( MODE_APPCURSOR ) ? k.appcursor < 0 : k.appcursor > 0 ) + continue; + + if ( !k.altscrn || ( k.altscrn == ( mEmulator->tisaltscr() ? 1 : -1 ) ) ) { + action( k.action ); + return; } } } @@ -883,7 +902,9 @@ void TerminalDisplay::draw( const Vector2f& pos ) { const float lineHeight = fontSize; auto defaultFg = termColor( mEmulator->getDefaultForeground(), mColors ); auto defaultBg = termColor( mEmulator->getDefaultBackground(), mColors ); - auto cursorThickness = eeceil( PixelDensity::dpToPx( 1.f ) ); + auto cursorThickness = Math::roundDown( PixelDensity::dpToPx( 1.f ) ); + Rectf xBounds = mFont->getGlyph( L'x', mFontSize, false ).bounds; + Float strikeThroughOffset = lineHeight + xBounds.Top + cursorThickness; Primitives p; p.setForceDraw( false ); @@ -991,8 +1012,8 @@ void TerminalDisplay::draw( const Vector2f& pos ) { if ( glyph.mode & ATTR_STRUCK ) { p.setColor( fg ); - p.drawRectangle( Rectf( { x, y + eefloor( lineHeight / 2.f ) }, - { advanceX, cursorThickness } ) ); + p.drawRectangle( + Rectf( { x, y + strikeThroughOffset }, { advanceX, cursorThickness } ) ); } } @@ -1238,8 +1259,9 @@ Float TerminalDisplay::getFontSize() const { } void TerminalDisplay::setFontSize( const Float& fontSize ) { - if ( mFontSize != fontSize ) { - mFontSize = fontSize; + Float fontSizeClamp = eeclamp( fontSize, 4.f, 120.f ); + if ( mFontSize != fontSizeClamp ) { + mFontSize = fontSizeClamp; onSizeChange(); } } diff --git a/src/tools/eterm/terminal/terminaldisplay.hpp b/src/tools/eterm/terminal/terminaldisplay.hpp index f91032015..4187781de 100644 --- a/src/tools/eterm/terminal/terminaldisplay.hpp +++ b/src/tools/eterm/terminal/terminaldisplay.hpp @@ -29,7 +29,9 @@ enum class TerminalShortcutAction { SCROLLUP_SCREEN, SCROLLDOWN_SCREEN, SCROLLUP_HISTORY, - SCROLLDOWN_HISTORY + SCROLLDOWN_HISTORY, + FONTSIZE_GROW, + FONTSIZE_SHRINK }; struct TerminalKey { @@ -201,6 +203,10 @@ class TerminalDisplay : public ITerminalDisplay { virtual void attach( TerminalEmulator* terminal ); + int scrollSize() const; + + int rowCount() const; + protected: EE::Window::Window* mWindow; std::vector mBuffer; diff --git a/src/tools/eterm/terminal/terminalemulator.cpp b/src/tools/eterm/terminal/terminalemulator.cpp index 2ad6c7d6f..dfbd8dd8b 100644 --- a/src/tools/eterm/terminal/terminalemulator.cpp +++ b/src/tools/eterm/terminal/terminalemulator.cpp @@ -171,7 +171,7 @@ static const emoji_range_t smp_emoji_block = { static const emoji_range_t* emoji_ranges[] = { &bmp_emoji_block, &smp_emoji_block, 0 }; -static inline bool is_emoji_presentation( int32_t code ) { +static inline bool is_emoji( int32_t code ) { const emoji_range_t** curr = emoji_ranges; while ( *curr != 0 ) { if ( code >= ( *curr )->min_code && code <= ( *curr )->max_code ) { @@ -185,12 +185,6 @@ static inline bool is_emoji_presentation( int32_t code ) { return false; } -static inline bool is_emoji( int32_t code ) { - if ( is_emoji_presentation( code ) ) - return true; - return false; -} - static size_t _wcslen( const Rune* s ) { const Rune* a; for ( a = s; *s; s++ ) @@ -684,6 +678,14 @@ int TerminalEmulator::tisaltscr() { return IS_SET( MODE_ALTSCREEN ); } +int TerminalEmulator::scrollSize() const { + return mTerm.histi; +} + +int TerminalEmulator::rowCount() const { + return mTerm.row; +} + bool TerminalEmulator::isScrolling() const { return mTerm.scr != 0; } @@ -2524,6 +2526,9 @@ TerminalEmulator::TerminalEmulator( PtyPtr&& pty, ProcPtr&& process, } TerminalEmulator::~TerminalEmulator() { + for ( size_t i = 0; i < mTerm.hist.size(); ++i ) + free( mTerm.hist[i] ); + { auto dpy = mDpy.lock(); if ( dpy ) @@ -2603,9 +2608,8 @@ void TerminalEmulator::update() { } int n = 1024; - while ( ttyread() > 0 && n > 0 ) { + while ( ttyread() > 0 && n > 0 ) --n; - } if ( n != 1024 || mDirty ) draw(); diff --git a/src/tools/eterm/terminal/terminalemulator.hpp b/src/tools/eterm/terminal/terminalemulator.hpp index 49eecdf14..0a26bbc13 100644 --- a/src/tools/eterm/terminal/terminalemulator.hpp +++ b/src/tools/eterm/terminal/terminalemulator.hpp @@ -199,6 +199,10 @@ class TerminalEmulator final { int tisaltscr(); + int scrollSize() const; + + int rowCount() const; + private: DpyPtr mDpy; PtyPtr mPty;