KiCad PCB EDA Suite
common.h
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) 2014-2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5  * Copyright (C) 2007-2015 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
6  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
7  * Copyright (C) 1992-2018 KiCad Developers, see AUTHORS.txt for contributors.
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, you may find one here:
21  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22  * or you may search the http://www.gnu.org website for the version 2 license,
23  * or you may write to the Free Software Foundation, Inc.,
24  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25  */
26 
32 #ifndef INCLUDE__COMMON_H_
33 #define INCLUDE__COMMON_H_
34 
35 #include <vector>
36 
37 #include <wx/wx.h>
38 #include <wx/confbase.h>
39 #include <wx/fileconf.h>
40 
41 #include <base_struct.h> // For timestamp_t definition
42 #include <richio.h>
43 #include <gal/color4d.h>
44 
45 #include <atomic>
46 
47 // C++11 "polyfill" for the C++14 std::make_unique function
48 #include "make_unique.h"
49 
50 class wxAboutDialogInfo;
51 class SEARCH_STACK;
52 class REPORTER;
53 
54 
55 // Flag for special keys
56 // This type could be extended to 64 bits to add room for more flags.
57 // For compatibility with old code, keep flag bits out of the least
58 // significant nibble (0xF).
59 typedef uint32_t EDA_KEY;
60 #define EDA_KEY_C UINT32_C
61 
62 #define GR_KB_RIGHTSHIFT ( EDA_KEY_C( 0x01000000 ) )
63 #define GR_KB_LEFTSHIFT ( EDA_KEY_C( 0x02000000 ) )
64 #define GR_KB_CTRL ( EDA_KEY_C( 0x04000000 ) )
65 #define GR_KB_ALT ( EDA_KEY_C( 0x08000000 ) )
66 #define GR_KB_SHIFT ( GR_KB_LEFTSHIFT | GR_KB_RIGHTSHIFT )
67 #define GR_KB_SHIFTCTRL ( GR_KB_SHIFT | GR_KB_CTRL )
68 #define MOUSE_MIDDLE ( EDA_KEY_C( 0x10000000 ) )
69 #define GR_KEY_INVALID ( EDA_KEY_C( 0x80000000 ) )
70 #define GR_KEY_NONE ( EDA_KEY_C( 0 ) )
71 
73 #define NAMELESS_PROJECT wxT( "noname" )
74 
75 
77 enum pseudokeys {
85 };
86 
87 #define ESC 27
88 
91 #define TEXT_ANGLE_HORIZ 0
92 #define TEXT_ANGLE_VERT 900
93 
94 //-----<KiROUND KIT>------------------------------------------------------------
95 
102 #if !defined( DEBUG )
103 
106 static inline int KiROUND( double v )
107 {
108  return int( v < 0 ? v - 0.5 : v + 0.5 );
109 }
110 
113 #define KIROUND( v ) int( (v) < 0 ? (v) - 0.5 : (v) + 0.5 )
114 
115 #else
116 
117 // DEBUG: KiROUND() is a macro to capture line and file, then calls this inline
118 
119 static inline int kiRound_( double v, int line, const char* filename )
120 {
121  v = v < 0 ? v - 0.5 : v + 0.5;
122  if( v > INT_MAX + 0.5 )
123  {
124  printf( "%s: in file %s on line %d, val: %.16g too ' > 0 ' for int\n",
125  __FUNCTION__, filename, line, v );
126  }
127  else if( v < INT_MIN - 0.5 )
128  {
129  printf( "%s: in file %s on line %d, val: %.16g too ' < 0 ' for int\n",
130  __FUNCTION__, filename, line, v );
131  }
132  return int( v );
133 }
134 
135 #define KiROUND( v ) kiRound_( v, __LINE__, __FILE__ )
136 
137 // in Debug build, use the overflow catcher since code size is immaterial
138 #define KIROUND( v ) KiROUND( v )
139 
140 #endif
141 
142 //-----</KiROUND KIT>-----------------------------------------------------------
143 
144 
146  INCHES = 0,
149  DEGREES = 3,
150 };
151 
152 
153 extern EDA_UNITS_T g_UserUnit;
154 
157 
158 
168 {
169 public:
170  LOCALE_IO();
171  ~LOCALE_IO();
172 
173 private:
174  void setUserLocale( const char* aUserLocale );
175 
176  // allow for nesting of LOCALE_IO instantiations
177  static std::atomic<unsigned int> m_c_count;
178 
179  // The locale in use before switching to the "C" locale
180  // (the locale can be set by user, and is not always the system locale)
181  std::string m_user_locale;
182 };
183 
188 wxSize GetTextSize( const wxString& aSingleLine, wxWindow* aWindow );
189 
204 bool EnsureTextCtrlWidth( wxTextCtrl* aCtrl, const wxString* aString = NULL );
205 
217 int ProcessExecute( const wxString& aCommandLine, int aFlags = wxEXEC_ASYNC,
218  wxProcess *callback = NULL );
219 
224 
225 int GetCommandOptions( const int argc, const char** argv,
226  const char* stringtst, const char** optarg,
227  int* optind );
228 
237 double RoundTo0( double x, double precision );
238 
246 void wxStringSplit( const wxString& aText, wxArrayString& aStrings, wxChar aSplitter );
247 
267 wxString SearchHelpFileFullPath( const SEARCH_STACK& aSearchStack, const wxString& aBaseName );
268 
278 bool EnsureFileDirectoryExists( wxFileName* aTargetFullFileName,
279  const wxString& aBaseFilename,
280  REPORTER* aReporter = NULL );
281 
283 const wxString PrePendPath( const wxString& aEnvVar, const wxString& aPriorityPath );
284 
298 wxConfigBase* GetNewConfig( const wxString& aProgName );
299 
312 wxString GetKicadConfigPath();
313 
320 const wxString ExpandEnvVarSubstitutions( const wxString& aString );
321 
325 const wxString ResolveUriByEnvVars( const wxString& aUri );
326 
327 
328 #ifdef __WXMAC__
329 
333 wxString GetOSXKicadUserDataDir();
334 
339 wxString GetOSXKicadMachineDataDir();
340 
345 wxString GetOSXKicadDataDir();
346 #endif
347 
348 // Some wxWidgets versions (for instance before 3.1.0) do not include
349 // this function, so add it if missing
350 #if !wxCHECK_VERSION( 3, 1, 0 )
351 #define USE_KICAD_WXSTRING_HASH // for common.cpp
352 namespace std
354 {
355  template<> struct hash<wxString>
356  {
357  size_t operator()( const wxString& s ) const;
358  };
359 }
360 #endif
361 
363 #define USE_KICAD_WXPOINT_LESS // for common.cpp
364 namespace std
365 {
366  template<> struct less<wxPoint>
367  {
368  bool operator()( const wxPoint& aA, const wxPoint& aB ) const;
369  };
370 }
371 
372 
373 #endif // INCLUDE__COMMON_H_
long timestamp_t
timestamp_t is our type to represent unique IDs for all kinds of elements; historically simply the ti...
Definition: base_struct.h:155
~LOCALE_IO()
Definition: common.cpp:76
static int KiROUND(double v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: common.h:106
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
const wxString ResolveUriByEnvVars(const wxString &aUri)
Replace any environment variables in file-path uris (leaving network-path URIs alone).
Definition: common.cpp:269
const wxString PrePendPath(const wxString &aEnvVar, const wxString &aPriorityPath)
Put aPriorityPath in front of all paths in the value of aEnvVar.
Definition: prependpath.cpp:32
EDA_UNITS_T g_UserUnit
display units
Definition: common.cpp:57
KIGFX::COLOR4D g_GhostColor
Draw color for moving objects.
Definition: common.cpp:58
pseudokeys
Pseudo key codes for command panning.
Definition: common.h:77
Template specialization to enable wxStrings for certain containers (e.g. unordered_map) ...
Definition: bitmap.cpp:54
Class SEARCH_STACK looks for files in a number of places.
Definition: search_stack.h:41
Class REPORTER is a pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:61
wxString GetKicadConfigPath()
Return the user configuration path used to store KiCad&#39;s configuration files.
Definition: common.cpp:211
static std::atomic< unsigned int > m_c_count
Definition: common.h:177
int ProcessExecute(const wxString &aCommandLine, int aFlags=wxEXEC_ASYNC, wxProcess *callback=NULL)
Run a command in a child process.
Definition: common.cpp:154
wxString SearchHelpFileFullPath(const SEARCH_STACK &aSearchStack, const wxString &aBaseName)
Return the help file&#39;s full path.
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: common.cpp:87
wxConfigBase * GetNewConfig(const wxString &aProgName)
Create a new wxConfig so we can put configuration files in a more proper place for each platform...
Definition: common.cpp:199
void setUserLocale(const char *aUserLocale)
Definition: common.h:146
void wxStringSplit(const wxString &aText, wxArrayString &aStrings, wxChar aSplitter)
Split aString to a string list separated at aSplitter.
Definition: common.cpp:131
uint32_t EDA_KEY
Definition: common.h:52
bool EnsureTextCtrlWidth(wxTextCtrl *aCtrl, const wxString *aString=NULL)
Set the minimum pixel width on a text control in order to make a text string be fully visible within ...
Definition: common.cpp:102
LOCALE_IO()
Definition: common.cpp:63
const wxString ExpandEnvVarSubstitutions(const wxString &aString)
Replace any environment variable references with their values.
Definition: common.cpp:255
double RoundTo0(double x, double precision)
Round to the nearest precision.
Definition: common.cpp:176
timestamp_t GetNewTimeStamp()
Definition: common.cpp:160
Implementation of std::make_unique for pre C++14 compilation environments.
bool EnsureFileDirectoryExists(wxFileName *aTargetFullFileName, const wxString &aBaseFilename, REPORTER *aReporter=NULL)
Make aTargetFullFileName absolute and create the path of this file if it doesn&#39;t yet exist...
Definition: common.cpp:282
int GetCommandOptions(const int argc, const char **argv, const char *stringtst, const char **optarg, int *optind)
Basic classes for most KiCad items.
EDA_UNITS_T
Definition: common.h:145
std::string m_user_locale
Definition: common.h:181
Class COLOR4D is the color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:39