29#include <wx/html/htmlwin.h>
32#include <wx/filename.h>
34#include <wx/propgrid/propgrid.h>
35#include <wx/stdpaths.h>
37#include <wx/filedlg.h>
39#include <wx/tooltip.h>
73#include <winrt/base.h>
102 wxT(
"Español (Latinoamericano)" ),
true },
121 wxT(
"Português (Brasil)" ),
true },
135 wxT(
"简体中文" ),
true },
137 wxT(
"繁體中文" ),
true },
141#define _(s) wxGetTranslation((s))
190 winrt::uninit_apartment();
204 wxASSERT( wxTheApp );
222 if( !wxGetEnv( wxT(
"EDITOR" ), &editorname ) )
226 editorname = wxT(
"/usr/bin/open -e" );
228 editorname = wxT(
"/usr/bin/xdg-open" );
234 if( !editorname && aCanShowFileChooser )
243 if( !editorname.IsEmpty() )
256 wxString mask(
_(
"Executable file" ) + wxT(
" (*.exe)|*.exe" ) );
258 wxString mask(
_(
"Executable file" ) + wxT(
" (*)|*" ) );
264 wxFileName::SplitPath( aDefaultEditor, &
path, &
name, &ext );
268 return wxFileSelector(
_(
"Select Preferred Editor" ),
path,
name, wxT(
"." ) + ext,
269 mask, wxFD_OPEN | wxFD_FILE_MUST_EXIST,
nullptr );
275 const wxArrayString& argArray =
App().argv.GetArguments();
281 m_argvUtf8[n] = wxStrdup( argArray[n].ToUTF8() );
300 NULL, -1, wxDefaultPosition, wxDefaultSize,
301 wxBORDER_NONE | wxSTAY_ON_TOP );
320#if defined( __WXGTK__ ) && defined( KICAD_DESKTOP_APP_NAME )
323 if( aPgmName == wxT(
"kicad" ) )
324 return wxT( KICAD_DESKTOP_APP_NAME );
326 if( aPgmName == wxT(
"eeschema" ) || aPgmName == wxT(
"pcbnew" )
327 || aPgmName == wxT(
"gerbview" ) || aPgmName == wxT(
"bitmap2component" )
328 || aPgmName == wxT(
"pcb_calculator" ) )
331 wxString appName = aPgmName == wxT(
"pcb_calculator" ) ? wxT(
"pcbcalculator" ) : aPgmName;
332 return wxString( wxT( KICAD_DESKTOP_APP_PREFIX ) ) + wxT(
"." ) + appName;
336 return wxEmptyString;
342#if defined( __WXMAC__ )
363 if(
App().argc == 0 )
364 pgm_name = wxT(
"kicad" );
366 pgm_name = wxFileName(
App().argv[0] ).GetName().Lower();
370 wxInitAllImageHandlers();
374 wxImage::SetDefaultLoadFlags( wxImage::GetDefaultLoadFlags() & ~wxImage::Load_Verbose );
376#if !wxCHECK_VERSION( 3, 3, 0 )
379 wxPGInitResourceModule();
383 if( wxString( wxGetenv(
"HOME" ) ).IsEmpty() )
386 "Unable to continue." ) );
394 bool isDefined = wxGetEnv( wxT(
"KICAD" ), &
m_kicad_env );
405 App().SetVendorName( wxT(
"KiCad" ) );
406 App().SetAppName( pgm_name );
410#if defined( __WXGTK__ ) && defined( KICAD_DESKTOP_APP_NAME )
425 if( !wxGetEnv(
"FONTCONFIG_PATH", NULL ) )
431 wxSetEnv(
"FONTCONFIG_PATH", PATHS::GetWindowsFontConfigDir() );
436 winrt::init_apartment(winrt::apartment_type::single_threaded);
495 wxToolTip::Enable(
true );
496 wxToolTip::SetAutoPop( 10000 );
514 for(
const std::pair<wxString, ENV_VAR_ITEM> it :
GetCommonSettings()->m_Env.vars )
516 wxLogTrace(
traceEnvVars, wxT(
"PGM_BASE::loadSettings: Found entry %s = %s" ),
517 it.first, it.second.GetValue() );
525 if( it.first.IsEmpty() )
529 if( it.second.GetDefinedExternally() )
566 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
577 wxString dictionaryName( wxT(
"kicad" ) );
586 wxLogTrace(
traceLocale, wxT(
"This language is not supported by the system." ) );
592 m_locale->Init( wxLANGUAGE_DEFAULT );
594 aErrMsg =
_(
"This language is not supported by the operating system." );
597 else if( !first_time )
599 wxLogTrace(
traceLocale, wxT(
"Search for dictionary %s.mo in %s" ) ,
600 dictionaryName,
m_locale->GetName() );
609 wxString languageSel;
612 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
627 if( !
m_locale->IsLoaded( dictionaryName ) )
628 m_locale->AddCatalog( dictionaryName );
636 wxLogTrace(
traceLocale, wxT(
"Unable to load dictionary %s.mo in %s" ),
637 dictionaryName,
m_locale->GetName() );
643 m_locale->Init( wxLANGUAGE_DEFAULT );
645 aErrMsg =
_(
"The KiCad language file for this language is not installed." );
661 wxString dictionaryName( wxT(
"kicad" ) );
668 if( !
m_locale->IsLoaded( dictionaryName ) )
669 m_locale->AddCatalog( dictionaryName );
677 wxLogTrace(
traceLocale, wxT(
"Unable to load dictionary %s.mo in %s" ),
678 dictionaryName,
m_locale->GetName() );
686 aErrMsg =
_(
"The KiCad language file for this language is not installed." );
696 wxLogTrace(
traceLocale, wxT(
"Select language ID %d from %d possible languages." ),
699 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
712 const wxLanguageInfo* langInfo = wxLocale::GetLanguageInfo(
m_language_id );
720 wxString str = langInfo->GetCanonicalWithRegion();
721 str.Replace(
"_",
"-" );
731 wxLocale::AddCatalogLookupPathPrefix( PATHS::GetWindowsBaseSharePath() + wxT(
"locale" ) );
735 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
739 fn.AppendDir( wxT(
"translation" ) );
740 wxLocale::AddCatalogLookupPathPrefix( fn.GetPath() );
749 if( aName.IsEmpty() )
752 wxT(
"PGM_BASE::SetLocalEnvVariable: Attempt to set empty variable to "
759 if( wxGetEnv( aName, &env ) )
762 wxT(
"PGM_BASE::SetLocalEnvVariable: Environment variable %s already set "
765 return env == aValue;
769 wxT(
"PGM_BASE::SetLocalEnvVariable: Setting local environment variable %s to %s" ),
772 return wxSetEnv( aName, aValue );
780 for(
const std::pair<wxString, ENV_VAR_ITEM> m_local_env_var :
GetCommonSettings()->m_Env.vars )
783 wxT(
"PGM_BASE::SetLocalEnvVariables: Setting local environment variable %s "
785 m_local_env_var.first,
786 m_local_env_var.second.GetValue() );
787 wxSetEnv( m_local_env_var.first, m_local_env_var.second.GetValue() );
803 return wxTheApp->IsGUI();
812 std::rethrow_exception( aPtr );
816 wxLogError( ioe.
What() );
824 catch(
const std::exception& e )
828 wxLogError( wxT(
"Unhandled exception class: %s what: %s" ),
834 wxLogError( wxT(
"Unhandled exception of unknown type" ) );
845 const wxString& aCond,
const wxString& aMsg )
852 assertStr = wxString::Format(
"Assertion failed at %s:%d in %s: %s - %s", aFile, aLine,
853 aFunc, aCond, aMsg );
857 assertStr = wxString::Format(
"Assertion failed at %s:%d in %s: %s", aFile, aLine, aFunc,
862 wxLogError( assertStr );
865#ifdef KICAD_USE_SENTRY
895 constexpr static int interval = 150;
896 constexpr static int timeLimit = 120000;
905 [
this, aKiway]() ->
void
907 std::shared_ptr<BACKGROUND_JOB_REPORTER>
reporter =
913 bool aborted =
false;
915 reporter->Report(
_(
"Loading Design Block Libraries" ) );
927 std::this_thread::sleep_for( std::chrono::milliseconds( interval ) );
931 float progress = *loadStatus;
932 reporter->SetCurrentProgress( progress );
945 if( elapsed > timeLimit )
962 std::string payload =
"";
977 wxLogTrace(
traceLibraries,
"RegisterLibraryLoadStatusBar: statusBar=%p", aStatusBar );
997 wxLogTrace(
traceLibraries,
"UnregisterLibraryLoadStatusBar: statusBar=%p", aStatusBar );
1010 wxLogTrace(
traceLibraries,
"AddLibraryLoadMessages: message_count=%zu", aMessages.size() );
1012 if( aMessages.empty() )
1024 wxLogTrace(
traceLibraries,
" -> forwarding to statusBar=%p", statusBar );
1025 statusBar->AddWarningMessages(
"load", aMessages );
1035 wxLogTrace(
traceLibraries,
"ClearLibraryLoadMessages: status bars=%zu",
1041 statusBar->ClearWarningMessages(
"load" );
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
void LogAssert(const ASSERT_CACHE_KEY &aKey, const wxString &aMsg)
void LogException(const wxString &aMsg, bool aUnhandled)
void AddTag(const wxString &aKey, const wxString &aValue)
static SENTRY * Instance()
std::shared_ptr< BACKGROUND_JOB > Create(const wxString &aName)
Creates a background job with the given name.
void Remove(std::shared_ptr< BACKGROUND_JOB > job)
Removes the given background job from any lists and frees it.
void InitializeEnvironment()
Creates the built-in environment variables and sets their default values.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
virtual bool SaveToFile(const wxString &aDirectory="", bool aForce=false)
Calls Store() and then writes the contents of the JSON document to a file.
static void Cleanup()
Call curl_global_cleanup for the application.
static void Init()
Call curl_global_init for the application.
KISTATUSBAR is a wxStatusBar suitable for Kicad manager.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
virtual void ExpressMail(FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr, bool aFromOtherThread=false)
Send aPayload to aDestination from aSource.
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
std::optional< float > AsyncLoadProgress() const
Returns async load progress between 0.0 and 1.0, or nullopt if load is not in progress.
void AbortAsyncLoad()
Aborts any async load in progress; blocks until fully done aborting.
void AsyncLoad()
Loads all available libraries for this adapter type in the background.
void Load()
Load notifications stored from disk.
static void EnsureUserPathsExist()
Ensures/creates user default paths.
static wxString GetLocaleDataPath()
Gets the locales translation data path.
static const wxString & GetExecutablePath()
Container for data for KiCad programs.
virtual COMMON_SETTINGS * GetCommonSettings() const
virtual wxApp & App()
Return a bare naked wxApp which may come from wxPython, SINGLE_TOP, or kicad.exe.
std::unique_ptr< NOTIFICATIONS_MANAGER > m_notifications_manager
void PreloadDesignBlockLibraries(KIWAY *aKiway)
Starts a background job to preload the global and project design block libraries.
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
std::unique_ptr< LIBRARY_MANAGER > m_library_manager
bool m_Printing
wxWidgets on MSW tends to crash if you spool up more than one print job at a time.
void setLanguageId(int aId)
Trap all changes in here, simplifies debugging.
std::unique_ptr< API_PLUGIN_MANAGER > m_plugin_manager
std::unique_ptr< SETTINGS_MANAGER > m_settings_manager
void loadCommonSettings()
Load internal settings from COMMON_SETTINGS.
virtual void SetPdfBrowserName(const wxString &aFileName)
std::vector< KISTATUSBAR * > m_libraryLoadStatusBars
wxSplashScreen * m_splash
virtual BACKGROUND_JOBS_MONITOR & GetBackgroundJobMonitor() const
char ** m_argvUtf8
argv parameters converted to utf8 form because wxWidgets has opinions.
BS::priority_thread_pool & GetThreadPool()
void UnregisterLibraryLoadStatusBar(KISTATUSBAR *aStatusBar)
Unregister a status bar from receiving library load warning messages.
void AddLibraryLoadMessages(const std::vector< KI_ERROR > &aMessages)
Add library load messages to all registered status bars.
virtual void ReadPdfBrowserInfos()
Read the PDF browser choice from the common configuration.
void HandleException(std::exception_ptr aPtr, bool aUnhandled=false)
A exception handler to be used at the top level if exceptions bubble up that for.
bool IsGUI()
Determine if the application is running with a GUI.
bool m_use_system_pdf_browser
void RegisterLibraryLoadStatusBar(KISTATUSBAR *aStatusBar)
Register a status bar to receive library load warning messages.
std::future< void > m_libraryPreloadReturn
virtual NOTIFICATIONS_MANAGER & GetNotificationsManager() const
std::shared_ptr< BACKGROUND_JOB > m_libraryPreloadBackgroundJob
void BuildArgvUtf8()
Builds the UTF8 based argv variable.
virtual const wxString & GetPdfBrowserName() const
std::atomic_bool m_libraryPreloadAbort
void ClearLibraryLoadMessages()
Clear library load messages from all registered status bars.
virtual void SetTextEditor(const wxString &aFileName)
virtual bool SetLocalEnvVariable(const wxString &aName, const wxString &aValue)
Set the environment variable aName to aValue.
bool InitPgm(bool aHeadless=false, bool aIsUnitTest=false)
Initialize this program.
wxString m_kicad_env
The KICAD system environment variable.
virtual void ForceSystemPdfBrowser(bool aFlg)
Force the use of system PDF browser, even if a preferred PDF browser is set.
virtual void SetLocalEnvVariables()
Update the local environment with the contents of the current ENV_VAR_MAP stored in the COMMON_SETTIN...
virtual void SetLanguagePath()
bool SetDefaultLanguage(wxString &aErrMsg)
Set the default language without reference to any preferences.
std::atomic_bool m_libraryPreloadInProgress
wxString m_desktopAppId
freedesktop app id of this process, or empty.
virtual void SetLanguageIdentifier(int menu_id)
Set in .m_language_id member the wxWidgets language identifier ID from the KiCad menu id (internal me...
std::unique_ptr< BACKGROUND_JOBS_MONITOR > m_background_jobs_monitor
void HandleAssert(const wxString &aFile, int aLine, const wxString &aFunc, const wxString &aCond, const wxString &aMsg)
A common assert handler to be used between single_top and kicad.
virtual wxString GetLanguageTag()
virtual const wxString & GetTextEditor(bool aCanShowFileChooser=true)
Return the path to the preferred text editor application.
virtual const wxString & GetExecutablePath() const
virtual SETTINGS_MANAGER & GetSettingsManager() const
virtual void WritePdfBrowserInfos()
Save the PDF browser choice to the common configuration.
static wxString DesktopAppIdForProgram(const wxString &aPgmName)
Map a program name (argv[0] basename, lowercased) to the freedesktop application id of its installed ...
void SaveCommonSettings()
Save the program (process) settings subset which are stored .kicad_common.
bool m_PropertyGridInitialized
KICAD_SINGLETON m_singleton
std::mutex m_libraryLoadStatusBarsMutex
virtual const wxString AskUserForPreferredEditor(const wxString &aDefaultEditor=wxEmptyString)
Show a dialog that instructs the user to select a new preferred editor.
virtual bool SetLanguage(wxString &aErrMsg, bool first_time=false)
Set the dictionary file name for internationalization.
virtual DESIGN_BLOCK_LIBRARY_ADAPTER * DesignBlockLibs()
Return the table of design block libraries.
static wxString FindPythonInterpreter()
Searches for a Python intepreter on the user's system.
bool LoadProject(const wxString &aFullPath, bool aSetActive=true)
Load a project or sets up a new project with a specified path.
bool WarnUserIfOperatingSystemUnsupported()
Checks if the operating system is explicitly unsupported and displays a disclaimer message box.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
#define WIN_STRING_DIR_SEP
#define UNIX_STRING_DIR_SEP
const wxChar *const traceLibraries
Flag to enable library table and library manager tracing.
const wxChar *const traceLocale
Flag to enable locale debug output.
const wxChar *const traceEnvVars
Flag to enable debug output of environment variable operations.
@ ID_LANGUAGE_NORWEGIAN_BOKMAL
@ ID_LANGUAGE_CHINESE_SIMPLIFIED
@ ID_LANGUAGE_PORTUGUESE_BRAZILIAN
@ ID_LANGUAGE_SPANISH_MEXICAN
@ ID_LANGUAGE_CHINESE_TRADITIONAL
std::map< wxString, ENV_VAR_ITEM > ENV_VAR_MAP
This file contains miscellaneous commonly used macros and functions.
thread_pool< 1 > priority_thread_pool
void SetPgm(PGM_BASE *pgm)
static PGM_BASE * process
PGM_BASE & Pgm()
The global program "get" accessor.
PGM_BASE * PgmOrNull()
Return a reference that can be nullptr when running a shared lib from a script, not from a kicad app.
LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
#define _(s)
Current list of languages supported by KiCad.
KICOMMON_API LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
KICOMMON_API PGM_BASE & Pgm()
The global program "get" accessor.
#define PROJECT_VAR_NAME
A variable name whose value holds the current project directory.
APIIMPORT wxPGGlobalVarsClass * wxPGGlobalVars
wxString From_UTF8(const char *cstring)
This struct represents a key being used for the std::set that deduplicates asserts during this runnin...
wxString python_interpreter
bool use_system_pdf_viewer
A small class to handle the list of existing translations.
System directories search utilities.
IbisParser parser & reporter
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
BS::priority_thread_pool thread_pool
wxLogTrace helper definitions.