KiCad PCB EDA Suite
KIWAY Class Reference

A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad process. More...

#include <kiway.h>

Inheritance diagram for KIWAY:

Public Types

enum  FACE_T {
  FACE_SCH , FACE_PCB , FACE_CVPCB , FACE_GERBVIEW ,
  FACE_PL_EDITOR , FACE_PCB_CALCULATOR , FACE_BMP2CMP , FACE_PYTHON ,
  KIWAY_FACE_COUNT
}
 Known KIFACE implementations. More...
 

Public Member Functions

 ~KIWAY () throw ()
 
virtual KIFACEKiFACE (FACE_T aFaceId, bool doLoad=true)
 Return the KIFACE* given a FACE_T. More...
 
virtual KIWAY_PLAYERPlayer (FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
 Return the KIWAY_PLAYER* given a FRAME_T. More...
 
virtual bool PlayerClose (FRAME_T aFrameType, bool doForce)
 Call the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed, returns true, else false. More...
 
virtual bool PlayersClose (bool doForce)
 Call the KIWAY_PLAYER::Close( bool force ) function on all the windows and if none are vetoed, returns true, else false. More...
 
virtual void ExpressMail (FRAME_T aDestination, MAIL_T aCommand, std::string &aPayload, wxWindow *aSource=nullptr)
 Send aPayload to aDestination from aSource. More...
 
virtual void GetActions (std::vector< TOOL_ACTION * > &aActions) const
 Append all registered actions to the given list. More...
 
virtual PROJECTPrj () const
 Return the PROJECT associated with this KIWAY. More...
 
virtual void SetLanguage (int aLanguage)
 Change the language and then calls ShowChangedLanguage() on all #KIWAY_PLAYERs. More...
 
virtual void CommonSettingsChanged (bool aEnvVarsChanged, bool aTextVarsChanged)
 Call CommonSettingsChanged() on all KIWAY_PLAYERs. More...
 
virtual void ProjectChanged ()
 Calls ProjectChanged() on all KIWAY_PLAYERs. More...
 
 KIWAY (PGM_BASE *aProgram, int aCtlBits, wxFrame *aTop=nullptr)
 
void SetTop (wxFrame *aTop)
 Tell this KIWAY about the top most frame in the program and optionally allows it to play the role of one of the KIWAY_PLAYERs if launched from single_top.cpp. More...
 
wxFrame * GetTop ()
 
void OnKiCadExit ()
 
void OnKiwayEnd ()
 
bool ProcessEvent (wxEvent &aEvent) override
 
wxWindow * GetBlockingDialog ()
 Gets the window pointer to the blocking dialog (to send it signals) More...
 
void SetBlockingDialog (wxWindow *aWin)
 

Static Public Member Functions

static FACE_T KifaceType (FRAME_T aFrameType)
 A simple mapping function which returns the FACE_T which is known to implement aFrameType. More...
 

Private Member Functions

const wxString dso_search_path (FACE_T aFaceId)
 Get the [path &] name of the DSO holding the requested FACE_T. More...
 
bool set_kiface (FACE_T aFaceType, KIFACE *aKiface)
 
KIWAY_PLAYERGetPlayerFrame (FRAME_T aFrameType)
 

Private Attributes

PGM_BASEm_program
 
int m_ctl
 
wxFrame * m_top
 
wxWindowID m_blockingDialog
 
std::atomic< wxWindowID > m_playerFrameId [KIWAY_PLAYER_COUNT]
 

Static Private Attributes

static KIFACEm_kiface [KIWAY_FACE_COUNT]
 
static int m_kiface_version [KIWAY_FACE_COUNT]
 

Friends

struct PGM_SINGLE_TOP
 

Detailed Description

A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad process.

It makes it possible to call between DSOs without having to link them together, and without having to link to the top process module which houses the KIWAY(s). More importantly it makes it possible to send custom wxEvents between DSOs and from the top process module down into the DSOs. The latter capability is thought useful for driving the lower DSOs from a python test rig or for demo (automation) purposes.

Most all calls are via virtual functions, which means C++ vtables are used to hold function pointers and eliminate the need to link to specific object code libraries, speeding development and encouraging clearly defined interface design. Unlike Microsoft COM, which is a multi-vendor design supporting DLL's built at various points in time, the KIWAY alchemy is single project, with all components being built at the same time. So one should expect solid compatibility between all KiCad components, as long at they are compiled at the same time.

There is one KIWAY in the launching portion of the process for each open KiCad project. Each project has its own KIWAY. Available to each KIWAY is an actual PROJECT data structure. If you have a KIWAY, you can get to the PROJECT using KIWAY::Prj().

In summary, a KIWAY facilitates communicating between DSOs, where the topic of the communication is project specific. Here a "project" means a BOARD and a SCHEMATIC and a NETLIST, (anything relating to production of a single BOARD and added to class PROJECT.)

Definition at line 266 of file kiway.h.

Member Enumeration Documentation

◆ FACE_T

Known KIFACE implementations.

Enumerator
FACE_SCH 

eeschema DSO

FACE_PCB 

pcbnew DSO

FACE_CVPCB 
FACE_GERBVIEW 
FACE_PL_EDITOR 
FACE_PCB_CALCULATOR 
FACE_BMP2CMP 
FACE_PYTHON 
KIWAY_FACE_COUNT 

Definition at line 272 of file kiway.h.

273 {
274 FACE_SCH,
275 FACE_PCB,
282
284 };
@ KIWAY_FACE_COUNT
Definition: kiway.h:283
@ FACE_SCH
eeschema DSO
Definition: kiway.h:274
@ FACE_PL_EDITOR
Definition: kiway.h:278
@ FACE_PYTHON
Definition: kiway.h:281
@ FACE_PCB
pcbnew DSO
Definition: kiway.h:275
@ FACE_CVPCB
Definition: kiway.h:276
@ FACE_GERBVIEW
Definition: kiway.h:277
@ FACE_BMP2CMP
Definition: kiway.h:280
@ FACE_PCB_CALCULATOR
Definition: kiway.h:279

Constructor & Destructor Documentation

◆ ~KIWAY()

KIWAY::~KIWAY ( )
throw (
)
inline

Definition at line 286 of file kiway.h.

286{}

◆ KIWAY()

KIWAY::KIWAY ( PGM_BASE aProgram,
int  aCtlBits,
wxFrame *  aTop = nullptr 
)

Definition at line 53 of file kiway.cpp.

53 :
54 m_program( aProgram ), m_ctl( aCtlBits ), m_top( nullptr ), m_blockingDialog( wxID_NONE )
55{
56 SetTop( aTop ); // hook player_destroy_handler() into aTop.
57
58 // Set the array of all known frame window IDs to empty = wxID_NONE,
59 // once they are be created, they are added with FRAME_T as index to this array.
60 // Note: A non empty entry does not mean the frame still exists.
61 // It means only the frame was created at least once. It can be destroyed after.
62 // These entries are not cleared automatically on window closing. The purpose is just
63 // to allow a call to wxWindow::FindWindowById() using a FRAME_T frame type
64 for( int n = 0; n < KIWAY_PLAYER_COUNT; n++ )
65 m_playerFrameId[n] = wxID_NONE;
66}
PGM_BASE * m_program
Definition: kiway.h:442
wxWindowID m_blockingDialog
Definition: kiway.h:447
wxFrame * m_top
Definition: kiway.h:445
std::atomic< wxWindowID > m_playerFrameId[KIWAY_PLAYER_COUNT]
Definition: kiway.h:455
void SetTop(wxFrame *aTop)
Tell this KIWAY about the top most frame in the program and optionally allows it to play the role of ...
Definition: kiway.cpp:84
int m_ctl
Definition: kiway.h:443
int PGM_BASE * aProgram
Definition: cvpcb.cpp:110
@ KIWAY_PLAYER_COUNT
Definition: frame_type.h:61

References KIWAY_PLAYER_COUNT, m_playerFrameId, and SetTop().

Member Function Documentation

◆ CommonSettingsChanged()

void KIWAY::CommonSettingsChanged ( bool  aEnvVarsChanged,
bool  aTextVarsChanged 
)
virtual

Call CommonSettingsChanged() on all KIWAY_PLAYERs.

Use after changing suite-wide options such as panning, autosave interval, etc.

Definition at line 572 of file kiway.cpp.

573{
575 {
576 // A dynamic_cast could be better, but creates link issues
577 // (some basic_frame functions not found) on some platforms,
578 // so a static_cast is used.
579 EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
580
581 if( top )
582 top->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
583 }
584
585 for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
586 {
587 KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
588
589 if( frame )
590 frame->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
591 }
592}
The base frame for deriving all KiCad main window classes.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:66
KIWAY_PLAYER * GetPlayerFrame(FRAME_T aFrameType)
Definition: kiway.cpp:376
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:33
#define KFCTL_CPP_PROJECT_SUITE
Running under C++ project mgr, possibly with others.
Definition: kiway.h:158

References EDA_BASE_FRAME::CommonSettingsChanged(), GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, m_ctl, and m_top.

Referenced by COMMON_CONTROL::ConfigurePaths(), PCB::IFACE::CreateWindow(), EDA_BASE_FRAME::OnPreferences(), PCB_EDIT_FRAME::ShowBoardSetupDialog(), and SCH_EDIT_FRAME::ShowSchematicSetupDialog().

◆ dso_search_path()

const wxString KIWAY::dso_search_path ( FACE_T  aFaceId)
private

Get the [path &] name of the DSO holding the requested FACE_T.

Definition at line 106 of file kiway.cpp.

107{
108 const char* name;
109
110 switch( aFaceId )
111 {
112 case FACE_SCH: name = KIFACE_PREFIX "eeschema"; break;
113 case FACE_PCB: name = KIFACE_PREFIX "pcbnew"; break;
114 case FACE_CVPCB: name = KIFACE_PREFIX "cvpcb"; break;
115 case FACE_GERBVIEW: name = KIFACE_PREFIX "gerbview"; break;
116 case FACE_PL_EDITOR: name = KIFACE_PREFIX "pl_editor"; break;
117 case FACE_PCB_CALCULATOR: name = KIFACE_PREFIX "pcb_calculator"; break;
118 case FACE_BMP2CMP: name = KIFACE_PREFIX "bitmap2component"; break;
119 case FACE_PYTHON: name = KIFACE_PREFIX "kipython"; break;
120
121 default:
122 wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
123 return wxEmptyString;
124 }
125
126#ifndef __WXMAC__
127 wxString path;
128
130 {
131 // The 2 *.cpp program launchers: single_top.cpp and kicad.cpp expect
132 // the *.kiface's to reside in same directory as their binaries do.
133 path = wxStandardPaths::Get().GetExecutablePath();
134 }
135
136 wxFileName fn = path;
137#else
138 // we have the dso's in main OSX bundle kicad.app/Contents/PlugIns
139 wxFileName fn = Pgm().GetExecutablePath();
140 fn.AppendDir( wxT( "Contents" ) );
141 fn.AppendDir( wxT( "PlugIns" ) );
142#endif
143
144 fn.SetName( name );
145
146 // To speed up development, it's sometimes nice to run kicad from inside
147 // the build path. In that case, each program will be in a subdirectory.
148 // To find the DSOs, we need to go up one directory and then enter a subdirectory.
149
150 if( wxGetEnv( wxT( "KICAD_RUN_FROM_BUILD_DIR" ), nullptr ) )
151 {
152#ifdef __WXMAC__
153 // On Mac, all of the kifaces are placed in the kicad.app bundle, even though the individual
154 // standalone binaries are placed in separate bundles before the make install step runs.
155 // So, we have to jump up to the kicad directory, then the PlugIns section of the kicad
156 // bundle.
157 fn = wxStandardPaths::Get().GetExecutablePath();
158
159 fn.RemoveLastDir();
160 fn.RemoveLastDir();
161 fn.RemoveLastDir();
162 fn.RemoveLastDir();
163 fn.AppendDir( wxT( "kicad" ) );
164 fn.AppendDir( wxT( "kicad.app" ) );
165 fn.AppendDir( wxT( "Contents" ) );
166 fn.AppendDir( wxT( "PlugIns" ) );
167 fn.SetName( name );
168#else
169 const char* dirName;
170
171 // The subdirectories usually have the same name as the kiface
172 switch( aFaceId )
173 {
174 case FACE_PL_EDITOR: dirName = "pagelayout_editor"; break;
175 case FACE_PYTHON: dirName = "scripting"; break;
176 default: dirName = name + 1; break;
177 }
178
179 fn.RemoveLastDir();
180 fn.AppendDir( dirName );
181#endif
182 }
183
184 // Here a "suffix" == an extension with a preceding '.',
185 // so skip the preceding '.' to get an extension
186 fn.SetExt( &KIFACE_SUFFIX[1] );
187
188 return fn.GetFullPath();
189}
const char * name
Definition: DXF_plotter.cpp:56
#define KFCTL_STANDALONE
Running as a standalone Top.
Definition: kiway.h:157
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:111

References FACE_BMP2CMP, FACE_CVPCB, FACE_GERBVIEW, FACE_PCB, FACE_PCB_CALCULATOR, FACE_PL_EDITOR, FACE_PYTHON, FACE_SCH, KFCTL_CPP_PROJECT_SUITE, KFCTL_STANDALONE, m_ctl, name, path, and Pgm().

Referenced by KiFACE().

◆ ExpressMail()

void KIWAY::ExpressMail ( FRAME_T  aDestination,
MAIL_T  aCommand,
std::string &  aPayload,
wxWindow *  aSource = nullptr 
)
virtual

◆ GetActions()

void KIWAY::GetActions ( std::vector< TOOL_ACTION * > &  aActions) const
virtual

Append all registered actions to the given list.

Definition at line 497 of file kiway.cpp.

498{
500 aActions.push_back( action );
501}
static std::list< TOOL_ACTION * > & GetActionList()
Return list of TOOL_ACTIONs.
Represent a single user action.
Definition: tool_action.h:68

References ACTION_MANAGER::GetActionList().

Referenced by DIALOG_LIST_HOTKEYS::DIALOG_LIST_HOTKEYS(), and EDA_BASE_FRAME::OnPreferences().

◆ GetBlockingDialog()

wxWindow * KIWAY::GetBlockingDialog ( )

Gets the window pointer to the blocking dialog (to send it signals)

Returns
Pointer to blocking dialog window or null if none

Definition at line 617 of file kiway.cpp.

618{
619 return wxWindow::FindWindowById( m_blockingDialog );
620}

References m_blockingDialog.

Referenced by FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), SYMBOL_EDITOR_CONTROL::AddSymbolToSchematic(), SCH_EDITOR_CONTROL::EditWithSymbolEditor(), PGM_SINGLE_TOP::MacOpenFile(), SIM_PLOT_FRAME::onProbe(), SIM_PLOT_FRAME::onTune(), EE_INSPECTION_TOOL::RunSimulation(), CVPCB_CONTROL::ShowFootprintViewer(), and BOARD_EDITOR_CONTROL::UpdateSchematicFromPCB().

◆ GetPlayerFrame()

KIWAY_PLAYER * KIWAY::GetPlayerFrame ( FRAME_T  aFrameType)
private
Returns
the reference of the KIWAY_PLAYER having the type aFrameType if exists, or NULL if this KIWAY_PLAYER was not yet created, or was closed

Definition at line 376 of file kiway.cpp.

377{
378 wxWindowID storedId = m_playerFrameId[aFrameType];
379
380 if( storedId == wxID_NONE )
381 return nullptr;
382
383 wxWindow* frame = wxWindow::FindWindowById( storedId );
384
385 // Since wxWindow::FindWindow*() is not cheap (especially if the window does not exist),
386 // clear invalid entries to save CPU on repeated calls that do not lead to frame creation
387 if( !frame )
388 m_playerFrameId[aFrameType].compare_exchange_strong( storedId, wxID_NONE );
389
390 return static_cast<KIWAY_PLAYER*>( frame );
391}

References m_playerFrameId.

Referenced by CommonSettingsChanged(), Player(), PlayerClose(), ProjectChanged(), and SetLanguage().

◆ GetTop()

wxFrame * KIWAY::GetTop ( )
inline

Definition at line 398 of file kiway.h.

398{ return m_top; }

References m_top.

◆ KiFACE()

KIFACE * KIWAY::KiFACE ( FACE_T  aFaceId,
bool  doLoad = true 
)
virtual

Return the KIFACE* given a FACE_T.

If it is not already loaded, the KIFACE is loaded and initialized with a call to KIFACE::OnKifaceStart().

Definition at line 198 of file kiway.cpp.

199{
200 // Since this will be called from python, cannot assume that code will
201 // not pass a bad aFaceId.
202 if( (unsigned) aFaceId >= arrayDim( m_kiface ) )
203 {
204 // @todo : throw an exception here for python's benefit, at least that
205 // way it gets some explanatory text.
206
207 wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFaceId" ) );
208 return nullptr;
209 }
210
211 // return the previously loaded KIFACE, if it was.
212 if( m_kiface[aFaceId] )
213 return m_kiface[aFaceId];
214
215 wxString msg;
216
217 // DSO with KIFACE has not been loaded yet, does caller want to load it?
218 if( doLoad )
219 {
220 wxString dname = dso_search_path( aFaceId );
221
222 // Insert DLL search path for kicad_3dsg from build dir
223 if( wxGetEnv( wxT( "KICAD_RUN_FROM_BUILD_DIR" ), nullptr ) )
224 {
225 wxFileName myPath = wxStandardPaths::Get().GetExecutablePath();
226
227 if( !myPath.GetPath().EndsWith( wxT( "pcbnew" ) ) )
228 {
229 myPath.RemoveLastDir();
230 myPath.AppendDir( wxT( "pcbnew" ) );
232 }
233 }
234
235#ifdef KICAD_WIN32_VERIFY_CODESIGN
236 bool codeSignOk = KIPLATFORM::ENV::VerifyFileSignature( dname );
237 if( !codeSignOk )
238 {
239 msg.Printf( _( "Failed to verify kiface library '%s' signature." ), dname );
240 THROW_IO_ERROR( msg );
241 }
242#endif
243
244 wxDynamicLibrary dso;
245
246 void* addr = nullptr;
247
248 // For some reason wxDynamicLibrary::Load() crashes in some languages
249 // (chinese for instance) when loading the dynamic library.
250 // The crash happens for Eeschema.
251 // So switch to "C" locale during loading (LC_COLLATE is enough).
252 int lc_new_type = LC_COLLATE;
253 std::string user_locale = setlocale( lc_new_type, nullptr );
254 setlocale( lc_new_type, "C" );
255
256 bool success = dso.Load( dname, wxDL_VERBATIM | wxDL_NOW | wxDL_GLOBAL );
257
258 setlocale( lc_new_type, user_locale.c_str() );
259
260 if( !success )
261 {
262 // Failure: error reporting UI was done via wxLogSysError().
263 // No further reporting required here. Apparently this is not true on all
264 // platforms and/or wxWidgets builds and KiCad will crash. Throwing the exception
265 // here and catching it in the KiCad launcher resolves the crash issue. See bug
266 // report https://bugs.launchpad.net/kicad/+bug/1577786.
267
268 msg.Printf( _( "Failed to load kiface library '%s'." ), dname );
269 THROW_IO_ERROR( msg );
270 }
271 else if( ( addr = dso.GetSymbol( wxT( KIFACE_INSTANCE_NAME_AND_VERSION ) ) ) == nullptr )
272 {
273 // Failure: error reporting UI was done via wxLogSysError().
274 // No further reporting required here. Assume the same thing applies here as
275 // above with the Load() call. This has not been tested.
276 msg.Printf( _( "Could not read instance name and version from kiface library '%s'." ),
277 dname );
278 THROW_IO_ERROR( msg );
279 }
280 else
281 {
282 KIFACE_GETTER_FUNC* ki_getter = (KIFACE_GETTER_FUNC*) addr;
283
284 KIFACE* kiface = ki_getter( &m_kiface_version[aFaceId], KIFACE_VERSION, m_program );
285
286 // KIFACE_GETTER_FUNC function comment (API) says the non-NULL is unconditional.
287 wxASSERT_MSG( kiface,
288 wxT( "attempted DSO has a bug, failed to return a KIFACE*" ) );
289
290 // Give the DSO a single chance to do its "process level" initialization.
291 // "Process level" specifically means stay away from any projects in there.
292 if( kiface->OnKifaceStart( m_program, m_ctl ) )
293 {
294 // Tell dso's wxDynamicLibrary destructor not to Unload() the program image.
295 ignore_unused( dso.Detach() );
296
297 return m_kiface[aFaceId] = kiface;
298 }
299 }
300
301 // In any of the failure cases above, dso.Unload() should be called here
302 // by dso destructor.
303 // However:
304
305 // There is a file installation bug. We only look for KIFACE's which we know
306 // to exist, and we did not find one. If we do not find one, this is an
307 // installation bug.
308
309 msg = wxString::Format( _( "Fatal Installation Bug. File:\n"
310 "'%s'\ncould not be loaded\n" ), dname );
311
312 if( ! wxFileExists( dname ) )
313 msg << _( "It is missing.\n" );
314 else
315 msg << _( "Perhaps a shared library (.dll or .so) file is missing.\n" );
316
317 msg << _( "From command line: argv[0]:\n'" );
318 msg << wxStandardPaths::Get().GetExecutablePath() << wxT( "'\n" );
319
320 // This is a fatal error, one from which we cannot recover, nor do we want
321 // to protect against in client code which would require numerous noisy
322 // tests in numerous places. So we inform the user that the installation
323 // is bad. This exception will likely not get caught until way up in the
324 // wxApp derivative, at which point the process will exit gracefully.
325 THROW_IO_ERROR( msg );
326 }
327
328 return nullptr;
329}
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
const wxString dso_search_path(FACE_T aFaceId)
Get the [path &] name of the DSO holding the requested FACE_T.
Definition: kiway.cpp:106
static KIFACE * m_kiface[KIWAY_FACE_COUNT]
Definition: kiway.h:439
static int m_kiface_version[KIWAY_FACE_COUNT]
Definition: kiway.h:440
return & kiface
Definition: cvpcb.cpp:112
#define _(s)
void ignore_unused(const T &)
Definition: ignore.h:24
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:38
KIFACE * KIFACE_GETTER_FUNC(int *aKIFACEversion, int aKIWAYversion, PGM_BASE *aProgram)
Point to the one and only KIFACE export.
Definition: kiway.h:478
#define KIFACE_INSTANCE_NAME_AND_VERSION
Definition: kiway.h:114
#define KIFACE_VERSION
The KIWAY and KIFACE classes are used to communicate between various process modules,...
Definition: kiway.h:109
void AddDynamicLibrarySearchPath(const wxString &aPath)
Inserts a search path for loading dynamic libraries.
Definition: gtk/app.cpp:93
bool VerifyFileSignature(const wxString &aPath)
Validates the code signing signature of a given file This is most likely only ever going to be applic...
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
Implement a participant in the KIWAY alchemy.
Definition: kiway.h:150

References _, KIPLATFORM::APP::AddDynamicLibrarySearchPath(), arrayDim(), dso_search_path(), Format(), ignore_unused(), kiface, KIFACE_INSTANCE_NAME_AND_VERSION, KIFACE_VERSION, m_ctl, m_kiface, m_kiface_version, m_program, THROW_IO_ERROR, and KIPLATFORM::ENV::VerifyFileSignature().

Referenced by COMMON_CONTROL::ConfigurePaths(), FOOTPRINT_PREVIEW_PANEL_BASE::Create(), DIALOG_LIST_HOTKEYS::DIALOG_LIST_HOTKEYS(), get_instance_from_id(), SCRIPTING_TOOL::Init(), SAVE_AS_TRAVERSER::OnFile(), EDA_BASE_FRAME::OnPreferences(), PROJECT::PcbFootprintLibs(), Player(), and COMMON_CONTROL::ShowLibraryTable().

◆ KifaceType()

KIWAY::FACE_T KIWAY::KifaceType ( FRAME_T  aFrameType)
static

A simple mapping function which returns the FACE_T which is known to implement aFrameType.

Returns
a valid value KIWAY::FACE_T or FACE_T(-1) if given a bad aFrameType.

Definition at line 332 of file kiway.cpp.

333{
334 switch( aFrameType )
335 {
336 case FRAME_SCH:
338 case FRAME_SCH_VIEWER:
340 case FRAME_SIMULATOR:
341 return FACE_SCH;
342
343 case FRAME_PCB_EDITOR:
349 return FACE_PCB;
350
351 case FRAME_CVPCB:
353 return FACE_CVPCB;
354
355 case FRAME_PYTHON:
356 return FACE_PYTHON;
357
358 case FRAME_GERBER:
359 return FACE_GERBVIEW;
360
361 case FRAME_PL_EDITOR:
362 return FACE_PL_EDITOR;
363
364 case FRAME_CALC:
365 return FACE_PCB_CALCULATOR;
366
367 case FRAME_BM2CMP:
368 return FACE_BMP2CMP;
369
370 default:
371 return FACE_T( -1 );
372 }
373}
FACE_T
Known KIFACE implementations.
Definition: kiway.h:273
@ FRAME_PCB_EDITOR
Definition: frame_type.h:40
@ FRAME_FOOTPRINT_VIEWER_MODAL
Definition: frame_type.h:43
@ FRAME_CALC
Definition: frame_type.h:59
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_CVPCB_DISPLAY
Definition: frame_type.h:49
@ FRAME_FOOTPRINT_VIEWER
Definition: frame_type.h:42
@ FRAME_BM2CMP
Definition: frame_type.h:57
@ FRAME_FOOTPRINT_WIZARD
Definition: frame_type.h:44
@ FRAME_SCH_VIEWER
Definition: frame_type.h:36
@ FRAME_SCH
Definition: frame_type.h:34
@ FRAME_SCH_VIEWER_MODAL
Definition: frame_type.h:37
@ FRAME_SIMULATOR
Definition: frame_type.h:38
@ FRAME_PL_EDITOR
Definition: frame_type.h:55
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:41
@ FRAME_GERBER
Definition: frame_type.h:53
@ FRAME_PYTHON
Definition: frame_type.h:51
@ FRAME_PCB_DISPLAY3D
Definition: frame_type.h:45
@ FRAME_CVPCB
Definition: frame_type.h:48

References FACE_BMP2CMP, FACE_CVPCB, FACE_GERBVIEW, FACE_PCB, FACE_PCB_CALCULATOR, FACE_PL_EDITOR, FACE_PYTHON, FACE_SCH, FRAME_BM2CMP, FRAME_CALC, FRAME_CVPCB, FRAME_CVPCB_DISPLAY, FRAME_FOOTPRINT_EDITOR, FRAME_FOOTPRINT_VIEWER, FRAME_FOOTPRINT_VIEWER_MODAL, FRAME_FOOTPRINT_WIZARD, FRAME_GERBER, FRAME_PCB_DISPLAY3D, FRAME_PCB_EDITOR, FRAME_PL_EDITOR, FRAME_PYTHON, FRAME_SCH, FRAME_SCH_SYMBOL_EDITOR, FRAME_SCH_VIEWER, FRAME_SCH_VIEWER_MODAL, and FRAME_SIMULATOR.

Referenced by PGM_SINGLE_TOP::OnPgmInit(), and Player().

◆ OnKiCadExit()

void KIWAY::OnKiCadExit ( )

Definition at line 657 of file kiway.cpp.

658{
660 {
661 // A dynamic_cast could be better, but creates link issues
662 // (some basic_frame functions not found) on some platforms,
663 // so a static_cast is used.
664 EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
665
666 if( top )
667 top->Close( false );
668 }
669}

References KFCTL_CPP_PROJECT_SUITE, m_ctl, and m_top.

Referenced by PL_EDITOR_FRAME::OnExit(), SCH_EDIT_FRAME::OnExit(), FOOTPRINT_EDIT_FRAME::OnExitKiCad(), SYMBOL_EDIT_FRAME::OnExitKiCad(), FOOTPRINT_VIEWER_FRAME::OnExitKiCad(), and PCB_EDIT_FRAME::OnQuit().

◆ OnKiwayEnd()

void KIWAY::OnKiwayEnd ( )

Definition at line 672 of file kiway.cpp.

673{
674 for( KIFACE* i : m_kiface )
675 {
676 if( i )
677 i->OnKifaceEnd();
678 }
679}

References m_kiface.

Referenced by PGM_SINGLE_TOP::OnPgmExit(), PGM_KICAD::OnPgmExit(), and PGM_TEST_FRAME::OnPgmExit().

◆ Player()

KIWAY_PLAYER * KIWAY::Player ( FRAME_T  aFrameType,
bool  doCreate = true,
wxTopLevelWindow *  aParent = nullptr 
)
virtual

Return the KIWAY_PLAYER* given a FRAME_T.

If it is not already created, the required KIFACE is found and loaded and initialized if necessary, then the KIWAY_PLAYER window is created but not shown. Caller must Show() it. If it is already created, then the existing KIWAY_PLAYER* pointer is returned.

Parameters
aFrameTypeis from enum FRAME_T.
doCreatewhen true asks that the player be created if it is not already created, false means do not create and maybe return NULL.
aParentis a parent for modal KIWAY_PLAYER frames, otherwise NULL used only when doCreate = true and by KIWAY_PLAYER frames created in modal form
Returns
a valid opened KIWAY_PLAYER or NULL if there is something wrong or doCreate was false and the player has yet to be created.
Exceptions
IO_ERRORif the *.kiface file could not be found, filled with text saying what.

Definition at line 394 of file kiway.cpp.

395{
396 // Since this will be called from python, cannot assume that code will
397 // not pass a bad aFrameType.
398 if( (unsigned) aFrameType >= KIWAY_PLAYER_COUNT )
399 {
400 // @todo : throw an exception here for python's benefit, at least that
401 // way it gets some explanatory text.
402
403 wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) );
404 return nullptr;
405 }
406
407 // return the previously opened window
408 KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
409
410 if( frame )
411 return frame;
412
413 if( doCreate )
414 {
415 try
416 {
417 FACE_T face_type = KifaceType( aFrameType );
418 KIFACE* kiface = KiFACE( face_type );
419
420 frame = (KIWAY_PLAYER*) kiface->CreateWindow(
421 aParent, // Parent window of frame in modal mode,
422 // NULL in non modal mode
423 aFrameType,
424 this,
425 m_ctl // questionable need, these same flags
426 // were passed to KIFACE::OnKifaceStart()
427 );
428
429 m_playerFrameId[aFrameType].store( frame->GetId() );
430 return frame;
431 }
432 catch( const IO_ERROR& ioe )
433 {
434 DisplayErrorMessage( nullptr, _( "Error loading editor." ), ioe.What() );
435 }
436 catch( const std::exception& e)
437 {
438 DisplayErrorMessage( nullptr, _( "Error loading editor." ), e.what() );
439 }
440 catch( ... )
441 {
442 DisplayErrorMessage( nullptr, _( "Error loading editor." ) );
443 }
444 }
445
446 return nullptr;
447}
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:76
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
static FACE_T KifaceType(FRAME_T aFrameType)
A simple mapping function which returns the FACE_T which is known to implement aFrameType.
Definition: kiway.cpp:332
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:198
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:299

References _, DisplayErrorMessage(), GetPlayerFrame(), kiface, KiFACE(), KifaceType(), KIWAY_PLAYER_COUNT, m_ctl, m_playerFrameId, and IO_ERROR::What().

Referenced by FOOTPRINT_VIEWER_FRAME::AddFootprintToPCB(), PCB_BASE_EDIT_FRAME::AddLibrary(), SYMBOL_EDITOR_CONTROL::AddSymbolToSchematic(), SCH_EDIT_FRAME::AskToSaveChanges(), IMPORT_PROJ_HELPER::AssociateFileWithProj(), SYMBOL_EDIT_FRAME::CanCloseSymbolFromSchematic(), SCH_EDIT_FRAME::canCloseWindow(), PCB_EDIT_FRAME::canCloseWindow(), FOOTPRINT_EDITOR_CONTROL::CreateFootprint(), PCB::IFACE::CreateWindow(), FIELDS_EDITOR_GRID_TRICKS::doPopupSelection(), FIELDS_GRID_TRICKS::doPopupSelection(), BOARD_EDITOR_CONTROL::EditFpInFpEditor(), SCH_EDITOR_CONTROL::EditWithSymbolEditor(), BACK_ANNOTATE::FetchNetlistFromPCB(), InvokePcbLibTableEditor(), InvokeSchEditSymbolLibTable(), EDA_DRAW_FRAME::IsScriptingConsoleVisible(), DIALOG_CHANGE_SYMBOLS::launchMatchIdSymbolBrowser(), DIALOG_CHANGE_SYMBOLS::launchNewIdSymbolBrowser(), FOOTPRINT_EDIT_FRAME::LoadFootprintFromBoard(), TEXT_BUTTON_SYMBOL_CHOOSER::OnButtonClick(), TEXT_BUTTON_FP_CHOOSER::OnButtonClick(), KIGFX::WX_VIEW_CONTROLS::onMotion(), SCH_EDIT_FRAME::OnOpenCvpcb(), SCH_EDIT_FRAME::OnOpenPcbnew(), PGM_SINGLE_TOP::OnPgmInit(), DIALOG_SYMBOL_REMAP::OnRemapSymbols(), DIALOG_FIELD_PROPERTIES::OnTextValueSelectButtonClick(), FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard(), SCH_EDIT_FRAME::OnUpdatePCB(), FOOTPRINT_EDIT_FRAME::OnUpdateSaveFootprintToBoard(), SCH_BASE_FRAME::PickSymbolFromLibBrowser(), ProcessEvent(), SCH_EDIT_TOOL::Properties(), FOOTPRINT_WIZARD_FRAME::PythonPluginsReload(), SCH_EDITOR_CONTROL::rescueProject(), PCB_EDIT_FRAME::RunEeschema(), EE_INSPECTION_TOOL::RunSimulation(), SYMBOL_EDIT_FRAME::Save(), SYMBOL_EDIT_FRAME::saveCurrentSymbol(), SaveFileAs(), FOOTPRINT_EDIT_FRAME::SaveFootprintToBoard(), EDA_DRAW_FRAME::ScriptingConsoleEnableDisable(), PCB_BASE_FRAME::SelectFootprintFromLibBrowser(), PCB_EDIT_FRAME::ShowFootprintPropertiesDialog(), CVPCB_CONTROL::ShowFootprintViewer(), COMMON_CONTROL::ShowPlayer(), KICAD_MANAGER_CONTROL::ShowPlayer(), SIM_PLOT_FRAME::SIM_PLOT_FRAME(), PCB_EDIT_FRAME::TestStandalone(), BOARD_EDITOR_CONTROL::UpdateSchematicFromPCB(), and DIALOG_EXCHANGE_FOOTPRINTS::ViewAndSelectFootprint().

◆ PlayerClose()

bool KIWAY::PlayerClose ( FRAME_T  aFrameType,
bool  doForce 
)
virtual

Call the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed, returns true, else false.

If window actually closes, then this KIWAY marks it as not opened internally.

Returns
true if the window is closed and not vetoed, else false.

Definition at line 450 of file kiway.cpp.

451{
452 // Since this will be called from python, cannot assume that code will
453 // not pass a bad aFrameType.
454 if( (unsigned) aFrameType >= KIWAY_PLAYER_COUNT )
455 {
456 // @todo : throw an exception here for python's benefit, at least that
457 // way it gets some explanatory text.
458
459 wxASSERT_MSG( 0, wxT( "caller has a bug, passed a bad aFrameType" ) );
460 return false;
461 }
462
463 KIWAY_PLAYER* frame = GetPlayerFrame( aFrameType );
464
465 if( frame == nullptr ) // Already closed
466 return true;
467
468 if( frame->NonUserClose( doForce ) )
469 return true;
470
471 return false;
472}
bool NonUserClose(bool aForce)

References GetPlayerFrame(), KIWAY_PLAYER_COUNT, and EDA_BASE_FRAME::NonUserClose().

Referenced by PlayersClose().

◆ PlayersClose()

bool KIWAY::PlayersClose ( bool  doForce)
virtual

Call the KIWAY_PLAYER::Close( bool force ) function on all the windows and if none are vetoed, returns true, else false.

If any window actually closes, then* this KIWAY marks it as not opened internally.

Returns
true indicates that all windows closed because none were vetoed, false means at least one cast a veto. Any that cast a veto are still open.

Definition at line 475 of file kiway.cpp.

476{
477 bool ret = true;
478
479 for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
480 {
481 ret = ret && PlayerClose( FRAME_T( i ), doForce );
482 }
483
484 return ret;
485}
virtual bool PlayerClose(FRAME_T aFrameType, bool doForce)
Call the KIWAY_PLAYER::Close( bool force ) function on the window and if not vetoed,...
Definition: kiway.cpp:450

References KIWAY_PLAYER_COUNT, and PlayerClose().

◆ Prj()

PROJECT & KIWAY::Prj ( ) const
virtual

Return the PROJECT associated with this KIWAY.

This is here as an accessor, so that there is freedom to put the actual PROJECT storage in a place decided by the implementation, and not known to the caller.

Definition at line 192 of file kiway.cpp.

193{
194 return Pgm().GetSettingsManager().Prj();
195}
virtual PROJECT & Prj() const
Return the PROJECT associated with this KIWAY.
Definition: kiway.cpp:192

References Pgm(), and Prj().

Referenced by CVPCB_MAINFRAME::BuildLibrariesListBox(), FOOTPRINT_EDIT_FRAME::buildSaveAsDialog(), SYMBOL_EDIT_FRAME::buildSaveAsDialog(), SYMBOL_PREVIEW_WIDGET::DisplaySymbol(), FOOTPRINT_LIST::GetInstance(), InvokePcbLibTableEditor(), InvokeSchEditSymbolLibTable(), Prj(), Prj(), KIWAY_HOLDER::Prj(), SYMBOL_VIEWER_FRAME::ReCreateLibList(), FOOTPRINT_VIEWER_FRAME::ReCreateLibraryList(), and PCB_BASE_FRAME::SelectLibrary().

◆ ProcessEvent()

bool KIWAY::ProcessEvent ( wxEvent &  aEvent)
override

Definition at line 631 of file kiway.cpp.

632{
633 KIWAY_EXPRESS* mail = dynamic_cast<KIWAY_EXPRESS*>( &aEvent );
634
635 if( mail )
636 {
637 FRAME_T dest = mail->Dest();
638
639 // see if recipient is alive
640 KIWAY_PLAYER* alive = Player( dest, false );
641
642 if( alive )
643 {
644#if 1
645 return alive->ProcessEvent( aEvent );
646#else
647 alive->KiwayMailIn( *mail );
648 return true;
649#endif
650 }
651 }
652
653 return false;
654}
bool ProcessEvent(wxEvent &aEvent) override
Override the default process event handler to implement the auto save feature.
FRAME_T Dest()
Return the destination player id of the message.
Definition: kiway_express.h:44
virtual void KiwayMailIn(KIWAY_EXPRESS &aEvent)
Receive KIWAY_EXPRESS messages from other players.
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:394

References KIWAY_EXPRESS::Dest(), KIWAY_PLAYER::KiwayMailIn(), Player(), and EDA_BASE_FRAME::ProcessEvent().

Referenced by ExpressMail().

◆ ProjectChanged()

void KIWAY::ProjectChanged ( )
virtual

Calls ProjectChanged() on all KIWAY_PLAYERs.

Used after changing the project to ensure all players are updated correctly.

Definition at line 595 of file kiway.cpp.

596{
598 {
599 // A dynamic_cast could be better, but creates link issues
600 // (some basic_frame functions not found) on some platforms,
601 // so a static_cast is used.
602 EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
603
604 if( top )
605 top->ProjectChanged();
606 }
607
608 for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
609 {
610 KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
611
612 if( frame )
613 frame->ProjectChanged();
614 }
615}
virtual void ProjectChanged()
Notification event that the project has changed.

References GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, m_ctl, m_top, and EDA_BASE_FRAME::ProjectChanged().

Referenced by SETTINGS_MANAGER::LoadProject(), and SETTINGS_MANAGER::UnloadProject().

◆ set_kiface()

bool KIWAY::set_kiface ( FACE_T  aFaceType,
KIFACE aKiface 
)
inlineprivate

Definition at line 422 of file kiway.h.

423 {
424 if( (unsigned) aFaceType < (unsigned) KIWAY_FACE_COUNT )
425 {
426 m_kiface[aFaceType] = aKiface;
427 return true;
428 }
429
430 return false;
431 }

References KIWAY_FACE_COUNT, and m_kiface.

Referenced by PGM_SINGLE_TOP::OnPgmInit().

◆ SetBlockingDialog()

void KIWAY::SetBlockingDialog ( wxWindow *  aWin)

Definition at line 622 of file kiway.cpp.

623{
624 if( !aWin )
625 m_blockingDialog = wxID_NONE;
626 else
627 m_blockingDialog = aWin->GetId();
628}

References m_blockingDialog.

Referenced by DIALOG_SHIM::DIALOG_SHIM(), and DIALOG_SHIM::~DIALOG_SHIM().

◆ SetLanguage()

void KIWAY::SetLanguage ( int  aLanguage)
virtual

Change the language and then calls ShowChangedLanguage() on all #KIWAY_PLAYERs.

Definition at line 504 of file kiway.cpp.

505{
506 wxString errMsg;
507 bool ret = false;
508
509 {
510 // Only allow the traces to be logged by wx. We use our own system to log when the
511 // OS doesn't support the language, so we want to hide the wx error.
512 WX_LOG_TRACE_ONLY logtraceOnly;
513 Pgm().SetLanguageIdentifier( aLanguage );
514 ret = Pgm().SetLanguage( errMsg );
515 }
516
517 if( !ret )
518 {
519 wxString lang;
520
521 for( unsigned ii = 0; LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
522 {
523 if( aLanguage == LanguagesList[ii].m_KI_Lang_Identifier )
524 {
525 if( LanguagesList[ii].m_DoNotTranslate )
526 lang = LanguagesList[ii].m_Lang_Label;
527 else
528 lang = wxGetTranslation( LanguagesList[ii].m_Lang_Label );
529
530 break;
531 }
532 }
533
534 DisplayErrorMessage( nullptr,
535 wxString::Format( _( "Unable to switch language to %s" ), lang ),
536 errMsg );
537 return;
538 }
539
540#if 1
541 // This is a risky hack that goes away if we allow the language to be
542 // set only from the top most frame if !Kiface.IsSingle()
543
544 // Only for the C++ project manager, and not for the python one and not for
545 // single_top do we look for the EDA_BASE_FRAME as the top level window.
546 // For single_top this is not needed because that window is registered in
547 // the array below.
549 {
550 // A dynamic_cast could be better, but creates link issues
551 // (some basic_frame functions not found) on some platforms,
552 // so a static_cast is used.
553 EDA_BASE_FRAME* top = static_cast<EDA_BASE_FRAME*>( m_top );
554
555 if( top )
556 top->ShowChangedLanguage();
557 }
558#endif
559
560 for( unsigned i=0; i < KIWAY_PLAYER_COUNT; ++i )
561 {
562 KIWAY_PLAYER* frame = GetPlayerFrame( ( FRAME_T )i );
563
564 if( frame )
565 {
566 frame->ShowChangedLanguage();
567 }
568 }
569}
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void SetLanguage(int aLanguage)
Change the language and then calls ShowChangedLanguage() on all #KIWAY_PLAYERs.
Definition: kiway.cpp:504
A logger class that filters out all log messages that are not generated by wxLogTrace and ignores the...
Definition: logging.h:32
LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
Definition: pgm_base.cpp:83
int m_KI_Lang_Identifier
KiCad identifier used in menu selection (See id.h)
Definition: pgm_base.h:65
wxString m_Lang_Label
Labels used in menus.
Definition: pgm_base.h:68

References _, DisplayErrorMessage(), Format(), GetPlayerFrame(), KFCTL_CPP_PROJECT_SUITE, KIWAY_PLAYER_COUNT, LanguagesList, m_ctl, LANGUAGE_DESCR::m_KI_Lang_Identifier, LANGUAGE_DESCR::m_Lang_Label, m_top, Pgm(), SetLanguage(), and EDA_BASE_FRAME::ShowChangedLanguage().

Referenced by KIWAY_PLAYER::language_change(), KICAD_MANAGER_FRAME::language_change(), and SetLanguage().

◆ SetTop()

void KIWAY::SetTop ( wxFrame *  aTop)

Tell this KIWAY about the top most frame in the program and optionally allows it to play the role of one of the KIWAY_PLAYERs if launched from single_top.cpp.

Parameters
aTopis the top most wxFrame in the entire program.

Definition at line 84 of file kiway.cpp.

85{
86#if 0
87 if( m_top )
88 {
89 m_top->Disconnect( wxEVT_DESTROY,
90 wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ),
91 nullptr, this );
92 }
93
94 if( aTop )
95 {
96 aTop->Connect( wxEVT_DESTROY,
97 wxWindowDestroyEventHandler( KIWAY::player_destroy_handler ),
98 nullptr, this );
99 }
100#endif
101
102 m_top = aTop;
103}

References m_top.

Referenced by KIWAY(), PGM_SINGLE_TOP::OnPgmInit(), and PGM_KICAD::OnPgmInit().

Friends And Related Function Documentation

◆ PGM_SINGLE_TOP

friend struct PGM_SINGLE_TOP
friend

Definition at line 268 of file kiway.h.

Member Data Documentation

◆ m_blockingDialog

wxWindowID KIWAY::m_blockingDialog
private

Definition at line 447 of file kiway.h.

Referenced by GetBlockingDialog(), and SetBlockingDialog().

◆ m_ctl

int KIWAY::m_ctl
private

◆ m_kiface

KIFACE * KIWAY::m_kiface
staticprivate

Definition at line 439 of file kiway.h.

Referenced by KiFACE(), OnKiwayEnd(), and set_kiface().

◆ m_kiface_version

int KIWAY::m_kiface_version
staticprivate

Definition at line 440 of file kiway.h.

Referenced by KiFACE().

◆ m_playerFrameId

std::atomic<wxWindowID> KIWAY::m_playerFrameId[KIWAY_PLAYER_COUNT]
private

Definition at line 455 of file kiway.h.

Referenced by GetPlayerFrame(), KIWAY(), and Player().

◆ m_program

PGM_BASE* KIWAY::m_program
private

Definition at line 442 of file kiway.h.

Referenced by KiFACE().

◆ m_top

wxFrame* KIWAY::m_top
private

Definition at line 445 of file kiway.h.

Referenced by CommonSettingsChanged(), GetTop(), OnKiCadExit(), ProjectChanged(), SetLanguage(), and SetTop().


The documentation for this class was generated from the following files: