33#include <wx/html/htmlwin.h> 
   36#include <wx/filename.h> 
   38#include <wx/propgrid/propgrid.h> 
   39#include <wx/snglinst.h> 
   40#include <wx/stdpaths.h> 
   42#include <wx/filedlg.h> 
   44#include <wx/tooltip.h> 
   64#include <python_scripting.h> 
   77#include <python_manager.h> 
   81#include <winrt/base.h> 
  108      wxT( 
"Español (Latinoamericano)" ),  
true },
 
  123      wxT( 
"Português (Brasil)" ), 
true },
 
  136            wxT( 
"简体中文" ), 
true },
 
  138            wxT( 
"繁體中文" ), 
true },
 
 
  142#define _(s) wxGetTranslation((s)) 
  187    winrt::uninit_apartment();
 
 
  194    wxASSERT( wxTheApp );
 
 
  212        if( !wxGetEnv(  wxT( 
"EDITOR" ), &editorname ) )
 
  216            editorname = wxT( 
"/usr/bin/open -e" );
 
  218            editorname =  wxT( 
"/usr/bin/xdg-open" );
 
  224    if( !editorname && aCanShowFileChooser )
 
  233    if( !editorname.IsEmpty() )
 
 
  246    wxString mask( 
_( 
"Executable file" ) + wxT( 
" (*.exe)|*.exe" ) );
 
  248    wxString mask( 
_( 
"Executable file" ) + wxT( 
" (*)|*" ) );
 
  254    wxFileName::SplitPath( aDefaultEditor, &
path, &
name, &ext );
 
  258    return wxFileSelector( 
_( 
"Select Preferred Editor" ), 
path, 
name, wxT( 
"." ) + ext,
 
  259                           mask, wxFD_OPEN | wxFD_FILE_MUST_EXIST, 
nullptr );
 
 
  265    const wxArrayString& argArray = 
App().argv.GetArguments();
 
  271        m_argvUtf8[n] = wxStrdup( argArray[n].ToUTF8() );
 
 
  290                              NULL, -1, wxDefaultPosition, wxDefaultSize,
 
  291                              wxBORDER_NONE | wxSTAY_ON_TOP );
 
 
  310#if defined( __WXMAC__ ) 
  331    if( 
App().argc == 0 )
 
  332        pgm_name = wxT( 
"kicad" );
 
  334        pgm_name = wxFileName( 
App().argv[0] ).GetName().Lower();
 
  338    wxInitAllImageHandlers();
 
  342        wxPGInitResourceModule();
 
  345    if( wxString( wxGetenv( 
"HOME" ) ).IsEmpty() )
 
  348                                         "Unable to continue." ) );
 
  359    wxChmod( instanceCheckerDir,
 
  360             wxPOSIX_USER_READ | wxPOSIX_USER_WRITE | wxPOSIX_USER_EXECUTE |
 
  361             wxPOSIX_GROUP_READ | wxPOSIX_GROUP_WRITE | wxPOSIX_GROUP_EXECUTE |
 
  362             wxPOSIX_OTHERS_READ | wxPOSIX_OTHERS_WRITE | wxPOSIX_OTHERS_EXECUTE );
 
  364    wxString instanceCheckerName = wxString::Format( wxS( 
"%s-%s" ), pgm_name,
 
  368    m_pgm_checker->Create( instanceCheckerName, instanceCheckerDir );
 
  373    bool isDefined = wxGetEnv( wxT( 
"KICAD" ), &
m_kicad_env );
 
  384    App().SetVendorName(  wxT( 
"KiCad" ) );
 
  385    App().SetAppName( pgm_name );
 
  388    if( wxImage::FindHandler( wxBITMAP_TYPE_PNG ) == 
nullptr )
 
  389        wxImage::AddHandler( 
new wxPNGHandler );
 
  391    if( wxImage::FindHandler( wxBITMAP_TYPE_GIF ) == 
nullptr )
 
  392        wxImage::AddHandler( 
new wxGIFHandler );
 
  394    if( wxImage::FindHandler( wxBITMAP_TYPE_JPEG ) == 
nullptr )
 
  395        wxImage::AddHandler( 
new wxJPEGHandler );
 
  397    wxFileSystem::AddHandler( 
new wxZipFSHandler );
 
  405    if( !wxGetEnv( 
"FONTCONFIG_PATH", NULL ) )
 
  411        wxSetEnv( 
"FONTCONFIG_PATH", PATHS::GetWindowsFontConfigDir() );
 
  416    winrt::init_apartment(winrt::apartment_type::single_threaded);
 
  425    m_plugin_manager = std::make_unique<API_PLUGIN_MANAGER>( &
App() );
 
  479        m_plugin_manager->ReloadPlugins();
 
  486        wxToolTip::Enable( 
true );
 
  487        wxToolTip::SetAutoPop( 10000 );
 
 
  505    for( 
const std::pair<wxString, ENV_VAR_ITEM> it : 
GetCommonSettings()->m_Env.vars )
 
  507        wxLogTrace( 
traceEnvVars, wxT( 
"PGM_BASE::loadSettings: Found entry %s = %s" ),
 
  508                    it.first, it.second.GetValue() );
 
  516        if( it.first.IsEmpty() )
 
  520        if( it.second.GetDefinedExternally() )
 
 
  557        for( 
unsigned ii = 0; 
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
 
  568    wxString dictionaryName( wxT( 
"kicad" ) );
 
  577        wxLogTrace( 
traceLocale, wxT( 
"This language is not supported by the system." ) );
 
  583        m_locale->Init( wxLANGUAGE_DEFAULT );
 
  585        aErrMsg = 
_( 
"This language is not supported by the operating system." );
 
  588    else if( !first_time )
 
  590        wxLogTrace( 
traceLocale, wxT( 
"Search for dictionary %s.mo in %s" ) ,
 
  591                    dictionaryName, 
m_locale->GetName() );
 
  600        wxString languageSel;
 
  603        for( 
unsigned ii = 0;  
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
 
  618    if( !
m_locale->IsLoaded( dictionaryName ) )
 
  619        m_locale->AddCatalog( dictionaryName );
 
  627        wxLogTrace( 
traceLocale, wxT( 
"Unable to load dictionary %s.mo in %s" ),
 
  628                    dictionaryName, 
m_locale->GetName() );
 
  634        m_locale->Init( wxLANGUAGE_DEFAULT );
 
  636        aErrMsg = 
_( 
"The KiCad language file for this language is not installed." );
 
 
  652    wxString dictionaryName( wxT( 
"kicad" ) );
 
  659    if( !
m_locale->IsLoaded( dictionaryName ) )
 
  660        m_locale->AddCatalog( dictionaryName );
 
  668        wxLogTrace( 
traceLocale, wxT( 
"Unable to load dictionary %s.mo in %s" ),
 
  669                    dictionaryName, 
m_locale->GetName() );
 
  677        aErrMsg = 
_( 
"The KiCad language file for this language is not installed." );
 
 
  687    wxLogTrace( 
traceLocale, wxT( 
"Select language ID %d from %d possible languages." ),
 
  690    for( 
unsigned ii = 0;  
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
 
 
  703    const wxLanguageInfo* langInfo = wxLocale::GetLanguageInfo( 
m_language_id );
 
  711        wxString str = langInfo->GetCanonicalWithRegion();
 
  712        str.Replace( 
"_", 
"-" );
 
 
  722    wxLocale::AddCatalogLookupPathPrefix( PATHS::GetWindowsBaseSharePath() + wxT( 
"locale" ) );
 
  726    if( wxGetEnv( wxT( 
"KICAD_RUN_FROM_BUILD_DIR" ), 
nullptr ) )
 
  730        fn.AppendDir( wxT( 
"translation" ) );
 
  731        wxLocale::AddCatalogLookupPathPrefix( fn.GetPath() );
 
 
  740    if( aName.IsEmpty() )
 
  743                    wxT( 
"PGM_BASE::SetLocalEnvVariable: Attempt to set empty variable to " 
  750    if( wxGetEnv( aName, &env ) )
 
  753                    wxT( 
"PGM_BASE::SetLocalEnvVariable: Environment variable %s already set " 
  756        return env == aValue;
 
  760                wxT( 
"PGM_BASE::SetLocalEnvVariable: Setting local environment variable %s to %s" ),
 
  763    return wxSetEnv( aName, aValue );
 
 
  771    for( 
const std::pair<wxString, ENV_VAR_ITEM> m_local_env_var : 
GetCommonSettings()->m_Env.vars )
 
  774                    wxT( 
"PGM_BASE::SetLocalEnvVariables: Setting local environment variable %s " 
  776                    m_local_env_var.first,
 
  777                    m_local_env_var.second.GetValue() );
 
  778        wxSetEnv( m_local_env_var.first, m_local_env_var.second.GetValue() );
 
 
  794    return wxTheApp->IsGUI();
 
 
  803            std::rethrow_exception( aPtr );
 
  807        wxLogError( ioe.
What() );
 
  809    catch( 
const std::exception& e )
 
  813        wxLogError( wxT( 
"Unhandled exception class: %s  what: %s" ),
 
  818        wxLogError( wxT( 
"Unhandled exception of unknown type" ) );
 
 
  824                             const wxString& aCond, 
const wxString& aMsg )
 
  831        assertStr = wxString::Format( 
"Assertion failed at %s:%d in %s: %s - %s", aFile, aLine,
 
  832                                      aFunc, aCond, aMsg );
 
  836        assertStr = wxString::Format( 
"Assertion failed at %s:%d in %s: %s", aFile, aLine, aFunc,
 
  841    wxLogError( assertStr );
 
  844#ifdef KICAD_USE_SENTRY 
 
  874    constexpr static int interval = 150;
 
  875    constexpr static int timeLimit = 120000;
 
  884        [
this, aKiway]() -> 
void 
  886            std::shared_ptr<BACKGROUND_JOB_REPORTER> reporter =
 
  893            reporter->Report( 
_( 
"Loading Design Block Libraries" ) );
 
  904                std::this_thread::sleep_for( std::chrono::milliseconds( interval ) );
 
  908                    float progress = *loadStatus;
 
  909                    reporter->SetCurrentProgress( progress );
 
  916                    reporter->SetCurrentProgress( 1 );
 
  922                if( elapsed > timeLimit )
 
  932            std::string payload = 
"";
 
 
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...
 
wxString GetMajorMinorVersion()
Get only the major and minor version in a string major.minor.
 
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)
 
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.
 
void AsyncLoad() override
Loads all available libraries for this adapter type in the background.
 
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.
 
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 Load()
Load notifications stored from disk.
 
static wxString GetInstanceCheckerPath()
Gets the path used for wxSingleInstanceChecker lock files.
 
static void EnsureUserPathsExist()
Ensures/creates user default paths.
 
static bool EnsurePathExists(const wxString &aPath, bool aPathToFile=false)
Attempts to create a given path if it does not exist.
 
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< SETTINGS_MANAGER > m_settings_manager
 
void loadCommonSettings()
Load internal settings from COMMON_SETTINGS.
 
virtual void SetPdfBrowserName(const wxString &aFileName)
 
wxSplashScreen * m_splash
 
virtual BACKGROUND_JOBS_MONITOR & GetBackgroundJobMonitor() const
 
bool InitPgm(bool aHeadless=false, bool aSkipPyInit=false, bool aIsUnitTest=false)
Initialize this program.
 
char ** m_argvUtf8
argv parameters converted to utf8 form because wxWidgets has opinions.
 
virtual void ReadPdfBrowserInfos()
Read the PDF browser choice from the common configuration.
 
bool IsGUI()
Determine if the application is running with a GUI.
 
bool m_use_system_pdf_browser
 
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
 
virtual void SetTextEditor(const wxString &aFileName)
 
std::unique_ptr< wxSingleInstanceChecker > m_pgm_checker
Check if there is another copy of Kicad running at the same time.
 
virtual bool SetLocalEnvVariable(const wxString &aName, const wxString &aValue)
Set the environment variable aName to aValue.
 
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
 
std::unique_ptr< SCRIPTING > m_python_scripting
 
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 HandleException(std::exception_ptr aPtr)
A exception handler to be used at the top level if exceptions bubble up that for.
 
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.
 
void SaveCommonSettings()
Save the program (process) settings subset which are stored .kicad_common.
 
bool m_PropertyGridInitialized
 
KICAD_SINGLETON m_singleton
 
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.
 
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 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.
 
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.
 
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
 
BS::thread_pool< 0 > thread_pool
 
wxLogTrace helper definitions.