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