From a15e461cc8a198162c5ae8dbc04717299888a8e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sun, 22 Dec 2024 22:23:44 -0300 Subject: [PATCH] Speed up load time by loading asynchronously some resources before window creation and avoiding creating some of the largest submenues in settings menu. --- projects/linux/ee.includes | 1 + src/eepp/ui/doc/syntaxdefinitionmanager.cpp | 2 +- src/tools/ecode/ecode.cpp | 168 +++++++++++--------- src/tools/ecode/ecode.hpp | 4 + src/tools/ecode/settingsmenu.cpp | 22 ++- src/tools/ecode/settingsmenu.hpp | 4 +- src/tools/ecode/terminalmanager.cpp | 8 +- src/tools/ecode/terminalmanager.hpp | 2 +- 8 files changed, 120 insertions(+), 91 deletions(-) diff --git a/projects/linux/ee.includes b/projects/linux/ee.includes index 84e29e584..1e9d82768 100644 --- a/projects/linux/ee.includes +++ b/projects/linux/ee.includes @@ -15,4 +15,5 @@ ../../src/tools/ecode ../../src/thirdparty/mojoAL/ ../../src/thirdparty/pcre2/src +../../src/modules/languages-syntax-highlighting/src /usr/include/freetype2/ diff --git a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp index e92aa00b0..d6d9f6213 100644 --- a/src/eepp/ui/doc/syntaxdefinitionmanager.cpp +++ b/src/eepp/ui/doc/syntaxdefinitionmanager.cpp @@ -30,7 +30,7 @@ SINGLETON_DECLARE_IMPLEMENTATION( SyntaxDefinitionManager ) SyntaxDefinitionManager* SyntaxDefinitionManager::createSingleton( std::size_t reserveSpaceForLanguages ) { if ( NULL == ms_singleton ) { - ms_singleton = eeNew( SyntaxDefinitionManager, () ); + ms_singleton = eeNew( SyntaxDefinitionManager, ( reserveSpaceForLanguages ) ); } return ms_singleton; diff --git a/src/tools/ecode/ecode.cpp b/src/tools/ecode/ecode.cpp index 22ae58fbe..9bce5b09b 100644 --- a/src/tools/ecode/ecode.cpp +++ b/src/tools/ecode/ecode.cpp @@ -1727,51 +1727,50 @@ std::map App::getDefaultKeybindings() { std::map App::getLocalKeybindings() { return { { { KEY_RETURN, KEYMOD_LALT | KEYMOD_LCTRL }, "fullscreen-toggle" }, - { { KEY_F3, KEYMOD_NONE }, "repeat-find" }, { { KEY_F3, KEYMOD_SHIFT }, "find-prev" }, - { { KEY_F12, KEYMOD_NONE }, "console-toggle" }, - { { KEY_F, KeyMod::getDefaultModifier() }, "find-replace" }, - { { KEY_Q, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "close-app" }, - { { KEY_O, KeyMod::getDefaultModifier() }, "open-file" }, - { { KEY_W, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "download-file-web" }, - { { KEY_O, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-folder" }, - { { KEY_F11, KEYMOD_NONE }, "debug-widget-tree-view" }, - { { KEY_K, KeyMod::getDefaultModifier() }, "open-locatebar" }, - { { KEY_P, KeyMod::getDefaultModifier() }, "open-command-palette" }, - { { KEY_F, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-global-search" }, - { { KEY_L, KeyMod::getDefaultModifier() }, "go-to-line" }, + { { KEY_F3, KEYMOD_NONE }, "repeat-find" }, + { { KEY_F3, KEYMOD_SHIFT }, "find-prev" }, + { { KEY_F12, KEYMOD_NONE }, "console-toggle" }, + { { KEY_F, KeyMod::getDefaultModifier() }, "find-replace" }, + { { KEY_Q, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "close-app" }, + { { KEY_O, KeyMod::getDefaultModifier() }, "open-file" }, + { { KEY_W, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "download-file-web" }, + { { KEY_O, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-folder" }, + { { KEY_F11, KEYMOD_NONE }, "debug-widget-tree-view" }, + { { KEY_K, KeyMod::getDefaultModifier() }, "open-locatebar" }, + { { KEY_P, KeyMod::getDefaultModifier() }, "open-command-palette" }, + { { KEY_F, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-global-search" }, + { { KEY_L, KeyMod::getDefaultModifier() }, "go-to-line" }, #if EE_PLATFORM == EE_PLATFORM_MACOS - { { KEY_M, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "menu-toggle" }, + { { KEY_M, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "menu-toggle" }, #else - { { KEY_M, KeyMod::getDefaultModifier() }, "menu-toggle" }, + { { KEY_M, KeyMod::getDefaultModifier() }, "menu-toggle" }, #endif - { { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "save-all" }, - { { KEY_F9, KEYMOD_LALT }, "switch-side-panel" }, - { { KEY_J, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, - "terminal-split-left" }, - { { KEY_L, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, - "terminal-split-right" }, - { { KEY_I, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, - "terminal-split-top" }, - { { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, - "terminal-split-bottom" }, - { { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, - "terminal-split-swap" }, - { { KEY_T, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, - "reopen-closed-tab" }, - { { KEY_1, KEYMOD_LALT }, "toggle-status-locate-bar" }, - { { KEY_2, KEYMOD_LALT }, "toggle-status-global-search-bar" }, - { { KEY_3, KEYMOD_LALT }, "toggle-status-terminal" }, - { { KEY_4, KEYMOD_LALT }, "toggle-status-build-output" }, - { { KEY_5, KEYMOD_LALT }, "toggle-status-app-output" }, - { { KEY_B, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-start" }, - { { KEY_C, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-cancel" }, - { { KEY_F5, KEYMOD_NONE }, "project-build-and-run" }, - { { KEY_O, KEYMOD_LALT | KEYMOD_SHIFT }, "show-open-documents" }, - { { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, - "open-workspace-symbol-search" }, - { { KEY_P, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, - "open-document-symbol-search" }, - { { KEY_N, KEYMOD_SHIFT | KEYMOD_LALT }, "create-new-window" }, + { { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "save-all" }, + { { KEY_F9, KEYMOD_LALT }, "switch-side-panel" }, + { { KEY_J, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, + "terminal-split-left" }, + { { KEY_L, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, + "terminal-split-right" }, + { { KEY_I, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, + "terminal-split-top" }, + { { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, + "terminal-split-bottom" }, + { { KEY_S, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, + "terminal-split-swap" }, + { { KEY_T, KeyMod::getDefaultModifier() | KEYMOD_LALT | KEYMOD_SHIFT }, + "reopen-closed-tab" }, + { { KEY_1, KEYMOD_LALT }, "toggle-status-locate-bar" }, + { { KEY_2, KEYMOD_LALT }, "toggle-status-global-search-bar" }, + { { KEY_3, KEYMOD_LALT }, "toggle-status-terminal" }, + { { KEY_4, KEYMOD_LALT }, "toggle-status-build-output" }, + { { KEY_5, KEYMOD_LALT }, "toggle-status-app-output" }, + { { KEY_B, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-start" }, + { { KEY_C, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "project-build-cancel" }, + { { KEY_F5, KEYMOD_NONE }, "project-build-and-run" }, + { { KEY_O, KEYMOD_LALT | KEYMOD_SHIFT }, "show-open-documents" }, + { { KEY_K, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-workspace-symbol-search" }, + { { KEY_P, KeyMod::getDefaultModifier() | KEYMOD_SHIFT }, "open-document-symbol-search" }, + { { KEY_N, KEYMOD_SHIFT | KEYMOD_LALT }, "create-new-window" }, }; } @@ -1780,15 +1779,15 @@ std::map App::getLocalKeybindings() { std::map App::getMigrateKeybindings() { return { { "fullscreen-toggle", "alt+return" }, { "switch-to-tab-1", "alt+1" }, - { "switch-to-tab-2", "alt+2" }, { "switch-to-tab-3", "alt+3" }, - { "switch-to-tab-4", "alt+4" }, { "switch-to-tab-5", "alt+5" }, - { "switch-to-tab-6", "alt+6" }, { "switch-to-tab-7", "alt+7" }, - { "switch-to-tab-8", "alt+8" }, { "switch-to-tab-9", "alt+9" }, - { "switch-to-last-tab", "alt+0" }, + { "switch-to-tab-2", "alt+2" }, { "switch-to-tab-3", "alt+3" }, + { "switch-to-tab-4", "alt+4" }, { "switch-to-tab-5", "alt+5" }, + { "switch-to-tab-6", "alt+6" }, { "switch-to-tab-7", "alt+7" }, + { "switch-to-tab-8", "alt+8" }, { "switch-to-tab-9", "alt+9" }, + { "switch-to-last-tab", "alt+0" }, #if EE_PLATFORM == EE_PLATFORM_MACOS - { "menu-toggle", "mod+shift+m" }, + { "menu-toggle", "mod+shift+m" }, #endif - { "lock-toggle", "mod+shift+l" }, + { "lock-toggle", "mod+shift+l" }, }; } @@ -3402,6 +3401,44 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe mConfig.context.SharedGLContext = true; + mThreadPool->run( [this] { + // Load language definitions + Clock defClock; + SyntaxDefinitionManager::createSingleton( 104 ); + Language::LanguagesSyntaxHighlighting::load(); + SyntaxDefinitionManager::instance()->setLanguageExtensionsPriority( + mConfig.languagesExtensions.priorities ); + Log::info( "Syntax definitions loaded in %s.", + defClock.getElapsedTimeAndReset().toString() ); + + // Load user defined languages definitions + Clock customLangsClock; + SyntaxDefinitionManager::instance()->loadFromFolder( mLanguagesPath ); + Log::info( "SyntaxDefinitionManager loaded custom languages in: %s.", + customLangsClock.getElapsedTime().toString() ); + + // Load editor color schemes + mColorSchemes = + ( SyntaxColorScheme::loadFromFile( mResPath + "colorschemes/colorschemes.conf" ) ); + if ( FileSystem::isDirectory( mColorSchemesPath ) ) { + auto colorSchemesFiles = FileSystem::filesGetInPath( mColorSchemesPath ); + for ( const auto& curFile : colorSchemesFiles ) { + auto colorSchemesInFile = + SyntaxColorScheme::loadFromFile( mColorSchemesPath + curFile ); + for ( auto& colorScheme : colorSchemesInFile ) + mColorSchemes.emplace_back( colorScheme ); + } + } else { + FileSystem::makeDir( mColorSchemesPath, true ); + } + + // Load terminal color schemes + mTerminalManager->loadTerminalColorSchemes(); + + mAsyncResourcesLoaded = true; + mAsyncResourcesLoadCond.notify_all(); + } ); + mWindow = engine->createWindow( winSettings, mConfig.context ); Log::info( "%s (codename: \"%s\") initializing", ecode::Version::getVersionFullName(), ecode::Version::getCodename() ); @@ -3657,14 +3694,6 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe mMenuIconSize = mConfig.ui.fontSize.asPixels( 0, Sizef(), mDisplayDPI ); IconManager::init( mUISceneNode, iconFont, mimeIconFont, codIconFont ); - Clock defClock; - SyntaxDefinitionManager::createSingleton( 104 ); - Language::LanguagesSyntaxHighlighting::load(); - SyntaxDefinitionManager::instance()->setLanguageExtensionsPriority( - mConfig.languagesExtensions.priorities ); - Log::info( "Syntax definitions loaded in %.2f ms.", - defClock.getElapsedTimeAndReset().asMilliseconds() ); - UIWidgetCreator::registerWidget( "searchbar", UISearchBar::New ); UIWidgetCreator::registerWidget( "locatebar", UILocateBar::New ); UIWidgetCreator::registerWidget( "globalsearchbar", UIGlobalSearchBar::New ); @@ -3695,28 +3724,13 @@ void App::init( const LogLevel& logLevel, std::string file, const Float& pidelDe if ( !mConfig.ui.showSidePanel ) showSidePanel( mConfig.ui.showSidePanel ); - auto colorSchemes( - SyntaxColorScheme::loadFromFile( mResPath + "colorschemes/colorschemes.conf" ) ); - if ( FileSystem::isDirectory( mColorSchemesPath ) ) { - auto colorSchemesFiles = FileSystem::filesGetInPath( mColorSchemesPath ); - for ( const auto& curFile : colorSchemesFiles ) { - auto colorSchemesInFile = - SyntaxColorScheme::loadFromFile( mColorSchemesPath + curFile ); - for ( auto& coloScheme : colorSchemesInFile ) - colorSchemes.emplace_back( coloScheme ); - } - } else { - FileSystem::makeDir( mColorSchemesPath, true ); + if ( !mAsyncResourcesLoaded ) { + std::unique_lock syntaxLanguagesLock( mAsyncResourcesLoadMutex ); + mAsyncResourcesLoadCond.wait( syntaxLanguagesLock, + [this]() { return mAsyncResourcesLoaded; } ); } - Clock customLangsClock; - SyntaxDefinitionManager::instance()->loadFromFolder( mLanguagesPath ); - Log::info( "SyntaxDefinitionManager loaded custom languages in: %.2f ms", - customLangsClock.getElapsedTime().asMilliseconds() ); - - mTerminalManager->loadTerminalColorSchemes(); - - mSplitter = UICodeEditorSplitter::New( this, mUISceneNode, mThreadPool, colorSchemes, + mSplitter = UICodeEditorSplitter::New( this, mUISceneNode, mThreadPool, mColorSchemes, mInitColorScheme ); mSplitter->setHideTabBarOnSingleTab( mConfig.editor.hideTabBarOnSingleTab ); mSplitter->setOnTabWidgetCreateCb( [this]( UITabWidget* tabWidget ) { diff --git a/src/tools/ecode/ecode.hpp b/src/tools/ecode/ecode.hpp index ada42d560..e45d70e2b 100644 --- a/src/tools/ecode/ecode.hpp +++ b/src/tools/ecode/ecode.hpp @@ -561,6 +561,10 @@ class App : public UICodeEditorSplitter::Client { std::unique_ptr mSettingsActions; std::vector mPathsToLoad; Uint64 mIpcListenerId{ 0 }; + std::mutex mAsyncResourcesLoadMutex; + std::condition_variable mAsyncResourcesLoadCond; + std::vector mColorSchemes; + bool mAsyncResourcesLoaded{ false }; void saveAllProcess(); diff --git a/src/tools/ecode/settingsmenu.cpp b/src/tools/ecode/settingsmenu.cpp index f2cc907a8..def563533 100644 --- a/src/tools/ecode/settingsmenu.cpp +++ b/src/tools/ecode/settingsmenu.cpp @@ -204,8 +204,8 @@ void SettingsMenu::createSettingsMenu( App* app, UIMenuBar* menuBar ) { Log::info( "Settings Menu took: %s", clock.getElapsedTime().toString() ); } -UIMenu* SettingsMenu::createFileTypeMenu() { - mFileTypeMenuesCreatedWithHeight = mUISceneNode->getPixelsSize().getHeight(); +UIMenu* SettingsMenu::createFileTypeMenu( bool emptyMenu ) { + mFileTypeMenuesCreatedWithHeight = emptyMenu ? 0 : mUISceneNode->getPixelsSize().getHeight(); size_t maxItems = 19; auto* dM = SyntaxDefinitionManager::instance(); auto names = dM->getLanguageNames(); @@ -223,6 +223,9 @@ UIMenu* SettingsMenu::createFileTypeMenu() { mFileTypeMenues.push_back( menu ); size_t total = 0; + if ( emptyMenu ) + return mFileTypeMenues[0]; + for ( const auto& name : names ) { menu->addRadioButton( name, mSplitter->curEditorExistsAndFocused() && @@ -249,8 +252,8 @@ UIMenu* SettingsMenu::createFileTypeMenu() { return mFileTypeMenues[0]; } -UIMenu* SettingsMenu::createColorSchemeMenu() { - mColorSchemeMenuesCreatedWithHeight = mUISceneNode->getPixelsSize().getHeight(); +UIMenu* SettingsMenu::createColorSchemeMenu( bool emptyMenu ) { + mColorSchemeMenuesCreatedWithHeight = emptyMenu ? 0 : mUISceneNode->getPixelsSize().getHeight(); size_t maxItems = 19; auto cb = [this]( const Event* event ) { UIMenuItem* item = event->getNode()->asType(); @@ -264,6 +267,9 @@ UIMenu* SettingsMenu::createColorSchemeMenu() { size_t total = 0; const auto& colorSchemes = mSplitter->getColorSchemes(); + if ( emptyMenu ) + return mColorSchemeMenues[0]; + for ( auto& colorScheme : colorSchemes ) { menu->addRadioButton( colorScheme.first, mSplitter->getCurrentColorSchemeName() == colorScheme.first ); @@ -305,7 +311,7 @@ UIMenu* SettingsMenu::createDocumentMenu() { ->setId( "auto_indent_cur" ); UIMenuSubMenu* fileTypeMenu = mDocMenu->addSubMenu( - i18n( "file_type", "File Type" ), findIcon( "file-code" ), createFileTypeMenu() ); + i18n( "file_type", "File Type" ), findIcon( "file-code" ), createFileTypeMenu( true ) ); fileTypeMenu->on( Event::OnMenuShow, [this, fileTypeMenu]( const Event* ) { if ( mFileTypeMenuesCreatedWithHeight != mUISceneNode->getPixelsSize().getHeight() ) { @@ -468,7 +474,7 @@ UIMenu* SettingsMenu::createDocumentMenu() { UIMenuSubMenu* colorSchemeMenu = mDocMenu->addSubMenu( i18n( "syntax_color_scheme", "Syntax Color Scheme" ), - findIcon( "palette" ), createColorSchemeMenu() ); + findIcon( "palette" ), createColorSchemeMenu( true ) ); colorSchemeMenu->on( Event::OnMenuShow, [this, colorSchemeMenu]( const Event* ) { if ( mColorSchemeMenuesCreatedWithHeight != mUISceneNode->getPixelsSize().getHeight() ) { for ( UIPopUpMenu* menu : mColorSchemeMenues ) @@ -912,7 +918,7 @@ UIMenu* SettingsMenu::createTerminalMenu() { #if EE_PLATFORM != EE_PLATFORM_EMSCRIPTEN UIMenuSubMenu* termColorSchemeMenu = mTerminalMenu->addSubMenu( i18n( "terminal_color_scheme", "Terminal Color Scheme" ), findIcon( "palette" ), - mApp->getTerminalManager()->createColorSchemeMenu() ); + mApp->getTerminalManager()->createColorSchemeMenu( true ) ); termColorSchemeMenu->on( Event::OnMenuShow, [this, termColorSchemeMenu]( const Event* ) { mApp->getTerminalManager()->updateMenuColorScheme( termColorSchemeMenu ); } ); @@ -1058,7 +1064,7 @@ UIMenu* SettingsMenu::createWindowMenu() { colorsMenu ->addRadioButton( i18n( "light", "Light" ), mApp->getUIColorScheme() == ColorSchemePreference::Light ) - ->setOnShouldCloseCb( shouldCloseCb ) + ->setOnShouldCloseCb( shouldCloseCb ) ->setId( "light" ); colorsMenu ->addRadioButton( i18n( "dark", "Dark" ), diff --git a/src/tools/ecode/settingsmenu.hpp b/src/tools/ecode/settingsmenu.hpp index 739630482..57c00bea1 100644 --- a/src/tools/ecode/settingsmenu.hpp +++ b/src/tools/ecode/settingsmenu.hpp @@ -18,9 +18,9 @@ class SettingsMenu { void runCommand( const std::string& command ); - UIMenu* createFileTypeMenu(); + UIMenu* createFileTypeMenu( bool emptyMenu = false ); - UIMenu* createColorSchemeMenu(); + UIMenu* createColorSchemeMenu( bool emptyMenu = false ); UIMenu* createDocumentMenu(); diff --git a/src/tools/ecode/terminalmanager.cpp b/src/tools/ecode/terminalmanager.cpp index 65a918a9d..b3aac387d 100644 --- a/src/tools/ecode/terminalmanager.cpp +++ b/src/tools/ecode/terminalmanager.cpp @@ -241,8 +241,9 @@ void TerminalManager::configureTerminalScrollback() { } ); } -UIMenu* TerminalManager::createColorSchemeMenu() { - mColorSchemeMenuesCreatedWithHeight = mApp->uiSceneNode()->getPixelsSize().getHeight(); +UIMenu* TerminalManager::createColorSchemeMenu( bool emptyMenu ) { + mColorSchemeMenuesCreatedWithHeight = + emptyMenu ? 0 : mApp->uiSceneNode()->getPixelsSize().getHeight(); size_t maxItems = 19; auto cb = [this]( const Event* event ) { UIMenuItem* item = event->getNode()->asType(); @@ -256,6 +257,9 @@ UIMenu* TerminalManager::createColorSchemeMenu() { size_t total = 0; const auto& colorSchemes = mTerminalColorSchemes; + if ( emptyMenu ) + return mColorSchemeMenues[0]; + for ( auto& colorScheme : colorSchemes ) { menu->addRadioButton( colorScheme.first, mTerminalCurrentColorScheme == colorScheme.first ); diff --git a/src/tools/ecode/terminalmanager.hpp b/src/tools/ecode/terminalmanager.hpp index 56ae06033..07b53ac26 100644 --- a/src/tools/ecode/terminalmanager.hpp +++ b/src/tools/ecode/terminalmanager.hpp @@ -36,7 +36,7 @@ class TerminalManager { void setTerminalColorSchemesPath( const std::string& terminalColorSchemesPath ); - UIMenu* createColorSchemeMenu(); + UIMenu* createColorSchemeMenu( bool emptyMenu = false ); void updateMenuColorScheme( UIMenuSubMenu* colorSchemeMenu );