29#include <wx/html/htmlwin.h>
32#include <wx/filename.h>
34#include <wx/propgrid/propgrid.h>
35#include <wx/snglinst.h>
36#include <wx/stdpaths.h>
38#include <wx/filedlg.h>
40#include <wx/tooltip.h>
74#include <winrt/base.h>
103 wxT(
"Español (Latinoamericano)" ),
true },
122 wxT(
"Português (Brasil)" ),
true },
136 wxT(
"简体中文" ),
true },
138 wxT(
"繁體中文" ),
true },
142#define _(s) wxGetTranslation((s))
193 winrt::uninit_apartment();
207 wxASSERT( wxTheApp );
225 if( !wxGetEnv( wxT(
"EDITOR" ), &editorname ) )
229 editorname = wxT(
"/usr/bin/open -e" );
231 editorname = wxT(
"/usr/bin/xdg-open" );
237 if( !editorname && aCanShowFileChooser )
246 if( !editorname.IsEmpty() )
259 wxString mask(
_(
"Executable file" ) + wxT(
" (*.exe)|*.exe" ) );
261 wxString mask(
_(
"Executable file" ) + wxT(
" (*)|*" ) );
267 wxFileName::SplitPath( aDefaultEditor, &
path, &
name, &ext );
271 return wxFileSelector(
_(
"Select Preferred Editor" ),
path,
name, wxT(
"." ) + ext,
272 mask, wxFD_OPEN | wxFD_FILE_MUST_EXIST,
nullptr );
278 const wxArrayString& argArray =
App().argv.GetArguments();
284 m_argvUtf8[n] = wxStrdup( argArray[n].ToUTF8() );
303 NULL, -1, wxDefaultPosition, wxDefaultSize,
304 wxBORDER_NONE | wxSTAY_ON_TOP );
323#if defined( __WXGTK__ ) && defined( KICAD_DESKTOP_APP_NAME )
326 if( aPgmName == wxT(
"kicad" ) )
327 return wxT( KICAD_DESKTOP_APP_NAME );
329 if( aPgmName == wxT(
"eeschema" ) || aPgmName == wxT(
"pcbnew" )
330 || aPgmName == wxT(
"gerbview" ) || aPgmName == wxT(
"bitmap2component" )
331 || aPgmName == wxT(
"pcb_calculator" ) )
334 wxString appName = aPgmName == wxT(
"pcb_calculator" ) ? wxT(
"pcbcalculator" ) : aPgmName;
335 return wxString( wxT( KICAD_DESKTOP_APP_PREFIX ) ) + wxT(
"." ) + appName;
339 return wxEmptyString;
345#if defined( __WXMAC__ )
366 if(
App().argc == 0 )
367 pgm_name = wxT(
"kicad" );
369 pgm_name = wxFileName(
App().argv[0] ).GetName().Lower();
373 wxInitAllImageHandlers();
375#if !wxCHECK_VERSION( 3, 3, 0 )
378 wxPGInitResourceModule();
382 if( wxString( wxGetenv(
"HOME" ) ).IsEmpty() )
385 "Unable to continue." ) );
396 wxChmod( instanceCheckerDir,
397 wxPOSIX_USER_READ | wxPOSIX_USER_WRITE | wxPOSIX_USER_EXECUTE |
398 wxPOSIX_GROUP_READ | wxPOSIX_GROUP_WRITE | wxPOSIX_GROUP_EXECUTE |
399 wxPOSIX_OTHERS_READ | wxPOSIX_OTHERS_WRITE | wxPOSIX_OTHERS_EXECUTE );
401 wxString instanceCheckerName = wxString::Format( wxS(
"%s-%s" ), pgm_name,
405 m_pgm_checker->Create( instanceCheckerName, instanceCheckerDir );
410 bool isDefined = wxGetEnv( wxT(
"KICAD" ), &
m_kicad_env );
421 App().SetVendorName( wxT(
"KiCad" ) );
422 App().SetAppName( pgm_name );
426#if defined( __WXGTK__ ) && defined( KICAD_DESKTOP_APP_NAME )
441 if( !wxGetEnv(
"FONTCONFIG_PATH", NULL ) )
447 wxSetEnv(
"FONTCONFIG_PATH", PATHS::GetWindowsFontConfigDir() );
452 winrt::init_apartment(winrt::apartment_type::single_threaded);
511 wxToolTip::Enable(
true );
512 wxToolTip::SetAutoPop( 10000 );
530 for(
const std::pair<wxString, ENV_VAR_ITEM> it :
GetCommonSettings()->m_Env.vars )
532 wxLogTrace(
traceEnvVars, wxT(
"PGM_BASE::loadSettings: Found entry %s = %s" ),
533 it.first, it.second.GetValue() );
541 if( it.first.IsEmpty() )
545 if( it.second.GetDefinedExternally() )
582 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
593 wxString dictionaryName( wxT(
"kicad" ) );
602 wxLogTrace(
traceLocale, wxT(
"This language is not supported by the system." ) );
608 m_locale->Init( wxLANGUAGE_DEFAULT );
610 aErrMsg =
_(
"This language is not supported by the operating system." );
613 else if( !first_time )
615 wxLogTrace(
traceLocale, wxT(
"Search for dictionary %s.mo in %s" ) ,
616 dictionaryName,
m_locale->GetName() );
625 wxString languageSel;
628 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
643 if( !
m_locale->IsLoaded( dictionaryName ) )
644 m_locale->AddCatalog( dictionaryName );
652 wxLogTrace(
traceLocale, wxT(
"Unable to load dictionary %s.mo in %s" ),
653 dictionaryName,
m_locale->GetName() );
659 m_locale->Init( wxLANGUAGE_DEFAULT );
661 aErrMsg =
_(
"The KiCad language file for this language is not installed." );
677 wxString dictionaryName( wxT(
"kicad" ) );
684 if( !
m_locale->IsLoaded( dictionaryName ) )
685 m_locale->AddCatalog( dictionaryName );
693 wxLogTrace(
traceLocale, wxT(
"Unable to load dictionary %s.mo in %s" ),
694 dictionaryName,
m_locale->GetName() );
702 aErrMsg =
_(
"The KiCad language file for this language is not installed." );
712 wxLogTrace(
traceLocale, wxT(
"Select language ID %d from %d possible languages." ),
715 for(
unsigned ii = 0;
LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
728 const wxLanguageInfo* langInfo = wxLocale::GetLanguageInfo(
m_language_id );
736 wxString str = langInfo->GetCanonicalWithRegion();
737 str.Replace(
"_",
"-" );
747 wxLocale::AddCatalogLookupPathPrefix( PATHS::GetWindowsBaseSharePath() + wxT(
"locale" ) );
751 if( wxGetEnv( wxT(
"KICAD_RUN_FROM_BUILD_DIR" ),
nullptr ) )
755 fn.AppendDir( wxT(
"translation" ) );
756 wxLocale::AddCatalogLookupPathPrefix( fn.GetPath() );
765 if( aName.IsEmpty() )
768 wxT(
"PGM_BASE::SetLocalEnvVariable: Attempt to set empty variable to "
775 if( wxGetEnv( aName, &env ) )
778 wxT(
"PGM_BASE::SetLocalEnvVariable: Environment variable %s already set "
781 return env == aValue;
785 wxT(
"PGM_BASE::SetLocalEnvVariable: Setting local environment variable %s to %s" ),
788 return wxSetEnv( aName, aValue );
796 for(
const std::pair<wxString, ENV_VAR_ITEM> m_local_env_var :
GetCommonSettings()->m_Env.vars )
799 wxT(
"PGM_BASE::SetLocalEnvVariables: Setting local environment variable %s "
801 m_local_env_var.first,
802 m_local_env_var.second.GetValue() );
803 wxSetEnv( m_local_env_var.first, m_local_env_var.second.GetValue() );
819 return wxTheApp->IsGUI();
828 std::rethrow_exception( aPtr );
832 wxLogError( ioe.
What() );
840 catch(
const std::exception& e )
844 wxLogError( wxT(
"Unhandled exception class: %s what: %s" ),
850 wxLogError( wxT(
"Unhandled exception of unknown type" ) );
861 const wxString& aCond,
const wxString& aMsg )
868 assertStr = wxString::Format(
"Assertion failed at %s:%d in %s: %s - %s", aFile, aLine,
869 aFunc, aCond, aMsg );
873 assertStr = wxString::Format(
"Assertion failed at %s:%d in %s: %s", aFile, aLine, aFunc,
878 wxLogError( assertStr );
881#ifdef KICAD_USE_SENTRY
911 constexpr static int interval = 150;
912 constexpr static int timeLimit = 120000;
921 [
this, aKiway]() ->
void
923 std::shared_ptr<BACKGROUND_JOB_REPORTER>
reporter =
929 bool aborted =
false;
931 reporter->Report(
_(
"Loading Design Block Libraries" ) );
943 std::this_thread::sleep_for( std::chrono::milliseconds( interval ) );
947 float progress = *loadStatus;
948 reporter->SetCurrentProgress( progress );
961 if( elapsed > timeLimit )
978 std::string payload =
"";
993 wxLogTrace(
traceLibraries,
"RegisterLibraryLoadStatusBar: statusBar=%p", aStatusBar );
1013 wxLogTrace(
traceLibraries,
"UnregisterLibraryLoadStatusBar: statusBar=%p", aStatusBar );
1026 wxLogTrace(
traceLibraries,
"AddLibraryLoadMessages: message_count=%zu", aMessages.size() );
1028 if( aMessages.empty() )
1040 wxLogTrace(
traceLibraries,
" -> forwarding to statusBar=%p", statusBar );
1041 statusBar->AddWarningMessages(
"load", aMessages );
1051 wxLogTrace(
traceLibraries,
"ClearLibraryLoadMessages: status bars=%zu",
1057 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...
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, 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.
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 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< 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.
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)
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.
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
void AddLibraryLoadMessages(const std::vector< LOAD_MESSAGE > &aMessages)
Add library load messages to all registered status bars.
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.