From d949667eafa6899c5c768c460ee08fdf86d9c385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Mon, 27 Jun 2022 02:05:26 -0300 Subject: [PATCH] FontTrueType: Allow disable emoji fallback. Vector2: Added round, roundUp, roundDown. KeyEvent: Now sends also the scancode. GlyphDrawable force glyph offset to be an integer value. TerminalDisplay: Allow emoji fonts. Fixed minor bugs. Added events callback. TerminalEmulator: Added clearHistory. eterm: Implemented title updates. --- include/eepp/graphics/fonttruetype.hpp | 6 ++ include/eepp/math/vector2.hpp | 23 ++++- include/eepp/scene/eventdispatcher.hpp | 6 +- include/eepp/scene/keyevent.hpp | 13 +-- src/eepp/graphics/fonttruetype.cpp | 11 ++- src/eepp/graphics/glyphdrawable.cpp | 2 +- src/eepp/scene/eventdispatcher.cpp | 16 ++-- src/eepp/scene/keyevent.cpp | 15 +++- src/eepp/ui/uilistbox.cpp | 4 +- src/tools/ecode/filelocator.cpp | 4 +- src/tools/ecode/globalsearchcontroller.cpp | 5 +- src/tools/eterm/eterm.cpp | 11 +++ src/tools/eterm/terminal/iterminaldisplay.cpp | 2 +- src/tools/eterm/terminal/iterminaldisplay.hpp | 3 +- src/tools/eterm/terminal/terminaldisplay.cpp | 89 +++++++++++++------ src/tools/eterm/terminal/terminaldisplay.hpp | 19 +++- src/tools/eterm/terminal/terminalemulator.cpp | 10 ++- src/tools/eterm/terminal/terminalemulator.hpp | 2 + 18 files changed, 184 insertions(+), 57 deletions(-) diff --git a/include/eepp/graphics/fonttruetype.hpp b/include/eepp/graphics/fonttruetype.hpp index 7b247caba..4f15266e3 100644 --- a/include/eepp/graphics/fonttruetype.hpp +++ b/include/eepp/graphics/fonttruetype.hpp @@ -77,6 +77,11 @@ class EE_API FontTrueType : public Font { void setIsEmojiFont( bool isEmojiFont ); void setForceIsMonospace( bool isMonospace ); + + bool isEmojiFallbackEnabled() const; + + void setEnableEmojiFallback( bool enableEmojiFallback ); + protected: explicit FontTrueType( const std::string& FontName ); @@ -147,6 +152,7 @@ class EE_API FontTrueType : public Font { bool mIsColorEmojiFont{ false }; bool mIsEmojiFont{ false }; bool mIsMonospace{ false }; + bool mEnableEmojiFallback{ true }; mutable std::map mClosestCharacterSize; mutable std::map mCodePointIndexCache; diff --git a/include/eepp/math/vector2.hpp b/include/eepp/math/vector2.hpp index 21a57e28f..a81e4f446 100644 --- a/include/eepp/math/vector2.hpp +++ b/include/eepp/math/vector2.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace EE { namespace Math { @@ -98,6 +99,12 @@ template class Vector2 { Vector2 floor() const; + Vector2 round() const; + + Vector2 roundUp() const; + + Vector2 roundDown() const; + Vector2 abs() const; Vector2 asFloat() const; @@ -134,8 +141,8 @@ template Vector2 Vector2::sphericalLerp( const Vector2& Ve if ( omega ) { T denom = 1 / eesin( omega ); - return ( Vector2( x, y ) * ( T )( eesin( ( 1 - Time ) * omega ) * denom ) + - Vec * ( T )( eesin( Time * omega ) * denom ) ); + return ( Vector2( x, y ) * (T)( eesin( ( 1 - Time ) * omega ) * denom ) + + Vec * (T)( eesin( Time * omega ) * denom ) ); } else { return Vector2( x, y ); } @@ -386,6 +393,18 @@ template Vector2 Vector2::floor() const { return Vector2( eefloor( x ), eefloor( y ) ); } +template Vector2 Vector2::round() const { + return Vector2( Math::round( x ), Math::round( y ) ); +} + +template Vector2 Vector2::roundUp() const { + return Vector2( Math::roundUp( x ), Math::roundUp( y ) ); +} + +template Vector2 Vector2::roundDown() const { + return Vector2( Math::roundDown( x ), Math::roundDown( y ) ); +} + template Vector2 Vector2::abs() const { return Vector2( eeabs( x ), eeabs( y ) ); } diff --git a/include/eepp/scene/eventdispatcher.hpp b/include/eepp/scene/eventdispatcher.hpp index 3ea9e1ca6..4f8ac0f61 100644 --- a/include/eepp/scene/eventdispatcher.hpp +++ b/include/eepp/scene/eventdispatcher.hpp @@ -52,9 +52,11 @@ class EE_API EventDispatcher { void sendTextInput( const Uint32& textChar, const Uint32& timestamp ); - void sendKeyUp( const Keycode& KeyCode, const Uint32& Char, const Uint32& Mod ); + void sendKeyUp( const Keycode& keyCode, const Scancode& scancode, const Uint32& chr, + const Uint32& mod ); - void sendKeyDown( const Keycode& KeyCode, const Uint32& Char, const Uint32& Mod ); + void sendKeyDown( const Keycode& keyCode, const Scancode& scancode, const Uint32& chr, + const Uint32& mod ); void sendMouseClick( Node* toNode, const Vector2i& pos, const Uint32 flags ); diff --git a/include/eepp/scene/keyevent.hpp b/include/eepp/scene/keyevent.hpp index 4cfd48617..53aa8c673 100644 --- a/include/eepp/scene/keyevent.hpp +++ b/include/eepp/scene/keyevent.hpp @@ -11,8 +11,8 @@ namespace EE { namespace Scene { class EE_API KeyEvent : public Event { public: - KeyEvent( Node* node, const Uint32& eventNum, const Keycode& keyCode, const Uint32& chr, - const Uint32& mod ); + KeyEvent( Node* node, const Uint32& eventNum, const Keycode& keyCode, const Scancode& scancode, + const Uint32& chr, const Uint32& mod ); KeyEvent( const KeyEvent& event ); @@ -20,14 +20,17 @@ class EE_API KeyEvent : public Event { const Keycode& getKeyCode() const; + const Scancode& getScancode() const; + const String::StringBaseType& getChar() const; const Uint32& getMod() const; protected: - Keycode mKeyCode{Keycode::KEY_UNKNOWN}; - String::StringBaseType mChar{0}; - Uint32 mMod{0}; + Keycode mKeyCode{ Keycode::KEY_UNKNOWN }; + Scancode mScancode{ Scancode::SCANCODE_UNKNOWN }; + String::StringBaseType mChar{ 0 }; + Uint32 mMod{ 0 }; }; class EE_API TextInputEvent : public Event { diff --git a/src/eepp/graphics/fonttruetype.cpp b/src/eepp/graphics/fonttruetype.cpp index 65b78ce46..811f05b6b 100644 --- a/src/eepp/graphics/fonttruetype.cpp +++ b/src/eepp/graphics/fonttruetype.cpp @@ -379,7 +379,8 @@ const Glyph& FontTrueType::getGlyph( Uint32 codePoint, unsigned int characterSiz Float outlineThickness ) const { Uint32 index = getGlyphIndex( codePoint ); - if ( Font::isEmojiCodePoint( codePoint ) && !mIsColorEmojiFont && !mIsEmojiFont ) { + if ( mEnableEmojiFallback && Font::isEmojiCodePoint( codePoint ) && !mIsColorEmojiFont && + !mIsEmojiFont ) { if ( !mIsColorEmojiFont && FontManager::instance()->getColorEmojiFont() != nullptr && FontManager::instance()->getColorEmojiFont()->getType() == FontType::TTF ) { @@ -1041,6 +1042,14 @@ FontTrueType::Page& FontTrueType::getPage( unsigned int characterSize ) const { return *pageIt->second; } +bool FontTrueType::isEmojiFallbackEnabled() const { + return mEnableEmojiFallback; +} + +void FontTrueType::setEnableEmojiFallback( bool enableEmojiFallback ) { + mEnableEmojiFallback = enableEmojiFallback; +} + void FontTrueType::setIsEmojiFont( bool isEmojiFont ) { mIsEmojiFont = isEmojiFont; } diff --git a/src/eepp/graphics/glyphdrawable.cpp b/src/eepp/graphics/glyphdrawable.cpp index 3232887f8..cf7ee547b 100644 --- a/src/eepp/graphics/glyphdrawable.cpp +++ b/src/eepp/graphics/glyphdrawable.cpp @@ -80,7 +80,7 @@ const Vector2f& GlyphDrawable::getGlyphOffset() const { } void GlyphDrawable::setGlyphOffset( const Vector2f& glyphOffset ) { - mGlyphOffset = glyphOffset; + mGlyphOffset = glyphOffset.roundDown(); } const GlyphDrawable::DrawMode& GlyphDrawable::getDrawMode() const { diff --git a/src/eepp/scene/eventdispatcher.cpp b/src/eepp/scene/eventdispatcher.cpp index 66f298e06..ea9141bb4 100644 --- a/src/eepp/scene/eventdispatcher.cpp +++ b/src/eepp/scene/eventdispatcher.cpp @@ -40,10 +40,12 @@ void EventDispatcher::inputCallback( InputEvent* event ) { break; } case InputEvent::KeyUp: - sendKeyUp( event->key.keysym.sym, event->key.keysym.unicode, event->key.keysym.mod ); + sendKeyUp( event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.unicode, + event->key.keysym.mod ); break; case InputEvent::KeyDown: - sendKeyDown( event->key.keysym.sym, event->key.keysym.unicode, event->key.keysym.mod ); + sendKeyDown( event->key.keysym.sym, event->key.keysym.scancode, + event->key.keysym.unicode, event->key.keysym.mod ); break; case InputEvent::TextInput: sendTextInput( event->text.text, event->text.timestamp ); @@ -174,8 +176,9 @@ void EventDispatcher::sendTextInput( const Uint32& textChar, const Uint32& times } } -void EventDispatcher::sendKeyUp( const Keycode& KeyCode, const Uint32& Char, const Uint32& Mod ) { - KeyEvent keyEvent = KeyEvent( mFocusNode, Event::KeyUp, KeyCode, Char, Mod ); +void EventDispatcher::sendKeyUp( const Keycode& keyCode, const Scancode& scancode, + const Uint32& chr, const Uint32& mod ) { + KeyEvent keyEvent = KeyEvent( mFocusNode, Event::KeyUp, keyCode, scancode, chr, mod ); Node* node = mFocusNode; while ( NULL != node ) { if ( node->isEnabled() && node->onKeyUp( keyEvent ) ) @@ -184,8 +187,9 @@ void EventDispatcher::sendKeyUp( const Keycode& KeyCode, const Uint32& Char, con } } -void EventDispatcher::sendKeyDown( const Keycode& KeyCode, const Uint32& Char, const Uint32& Mod ) { - KeyEvent keyEvent = KeyEvent( mFocusNode, Event::KeyDown, KeyCode, Char, Mod ); +void EventDispatcher::sendKeyDown( const Keycode& keyCode, const Scancode& scancode, + const Uint32& chr, const Uint32& mod ) { + KeyEvent keyEvent = KeyEvent( mFocusNode, Event::KeyDown, keyCode, scancode, chr, mod ); Node* node = mFocusNode; while ( NULL != node ) { if ( node->isEnabled() && node->onKeyDown( keyEvent ) ) diff --git a/src/eepp/scene/keyevent.cpp b/src/eepp/scene/keyevent.cpp index 16c9a20a5..e16b7700e 100644 --- a/src/eepp/scene/keyevent.cpp +++ b/src/eepp/scene/keyevent.cpp @@ -3,13 +3,18 @@ namespace EE { namespace Scene { -KeyEvent::KeyEvent( Node* node, const Uint32& eventNum, const Keycode& keyCode, const Uint32& chr, - const Uint32& mod ) : - Event( node, eventNum ), mKeyCode( keyCode ), mChar( chr ), mMod( mod ) {} +KeyEvent::KeyEvent( Node* node, const Uint32& eventNum, const Keycode& keyCode, + const Scancode& scancode, const Uint32& chr, const Uint32& mod ) : + Event( node, eventNum ), + mKeyCode( keyCode ), + mScancode( scancode ), + mChar( chr ), + mMod( mod ) {} KeyEvent::KeyEvent( const KeyEvent& event ) : Event( event.getNode(), event.getType() ), mKeyCode( event.getKeyCode() ), + mScancode( event.getScancode() ), mChar( event.getChar() ), mMod( event.getMod() ) {} @@ -19,6 +24,10 @@ const Keycode& KeyEvent::getKeyCode() const { return mKeyCode; } +const Scancode& KeyEvent::getScancode() const { + return mScancode; +} + const String::StringBaseType& KeyEvent::getChar() const { return mChar; } diff --git a/src/eepp/ui/uilistbox.cpp b/src/eepp/ui/uilistbox.cpp index 90f8eb580..1ee4eca72 100644 --- a/src/eepp/ui/uilistbox.cpp +++ b/src/eepp/ui/uilistbox.cpp @@ -670,8 +670,8 @@ void UIListBox::updateScroll( bool fromScrollChange ) { } void UIListBox::itemKeyEvent( const KeyEvent& Event ) { - KeyEvent ItemEvent( Event.getNode(), Event::OnItemKeyDown, Event.getKeyCode(), Event.getChar(), - Event.getMod() ); + KeyEvent ItemEvent( Event.getNode(), Event::OnItemKeyDown, Event.getKeyCode(), + Event.getScancode(), Event.getChar(), Event.getMod() ); sendEvent( &ItemEvent ); } diff --git a/src/tools/ecode/filelocator.cpp b/src/tools/ecode/filelocator.cpp index 44313253a..b347a7a39 100644 --- a/src/tools/ecode/filelocator.cpp +++ b/src/tools/ecode/filelocator.cpp @@ -75,7 +75,7 @@ void FileLocator::initLocateBar( UILocateBar* locateBar, UITextInput* locateInpu } } ); mLocateInput->addEventListener( Event::OnPressEnter, [&]( const Event* ) { - KeyEvent keyEvent( mLocateTable, Event::KeyDown, KEY_RETURN, 0, 0 ); + KeyEvent keyEvent( mLocateTable, Event::KeyDown, KEY_RETURN, SCANCODE_UNKNOWN, 0, 0 ); mLocateTable->forceKeyDown( keyEvent ); } ); mLocateInput->addEventListener( Event::KeyDown, [&]( const Event* event ) { @@ -148,4 +148,4 @@ void FileLocator::showLocateBar() { updateLocateBar(); } -} +} // namespace ecode diff --git a/src/tools/ecode/globalsearchcontroller.cpp b/src/tools/ecode/globalsearchcontroller.cpp index d3935d34d..8f0eedde6 100644 --- a/src/tools/ecode/globalsearchcontroller.cpp +++ b/src/tools/ecode/globalsearchcontroller.cpp @@ -159,7 +159,8 @@ void GlobalSearchController::initGlobalSearchBar( if ( mGlobalSearchInput->hasFocus() ) { mGlobalSearchBarLayout->execute( "search-in-files" ); } else { - KeyEvent keyEvent( mGlobalSearchTree, Event::KeyDown, KEY_RETURN, 0, 0 ); + KeyEvent keyEvent( mGlobalSearchTree, Event::KeyDown, KEY_RETURN, SCANCODE_UNKNOWN, 0, + 0 ); mGlobalSearchTree->forceKeyDown( keyEvent ); } } ); @@ -533,4 +534,4 @@ void GlobalSearchController::initGlobalSearchTree( UITreeViewGlobalSearch* searc } ); } -} +} // namespace ecode diff --git a/src/tools/eterm/eterm.cpp b/src/tools/eterm/eterm.cpp index 1918a4fb1..63d2d9020 100644 --- a/src/tools/eterm/eterm.cpp +++ b/src/tools/eterm/eterm.cpp @@ -93,10 +93,21 @@ EE_MAIN_FUNC int main( int, char*[] ) { FontTrueType* fontMono = FontTrueType::New( "monospace" ); fontMono->loadFromFile( "assets/fonts/DejaVuSansMonoNerdFontComplete.ttf" ); + fontMono->setEnableEmojiFallback( false ); + + if ( FileSystem::fileExists( "assets/fonts/NotoColorEmoji.ttf" ) ) { + FontTrueType::New( "emoji-color" )->loadFromFile( "assets/fonts/NotoColorEmoji.ttf" ); + } else if ( FileSystem::fileExists( "assets/fonts/NotoEmoji-Regular.ttf" ) ) { + FontTrueType::New( "emoji-font" )->loadFromFile( "assets/fonts/NotoEmoji-Regular.ttf" ); + } if ( !terminal || terminal->hasTerminated() ) { terminal = TerminalDisplay::create( win, fontMono, PixelDensity::dpToPx( 11 ), win->getSize().asFloat() ); + terminal->pushEventCallback( [&]( const TerminalDisplay::Event& event ) { + if ( event.type == TerminalDisplay::EventType::TITLE ) + win->setTitle( "eterm - " + event.eventData ); + } ); } win->getInput()->pushCallback( &inputCallback ); diff --git a/src/tools/eterm/terminal/iterminaldisplay.cpp b/src/tools/eterm/terminal/iterminaldisplay.cpp index f244d7546..7cc90ce02 100644 --- a/src/tools/eterm/terminal/iterminaldisplay.cpp +++ b/src/tools/eterm/terminal/iterminaldisplay.cpp @@ -44,7 +44,7 @@ void ITerminalDisplay::bell() {} void ITerminalDisplay::resetColors() {} -int ITerminalDisplay::resetColor( int /*index*/, const char* /*name*/ ) { +int ITerminalDisplay::resetColor( Uint32 /*index*/, const char* /*name*/ ) { return 0; } diff --git a/src/tools/eterm/terminal/iterminaldisplay.hpp b/src/tools/eterm/terminal/iterminaldisplay.hpp index 3b41929f6..3181f977c 100644 --- a/src/tools/eterm/terminal/iterminaldisplay.hpp +++ b/src/tools/eterm/terminal/iterminaldisplay.hpp @@ -22,6 +22,7 @@ #pragma once #include "types.hpp" +#include namespace EE { namespace Terminal { @@ -49,7 +50,7 @@ class ITerminalDisplay { virtual void resetColors(); - virtual int resetColor( int index, const char* name ); + virtual int resetColor( Uint32 index, const char* name ); virtual void setMode( TerminalWinMode mode, int set ); diff --git a/src/tools/eterm/terminal/terminaldisplay.cpp b/src/tools/eterm/terminal/terminaldisplay.cpp index 440be8c7e..7f8cbdc26 100644 --- a/src/tools/eterm/terminal/terminaldisplay.cpp +++ b/src/tools/eterm/terminal/terminaldisplay.cpp @@ -1,6 +1,8 @@ #include "terminaldisplay.hpp" #include "../system/processfactory.hpp" #include "boxdraw.hpp" +#include "eepp/graphics/fonttruetype.hpp" +#include #include #include #include @@ -263,9 +265,10 @@ TerminalKeyMap terminalKeyMap{ /* Terminal colors (16 first used in escape sequence) */ // This is the customizable colorscheme -const char* colornames[256] = { "#1e2127", "#e06c75", "#98c379", "#d19a66", "#61afef", "#c678dd", - "#56b6c2", "#abb2bf", "#5c6370", "#e06c75", "#98c379", "#d19a66", - "#61afef", "#c678dd", "#56b6c2", "#ffffff", "#1e2127", "#abb2bf" }; +static std::vector colornames{ "#1e2127", "#e06c75", "#98c379", "#d19a66", "#61afef", + "#c678dd", "#56b6c2", "#abb2bf", "#5c6370", "#e06c75", + "#98c379", "#d19a66", "#61afef", "#c678dd", "#56b6c2", + "#ffffff", "#1e2127", "#abb2bf" }; // This is the default Xterm palette static const Color colormapped[256] = { @@ -440,32 +443,29 @@ TerminalDisplay::TerminalDisplay( EE::Window::Window* window, Font* font, const defaultGlyph.mode = ATTR_INVISIBLE; auto defaultColor = std::make_pair( 0U, "" ); mCursorGlyph = defaultGlyph; - mColors.resize( eeARRAY_SIZE( colornames ), defaultColor ); + mColors.resize( eeARRAY_SIZE( colormapped ), defaultColor ); mBuffer.resize( mColumns * mRows, defaultGlyph ); ( (int&)mMode ) |= MODE_FOCUSED; } void TerminalDisplay::resetColors() { - for ( Uint32 i = 0; i < eeARRAY_SIZE( colornames ); i++ ) { - resetColor( i, colornames[i] ); - } + for ( Uint32 i = 0; i < eeARRAY_SIZE( colormapped ); i++ ) + resetColor( i, i < colornames.size() ? colornames[i].c_str() : nullptr ); } -int TerminalDisplay::resetColor( int index, const char* name ) { - if ( !name ) { - if ( index >= 0 && index < (int)mColors.size() ) { - Color col = 0x000000FF; +int TerminalDisplay::resetColor( Uint32 index, const char* name ) { + if ( !name && index < mColors.size() ) { + Color col = 0x000000FF; - if ( index < 256 ) - col = colormapped[index]; + if ( index < 256 ) + col = colormapped[index]; - mColors[index].first = col; - mColors[index].second = ""; - return 0; - } + mColors[index].first = col; + mColors[index].second = ""; + return 0; } - if ( index >= 0 && index < (int)mColors.size() ) { + if ( index < mColors.size() ) { mColors[index].first = Color::fromString( name ); mColors[index].second = name; } @@ -507,6 +507,22 @@ int TerminalDisplay::rowCount() const { return mEmulator ? mEmulator->rowCount() : 0; } +void TerminalDisplay::sendEvent( const Event& event ) { + for ( auto it : mCallbacks ) + it.second( event ); +} + +Uint32 TerminalDisplay::pushEventCallback( const EventFunc& func ) { + mCallbacks[++mNumCallBacks] = func; + return mNumCallBacks; +} + +void TerminalDisplay::popEventCallback( const Uint32& id ) { + auto it = mCallbacks.find( id ); + if ( it != mCallbacks.end() ) + mCallbacks.erase( it ); +} + void TerminalDisplay::update() { if ( mFocus && isBlinkingCursor() && mClock.getElapsedTime().asSeconds() > 0.7 ) { mMode ^= MODE_BLINK; @@ -578,9 +594,15 @@ bool TerminalDisplay::hasTerminated() const { return mTerminal->hasExited(); } -void TerminalDisplay::setTitle( const char* ) {} +void TerminalDisplay::setTitle( const char* title ) { + if ( title ) + sendEvent( { EventType::TITLE, std::string( title ) } ); +} -void TerminalDisplay::setIconTitle( const char* ) {} +void TerminalDisplay::setIconTitle( const char* title ) { + if ( title ) + sendEvent( { EventType::ICON_TITLE, std::string( title ) } ); +} void TerminalDisplay::setClipboard( const char* text ) { if ( text == nullptr ) @@ -914,7 +936,7 @@ void TerminalDisplay::draw( const Vector2f& pos ) { for ( int j = 0; j < mRows; j++ ) { x = std::floor( pos.x ); - if ( pos.y + lineHeight * j > mSize.getWidth() ) + if ( pos.y + lineHeight * j > pos.y + mSize.getHeight() ) break; for ( int i = 0; i < mColumns; i++ ) { @@ -955,7 +977,7 @@ void TerminalDisplay::draw( const Vector2f& pos ) { for ( int j = 0; j < mRows; j++ ) { x = std::floor( pos.x ); - if ( pos.y + lineHeight * j > mSize.getWidth() ) + if ( pos.y + lineHeight * j > pos.y + mSize.getHeight() ) break; for ( int i = 0; i < mColumns; i++ ) { @@ -999,9 +1021,24 @@ void TerminalDisplay::draw( const Vector2f& pos ) { drawbox( x, y, advanceX, lineHeight, fg, bg, bd, p ); } else { auto* gd = mFont->getGlyphDrawable( glyph.u, mFontSize, glyph.mode & ATTR_BOLD ); - gd->setColor( fg ); - gd->setDrawMode( glyph.mode & ATTR_ITALIC ? GlyphDrawable::DrawMode::TextItalic - : GlyphDrawable::DrawMode::Text ); + + if ( glyph.mode & ATTR_EMOJI ) { + if ( FontManager::instance()->getColorEmojiFont() ) { + Font* font = FontManager::instance()->getColorEmojiFont(); + gd = font->getGlyphDrawable( glyph.u, mFontSize ); + gd->setColor( Color::White ); + } else if ( FontManager::instance()->getEmojiFont() ) { + Font* font = FontManager::instance()->getEmojiFont(); + gd = font->getGlyphDrawable( glyph.u, mFontSize ); + gd->setColor( fg ); + } + gd->setDrawMode( GlyphDrawable::DrawMode::Text ); + } else { + gd->setDrawMode( glyph.mode & ATTR_ITALIC ? GlyphDrawable::DrawMode::TextItalic + : GlyphDrawable::DrawMode::Text ); + gd->setColor( fg ); + } + gd->draw( { x, y } ); if ( glyph.mode & ATTR_UNDERLINE ) { @@ -1109,7 +1146,7 @@ Vector2i TerminalDisplay::positionToGrid( const Vector2i& pos ) { mouseY = 0; } else if ( relPos.x >= 0.0f && relPos.y >= 0.0f ) { mouseX = eeclamp( (int)std::floor( relPos.x / spaceCharAdvanceX ), 0, clipColumns ); - mouseY = eeclamp( (int)std::floor( relPos.y / fontSize ), 0, clipRows ); + mouseY = eeclamp( (int)std::floor( relPos.y / fontSize ), 0, clipRows - 1 ); } return { mouseX, mouseY }; diff --git a/src/tools/eterm/terminal/terminaldisplay.hpp b/src/tools/eterm/terminal/terminaldisplay.hpp index 4187781de..abd46503c 100644 --- a/src/tools/eterm/terminal/terminaldisplay.hpp +++ b/src/tools/eterm/terminal/terminaldisplay.hpp @@ -128,6 +128,15 @@ static const Scancode asciiScancodeTable[] = { class TerminalDisplay : public ITerminalDisplay { public: + enum class EventType { TITLE, ICON_TITLE, UNKNOWN }; + + struct Event { + EventType type{ EventType::UNKNOWN }; + std::string eventData; + }; + + typedef std::function EventFunc; + static std::shared_ptr create( EE::Window::Window* window, Font* font, const Float& fontSize, const Sizef& pixelsSize, std::shared_ptr&& terminalEmulator ); @@ -139,7 +148,7 @@ class TerminalDisplay : public ITerminalDisplay { IProcessFactory* processFactory = nullptr ); virtual void resetColors(); - virtual int resetColor( int index, const char* name ); + virtual int resetColor( Uint32 index, const char* name ); virtual void setTitle( const char* title ); virtual void setIconTitle( const char* title ); @@ -207,12 +216,18 @@ class TerminalDisplay : public ITerminalDisplay { int rowCount() const; + Uint32 pushEventCallback( const EventFunc& func ); + + void popEventCallback( const Uint32& id ); + protected: EE::Window::Window* mWindow; std::vector mBuffer; std::vector> mColors; std::shared_ptr mTerminal; mutable std::string mClipboard; + Uint32 mNumCallBacks; + std::map mCallbacks; Font* mFont{ nullptr }; Float mFontSize{ 12 }; @@ -245,6 +260,8 @@ class TerminalDisplay : public ITerminalDisplay { void onSizeChange(); virtual void onProcessExit( int exitCode ); + + void sendEvent( const TerminalDisplay::Event& event ); }; #endif // ETERMINALDISPLAY_HPP diff --git a/src/tools/eterm/terminal/terminalemulator.cpp b/src/tools/eterm/terminal/terminalemulator.cpp index dfbd8dd8b..c1f60e5b0 100644 --- a/src/tools/eterm/terminal/terminalemulator.cpp +++ b/src/tools/eterm/terminal/terminalemulator.cpp @@ -686,6 +686,13 @@ int TerminalEmulator::rowCount() const { return mTerm.row; } +void TerminalEmulator::clearHistory() { + for ( size_t i = 0; i < mTerm.hist.size(); ++i ) + free( mTerm.hist[i] ); + mTerm.hist.clear(); + mTerm.histi = 0; +} + bool TerminalEmulator::isScrolling() const { return mTerm.scr != 0; } @@ -2526,8 +2533,7 @@ TerminalEmulator::TerminalEmulator( PtyPtr&& pty, ProcPtr&& process, } TerminalEmulator::~TerminalEmulator() { - for ( size_t i = 0; i < mTerm.hist.size(); ++i ) - free( mTerm.hist[i] ); + clearHistory(); { auto dpy = mDpy.lock(); diff --git a/src/tools/eterm/terminal/terminalemulator.hpp b/src/tools/eterm/terminal/terminalemulator.hpp index 0a26bbc13..f0850ffa2 100644 --- a/src/tools/eterm/terminal/terminalemulator.hpp +++ b/src/tools/eterm/terminal/terminalemulator.hpp @@ -203,6 +203,8 @@ class TerminalEmulator final { int rowCount() const; + void clearHistory(); + private: DpyPtr mDpy; PtyPtr mPty;