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 // Abort and wait on any background jobs
411 GetKiCadThreadPool().purge();
412 GetKiCadThreadPool().wait();
413
414 Kiway.OnKiwayEnd();
415
416#ifdef KICAD_IPC_API
417 m_api_server.reset();
418#endif
419
421 {
423 m_settings_manager->Save();
424 }
425
426 // Destroy everything in PGM_KICAD,
427 // especially wxSingleInstanceCheckerImpl earlier than wxApp and earlier
428 // than static destruction would.
429 Destroy();
431 delete GetGitBackend();
432 SetGitBackend( nullptr );
433}
434
435
436void PGM_KICAD::MacOpenFile( const wxString& aFileName )
437{
438#if defined(__WXMAC__)
439
440 KICAD_MANAGER_FRAME* frame = (KICAD_MANAGER_FRAME*) App().GetTopWindow();
441
442 if( !aFileName.empty() && wxFileExists( aFileName ) )
443 frame->LoadProject( wxFileName( aFileName ) );
444
445#endif
446}
447
448
450{
451 // unlike a normal destructor, this is designed to be called more
452 // than once safely:
453
454 m_bm.End();
455
457}
458
459
461
462#ifdef NDEBUG
463// Define a custom assertion handler
464void CustomAssertHandler(const wxString& file,
465 int line,
466 const wxString& func,
467 const wxString& cond,
468 const wxString& msg)
469{
470 Pgm().HandleAssert( file, line, func, cond, msg );
471}
472#endif
473
477struct APP_KICAD : public wxApp
478{
479 APP_KICAD() : wxApp()
480 {
481 SetPgm( &program );
482
483 // Init the environment each platform wants
485 }
486
487
488 bool OnInit() override
489 {
490#ifdef NDEBUG
491 // These checks generate extra assert noise
492 wxSizerFlags::DisableConsistencyChecks();
493 wxDISABLE_DEBUG_SUPPORT();
494 wxSetAssertHandler( CustomAssertHandler );
495#endif
496
497 // Perform platform-specific init tasks
498 if( !KIPLATFORM::APP::Init() )
499 return false;
500
501#ifndef DEBUG
502 // Enable logging traces to the console in release build.
503 // This is usually disabled, but it can be useful for users to run to help
504 // debug issues and other problems.
505 if( wxGetEnv( wxS( "KICAD_ENABLE_WXTRACE" ), nullptr ) )
506 {
507 wxLog::EnableLogging( true );
508 wxLog::SetLogLevel( wxLOG_Trace );
509 }
510#endif
511
512 if( !program.OnPgmInit() )
513 {
514 program.OnPgmExit();
515 return false;
516 }
517
518 return true;
519 }
520
521 int OnExit() override
522 {
523 program.OnPgmExit();
524
525 // Avoid wxLog crashing when used in destructors.
526 wxLog::EnableLogging( false );
527
528 return wxApp::OnExit();
529 }
530
531
532 int OnRun() override
533 {
534 try
535 {
536 return wxApp::OnRun();
537 }
538 catch(...)
539 {
540 Pgm().HandleException( std::current_exception() );
541 }
542
543 return -1;
544 }
545
546
547 void OnUnhandledException() override
548 {
549 Pgm().HandleException( std::current_exception(), true );
550 }
551
552
553 int FilterEvent( wxEvent& aEvent ) override
554 {
555 if( aEvent.GetEventType() == wxEVT_SHOW )
556 {
557 wxShowEvent& event = static_cast<wxShowEvent&>( aEvent );
558 wxDialog* dialog = dynamic_cast<wxDialog*>( event.GetEventObject() );
559
560 std::vector<void*>& dlgs = Pgm().m_ModalDialogs;
561
562 if( dialog )
563 {
564 if( event.IsShown() && dialog->IsModal() )
565 {
566 dlgs.push_back( dialog );
567 }
568 // Under GTK, sometimes the modal flag is cleared before hiding
569 else if( !event.IsShown() && !dlgs.empty() )
570 {
571 // If we close the expected dialog, remove it from our stack
572 if( dlgs.back() == dialog )
573 dlgs.pop_back();
574 // If an out-of-order, remove all dialogs added after the closed one
575 else if( auto it = std::find( dlgs.begin(), dlgs.end(), dialog ) ; it != dlgs.end() )
576 dlgs.erase( it, dlgs.end() );
577 }
578 }
579 }
580
581 return Event_Skip;
582 }
583
584#if defined( DEBUG )
588 bool ProcessEvent( wxEvent& aEvent ) override
589 {
590 if( aEvent.GetEventType() == wxEVT_CHAR || aEvent.GetEventType() == wxEVT_CHAR_HOOK )
591 {
592 wxKeyEvent* keyEvent = static_cast<wxKeyEvent*>( &aEvent );
593
594 if( keyEvent )
595 {
596 wxLogTrace( kicadTraceKeyEvent, "APP_KICAD::ProcessEvent %s", dump( *keyEvent ) );
597 }
598 }
599
600 aEvent.Skip();
601 return false;
602 }
603
611 bool OnExceptionInMainLoop() override
612 {
613 try
614 {
615 throw;
616 }
617 catch(...)
618 {
619 Pgm().HandleException( std::current_exception() );
620 }
621
622 return false; // continue on. Return false to abort program
623 }
624#endif
625
631#if defined( __WXMAC__ )
632 void MacOpenFile( const wxString& aFileName ) override
633 {
634 Pgm().MacOpenFile( aFileName );
635 }
636#endif
637};
638
639IMPLEMENT_APP( APP_KICAD )
640
641
642// The C++ project manager supports one open PROJECT, so Prj() calls within
643// this link image need this function.
645{
646 return Kiway.Prj();
647}
648
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::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:449
void MacOpenFile(const wxString &aFileName) override
Specific to MacOSX (not used under Linux or Windows).
Definition kicad.cpp:436
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:202
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:644
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:478
int OnRun() override
Definition kicad.cpp:532
APP_KICAD()
Definition kicad.cpp:479
bool OnInit() override
Definition kicad.cpp:488
int OnExit() override
Definition kicad.cpp:521
void OnUnhandledException() override
Definition kicad.cpp:547
int FilterEvent(wxEvent &aEvent) override
Definition kicad.cpp:553
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.