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
53#include <git/git_backend.h>
54#include <git/libgit_backend.h>
55#include <cstdlib>
56
57#include "pgm_kicad.h"
58#include "kicad_manager_frame.h"
59#include "mergetool_frame.h"
60
61#include <wx/crt.h>
62#include <wx/evtloop.h>
63#include <wx/weakref.h>
64
65#include <kiplatform/app.h>
67
68// a dummy to quiet linking with EDA_BASE_FRAME::config();
69#include <kiface_base.h>
70
72
73
75{
76 // This function should never be called. It is only referenced from
77 // EDA_BASE_FRAME::config() and this is only provided to satisfy the
78 // linker, not to be actually called. Print the diagnostic to stderr
79 // and abort — throwing here lets wxApp's top-level exception handler
80 // pop a second modal dialog, which defeats the point of moving the
81 // diagnostic to the terminal in the first place.
82 wxFprintf( stderr,
83 wxT( "Unexpected call to Kiface() in kicad/kicad.cpp — a "
84 "project-manager-process code path is reaching into a "
85 "kiface stub. Re-run with KICAD_TRACE=KICAD for a "
86 "backtrace.\n" ) );
87 std::abort();
88}
89
90
92
94{
95 return program;
96}
97
98
100{
101 App().SetAppDisplayName( wxT( "KiCad" ) );
102
103#if defined(DEBUG)
104 wxString absoluteArgv0 = wxStandardPaths::Get().GetExecutablePath();
105
106 if( !wxIsAbsolutePath( absoluteArgv0 ) )
107 {
108 wxLogError( wxT( "No meaningful argv[0]" ) );
109 return false;
110 }
111#endif
112
113 // Initialize the git backend before trying to initialize individual programs
115 GetGitBackend()->Init();
116
117 static const wxCmdLineEntryDesc desc[] = {
118 { wxCMD_LINE_OPTION, "f", "frame", "Frame to load", wxCMD_LINE_VAL_STRING, 0 },
119 { wxCMD_LINE_SWITCH, "n", "new", "New instance of KiCad, does not attempt to load previously open files",
120 wxCMD_LINE_VAL_NONE, 0 },
121 { wxCMD_LINE_SWITCH, nullptr, "mergetool",
122 "Launch the 3-way merge tool. Expects four positional args: "
123 "ANCESTOR OURS THEIRS MERGED. Intended as a `git mergetool` driver.",
124 wxCMD_LINE_VAL_NONE, 0 },
125#ifndef __WXOSX__
126 { wxCMD_LINE_SWITCH, nullptr, "software-rendering", "Use software rendering instead of OpenGL",
127 wxCMD_LINE_VAL_NONE, 0 },
128#endif
129 { wxCMD_LINE_PARAM, nullptr, nullptr, "File to load", wxCMD_LINE_VAL_STRING,
130 wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL },
131 { wxCMD_LINE_NONE, nullptr, nullptr, nullptr, wxCMD_LINE_VAL_NONE, 0 }
132 };
133
134 wxCmdLineParser parser( App().argc, App().argv );
135 parser.SetDesc( desc );
136 parser.Parse( false );
137
138 bool mergetoolMode = parser.FoundSwitch( "mergetool" ) == wxCMD_SWITCH_ON;
139
140 if( mergetoolMode && parser.GetParamCount() != 4 )
141 {
142 wxFprintf( stderr,
143 wxT( "kicad --mergetool expects four positional arguments: "
144 "ANCESTOR OURS THEIRS MERGED\n" ) );
145 return false;
146 }
147
148 FRAME_T appType = mergetoolMode ? FRAME_MERGETOOL : KICAD_MAIN_FRAME_T;
149
150 const struct
151 {
152 wxString name;
153 FRAME_T type;
154 } frameTypes[] = { { wxT( "pcb" ), FRAME_PCB_EDITOR },
155 { wxT( "fpedit" ), FRAME_FOOTPRINT_EDITOR },
156 { wxT( "sch" ), FRAME_SCH },
157 { wxT( "calc" ), FRAME_CALC },
158 { wxT( "bm2cmp" ), FRAME_BM2CMP },
159 { wxT( "ds" ), FRAME_PL_EDITOR },
160 { wxT( "gerb" ), FRAME_GERBER },
161 { wxT( "" ), FRAME_T_COUNT } };
162
163 wxString frameName;
164
165 if( parser.Found( "frame", &frameName ) )
166 {
167 appType = FRAME_T_COUNT;
168
169 for( const auto& it : frameTypes )
170 {
171 if( it.name == frameName )
172 appType = it.type;
173 }
174
175 if( appType == FRAME_T_COUNT )
176 {
177 wxLogError( wxT( "Unknown frame: %s" ), frameName );
178 // Clean up
179 OnPgmExit();
180 return false;
181 }
182 }
183
184 if( appType == KICAD_MAIN_FRAME_T )
185 {
186 Kiway.SetCtlBits( KFCTL_CPP_PROJECT_SUITE );
187 }
188 else
189 {
190 Kiway.SetCtlBits( KFCTL_STANDALONE );
191 }
192
193#ifndef __WXMAC__
194 if( parser.Found( "software-rendering" ) )
195 {
196 wxSetEnv( "KICAD_SOFTWARE_RENDERING", "1" );
197 }
198#endif
199
200 if( !InitPgm( false ) )
201 return false;
202
203
204 m_bm.InitSettings( new KICAD_SETTINGS );
207 m_bm.Init();
208
209 if( const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings() )
210 {
211 if( cfg->m_Appearance.app_theme == APP_THEME::DARK )
213 else if( cfg->m_Appearance.app_theme == APP_THEME::AUTO )
215 }
216
217 // Add search paths to feed the PGM_KICAD::SysSearch() function,
218 // currently limited in support to only look for project templates
219 {
220 SEARCH_STACK bases;
221
222 SystemDirsAppend( &bases );
223
224 for( unsigned i = 0; i < bases.GetCount(); ++i )
225 {
226 wxFileName fn( bases[i], wxEmptyString );
227
228 // Add KiCad template file path to search path list.
229 fn.AppendDir( wxT( "template" ) );
230
231 // Only add path if exists and can be read by the user.
232 if( fn.DirExists() && fn.IsDirReadable() )
233 m_bm.m_search.AddPaths( fn.GetPath() );
234 }
235
236 auto insertExpanded = [&]( const wxString& aValue )
237 {
238 wxString resolved = ExpandEnvVarSubstitutions( aValue, nullptr );
239
240 // Skip values that still contain unresolved variable references so we don't
241 // pollute the search stack with paths like "${MISSING}/templates".
242 if( resolved.Contains( wxT( "${" ) ) || resolved.Contains( wxT( "$(" ) ) )
243 return;
244
245 m_bm.m_search.Insert( resolved, 0 );
246 };
247
248 // The versioned TEMPLATE_DIR takes precedence over the search stack template path.
249 if( std::optional<wxString> v = ENV_VAR::GetVersionedEnvVarValue( GetLocalEnvVariables(),
250 wxT( "TEMPLATE_DIR" ) ) )
251 {
252 if( !v->IsEmpty() )
253 insertExpanded( *v );
254 }
255
256 // We've been adding system (installed default) search paths so far, now for user paths
257 // The default user search path is inside KIPLATFORM::ENV::GetDocumentsPath()
258 m_bm.m_search.Insert( PATHS::GetUserTemplatesPath(), 0 );
259
260 // ...but the user can override that default with the KICAD_USER_TEMPLATE_DIR env var.
261 // The value may itself reference other KiCad path variables, so expand them here.
262 ENV_VAR_MAP_CITER it = GetLocalEnvVariables().find( "KICAD_USER_TEMPLATE_DIR" );
263
264 if( it != GetLocalEnvVariables().end() && it->second.GetValue() != wxEmptyString )
265 insertExpanded( it->second.GetValue() );
266 }
267
268 wxFrame* frame = nullptr;
269 KIWAY_PLAYER* playerFrame = nullptr;
270 KICAD_MANAGER_FRAME* managerFrame = nullptr;
271 MERGETOOL_FRAME* mergetoolFrame = nullptr;
272
273 // Editor frames register their API handlers in their constructors, so the API server must
274 // be live before any frame is built. The short-lived --mergetool driver skips it to avoid
275 // contending for the singleton IPC socket.
276 if( appType != FRAME_MERGETOOL )
277 {
278 m_api_server = std::make_unique<KICAD_API_SERVER>();
279 m_api_common_handler = std::make_unique<API_HANDLER_COMMON>();
280 m_api_server->RegisterHandler( m_api_common_handler.get() );
281 m_api_libraries_handler = std::make_unique<API_HANDLER_LIBRARIES>(
283 m_api_server->RegisterHandler( m_api_libraries_handler.get() );
284 }
285
286 if( appType == FRAME_MERGETOOL )
287 {
288 MERGETOOL_PATHS paths{ parser.GetParam( 0 ), parser.GetParam( 1 ),
289 parser.GetParam( 2 ), parser.GetParam( 3 ) };
290 mergetoolFrame = new MERGETOOL_FRAME( &Kiway, nullptr, paths );
291 frame = mergetoolFrame;
292 }
293 else if( appType == KICAD_MAIN_FRAME_T )
294 {
295 managerFrame = new KICAD_MANAGER_FRAME( nullptr, wxT( "KiCad" ), wxDefaultPosition,
296 wxWindow::FromDIP( wxSize( 775, -1 ), NULL ) );
297 frame = managerFrame;
298
299 STARTWIZARD startWizard;
300 startWizard.CheckAndRun( frame );
301 }
302 else
303 {
304 // Use KIWAY to create a top window, which registers its existence also.
305 // "TOP_FRAME" is a macro that is passed on compiler command line from CMake,
306 // and is one of the types in FRAME_T.
307 playerFrame = Kiway.Player( appType, true );
308 frame = playerFrame;
309
310 if( frame == nullptr )
311 {
312 return false;
313 }
314 }
315
316 App().SetTopWindow( frame );
317
318 if( playerFrame )
319 App().SetAppDisplayName( playerFrame->GetAboutTitle() );
320
321 Kiway.SetTop( frame );
322
323 KIPLATFORM::ENV::SetAppDetailsForWindow( frame, '"' + wxStandardPaths::Get().GetExecutablePath() + '"' + " -n",
324 frame->GetTitle() );
325
326 KICAD_SETTINGS* settings = static_cast<KICAD_SETTINGS*>( PgmSettings() );
327
329
330 wxString projToLoad;
331
332 HideSplash();
333
334 if( playerFrame && parser.GetParamCount() )
335 {
336 // Now after the frame processing, the rest of the positional args are files
337 std::vector<wxString> fileArgs;
338 /*
339 gerbview handles multiple project data files, i.e. gerber files on
340 cmd line. Others currently do not, they handle only one. For common
341 code simplicity we simply pass all the arguments in however, each
342 program module can do with them what they want, ignore, complain
343 whatever. We don't establish policy here, as this is a multi-purpose
344 launcher.
345 */
346
347 for( size_t i = 0; i < parser.GetParamCount(); i++ )
348 fileArgs.push_back( parser.GetParam( i ) );
349
350 // special attention to a single argument: argv[1] (==argSet[0])
351 if( fileArgs.size() == 1 )
352 {
353 wxFileName argv1( fileArgs[0] );
354
355#if defined( PGM_DATA_FILE_EXT )
356 // PGM_DATA_FILE_EXT, if present, may be different for each compile,
357 // it may come from CMake on the compiler command line, but often does not.
358 // This facility is mostly useful for those program footprints
359 // supporting a single argv[1].
360 if( !argv1.GetExt() )
361 argv1.SetExt( wxT( PGM_DATA_FILE_EXT ) );
362#endif
363 argv1.MakeAbsolute();
364
365 fileArgs[0] = argv1.GetFullPath();
366 }
367
368 // Use the KIWAY_PLAYER::OpenProjectFiles() API function:
369 if( !playerFrame->OpenProjectFiles( fileArgs ) )
370 {
371 // OpenProjectFiles() API asks that it report failure to the UI.
372 // Nothing further to say here.
373
374 // We've already initialized things at this point, but wx won't call OnExit if
375 // we fail out. Call our own cleanup routine here to ensure the relevant resources
376 // are freed at the right time (if they aren't, segfaults will occur).
377 OnPgmExit();
378
379 // Fail the process startup if the file could not be opened,
380 // although this is an optional choice, one that can be reversed
381 // also in the KIFACE specific OpenProjectFiles() return value.
382 return false;
383 }
384 }
385 else if( managerFrame )
386 {
387 if( parser.GetParamCount() > 0 )
388 {
389 wxFileName tmp = parser.GetParam( 0 );
390
391 if( tmp.GetExt() != FILEEXT::ProjectFileExtension && tmp.GetExt() != FILEEXT::LegacyProjectFileExtension )
392 {
393 DisplayErrorMessage( nullptr, wxString::Format( _( "File '%s'\n"
394 "does not appear to be a KiCad project file." ),
395 tmp.GetFullPath() ) );
396 }
397 else
398 {
399 projToLoad = tmp.GetFullPath();
400 }
401 }
402
403 // If no file was given as an argument, check that there was a file open.
404 if( projToLoad.IsEmpty() && settings->m_OpenProjects.size() && !parser.FoundSwitch( "new" ) )
405 {
406 wxString last_pro = settings->m_OpenProjects.front();
407 settings->m_OpenProjects.erase( settings->m_OpenProjects.begin() );
408
409 if( wxFileExists( last_pro ) )
410 {
411 // Try to open the last opened project,
412 // if a project name is not given when starting Kicad
413 projToLoad = last_pro;
414 }
415 }
416
417 bool loaded = false;
418
419 // Do not attempt to load a non-existent project file.
420 if( !projToLoad.empty() )
421 {
422 wxFileName fn( projToLoad );
423
424 if( fn.Exists() && ( fn.GetExt() == FILEEXT::ProjectFileExtension
425 || fn.GetExt() == FILEEXT::LegacyProjectFileExtension ) )
426 {
427 fn.MakeAbsolute();
428
429 if( appType == KICAD_MAIN_FRAME_T )
430 loaded = managerFrame->LoadProject( fn );
431 }
432 }
433
434 if( !loaded && appType == KICAD_MAIN_FRAME_T )
435 managerFrame->PreloadAllLibraries();
436 }
437
438 if( mergetoolFrame )
439 {
440 // Stay hidden; the merge dialog is its own modal. The frame just needs
441 // to be the wxApp top window so the modal has a parent and the wxApp
442 // loop has something to drive. Defer the run via CallAfter so the
443 // event loop is up before ShowModal spins its nested loop. The
444 // wxWeakRef guards against the frame being destroyed (window-manager
445 // close, fatal init) before the callback fires.
446 wxWeakRef<MERGETOOL_FRAME> mergeToolFrameRef( mergetoolFrame );
447
448 mergetoolFrame->CallAfter(
449 [mergeToolFrameRef]() mutable
450 {
451 if( !mergeToolFrameRef || mergeToolFrameRef->IsBeingDeleted() )
452 return;
453
454 int exitCode = mergeToolFrameRef->RunMerge();
455
456 // Propagate the merge JOB's exit code to the kicad
457 // process exit status so `git mergetool` sees a non-zero
458 // status on unresolved conflicts.
459 if( wxEventLoopBase* loop = wxTheApp->GetMainLoop() )
460 loop->ScheduleExit( exitCode );
461
462 mergeToolFrameRef->Close( true );
463 } );
464 }
465 else
466 {
467 frame->Show( true );
468 frame->Raise();
469 }
470
471 if( m_api_server )
472 m_api_server->SetReadyToReply();
473
474 return true;
475}
476
477
479{
480 return 0;
481}
482
483
485{
486 // Signal all background library preloads to abort before waiting for the thread pool.
487 // The design block preload runs on the global thread pool and checks this flag; without
488 // setting it here the pool wait below can block for up to 120 seconds.
489 m_libraryPreloadAbort.store( true );
490
491 // Abort and wait on any background jobs
492 GetKiCadThreadPool().purge();
493 GetKiCadThreadPool().wait();
494
495 Kiway.OnKiwayEnd();
496
497 m_api_server.reset();
498
500 {
502 m_settings_manager->Save();
503 }
504
505 // Destroy PGM_KICAD earlier than wxApp and static destruction would
506 Destroy();
508 delete GetGitBackend();
509 SetGitBackend( nullptr );
510}
511
512
513void PGM_KICAD::MacOpenFile( const wxString& aFileName )
514{
515#if defined(__WXMAC__)
516
517 KICAD_MANAGER_FRAME* frame = (KICAD_MANAGER_FRAME*) App().GetTopWindow();
518
519 if( !aFileName.empty() && wxFileExists( aFileName ) )
520 frame->LoadProject( wxFileName( aFileName ) );
521
522#endif
523}
524
525
527{
528 // unlike a normal destructor, this is designed to be called more
529 // than once safely:
530
531 m_bm.End();
532
534}
535
536
538
539#ifdef NDEBUG
540// Define a custom assertion handler
541void CustomAssertHandler(const wxString& file,
542 int line,
543 const wxString& func,
544 const wxString& cond,
545 const wxString& msg)
546{
547 Pgm().HandleAssert( file, line, func, cond, msg );
548}
549#endif
550
554struct APP_KICAD : public wxApp
555{
556 APP_KICAD() : wxApp()
557 {
558 SetPgm( &program );
559
560 // Init the environment each platform wants
562 }
563
564
565 bool OnInit() override
566 {
567#ifdef NDEBUG
568 // These checks generate extra assert noise
569 wxSizerFlags::DisableConsistencyChecks();
570 wxDISABLE_DEBUG_SUPPORT();
571 wxSetAssertHandler( CustomAssertHandler );
572#endif
573
574 // Perform platform-specific init tasks
575 if( !KIPLATFORM::APP::Init() )
576 return false;
577
578#ifndef DEBUG
579 // Enable logging traces to the console in release build.
580 // This is usually disabled, but it can be useful for users to run to help
581 // debug issues and other problems.
582 if( wxGetEnv( wxS( "KICAD_ENABLE_WXTRACE" ), nullptr ) )
583 {
584 wxLog::EnableLogging( true );
585 wxLog::SetLogLevel( wxLOG_Trace );
586 }
587#endif
588
589 if( !program.OnPgmInit() )
590 {
591 program.OnPgmExit();
592 return false;
593 }
594
595 return true;
596 }
597
598 int OnExit() override
599 {
600 // Drain wxPendingDelete (frames deferred via Destroy()) before tearing down
601 // PGM_BASE singletons. On macOS the dock-quit path leaves frames in this
602 // queue at OnExit() time, and their canvas destructors call into
603 // Pgm().GetGLContextManager(). Running OnPgmExit() first would null that
604 // pointer out from under them. See https://gitlab.com/kicad/code/kicad/-/issues/23373
605 int ret = wxApp::OnExit();
606
607 // Avoid wxLog crashing when used in destructors invoked from OnPgmExit().
608 wxLog::EnableLogging( false );
609
610 program.OnPgmExit();
611 return ret;
612 }
613
614
615 int OnRun() override
616 {
617 try
618 {
619 return wxApp::OnRun();
620 }
621 catch(...)
622 {
623 Pgm().HandleException( std::current_exception() );
624 }
625
626 return -1;
627 }
628
629
630 void OnUnhandledException() override
631 {
632 Pgm().HandleException( std::current_exception(), true );
633 }
634
635
636 int FilterEvent( wxEvent& aEvent ) override
637 {
638 if( aEvent.GetEventType() == wxEVT_SHOW )
639 {
640 wxShowEvent& event = static_cast<wxShowEvent&>( aEvent );
641 wxDialog* dialog = dynamic_cast<wxDialog*>( event.GetEventObject() );
642
643 std::vector<void*>& dlgs = Pgm().m_ModalDialogs;
644
645 if( dialog )
646 {
647 if( event.IsShown() && dialog->IsModal() )
648 {
649 dlgs.push_back( dialog );
650 }
651 // Under GTK, sometimes the modal flag is cleared before hiding
652 else if( !event.IsShown() && !dlgs.empty() )
653 {
654 // If we close the expected dialog, remove it from our stack
655 if( dlgs.back() == dialog )
656 dlgs.pop_back();
657 // If an out-of-order, remove all dialogs added after the closed one
658 else if( auto it = std::find( dlgs.begin(), dlgs.end(), dialog ) ; it != dlgs.end() )
659 dlgs.erase( it, dlgs.end() );
660 }
661 }
662 }
663
664 return Event_Skip;
665 }
666
667#if defined( DEBUG )
671 bool ProcessEvent( wxEvent& aEvent ) override
672 {
673 if( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
674 {
675 wxKeyEvent* keyEvent = static_cast<wxKeyEvent*>( &aEvent );
676
677 if( keyEvent )
678 {
679 wxLogTrace( kicadTraceKeyEvent, "APP_KICAD::ProcessEvent %s", dump( *keyEvent ) );
680 }
681 }
682
683 aEvent.Skip();
684 return false;
685 }
686
694 bool OnExceptionInMainLoop() override
695 {
696 try
697 {
698 throw;
699 }
700 catch(...)
701 {
702 Pgm().HandleException( std::current_exception() );
703 }
704
705 return false; // continue on. Return false to abort program
706 }
707#endif
708
714#if defined( __WXMAC__ )
715 void MacOpenFile( const wxString& aFileName ) override
716 {
717 Pgm().MacOpenFile( aFileName );
718 }
719#endif
720};
721
722IMPLEMENT_APP( APP_KICAD )
723
724
725// The C++ project manager supports one open PROJECT, so Prj() calls within
726// this link image need this function.
728{
729 return Kiway.Prj();
730}
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:340
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:405
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:447
std::vector< void * > m_ModalDialogs
Definition pgm_base.h:386
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:411
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:99
void Destroy()
Definition kicad.cpp:526
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:513
void OnPgmExit()
Definition kicad.cpp:484
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:478
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:93
PROJECT & Prj()
Definition kicad.cpp:727
static PGM_KICAD program
Definition kicad.cpp:91
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Definition kicad.cpp:74
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:555
int OnRun() override
Definition kicad.cpp:615
APP_KICAD()
Definition kicad.cpp:556
bool OnInit() override
Definition kicad.cpp:565
int OnExit() override
Definition kicad.cpp:598
void OnUnhandledException() override
Definition kicad.cpp:630
int FilterEvent(wxEvent &aEvent) override
Definition kicad.cpp:636
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.