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