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, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
29
30
31#include <wx/filename.h>
32#include <wx/log.h>
33#include <wx/app.h>
34#include <wx/stdpaths.h>
35#include <wx/msgdlg.h>
36#include <wx/cmdline.h>
37
38#include <env_vars.h>
39#include <file_history.h>
40#include <hotkeys_basic.h>
41#include <kiway.h>
42#include <macros.h>
43#include <paths.h>
44#include <richio.h>
49#include <systemdirsappend.h>
50#include <thread_pool.h>
51#include <trace_helpers.h>
53#include <confirm.h>
54
55#include <git/git_backend.h>
56#include <git/libgit_backend.h>
57#include <stdexcept>
58
59#include "pgm_kicad.h"
60#include "kicad_manager_frame.h"
61
62#include <kiplatform/app.h>
64
65#ifdef KICAD_IPC_API
66#include <api/api_server.h>
67#endif
68
69// a dummy to quiet linking with EDA_BASE_FRAME::config();
70#include <kiface_base.h>
71
73
74
76{
77 // This function should never be called. It is only referenced from
78 // EDA_BASE_FRAME::config() and this is only provided to satisfy the linker,
79 // not to be actually called.
80 wxLogFatalError( wxT( "Unexpected call to Kiface() in kicad/kicad.cpp" ) );
81
82 throw std::logic_error( "Unexpected call to Kiface() in kicad/kicad.cpp" );
83}
84
85
87
89{
90 return program;
91}
92
93
95{
96 App().SetAppDisplayName( wxT( "KiCad" ) );
97
98#if defined(DEBUG)
99 wxString absoluteArgv0 = wxStandardPaths::Get().GetExecutablePath();
100
101 if( !wxIsAbsolutePath( absoluteArgv0 ) )
102 {
103 wxLogError( wxT( "No meaningful argv[0]" ) );
104 return false;
105 }
106#endif
107
108 // Initialize the git backend before trying to initialize individual programs
110 GetGitBackend()->Init();
111
112 static const wxCmdLineEntryDesc desc[] = {
113 { wxCMD_LINE_OPTION, "f", "frame", "Frame to load", wxCMD_LINE_VAL_STRING, 0 },
114 { wxCMD_LINE_SWITCH, "n", "new", "New instance of KiCad, does not attempt to load previously open files",
115 wxCMD_LINE_VAL_NONE, 0 },
116#ifndef __WXOSX__
117 { wxCMD_LINE_SWITCH, nullptr, "software-rendering", "Use software rendering instead of OpenGL",
118 wxCMD_LINE_VAL_NONE, 0 },
119#endif
120 { wxCMD_LINE_PARAM, nullptr, nullptr, "File to load", wxCMD_LINE_VAL_STRING,
121 wxCMD_LINE_PARAM_MULTIPLE | wxCMD_LINE_PARAM_OPTIONAL },
122 { wxCMD_LINE_NONE, nullptr, nullptr, nullptr, wxCMD_LINE_VAL_NONE, 0 }
123 };
124
125 wxCmdLineParser parser( App().argc, App().argv );
126 parser.SetDesc( desc );
127 parser.Parse( false );
128
129 FRAME_T appType = KICAD_MAIN_FRAME_T;
130
131 const struct
132 {
133 wxString name;
134 FRAME_T type;
135 } frameTypes[] = { { wxT( "pcb" ), FRAME_PCB_EDITOR },
136 { wxT( "fpedit" ), FRAME_FOOTPRINT_EDITOR },
137 { wxT( "sch" ), FRAME_SCH },
138 { wxT( "calc" ), FRAME_CALC },
139 { wxT( "bm2cmp" ), FRAME_BM2CMP },
140 { wxT( "ds" ), FRAME_PL_EDITOR },
141 { wxT( "gerb" ), FRAME_GERBER },
142 { wxT( "" ), FRAME_T_COUNT } };
143
144 wxString frameName;
145
146 if( parser.Found( "frame", &frameName ) )
147 {
148 appType = FRAME_T_COUNT;
149
150 for( const auto& it : frameTypes )
151 {
152 if( it.name == frameName )
153 appType = it.type;
154 }
155
156 if( appType == FRAME_T_COUNT )
157 {
158 wxLogError( wxT( "Unknown frame: %s" ), frameName );
159 // Clean up
160 OnPgmExit();
161 return false;
162 }
163 }
164
165 if( appType == KICAD_MAIN_FRAME_T )
166 {
167 Kiway.SetCtlBits( KFCTL_CPP_PROJECT_SUITE );
168 }
169 else
170 {
171 Kiway.SetCtlBits( KFCTL_STANDALONE );
172 }
173
174#ifndef __WXMAC__
175 if( parser.Found( "software-rendering" ) )
176 {
177 wxSetEnv( "KICAD_SOFTWARE_RENDERING", "1" );
178 }
179#endif
180
181 if( !InitPgm( false ) )
182 return false;
183
184
185 m_bm.InitSettings( new KICAD_SETTINGS );
188 m_bm.Init();
189
190 if( const COMMON_SETTINGS* cfg = Pgm().GetCommonSettings() )
191 {
192 if( cfg->m_Appearance.app_theme == APP_THEME::DARK )
194 else if( cfg->m_Appearance.app_theme == APP_THEME::AUTO )
196 }
197
198 // Add search paths to feed the PGM_KICAD::SysSearch() function,
199 // currently limited in support to only look for project templates
200 {
201 SEARCH_STACK bases;
202
203 SystemDirsAppend( &bases );
204
205 for( unsigned i = 0; i < bases.GetCount(); ++i )
206 {
207 wxFileName fn( bases[i], wxEmptyString );
208
209 // Add KiCad template file path to search path list.
210 fn.AppendDir( wxT( "template" ) );
211
212 // Only add path if exists and can be read by the user.
213 if( fn.DirExists() && fn.IsDirReadable() )
214 m_bm.m_search.AddPaths( fn.GetPath() );
215 }
216
217 // The versioned TEMPLATE_DIR takes precedence over the search stack template path.
218 if( std::optional<wxString> v = ENV_VAR::GetVersionedEnvVarValue( GetLocalEnvVariables(),
219 wxT( "TEMPLATE_DIR" ) ) )
220 {
221 if( !v->IsEmpty() )
222 m_bm.m_search.Insert( *v, 0 );
223 }
224
225 // We've been adding system (installed default) search paths so far, now for user paths
226 // The default user search path is inside KIPLATFORM::ENV::GetDocumentsPath()
227 m_bm.m_search.Insert( PATHS::GetUserTemplatesPath(), 0 );
228
229 // ...but the user can override that default with the KICAD_USER_TEMPLATE_DIR env var
230 ENV_VAR_MAP_CITER it = GetLocalEnvVariables().find( "KICAD_USER_TEMPLATE_DIR" );
231
232 if( it != GetLocalEnvVariables().end() && it->second.GetValue() != wxEmptyString )
233 m_bm.m_search.Insert( it->second.GetValue(), 0 );
234 }
235
236 wxFrame* frame = nullptr;
237 KIWAY_PLAYER* playerFrame = nullptr;
238 KICAD_MANAGER_FRAME* managerFrame = nullptr;
239
240 if( appType == KICAD_MAIN_FRAME_T )
241 {
242 managerFrame = new KICAD_MANAGER_FRAME( nullptr, wxT( "KiCad" ), wxDefaultPosition,
243 wxWindow::FromDIP( wxSize( 775, -1 ), NULL ) );
244 frame = managerFrame;
245
246 STARTWIZARD startWizard;
247 startWizard.CheckAndRun( frame );
248 }
249 else
250 {
251 // Use KIWAY to create a top window, which registers its existence also.
252 // "TOP_FRAME" is a macro that is passed on compiler command line from CMake,
253 // and is one of the types in FRAME_T.
254 playerFrame = Kiway.Player( appType, true );
255 frame = playerFrame;
256
257 if( frame == nullptr )
258 {
259 return false;
260 }
261 }
262
263 App().SetTopWindow( frame );
264
265 if( playerFrame )
266 App().SetAppDisplayName( playerFrame->GetAboutTitle() );
267
268 Kiway.SetTop( frame );
269
270 KIPLATFORM::ENV::SetAppDetailsForWindow( frame, '"' + wxStandardPaths::Get().GetExecutablePath() + '"' + " -n",
271 frame->GetTitle() );
272
273 KICAD_SETTINGS* settings = static_cast<KICAD_SETTINGS*>( PgmSettings() );
274
276
277#ifdef KICAD_IPC_API
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#endif
282
283 wxString projToLoad;
284
285 HideSplash();
286
287 if( playerFrame && parser.GetParamCount() )
288 {
289 // Now after the frame processing, the rest of the positional args are files
290 std::vector<wxString> fileArgs;
291 /*
292 gerbview handles multiple project data files, i.e. gerber files on
293 cmd line. Others currently do not, they handle only one. For common
294 code simplicity we simply pass all the arguments in however, each
295 program module can do with them what they want, ignore, complain
296 whatever. We don't establish policy here, as this is a multi-purpose
297 launcher.
298 */
299
300 for( size_t i = 0; i < parser.GetParamCount(); i++ )
301 fileArgs.push_back( parser.GetParam( i ) );
302
303 // special attention to a single argument: argv[1] (==argSet[0])
304 if( fileArgs.size() == 1 )
305 {
306 wxFileName argv1( fileArgs[0] );
307
308#if defined( PGM_DATA_FILE_EXT )
309 // PGM_DATA_FILE_EXT, if present, may be different for each compile,
310 // it may come from CMake on the compiler command line, but often does not.
311 // This facility is mostly useful for those program footprints
312 // supporting a single argv[1].
313 if( !argv1.GetExt() )
314 argv1.SetExt( wxT( PGM_DATA_FILE_EXT ) );
315#endif
316 argv1.MakeAbsolute();
317
318 fileArgs[0] = argv1.GetFullPath();
319 }
320
321 // Use the KIWAY_PLAYER::OpenProjectFiles() API function:
322 if( !playerFrame->OpenProjectFiles( fileArgs ) )
323 {
324 // OpenProjectFiles() API asks that it report failure to the UI.
325 // Nothing further to say here.
326
327 // We've already initialized things at this point, but wx won't call OnExit if
328 // we fail out. Call our own cleanup routine here to ensure the relevant resources
329 // are freed at the right time (if they aren't, segfaults will occur).
330 OnPgmExit();
331
332 // Fail the process startup if the file could not be opened,
333 // although this is an optional choice, one that can be reversed
334 // also in the KIFACE specific OpenProjectFiles() return value.
335 return false;
336 }
337 }
338 else if( managerFrame )
339 {
340 if( parser.GetParamCount() > 0 )
341 {
342 wxFileName tmp = parser.GetParam( 0 );
343
344 if( tmp.GetExt() != FILEEXT::ProjectFileExtension && tmp.GetExt() != FILEEXT::LegacyProjectFileExtension )
345 {
346 DisplayErrorMessage( nullptr, wxString::Format( _( "File '%s'\n"
347 "does not appear to be a KiCad project file." ),
348 tmp.GetFullPath() ) );
349 }
350 else
351 {
352 projToLoad = tmp.GetFullPath();
353 }
354 }
355
356 // If no file was given as an argument, check that there was a file open.
357 if( projToLoad.IsEmpty() && settings->m_OpenProjects.size() && !parser.FoundSwitch( "new" ) )
358 {
359 wxString last_pro = settings->m_OpenProjects.front();
360 settings->m_OpenProjects.erase( settings->m_OpenProjects.begin() );
361
362 if( wxFileExists( last_pro ) )
363 {
364 // Try to open the last opened project,
365 // if a project name is not given when starting Kicad
366 projToLoad = last_pro;
367 }
368 }
369
370 bool loaded = false;
371
372 // Do not attempt to load a non-existent project file.
373 if( !projToLoad.empty() )
374 {
375 wxFileName fn( projToLoad );
376
377 if( fn.Exists() && ( fn.GetExt() == FILEEXT::ProjectFileExtension
378 || fn.GetExt() == FILEEXT::LegacyProjectFileExtension ) )
379 {
380 fn.MakeAbsolute();
381
382 if( appType == KICAD_MAIN_FRAME_T )
383 loaded = managerFrame->LoadProject( fn );
384 }
385 }
386
387 if( !loaded && appType == KICAD_MAIN_FRAME_T )
388 managerFrame->PreloadAllLibraries();
389 }
390
391 frame->Show( true );
392 frame->Raise();
393
394#ifdef KICAD_IPC_API
395 m_api_server->SetReadyToReply();
396#endif
397
398 return true;
399}
400
401
403{
404 return 0;
405}
406
407
409{
410 // Signal all background library preloads to abort before waiting for the thread pool.
411 // The design block preload runs on the global thread pool and checks this flag; without
412 // setting it here the pool wait below can block for up to 120 seconds.
413 m_libraryPreloadAbort.store( true );
414
415 // Abort and wait on any background jobs
416 GetKiCadThreadPool().purge();
417 GetKiCadThreadPool().wait();
418
419 Kiway.OnKiwayEnd();
420
421#ifdef KICAD_IPC_API
422 m_api_server.reset();
423#endif
424
426 {
428 m_settings_manager->Save();
429 }
430
431 // Destroy everything in PGM_KICAD,
432 // especially wxSingleInstanceCheckerImpl earlier than wxApp and earlier
433 // than static destruction would.
434 Destroy();
436 delete GetGitBackend();
437 SetGitBackend( nullptr );
438}
439
440
441void PGM_KICAD::MacOpenFile( const wxString& aFileName )
442{
443#if defined(__WXMAC__)
444
445 KICAD_MANAGER_FRAME* frame = (KICAD_MANAGER_FRAME*) App().GetTopWindow();
446
447 if( !aFileName.empty() && wxFileExists( aFileName ) )
448 frame->LoadProject( wxFileName( aFileName ) );
449
450#endif
451}
452
453
455{
456 // unlike a normal destructor, this is designed to be called more
457 // than once safely:
458
459 m_bm.End();
460
462}
463
464
466
467#ifdef NDEBUG
468// Define a custom assertion handler
469void CustomAssertHandler(const wxString& file,
470 int line,
471 const wxString& func,
472 const wxString& cond,
473 const wxString& msg)
474{
475 Pgm().HandleAssert( file, line, func, cond, msg );
476}
477#endif
478
482struct APP_KICAD : public wxApp
483{
484 APP_KICAD() : wxApp()
485 {
486 SetPgm( &program );
487
488 // Init the environment each platform wants
490 }
491
492
493 bool OnInit() override
494 {
495#ifdef NDEBUG
496 // These checks generate extra assert noise
497 wxSizerFlags::DisableConsistencyChecks();
498 wxDISABLE_DEBUG_SUPPORT();
499 wxSetAssertHandler( CustomAssertHandler );
500#endif
501
502 // Perform platform-specific init tasks
503 if( !KIPLATFORM::APP::Init() )
504 return false;
505
506#ifndef DEBUG
507 // Enable logging traces to the console in release build.
508 // This is usually disabled, but it can be useful for users to run to help
509 // debug issues and other problems.
510 if( wxGetEnv( wxS( "KICAD_ENABLE_WXTRACE" ), nullptr ) )
511 {
512 wxLog::EnableLogging( true );
513 wxLog::SetLogLevel( wxLOG_Trace );
514 }
515#endif
516
517 if( !program.OnPgmInit() )
518 {
519 program.OnPgmExit();
520 return false;
521 }
522
523 return true;
524 }
525
526 int OnExit() override
527 {
528 // Drain wxPendingDelete (frames deferred via Destroy()) before tearing down
529 // PGM_BASE singletons. On macOS the dock-quit path leaves frames in this
530 // queue at OnExit() time, and their canvas destructors call into
531 // Pgm().GetGLContextManager(). Running OnPgmExit() first would null that
532 // pointer out from under them. See https://gitlab.com/kicad/code/kicad/-/issues/23373
533 int ret = wxApp::OnExit();
534
535 // Avoid wxLog crashing when used in destructors invoked from OnPgmExit().
536 wxLog::EnableLogging( false );
537
538 program.OnPgmExit();
539 return ret;
540 }
541
542
543 int OnRun() override
544 {
545 try
546 {
547 return wxApp::OnRun();
548 }
549 catch(...)
550 {
551 Pgm().HandleException( std::current_exception() );
552 }
553
554 return -1;
555 }
556
557
558 void OnUnhandledException() override
559 {
560 Pgm().HandleException( std::current_exception(), true );
561 }
562
563
564 int FilterEvent( wxEvent& aEvent ) override
565 {
566 if( aEvent.GetEventType() == wxEVT_SHOW )
567 {
568 wxShowEvent& event = static_cast<wxShowEvent&>( aEvent );
569 wxDialog* dialog = dynamic_cast<wxDialog*>( event.GetEventObject() );
570
571 std::vector<void*>& dlgs = Pgm().m_ModalDialogs;
572
573 if( dialog )
574 {
575 if( event.IsShown() && dialog->IsModal() )
576 {
577 dlgs.push_back( dialog );
578 }
579 // Under GTK, sometimes the modal flag is cleared before hiding
580 else if( !event.IsShown() && !dlgs.empty() )
581 {
582 // If we close the expected dialog, remove it from our stack
583 if( dlgs.back() == dialog )
584 dlgs.pop_back();
585 // If an out-of-order, remove all dialogs added after the closed one
586 else if( auto it = std::find( dlgs.begin(), dlgs.end(), dialog ) ; it != dlgs.end() )
587 dlgs.erase( it, dlgs.end() );
588 }
589 }
590 }
591
592 return Event_Skip;
593 }
594
595#if defined( DEBUG )
599 bool ProcessEvent( wxEvent& aEvent ) override
600 {
601 if( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
602 {
603 wxKeyEvent* keyEvent = static_cast<wxKeyEvent*>( &aEvent );
604
605 if( keyEvent )
606 {
607 wxLogTrace( kicadTraceKeyEvent, "APP_KICAD::ProcessEvent %s", dump( *keyEvent ) );
608 }
609 }
610
611 aEvent.Skip();
612 return false;
613 }
614
622 bool OnExceptionInMainLoop() override
623 {
624 try
625 {
626 throw;
627 }
628 catch(...)
629 {
630 Pgm().HandleException( std::current_exception() );
631 }
632
633 return false; // continue on. Return false to abort program
634 }
635#endif
636
642#if defined( __WXMAC__ )
643 void MacOpenFile( const wxString& aFileName ) override
644 {
645 Pgm().MacOpenFile( aFileName );
646 }
647#endif
648};
649
650IMPLEMENT_APP( APP_KICAD )
651
652
653// The C++ project manager supports one open PROJECT, so Prj() calls within
654// this link image need this function.
656{
657 return Kiway.Prj();
658}
659
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:39
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:315
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:541
virtual wxApp & App()
Return a bare naked wxApp which may come from wxPython, SINGLE_TOP, or kicad.exe.
Definition pgm_base.cpp:211
virtual ENV_VAR_MAP & GetLocalEnvVariables() const
Definition pgm_base.cpp:787
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:411
void Destroy()
Definition pgm_base.cpp:190
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:802
std::atomic_bool m_libraryPreloadAbort
Definition pgm_base.h:456
std::vector< void * > m_ModalDialogs
Definition pgm_base.h:392
bool InitPgm(bool aHeadless=false, bool aIsUnitTest=false)
Initialize this program.
Definition pgm_base.cpp:327
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:839
virtual const wxString & GetExecutablePath() const
Definition pgm_base.cpp:867
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:130
void HideSplash()
Definition pgm_base.cpp:316
virtual LIBRARY_MANAGER & GetLibraryManager() const
Definition pgm_base.h:132
void SaveCommonSettings()
Save the program (process) settings subset which are stored .kicad_common.
Definition pgm_base.cpp:532
PGM_KICAD extends PGM_BASE to bring in FileHistory() and PdfBrowser() which were moved from EDA_APP i...
Definition pgm_kicad.h:42
bool OnPgmInit()
Definition kicad.cpp:94
void Destroy()
Definition kicad.cpp:454
void MacOpenFile(const wxString &aFileName) override
Specific to MacOSX (not used under Linux or Windows).
Definition kicad.cpp:441
void OnPgmExit()
Definition kicad.cpp:408
APP_SETTINGS_BASE * PgmSettings()
Definition pgm_kicad.h:59
int OnPgmRun()
Definition kicad.cpp:402
BIN_MOD m_bm
Definition pgm_kicad.h:72
Container for project specific data.
Definition project.h:66
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)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:221
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:33
@ FRAME_PCB_EDITOR
Definition frame_type.h:42
@ FRAME_CALC
Definition frame_type.h:63
@ FRAME_BM2CMP
Definition frame_type.h:61
@ FRAME_SCH
Definition frame_type.h:34
@ FRAME_T_COUNT
Definition frame_type.h:70
@ FRAME_PL_EDITOR
Definition frame_type.h:59
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:43
@ FRAME_GERBER
Definition frame_type.h:57
@ KICAD_MAIN_FRAME_T
Definition frame_type.h:68
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:88
PROJECT & Prj()
Definition kicad.cpp:655
static PGM_KICAD program
Definition kicad.cpp:86
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
Definition kicad.cpp:75
KIWAY Kiway(KFCTL_CPP_PROJECT_SUITE)
#define KFCTL_CPP_PROJECT_SUITE
Running under C++ project mgr, possibly with others.
Definition kiway.h:164
#define KFCTL_STANDALONE
Running as a standalone Top.
Definition kiway.h:163
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:483
int OnRun() override
Definition kicad.cpp:543
APP_KICAD()
Definition kicad.cpp:484
bool OnInit() override
Definition kicad.cpp:493
int OnExit() override
Definition kicad.cpp:526
void OnUnhandledException() override
Definition kicad.cpp:558
int FilterEvent(wxEvent &aEvent) override
Definition kicad.cpp:564
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.