KiCad PCB EDA Suite
Loading...
Searching...
No Matches
kicad.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2004-2015 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
25
26
27#include <wx/filename.h>
28#include <wx/log.h>
29#include <wx/app.h>
30#include <wx/stdpaths.h>
31#include <wx/msgdlg.h>
32#include <wx/cmdline.h>
33
34#include <api/api_server.h>
35#include <common.h>
36#include <env_vars.h>
37#include <file_history.h>
38#include <hotkeys_basic.h>
39#include <kiway.h>
40#include <macros.h>
41#include <paths.h>
42#include <richio.h>
47#include <systemdirsappend.h>
48#include <thread_pool.h>
49#include <trace_helpers.h>
51#include <confirm.h>
52#if defined( KICAD_NATIVE_MODEL_PREVIEW ) && defined( __WINDOWS__ )
54#endif
55
56#include <git/git_backend.h>
57#include <git/libgit_backend.h>
58#include <cstdlib>
59
60#include "pgm_kicad.h"
61#include "kicad_manager_frame.h"
62#include "mergetool_frame.h"
63
64#include <wx/crt.h>
65#include <wx/evtloop.h>
66#include <wx/weakref.h>
67
68#include <kiplatform/app.h>
70
71// a dummy to quiet linking with EDA_BASE_FRAME::config();
72#include <kiface_base.h>
73
75
76
78{
79 // This function should never be called. It is only referenced from
80 // EDA_BASE_FRAME::config() and this is only provided to satisfy the
81 // linker, not to be actually called. Print the diagnostic to stderr
82 // and abort — throwing here lets wxApp's top-level exception handler
83 // pop a second modal dialog, which defeats the point of moving the
84 // diagnostic to the terminal in the first place.
85 wxFprintf( stderr,
86 wxT( "Unexpected call to Kiface() in kicad/kicad.cpp — a "
87 "project-manager-process code path is reaching into a "
88 "kiface stub. Re-run with KICAD_TRACE=KICAD for a "
89 "backtrace.\n" ) );
90 std::abort();
91}
92
93
95
97{
98 return program;
99}
100
101
103{
104 App().SetAppDisplayName( wxT( "KiCad" ) );
105
106#if defined(DEBUG)
107 wxString absoluteArgv0 = wxStandardPaths::Get().GetExecutablePath();
108
109 if( !wxIsAbsolutePath( absoluteArgv0 ) )
110 {
111 wxLogError( wxT( "No meaningful argv[0]" ) );
112 return false;
113 }
114#endif
115
116 // Initialize the git backend before trying to initialize individual programs
118 GetGitBackend()->Init();
119
120 static const wxCmdLineEntryDesc desc[] = {
121 { wxCMD_LINE_OPTION, "f", "frame", "Frame to load", wxCMD_LINE_VAL_STRING, 0 },
122 { wxCMD_LINE_SWITCH, "n", "new", "New instance of KiCad, does not attempt to load previously open files",
123 wxCMD_LINE_VAL_NONE, 0 },
124 { wxCMD_LINE_SWITCH, nullptr, "mergetool",
125 "Launch the 3-way merge tool. Expects four positional args: "
126 "ANCESTOR OURS THEIRS MERGED. Intended as a `git mergetool` driver.",
127 wxCMD_LINE_VAL_NONE, 0 },
128#ifndef __WXOSX__
129 { wxCMD_LINE_SWITCH, nullptr, "software-rendering", "Use software rendering instead of OpenGL",
130 wxCMD_LINE_VAL_NONE, 0 },
131#endif
132 { wxCMD_LINE_PARAM, nullptr, nullptr, "File to load", wxCMD_LINE_VAL_STRING,
133 wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL },
134 { wxCMD_LINE_NONE, nullptr, nullptr, nullptr, wxCMD_LINE_VAL_NONE, 0 }
135 };
136
137 wxCmdLineParser parser( App().argc, App().argv );
138 parser.SetDesc( desc );
139 parser.Parse( false );
140
141 bool mergetoolMode = parser.FoundSwitch( "mergetool" ) == wxCMD_SWITCH_ON;
142
143 if( mergetoolMode && parser.GetParamCount() != 4 )
144 {
145 wxFprintf( stderr,
146 wxT( "kicad --mergetool expects four positional arguments: "
147 "ANCESTOR OURS THEIRS MERGED\n" ) );
148 return false;
149 }
150
151 FRAME_T appType = mergetoolMode ? FRAME_MERGETOOL : KICAD_MAIN_FRAME_T;
152
153 const struct
154 {
155 wxString name;
156 FRAME_T type;
157 } frameTypes[] = { { wxT( "pcb" ), FRAME_PCB_EDITOR },
158 { wxT( "fpedit" ), FRAME_FOOTPRINT_EDITOR },
159 { wxT( "sch" ), FRAME_SCH },
160 { wxT( "calc" ), FRAME_CALC },
161 { wxT( "bm2cmp" ), FRAME_BM2CMP },
162 { wxT( "ds" ), FRAME_PL_EDITOR },
163 { wxT( "gerb" ), FRAME_GERBER },
164 { wxT( "" ), FRAME_T_COUNT } };
165
166 wxString frameName;
167
168 if( parser.Found( "frame", &frameName ) )
169 {
170 appType = FRAME_T_COUNT;
171
172 for( const auto& it : frameTypes )
173 {
174 if( it.name == frameName )
175 appType = it.type;
176 }
177
178 if( appType == FRAME_T_COUNT )
179 {
180 wxLogError( wxT( "Unknown frame: %s" ), frameName );
181 // Clean up
182 OnPgmExit();
183 return false;
184 }
185 }
186
187 if( appType == KICAD_MAIN_FRAME_T )
188 {
189 Kiway.SetCtlBits( KFCTL_CPP_PROJECT_SUITE );
190 }
191 else
192 {
193 Kiway.SetCtlBits( KFCTL_STANDALONE );
194 }
195
196#ifndef __WXMAC__
197 if( parser.Found( "software-rendering" ) )
198 {
199 wxSetEnv( "KICAD_SOFTWARE_RENDERING", "1" );
200 }
201#endif
202
203 if( !InitPgm( false ) )
204 return false;
205
206
207 m_bm.InitSettings( new KICAD_SETTINGS );
210 m_bm.Init();
211
212 if( const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings() )
213 {
214 if( cfg->m_Appearance.app_theme == APP_THEME::DARK )
216 else if( cfg->m_Appearance.app_theme == APP_THEME::AUTO )
218 }
219
220 // Add search paths to feed the PGM_KICAD::SysSearch() function,
221 // currently limited in support to only look for project templates
222 {
223 SEARCH_STACK bases;
224
225 SystemDirsAppend( &bases );
226
227 for( unsigned i = 0; i < bases.GetCount(); ++i )
228 {
229 wxFileName fn( bases[i], wxEmptyString );
230
231 // Add KiCad template file path to search path list.
232 fn.AppendDir( wxT( "template" ) );
233
234 // Only add path if exists and can be read by the user.
235 if( fn.DirExists() && fn.IsDirReadable() )
236 m_bm.m_search.AddPaths( fn.GetPath() );
237 }
238
239 auto insertExpanded = [&]( const wxString& aValue )
240 {
241 wxString resolved = ExpandEnvVarSubstitutions( aValue, nullptr );
242
243 // Skip values that still contain unresolved variable references so we don't
244 // pollute the search stack with paths like "${MISSING}/templates".
245 if( resolved.Contains( wxT( "${" ) ) || resolved.Contains( wxT( "$(" ) ) )
246 return;
247
248 m_bm.m_search.Insert( resolved, 0 );
249 };
250
251 // The versioned TEMPLATE_DIR takes precedence over the search stack template path.
252 if( std::optional<wxString> v = ENV_VAR::GetVersionedEnvVarValue( GetLocalEnvVariables(),
253 wxT( "TEMPLATE_DIR" ) ) )
254 {
255 if( !v->IsEmpty() )
256 insertExpanded( *v );
257 }
258
259 // We've been adding system (installed default) search paths so far, now for user paths
260 // The default user search path is inside KIPLATFORM::ENV::GetDocumentsPath()
261 m_bm.m_search.Insert( PATHS::GetUserTemplatesPath(), 0 );
262
263 // ...but the user can override that default with the KICAD_USER_TEMPLATE_DIR env var.
264 // The value may itself reference other KiCad path variables, so expand them here.
265 ENV_VAR_MAP_CITER it = GetLocalEnvVariables().find( "KICAD_USER_TEMPLATE_DIR" );
266
267 if( it != GetLocalEnvVariables().end() && it->second.GetValue() != wxEmptyString )
268 insertExpanded( it->second.GetValue() );
269 }
270
271 wxFrame* frame = nullptr;
272 KIWAY_PLAYER* playerFrame = nullptr;
273 KICAD_MANAGER_FRAME* managerFrame = nullptr;
274 MERGETOOL_FRAME* mergetoolFrame = nullptr;
275
276 // Editor frames register their API handlers in their constructors, so the API server must
277 // be live before any frame is built. The short-lived --mergetool driver skips it to avoid
278 // contending for the singleton IPC socket.
279 if( appType != FRAME_MERGETOOL )
280 {
281 m_api_server = std::make_unique<KICAD_API_SERVER>();
282 m_api_common_handler = std::make_unique<API_HANDLER_COMMON>();
283 m_api_server->RegisterHandler( m_api_common_handler.get() );
284 m_api_libraries_handler = std::make_unique<API_HANDLER_LIBRARIES>(
286 m_api_server->RegisterHandler( m_api_libraries_handler.get() );
287 }
288
289 if( appType == FRAME_MERGETOOL )
290 {
291 MERGETOOL_PATHS paths{ parser.GetParam( 0 ), parser.GetParam( 1 ),
292 parser.GetParam( 2 ), parser.GetParam( 3 ) };
293 mergetoolFrame = new MERGETOOL_FRAME( &Kiway, nullptr, paths );
294 frame = mergetoolFrame;
295 }
296 else if( appType == KICAD_MAIN_FRAME_T )
297 {
298 managerFrame = new KICAD_MANAGER_FRAME( nullptr, wxT( "KiCad" ), wxDefaultPosition,
299 wxWindow::FromDIP( wxSize( 775, -1 ), NULL ) );
300 frame = managerFrame;
301
302 STARTWIZARD startWizard;
303 startWizard.CheckAndRun( frame );
304 }
305 else
306 {
307 // Use KIWAY to create a top window, which registers its existence also.
308 // "TOP_FRAME" is a macro that is passed on compiler command line from CMake,
309 // and is one of the types in FRAME_T.
310 playerFrame = Kiway.Player( appType, true );
311 frame = playerFrame;
312
313 if( frame == nullptr )
314 {
315 return false;
316 }
317 }
318
319 App().SetTopWindow( frame );
320
321 if( playerFrame )
322 App().SetAppDisplayName( playerFrame->GetAboutTitle() );
323
324 Kiway.SetTop( frame );
325
326 KIPLATFORM::ENV::SetAppDetailsForWindow( frame, '"' + wxStandardPaths::Get().GetExecutablePath() + '"' + " -n",
327 frame->GetTitle() );
328
329 KICAD_SETTINGS* settings = static_cast<KICAD_SETTINGS*>( PgmSettings() );
330
332
333 wxString projToLoad;
334
335 HideSplash();
336
337 if( playerFrame && parser.GetParamCount() )
338 {
339 // Now after the frame processing, the rest of the positional args are files
340 std::vector<wxString> fileArgs;
341 /*
342 gerbview handles multiple project data files, i.e. gerber files on
343 cmd line. Others currently do not, they handle only one. For common
344 code simplicity we simply pass all the arguments in however, each
345 program module can do with them what they want, ignore, complain
346 whatever. We don't establish policy here, as this is a multi-purpose
347 launcher.
348 */
349
350 for( size_t i = 0; i < parser.GetParamCount(); i++ )
351 fileArgs.push_back( parser.GetParam( i ) );
352
353 // special attention to a single argument: argv[1] (==argSet[0])
354 if( fileArgs.size() == 1 )
355 {
356 wxFileName argv1( fileArgs[0] );
357
358#if defined( PGM_DATA_FILE_EXT )
359 // PGM_DATA_FILE_EXT, if present, may be different for each compile,
360 // it may come from CMake on the compiler command line, but often does not.
361 // This facility is mostly useful for those program footprints
362 // supporting a single argv[1].
363 if( !argv1.GetExt() )
364 argv1.SetExt( wxT( PGM_DATA_FILE_EXT ) );
365#endif
366 argv1.MakeAbsolute();
367
368 fileArgs[0] = argv1.GetFullPath();
369 }
370
371 // Use the KIWAY_PLAYER::OpenProjectFiles() API function:
372 if( !playerFrame->OpenProjectFiles( fileArgs ) )
373 {
374 // OpenProjectFiles() API asks that it report failure to the UI.
375 // Nothing further to say here.
376
377 // We've already initialized things at this point, but wx won't call OnExit if
378 // we fail out. Call our own cleanup routine here to ensure the relevant resources
379 // are freed at the right time (if they aren't, segfaults will occur).
380 OnPgmExit();
381
382 // Fail the process startup if the file could not be opened,
383 // although this is an optional choice, one that can be reversed
384 // also in the KIFACE specific OpenProjectFiles() return value.
385 return false;
386 }
387 }
388 else if( managerFrame )
389 {
390 if( parser.GetParamCount() > 0 )
391 {
392 wxFileName tmp = parser.GetParam( 0 );
393
394 if( tmp.GetExt() != FILEEXT::ProjectFileExtension && tmp.GetExt() != FILEEXT::LegacyProjectFileExtension )
395 {
396 DisplayErrorMessage( nullptr, wxString::Format( _( "File '%s'\n"
397 "does not appear to be a KiCad project file." ),
398 tmp.GetFullPath() ) );
399 }
400 else
401 {
402 projToLoad = tmp.GetFullPath();
403 }
404 }
405
406 // If no file was given as an argument, check that there was a file open.
407 if( projToLoad.IsEmpty() && settings->m_OpenProjects.size() && !parser.FoundSwitch( "new" ) )
408 {
409 wxString last_pro = settings->m_OpenProjects.front();
410 settings->m_OpenProjects.erase( settings->m_OpenProjects.begin() );
411
412 if( wxFileExists( last_pro ) )
413 {
414 // Try to open the last opened project,
415 // if a project name is not given when starting Kicad
416 projToLoad = last_pro;
417 }
418 }
419
420 bool loaded = false;
421
422 // Do not attempt to load a non-existent project file.
423 if( !projToLoad.empty() )
424 {
425 wxFileName fn( projToLoad );
426
427 if( fn.Exists() && ( fn.GetExt() == FILEEXT::ProjectFileExtension
428 || fn.GetExt() == FILEEXT::LegacyProjectFileExtension ) )
429 {
430 fn.MakeAbsolute();
431
432 if( appType == KICAD_MAIN_FRAME_T )
433 loaded = managerFrame->LoadProject( fn );
434 }
435 }
436
437 if( !loaded && appType == KICAD_MAIN_FRAME_T )
438 managerFrame->PreloadAllLibraries();
439 }
440
441 if( mergetoolFrame )
442 {
443 // Stay hidden; the merge dialog is its own modal. The frame just needs
444 // to be the wxApp top window so the modal has a parent and the wxApp
445 // loop has something to drive. Defer the run via CallAfter so the
446 // event loop is up before ShowModal spins its nested loop. The
447 // wxWeakRef guards against the frame being destroyed (window-manager
448 // close, fatal init) before the callback fires.
449 wxWeakRef<MERGETOOL_FRAME> mergeToolFrameRef( mergetoolFrame );
450
451 mergetoolFrame->CallAfter(
452 [mergeToolFrameRef]() mutable
453 {
454 if( !mergeToolFrameRef || mergeToolFrameRef->IsBeingDeleted() )
455 return;
456
457 int exitCode = mergeToolFrameRef->RunMerge();
458
459 // Propagate the merge JOB's exit code to the kicad
460 // process exit status so `git mergetool` sees a non-zero
461 // status on unresolved conflicts.
462 if( wxEventLoopBase* loop = wxTheApp->GetMainLoop() )
463 loop->ScheduleExit( exitCode );
464
465 mergeToolFrameRef->Close( true );
466 } );
467 }
468 else
469 {
470 frame->Show( true );
471 frame->Raise();
472
473#if defined( KICAD_NATIVE_MODEL_PREVIEW ) && defined( __WINDOWS__ )
474 frame->CallAfter( [frame] { MaybeShowModelPreviewSetupPrompt( frame ); } );
475#endif
476 }
477
478 if( m_api_server )
479 m_api_server->SetReadyToReply();
480
481 return true;
482}
483
484
486{
487 return 0;
488}
489
490
492{
493 // Signal all background library preloads to abort before waiting for the thread pool.
494 // The design block preload runs on the global thread pool and checks this flag; without
495 // setting it here the pool wait below can block for up to 120 seconds.
496 m_libraryPreloadAbort.store( true );
497
498 // Abort and wait on any background jobs
499 GetKiCadThreadPool().purge();
500 GetKiCadThreadPool().wait();
501
502 Kiway.OnKiwayEnd();
503
504 m_api_server.reset();
505
507 {
509 m_settings_manager->Save();
510 }
511
512 // Destroy PGM_KICAD earlier than wxApp and static destruction would
513 Destroy();
515 delete GetGitBackend();
516 SetGitBackend( nullptr );
517}
518
519
520void PGM_KICAD::MacOpenFile( const wxString& aFileName )
521{
522#if defined(__WXMAC__)
523
524 KICAD_MANAGER_FRAME* frame = (KICAD_MANAGER_FRAME*) App().GetTopWindow();
525
526 if( !aFileName.empty() && wxFileExists( aFileName ) )
527 frame->LoadProject( wxFileName( aFileName ) );
528
529#endif
530}
531
532
534{
535 // unlike a normal destructor, this is designed to be called more
536 // than once safely:
537
538 m_bm.End();
539
541}
542
543
545
546#ifdef NDEBUG
547// Define a custom assertion handler
548void CustomAssertHandler(const wxString& file,
549 int line,
550 const wxString& func,
551 const wxString& cond,
552 const wxString& msg)
553{
554 Pgm().HandleAssert( file, line, func, cond, msg );
555}
556#endif
557
561struct APP_KICAD : public wxApp
562{
563 APP_KICAD() : wxApp()
564 {
565 SetPgm( &program );
566
567 // Init the environment each platform wants
569 }
570
571
572 bool OnInit() override
573 {
574#ifdef NDEBUG
575 // These checks generate extra assert noise
576 wxSizerFlags::DisableConsistencyChecks();
577 wxDISABLE_DEBUG_SUPPORT();
578 wxSetAssertHandler( CustomAssertHandler );
579#endif
580
581 // Perform platform-specific init tasks
582 if( !KIPLATFORM::APP::Init() )
583 return false;
584
585#ifndef DEBUG
586 // Enable logging traces to the console in release build.
587 // This is usually disabled, but it can be useful for users to run to help
588 // debug issues and other problems.
589 if( wxGetEnv( wxS( "KICAD_ENABLE_WXTRACE" ), nullptr ) )
590 {
591 wxLog::EnableLogging( true );
592 wxLog::SetLogLevel( wxLOG_Trace );
593 }
594#endif
595
596 if( !program.OnPgmInit() )
597 {
598 program.OnPgmExit();
599 return false;
600 }
601
602 return true;
603 }
604
605 int OnExit() override
606 {
607 // Drain wxPendingDelete (frames deferred via Destroy()) before tearing down
608 // PGM_BASE singletons. On macOS the dock-quit path leaves frames in this
609 // queue at OnExit() time, and their canvas destructors call into
610 // Pgm().GetGLContextManager(). Running OnPgmExit() first would null that
611 // pointer out from under them. See https://gitlab.com/kicad/code/kicad/-/issues/23373
612 int ret = wxApp::OnExit();
613
614 // Avoid wxLog crashing when used in destructors invoked from OnPgmExit().
615 wxLog::EnableLogging( false );
616
617 program.OnPgmExit();
618 return ret;
619 }
620
621
622 int OnRun() override
623 {
624 try
625 {
626 return wxApp::OnRun();
627 }
628 catch(...)
629 {
630 Pgm().HandleException( std::current_exception() );
631 }
632
633 return -1;
634 }
635
636
637 void OnUnhandledException() override
638 {
639 Pgm().HandleException( std::current_exception(), true );
640 }
641
642
643 int FilterEvent( wxEvent& aEvent ) override
644 {
645 if( aEvent.GetEventType() == wxEVT_SHOW )
646 {
647 wxShowEvent& event = static_cast<wxShowEvent&>( aEvent );
648 wxDialog* dialog = dynamic_cast<wxDialog*>( event.GetEventObject() );
649
650 std::vector<void*>& dlgs = Pgm().m_ModalDialogs;
651
652 if( dialog )
653 {
654 if( event.IsShown() && dialog->IsModal() )
655 {
656 dlgs.push_back( dialog );
657 }
658 // Under GTK, sometimes the modal flag is cleared before hiding
659 else if( !event.IsShown() && !dlgs.empty() )
660 {
661 // If we close the expected dialog, remove it from our stack
662 if( dlgs.back() == dialog )
663 dlgs.pop_back();
664 // If an out-of-order, remove all dialogs added after the closed one
665 else if( auto it = std::find( dlgs.begin(), dlgs.end(), dialog ) ; it != dlgs.end() )
666 dlgs.erase( it, dlgs.end() );
667 }
668 }
669 }
670
671 return Event_Skip;
672 }
673
674#if defined( DEBUG )
678 bool ProcessEvent( wxEvent& aEvent ) override
679 {
680 if( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
681 {
682 wxKeyEvent* keyEvent = static_cast<wxKeyEvent*>( &aEvent );
683
684 if( keyEvent )
685 {
686 wxLogTrace( kicadTraceKeyEvent, "APP_KICAD::ProcessEvent %s", dump( *keyEvent ) );
687 }
688 }
689
690 return wxApp::ProcessEvent( aEvent );
691 }
692
700 bool OnExceptionInMainLoop() override
701 {
702 try
703 {
704 throw;
705 }
706 catch(...)
707 {
708 Pgm().HandleException( std::current_exception() );
709 }
710
711 return false; // continue on. Return false to abort program
712 }
713#endif
714
720#if defined( __WXMAC__ )
721 void MacOpenFile( const wxString& aFileName ) override
722 {
723 Pgm().MacOpenFile( aFileName );
724 }
725#endif
726};
727
728IMPLEMENT_APP( APP_KICAD )
729
730
731// The C++ project manager supports one open PROJECT, so Prj() calls within
732// this link image need this function.
734{
735 return Kiway.Prj();
736}
const char * name
wxString GetAboutTitle() const
virtual void Shutdown()=0
virtual void Init()=0
The main KiCad project manager frame.
bool LoadProject(const wxFileName &aProjectFileName)
Loads a new project.
std::vector< wxString > m_OpenProjects
A KIFACE implementation.
Definition kiface_base.h:35
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
virtual bool OpenProjectFiles(const std::vector< wxString > &aFileList, int aCtl=0)
Open a project or set of files given by aFileList.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:348
void LoadGlobalTables(std::initializer_list< LIBRARY_TABLE_TYPE > aTablesToLoad={})
(Re)loads the global library tables in the given list, or all tables if no list is given
static wxString GetUserTemplatesPath()
Gets the user path for custom templates.
Definition paths.cpp:71
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:546
virtual wxApp & App()
Return a bare naked wxApp which may come from wxPython, SINGLE_TOP, or kicad.exe.
Definition pgm_base.cpp:202
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition pgm_base.cpp:792
virtual void MacOpenFile(const wxString &aFileName)=0
Specific to MacOSX (not used under Linux or Windows).
std::unique_ptr< SETTINGS_MANAGER > m_settings_manager
Definition pgm_base.h:407
void Destroy()
Definition pgm_base.cpp:183
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.
Definition pgm_base.cpp:807
std::atomic_bool m_libraryPreloadAbort
Definition pgm_base.h:449
std::vector< void * > m_ModalDialogs
Definition pgm_base.h:388
bool InitPgm(bool aHeadless=false, bool aIsUnitTest=false)
Initialize this program.
Definition pgm_base.cpp:340
std::unique_ptr< KICAD_API_SERVER > m_api_server
Definition pgm_base.h:413
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.
Definition pgm_base.cpp:844
virtual const wxString & GetExecutablePath() const
Definition pgm_base.cpp:872
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:123
void HideSplash()
Definition pgm_base.cpp:307
virtual LIBRARY_MANAGER & GetLibraryManager() const
Definition pgm_base.h:125
void SaveCommonSettings()
Save the program (process) settings subset which are stored .kicad_common.
Definition pgm_base.cpp:537
PGM_KICAD extends PGM_BASE to bring in FileHistory() and PdfBrowser() which were moved from EDA_APP i...
Definition pgm_kicad.h:37
bool OnPgmInit()
Definition kicad.cpp:102
void Destroy()
Definition kicad.cpp:533
std::unique_ptr< API_HANDLER_COMMON > m_api_common_handler
Definition pgm_kicad.h:71
void MacOpenFile(const wxString &aFileName) override
Specific to MacOSX (not used under Linux or Windows).
Definition kicad.cpp:520
void OnPgmExit()
Definition kicad.cpp:491
APP_SETTINGS_BASE * PgmSettings()
Definition pgm_kicad.h:54
std::unique_ptr< API_HANDLER_LIBRARIES > m_api_libraries_handler
Definition pgm_kicad.h:72
int OnPgmRun()
Definition kicad.cpp:485
BIN_MOD m_bm
Definition pgm_kicad.h:67
Container for project specific data.
Definition project.h:63
Look for files in a number of paths.
T * RegisterSettings(T *aSettings, bool aLoadNow=true)
Take ownership of the pointer passed in.
void SetKiway(KIWAY *aKiway)
Associate this setting manager with the given Kiway.
void CheckAndRun(wxWindow *parent)
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
Definition common.cpp:776
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:217
This file is part of the common library.
#define _(s)
Functions related to environment variables, including help functions.
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition frame_type.h:29
@ FRAME_PCB_EDITOR
Definition frame_type.h:38
@ FRAME_CALC
Definition frame_type.h:59
@ FRAME_BM2CMP
Definition frame_type.h:57
@ FRAME_SCH
Definition frame_type.h:30
@ FRAME_MERGETOOL
Top-level host for the 3-way merge resolution dialog.
Definition frame_type.h:64
@ FRAME_T_COUNT
Definition frame_type.h:71
@ FRAME_PL_EDITOR
Definition frame_type.h:55
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:39
@ FRAME_GERBER
Definition frame_type.h:53
@ KICAD_MAIN_FRAME_T
Definition frame_type.h:69
void SetGitBackend(GIT_BACKEND *aBackend)
GIT_BACKEND * GetGitBackend()
static const std::string ProjectFileExtension
static const std::string LegacyProjectFileExtension
const wxChar *const kicadTraceKeyEvent
Flag to enable wxKeyEvent debug tracing.
std::map< wxString, ENV_VAR_ITEM >::const_iterator ENV_VAR_MAP_CITER
PGM_KICAD & PgmTop()
Definition kicad.cpp:96
PROJECT & Prj()
Definition kicad.cpp:733
static PGM_KICAD program
Definition kicad.cpp:94
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Definition kicad.cpp:77
KIWAY Kiway(KFCTL_CPP_PROJECT_SUITE)
#define KFCTL_CPP_PROJECT_SUITE
Running under C++ project mgr, possibly with others.
Definition kiway.h:175
#define KFCTL_STANDALONE
Running as a standalone Top.
Definition kiway.h:174
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API std::optional< wxString > GetVersionedEnvVarValue(const std::map< wxString, ENV_VAR_ITEM > &aMap, const wxString &aBaseName)
Attempt to retrieve the value of a versioned environment variable, such as KICAD8_TEMPLATE_DIR.
Definition env_vars.cpp:103
bool Init()
Perform application-specific initialization tasks.
Definition unix/app.cpp:40
void EnableDarkMode(bool aForce)
Definition unix/app.cpp:58
void Init()
Perform environment initialization tasks.
void SetAppDetailsForWindow(wxWindow *aWindow, const wxString &aRelaunchCommand, const wxString &aRelaunchDisplayName)
Sets the relaunch command for taskbar pins, this is intended for Windows.
void SetPgm(PGM_BASE *pgm)
PGM_BASE & Pgm()
The global program "get" accessor.
PGM_SINGLE_TOP program
KIWAY Kiway(KFCTL_STANDALONE)
Not publicly visible because most of the action is in PGM_KICAD these days.
Definition kicad.cpp:562
int OnRun() override
Definition kicad.cpp:622
APP_KICAD()
Definition kicad.cpp:563
bool OnInit() override
Definition kicad.cpp:572
int OnExit() override
Definition kicad.cpp:605
void OnUnhandledException() override
Definition kicad.cpp:637
int FilterEvent(wxEvent &aEvent) override
Definition kicad.cpp:643
Top-level host frame for the 3-way merge resolution dialog.
void SystemDirsAppend(SEARCH_STACK *aSearchStack)
Append system places to aSearchStack in a platform specific way and pertinent to KiCad programs.
System directories search utilities.
VECTOR2I end
thread_pool & GetKiCadThreadPool()
Get a reference to the current thread pool.
wxString dump(const wxArrayString &aArray)
Debug helper for printing wxArrayString contents.
wxLogTrace helper definitions.
Definition of file extensions used in Kicad.