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 if( appType == FRAME_MERGETOOL )
274 {
275 MERGETOOL_PATHS paths{ parser.GetParam( 0 ), parser.GetParam( 1 ),
276 parser.GetParam( 2 ), parser.GetParam( 3 ) };
277 mergetoolFrame = new MERGETOOL_FRAME( &Kiway, nullptr, paths );
278 frame = mergetoolFrame;
279 }
280 else if( appType == KICAD_MAIN_FRAME_T )
281 {
282 managerFrame = new KICAD_MANAGER_FRAME( nullptr, wxT( "KiCad" ), wxDefaultPosition,
283 wxWindow::FromDIP( wxSize( 775, -1 ), NULL ) );
284 frame = managerFrame;
285
286 STARTWIZARD startWizard;
287 startWizard.CheckAndRun( frame );
288 }
289 else
290 {
291 // Use KIWAY to create a top window, which registers its existence also.
292 // "TOP_FRAME" is a macro that is passed on compiler command line from CMake,
293 // and is one of the types in FRAME_T.
294 playerFrame = Kiway.Player( appType, true );
295 frame = playerFrame;
296
297 if( frame == nullptr )
298 {
299 return false;
300 }
301 }
302
303 App().SetTopWindow( frame );
304
305 if( playerFrame )
306 App().SetAppDisplayName( playerFrame->GetAboutTitle() );
307
308 Kiway.SetTop( frame );
309
310 KIPLATFORM::ENV::SetAppDetailsForWindow( frame, '"' + wxStandardPaths::Get().GetExecutablePath() + '"' + " -n",
311 frame->GetTitle() );
312
313 KICAD_SETTINGS* settings = static_cast<KICAD_SETTINGS*>( PgmSettings() );
314
316
317 // The standalone --mergetool driver is a short-lived, non-interactive
318 // process; don't spin up the API server (which binds the singleton IPC
319 // socket) for it — that wastes work and can contend with a running KiCad
320 // instance's socket. All other launches, including --frame standalone
321 // editors, keep the API server so automation clients can connect.
322 if( appType != FRAME_MERGETOOL )
323 {
324 m_api_server = std::make_unique<KICAD_API_SERVER>();
325 m_api_common_handler = std::make_unique<API_HANDLER_COMMON>();
326 m_api_server->RegisterHandler( m_api_common_handler.get() );
327 }
328
329 wxString projToLoad;
330
331 HideSplash();
332
333 if( playerFrame && parser.GetParamCount() )
334 {
335 // Now after the frame processing, the rest of the positional args are files
336 std::vector<wxString> fileArgs;
337 /*
338 gerbview handles multiple project data files, i.e. gerber files on
339 cmd line. Others currently do not, they handle only one. For common
340 code simplicity we simply pass all the arguments in however, each
341 program module can do with them what they want, ignore, complain
342 whatever. We don't establish policy here, as this is a multi-purpose
343 launcher.
344 */
345
346 for( size_t i = 0; i < parser.GetParamCount(); i++ )
347 fileArgs.push_back( parser.GetParam( i ) );
348
349 // special attention to a single argument: argv[1] (==argSet[0])
350 if( fileArgs.size() == 1 )
351 {
352 wxFileName argv1( fileArgs[0] );
353
354#if defined( PGM_DATA_FILE_EXT )
355 // PGM_DATA_FILE_EXT, if present, may be different for each compile,
356 // it may come from CMake on the compiler command line, but often does not.
357 // This facility is mostly useful for those program footprints
358 // supporting a single argv[1].
359 if( !argv1.GetExt() )
360 argv1.SetExt( wxT( PGM_DATA_FILE_EXT ) );
361#endif
362 argv1.MakeAbsolute();
363
364 fileArgs[0] = argv1.GetFullPath();
365 }
366
367 // Use the KIWAY_PLAYER::OpenProjectFiles() API function:
368 if( !playerFrame->OpenProjectFiles( fileArgs ) )
369 {
370 // OpenProjectFiles() API asks that it report failure to the UI.
371 // Nothing further to say here.
372
373 // We've already initialized things at this point, but wx won't call OnExit if
374 // we fail out. Call our own cleanup routine here to ensure the relevant resources
375 // are freed at the right time (if they aren't, segfaults will occur).
376 OnPgmExit();
377
378 // Fail the process startup if the file could not be opened,
379 // although this is an optional choice, one that can be reversed
380 // also in the KIFACE specific OpenProjectFiles() return value.
381 return false;
382 }
383 }
384 else if( managerFrame )
385 {
386 if( parser.GetParamCount() > 0 )
387 {
388 wxFileName tmp = parser.GetParam( 0 );
389
390 if( tmp.GetExt() != FILEEXT::ProjectFileExtension && tmp.GetExt() != FILEEXT::LegacyProjectFileExtension )
391 {
392 DisplayErrorMessage( nullptr, wxString::Format( _( "File '%s'\n"
393 "does not appear to be a KiCad project file." ),
394 tmp.GetFullPath() ) );
395 }
396 else
397 {
398 projToLoad = tmp.GetFullPath();
399 }
400 }
401
402 // If no file was given as an argument, check that there was a file open.
403 if( projToLoad.IsEmpty() && settings->m_OpenProjects.size() && !parser.FoundSwitch( "new" ) )
404 {
405 wxString last_pro = settings->m_OpenProjects.front();
406 settings->m_OpenProjects.erase( settings->m_OpenProjects.begin() );
407
408 if( wxFileExists( last_pro ) )
409 {
410 // Try to open the last opened project,
411 // if a project name is not given when starting Kicad
412 projToLoad = last_pro;
413 }
414 }
415
416 bool loaded = false;
417
418 // Do not attempt to load a non-existent project file.
419 if( !projToLoad.empty() )
420 {
421 wxFileName fn( projToLoad );
422
423 if( fn.Exists() && ( fn.GetExt() == FILEEXT::ProjectFileExtension
424 || fn.GetExt() == FILEEXT::LegacyProjectFileExtension ) )
425 {
426 fn.MakeAbsolute();
427
428 if( appType == KICAD_MAIN_FRAME_T )
429 loaded = managerFrame->LoadProject( fn );
430 }
431 }
432
433 if( !loaded && appType == KICAD_MAIN_FRAME_T )
434 managerFrame->PreloadAllLibraries();
435 }
436
437 if( mergetoolFrame )
438 {
439 // Stay hidden; the merge dialog is its own modal. The frame just needs
440 // to be the wxApp top window so the modal has a parent and the wxApp
441 // loop has something to drive. Defer the run via CallAfter so the
442 // event loop is up before ShowModal spins its nested loop. The
443 // wxWeakRef guards against the frame being destroyed (window-manager
444 // close, fatal init) before the callback fires.
445 wxWeakRef<MERGETOOL_FRAME> f( mergetoolFrame );
446
447 mergetoolFrame->CallAfter(
448 [f]() mutable
449 {
450 MERGETOOL_FRAME* frame = f.get();
451
452 if( !frame || frame->IsBeingDeleted() )
453 return;
454
455 int exitCode = frame->RunMerge();
456
457 // Propagate the merge JOB's exit code to the kicad
458 // process exit status so `git mergetool` sees a non-zero
459 // status on unresolved conflicts.
460 if( wxEventLoopBase* loop = wxTheApp->GetMainLoop() )
461 loop->ScheduleExit( exitCode );
462
463 frame->Close( true );
464 } );
465 }
466 else
467 {
468 frame->Show( true );
469 frame->Raise();
470 }
471
472 if( m_api_server )
473 m_api_server->SetReadyToReply();
474
475 return true;
476}
477
478
480{
481 return 0;
482}
483
484
486{
487 // Signal all background library preloads to abort before waiting for the thread pool.
488 // The design block preload runs on the global thread pool and checks this flag; without
489 // setting it here the pool wait below can block for up to 120 seconds.
490 m_libraryPreloadAbort.store( true );
491
492 // Abort and wait on any background jobs
493 GetKiCadThreadPool().purge();
494 GetKiCadThreadPool().wait();
495
496 Kiway.OnKiwayEnd();
497
498 m_api_server.reset();
499
501 {
503 m_settings_manager->Save();
504 }
505
506 // Destroy everything in PGM_KICAD,
507 // especially wxSingleInstanceCheckerImpl earlier than wxApp and earlier
508 // than static destruction would.
509 Destroy();
511 delete GetGitBackend();
512 SetGitBackend( nullptr );
513}
514
515
516void PGM_KICAD::MacOpenFile( const wxString& aFileName )
517{
518#if defined(__WXMAC__)
519
520 KICAD_MANAGER_FRAME* frame = (KICAD_MANAGER_FRAME*) App().GetTopWindow();
521
522 if( !aFileName.empty() && wxFileExists( aFileName ) )
523 frame->LoadProject( wxFileName( aFileName ) );
524
525#endif
526}
527
528
530{
531 // unlike a normal destructor, this is designed to be called more
532 // than once safely:
533
534 m_bm.End();
535
537}
538
539
541
542#ifdef NDEBUG
543// Define a custom assertion handler
544void CustomAssertHandler(const wxString& file,
545 int line,
546 const wxString& func,
547 const wxString& cond,
548 const wxString& msg)
549{
550 Pgm().HandleAssert( file, line, func, cond, msg );
551}
552#endif
553
557struct APP_KICAD : public wxApp
558{
559 APP_KICAD() : wxApp()
560 {
561 SetPgm( &program );
562
563 // Init the environment each platform wants
565 }
566
567
568 bool OnInit() override
569 {
570#ifdef NDEBUG
571 // These checks generate extra assert noise
572 wxSizerFlags::DisableConsistencyChecks();
573 wxDISABLE_DEBUG_SUPPORT();
574 wxSetAssertHandler( CustomAssertHandler );
575#endif
576
577 // Perform platform-specific init tasks
578 if( !KIPLATFORM::APP::Init() )
579 return false;
580
581#ifndef DEBUG
582 // Enable logging traces to the console in release build.
583 // This is usually disabled, but it can be useful for users to run to help
584 // debug issues and other problems.
585 if( wxGetEnv( wxS( "KICAD_ENABLE_WXTRACE" ), nullptr ) )
586 {
587 wxLog::EnableLogging( true );
588 wxLog::SetLogLevel( wxLOG_Trace );
589 }
590#endif
591
592 if( !program.OnPgmInit() )
593 {
594 program.OnPgmExit();
595 return false;
596 }
597
598 return true;
599 }
600
601 int OnExit() override
602 {
603 // Drain wxPendingDelete (frames deferred via Destroy()) before tearing down
604 // PGM_BASE singletons. On macOS the dock-quit path leaves frames in this
605 // queue at OnExit() time, and their canvas destructors call into
606 // Pgm().GetGLContextManager(). Running OnPgmExit() first would null that
607 // pointer out from under them. See https://gitlab.com/kicad/code/kicad/-/issues/23373
608 int ret = wxApp::OnExit();
609
610 // Avoid wxLog crashing when used in destructors invoked from OnPgmExit().
611 wxLog::EnableLogging( false );
612
613 program.OnPgmExit();
614 return ret;
615 }
616
617
618 int OnRun() override
619 {
620 try
621 {
622 return wxApp::OnRun();
623 }
624 catch(...)
625 {
626 Pgm().HandleException( std::current_exception() );
627 }
628
629 return -1;
630 }
631
632
633 void OnUnhandledException() override
634 {
635 Pgm().HandleException( std::current_exception(), true );
636 }
637
638
639 int FilterEvent( wxEvent& aEvent ) override
640 {
641 if( aEvent.GetEventType() == wxEVT_SHOW )
642 {
643 wxShowEvent& event = static_cast<wxShowEvent&>( aEvent );
644 wxDialog* dialog = dynamic_cast<wxDialog*>( event.GetEventObject() );
645
646 std::vector<void*>& dlgs = Pgm().m_ModalDialogs;
647
648 if( dialog )
649 {
650 if( event.IsShown() && dialog->IsModal() )
651 {
652 dlgs.push_back( dialog );
653 }
654 // Under GTK, sometimes the modal flag is cleared before hiding
655 else if( !event.IsShown() && !dlgs.empty() )
656 {
657 // If we close the expected dialog, remove it from our stack
658 if( dlgs.back() == dialog )
659 dlgs.pop_back();
660 // If an out-of-order, remove all dialogs added after the closed one
661 else if( auto it = std::find( dlgs.begin(), dlgs.end(), dialog ) ; it != dlgs.end() )
662 dlgs.erase( it, dlgs.end() );
663 }
664 }
665 }
666
667 return Event_Skip;
668 }
669
670#if defined( DEBUG )
674 bool ProcessEvent( wxEvent& aEvent ) override
675 {
676 if( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
677 {
678 wxKeyEvent* keyEvent = static_cast<wxKeyEvent*>( &aEvent );
679
680 if( keyEvent )
681 {
682 wxLogTrace( kicadTraceKeyEvent, "APP_KICAD::ProcessEvent %s", dump( *keyEvent ) );
683 }
684 }
685
686 aEvent.Skip();
687 return false;
688 }
689
697 bool OnExceptionInMainLoop() override
698 {
699 try
700 {
701 throw;
702 }
703 catch(...)
704 {
705 Pgm().HandleException( std::current_exception() );
706 }
707
708 return false; // continue on. Return false to abort program
709 }
710#endif
711
717#if defined( __WXMAC__ )
718 void MacOpenFile( const wxString& aFileName ) override
719 {
720 Pgm().MacOpenFile( aFileName );
721 }
722#endif
723};
724
725IMPLEMENT_APP( APP_KICAD )
726
727
728// The C++ project manager supports one open PROJECT, so Prj() calls within
729// this link image need this function.
731{
732 return Kiway.Prj();
733}
734
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:311
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
int RunMerge()
Run the merge synchronously.
static wxString GetUserTemplatesPath()
Gets the user path for custom templates.
Definition paths.cpp:71
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:528
virtual wxApp & App()
Return a bare naked wxApp which may come from wxPython, SINGLE_TOP, or kicad.exe.
Definition pgm_base.cpp:204
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition pgm_base.cpp:774
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:403
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:789
std::atomic_bool m_libraryPreloadAbort
Definition pgm_base.h:446
std::vector< void * > m_ModalDialogs
Definition pgm_base.h:384
bool InitPgm(bool aHeadless=false, bool aIsUnitTest=false)
Initialize this program.
Definition pgm_base.cpp:320
std::unique_ptr< KICAD_API_SERVER > m_api_server
Definition pgm_base.h:412
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:826
virtual const wxString & GetExecutablePath() const
Definition pgm_base.cpp:854
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:124
void HideSplash()
Definition pgm_base.cpp:309
virtual LIBRARY_MANAGER & GetLibraryManager() const
Definition pgm_base.h:126
void SaveCommonSettings()
Save the program (process) settings subset which are stored .kicad_common.
Definition pgm_base.cpp:519
PGM_KICAD extends PGM_BASE to bring in FileHistory() and PdfBrowser() which were moved from EDA_APP i...
Definition pgm_kicad.h:35
bool OnPgmInit()
Definition kicad.cpp:99
void Destroy()
Definition kicad.cpp:529
std::unique_ptr< API_HANDLER_COMMON > m_api_common_handler
Definition pgm_kicad.h:69
void MacOpenFile(const wxString &aFileName) override
Specific to MacOSX (not used under Linux or Windows).
Definition kicad.cpp:516
void OnPgmExit()
Definition kicad.cpp:485
APP_SETTINGS_BASE * PgmSettings()
Definition pgm_kicad.h:52
int OnPgmRun()
Definition kicad.cpp:479
BIN_MOD m_bm
Definition pgm_kicad.h:65
Container for project specific data.
Definition project.h:62
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:704
The common library.
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:730
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:160
#define KFCTL_STANDALONE
Running as a standalone Top.
Definition kiway.h:159
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:86
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:558
int OnRun() override
Definition kicad.cpp:618
APP_KICAD()
Definition kicad.cpp:559
bool OnInit() override
Definition kicad.cpp:568
int OnExit() override
Definition kicad.cpp:601
void OnUnhandledException() override
Definition kicad.cpp:633
int FilterEvent(wxEvent &aEvent) override
Definition kicad.cpp:639
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.