You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

350 lines
9.5 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. /*
  2. * This program source code file is part of KiCad, a free EDA CAD application.
  3. *
  4. * Copyright (C) 2018 Wayne Stambaugh <stambaughw@gmail.com>
  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. /**
  25. * @file trace_helpers.cpp
  26. * @brief wxLogTrace helper implementation.
  27. */
  28. #include <trace_helpers.h>
  29. #include <wx/tokenzr.h>
  30. const wxChar* const traceFindReplace = wxT( "KICAD_FIND_REPLACE" );
  31. const wxChar* const kicadTraceCoords = wxT( "KICAD_COORDS" );
  32. const wxChar* const kicadTraceKeyEvent = wxT( "KICAD_KEY_EVENTS" );
  33. const wxChar* const kicadTraceToolStack = wxT( "KICAD_TOOL_STACK" );
  34. const wxChar* const kicadTraceCoroutineStack = wxT( "KICAD_COROUTINE_STACK" );
  35. const wxChar* const traceSchLibMem = wxT( "KICAD_SCH_LIB_MEM" );
  36. const wxChar* const traceFindItem = wxT( "KICAD_FIND_ITEM" );
  37. const wxChar* const traceSchLegacyPlugin = wxT( "KICAD_SCH_LEGACY_PLUGIN" );
  38. const wxChar* const traceSchPlugin = wxT( "KICAD_SCH_PLUGIN" );
  39. const wxChar* const traceGedaPcbPlugin = wxT( "KICAD_GEDA_PLUGIN" );
  40. const wxChar* const traceKicadPcbPlugin = wxT( "KICAD_PCB_PLUGIN" );
  41. const wxChar* const tracePrinting = wxT( "KICAD_PRINT" );
  42. const wxChar* const traceAutoSave = wxT( "KICAD_AUTOSAVE" );
  43. const wxChar* const tracePathsAndFiles = wxT( "KICAD_PATHS_AND_FILES" );
  44. const wxChar* const traceLocale = wxT( "KICAD_LOCALE" );
  45. const wxChar* const traceFonts = wxT( "KICAD_FONTS" );
  46. const wxChar* const traceScreen = wxT( "KICAD_SCREEN" );
  47. const wxChar* const traceZoomScroll = wxT( "KICAD_ZOOM_SCROLL" );
  48. const wxChar* const traceSymbolResolver = wxT( "KICAD_SYM_RESOLVE" );
  49. const wxChar* const traceDisplayLocation = wxT( "KICAD_DISPLAY_LOCATION" );
  50. const wxChar* const traceSchSheetPaths = wxT( "KICAD_SCH_SHEET_PATHS" );
  51. const wxChar* const traceEnvVars = wxT( "KICAD_ENV_VARS" );
  52. const wxChar* const traceGalProfile = wxT( "KICAD_GAL_PROFILE" );
  53. const wxChar* const traceKiCad2Step = wxT( "KICAD2STEP" );
  54. const wxChar* const traceUiProfile = wxT( "KICAD_UI_PROFILE" );
  55. const wxChar* const traceGit = wxT( "KICAD_GIT" );
  56. const wxChar* const traceEagleIo = wxT( "KICAD_EAGLE_IO" );
  57. const wxChar* const traceDesignBlocks = wxT( "KICAD_DESIGN_BLOCK" );
  58. wxString dump( const wxArrayString& aArray )
  59. {
  60. wxString tmp;
  61. for( unsigned i = 0; i < aArray.GetCount(); i++ )
  62. {
  63. if( aArray[i].IsEmpty() )
  64. tmp << wxT( "\"\" " );
  65. else
  66. tmp << aArray[i] << wxT( " " );
  67. }
  68. return tmp;
  69. }
  70. // The following code was shamelessly copied from the wxWidgets keyboard sample
  71. // at https://github.com/wxWidgets/wxWidgets/blob/master/samples/keyboard/keyboard.cpp.
  72. /////////////////////////////////////////////////////////////////////////////
  73. // Author: Vadim Zeitlin
  74. // Modified by: Marcin Wojdyr
  75. // Created: 07.04.02
  76. // Copyright: (c) 2002 Vadim Zeitlin
  77. // Licence: wxWindows licence
  78. /////////////////////////////////////////////////////////////////////////////
  79. // helper function that returns textual description of wx virtual keycode
  80. const char* GetVirtualKeyCodeName(int keycode)
  81. {
  82. switch ( keycode )
  83. {
  84. #define WXK_(x) \
  85. case WXK_##x: return #x;
  86. WXK_(BACK)
  87. WXK_(TAB)
  88. WXK_(RETURN)
  89. WXK_(ESCAPE)
  90. WXK_(SPACE)
  91. WXK_(DELETE)
  92. WXK_(START)
  93. WXK_(LBUTTON)
  94. WXK_(RBUTTON)
  95. WXK_(CANCEL)
  96. WXK_(MBUTTON)
  97. WXK_(CLEAR)
  98. WXK_(SHIFT)
  99. WXK_(ALT)
  100. WXK_(CONTROL)
  101. WXK_(MENU)
  102. WXK_(PAUSE)
  103. WXK_(CAPITAL)
  104. WXK_(END)
  105. WXK_(HOME)
  106. WXK_(LEFT)
  107. WXK_(UP)
  108. WXK_(RIGHT)
  109. WXK_(DOWN)
  110. WXK_(SELECT)
  111. WXK_(PRINT)
  112. WXK_(EXECUTE)
  113. WXK_(SNAPSHOT)
  114. WXK_(INSERT)
  115. WXK_(HELP)
  116. WXK_(NUMPAD0)
  117. WXK_(NUMPAD1)
  118. WXK_(NUMPAD2)
  119. WXK_(NUMPAD3)
  120. WXK_(NUMPAD4)
  121. WXK_(NUMPAD5)
  122. WXK_(NUMPAD6)
  123. WXK_(NUMPAD7)
  124. WXK_(NUMPAD8)
  125. WXK_(NUMPAD9)
  126. WXK_(MULTIPLY)
  127. WXK_(ADD)
  128. WXK_(SEPARATOR)
  129. WXK_(SUBTRACT)
  130. WXK_(DECIMAL)
  131. WXK_(DIVIDE)
  132. WXK_(F1)
  133. WXK_(F2)
  134. WXK_(F3)
  135. WXK_(F4)
  136. WXK_(F5)
  137. WXK_(F6)
  138. WXK_(F7)
  139. WXK_(F8)
  140. WXK_(F9)
  141. WXK_(F10)
  142. WXK_(F11)
  143. WXK_(F12)
  144. WXK_(F13)
  145. WXK_(F14)
  146. WXK_(F15)
  147. WXK_(F16)
  148. WXK_(F17)
  149. WXK_(F18)
  150. WXK_(F19)
  151. WXK_(F20)
  152. WXK_(F21)
  153. WXK_(F22)
  154. WXK_(F23)
  155. WXK_(F24)
  156. WXK_(NUMLOCK)
  157. WXK_(SCROLL)
  158. WXK_(PAGEUP)
  159. WXK_(PAGEDOWN)
  160. WXK_(NUMPAD_SPACE)
  161. WXK_(NUMPAD_TAB)
  162. WXK_(NUMPAD_ENTER)
  163. WXK_(NUMPAD_F1)
  164. WXK_(NUMPAD_F2)
  165. WXK_(NUMPAD_F3)
  166. WXK_(NUMPAD_F4)
  167. WXK_(NUMPAD_HOME)
  168. WXK_(NUMPAD_LEFT)
  169. WXK_(NUMPAD_UP)
  170. WXK_(NUMPAD_RIGHT)
  171. WXK_(NUMPAD_DOWN)
  172. WXK_(NUMPAD_PAGEUP)
  173. WXK_(NUMPAD_PAGEDOWN)
  174. WXK_(NUMPAD_END)
  175. WXK_(NUMPAD_BEGIN)
  176. WXK_(NUMPAD_INSERT)
  177. WXK_(NUMPAD_DELETE)
  178. WXK_(NUMPAD_EQUAL)
  179. WXK_(NUMPAD_MULTIPLY)
  180. WXK_(NUMPAD_ADD)
  181. WXK_(NUMPAD_SEPARATOR)
  182. WXK_(NUMPAD_SUBTRACT)
  183. WXK_(NUMPAD_DECIMAL)
  184. WXK_(NUMPAD_DIVIDE)
  185. WXK_(WINDOWS_LEFT)
  186. WXK_(WINDOWS_RIGHT)
  187. #ifdef __WXOSX__
  188. WXK_(RAW_CONTROL)
  189. #endif
  190. #undef WXK_
  191. default:
  192. return nullptr;
  193. }
  194. }
  195. // helper function that returns textual description of key in the event
  196. wxString GetKeyName( const wxKeyEvent &aEvent )
  197. {
  198. int keycode = aEvent.GetKeyCode();
  199. const char* virt = GetVirtualKeyCodeName( keycode );
  200. if( virt )
  201. return virt;
  202. if( keycode > 0 && keycode < 32 )
  203. return wxString::Format( "Ctrl-%c", (unsigned char)('A' + keycode - 1) );
  204. if( keycode >= 32 && keycode < 128 )
  205. return wxString::Format( "'%c'", (unsigned char)keycode );
  206. #if wxUSE_UNICODE
  207. int uc = aEvent.GetUnicodeKey();
  208. if( uc != WXK_NONE )
  209. return wxString::Format( "'%c'", uc );
  210. #endif
  211. return "unknown";
  212. }
  213. wxString dump( const wxKeyEvent& aEvent )
  214. {
  215. wxString msg;
  216. wxString eventType = wxS( "unknown" );
  217. if( aEvent.GetEventType() == wxEVT_KEY_DOWN )
  218. eventType = wxS( "KeyDown" );
  219. else if( aEvent.GetEventType() == wxEVT_KEY_UP )
  220. eventType = wxS( "KeyUp" );
  221. else if( aEvent.GetEventType() == wxEVT_CHAR )
  222. eventType = wxS( "Char" );
  223. else if( aEvent.GetEventType() == wxEVT_CHAR_HOOK )
  224. eventType = wxS( "Hook" );
  225. // event key_name KeyCode modifiers Unicode raw_code raw_flags pos
  226. msg.Printf( "%7s %15s %5d %c%c%c%c"
  227. #if wxUSE_UNICODE
  228. "%5d (U+%04x)"
  229. #else
  230. " none "
  231. #endif
  232. #ifdef wxHAS_RAW_KEY_CODES
  233. " %7lu 0x%08lx"
  234. #else
  235. " not-set not-set"
  236. #endif
  237. " (%5d,%5d)",
  238. eventType,
  239. GetKeyName( aEvent ),
  240. aEvent.GetKeyCode(),
  241. aEvent.ControlDown() ? 'C' : '-',
  242. aEvent.AltDown() ? 'A' : '-',
  243. aEvent.ShiftDown() ? 'S' : '-',
  244. aEvent.MetaDown() ? 'M' : '-'
  245. #if wxUSE_UNICODE
  246. , aEvent.GetUnicodeKey()
  247. , aEvent.GetUnicodeKey()
  248. #endif
  249. #ifdef wxHAS_RAW_KEY_CODES
  250. , (unsigned long) aEvent.GetRawKeyCode()
  251. , (unsigned long) aEvent.GetRawKeyFlags()
  252. #endif
  253. , aEvent.GetX()
  254. , aEvent.GetY()
  255. );
  256. return msg;
  257. }
  258. TRACE_MANAGER& TRACE_MANAGER::Instance()
  259. {
  260. static TRACE_MANAGER* self = nullptr;
  261. if( !self )
  262. {
  263. self = new TRACE_MANAGER;
  264. self->init();
  265. }
  266. return *self;
  267. }
  268. bool TRACE_MANAGER::IsTraceEnabled( const wxString& aWhat )
  269. {
  270. if( !m_printAllTraces )
  271. {
  272. if( !m_globalTraceEnabled )
  273. return false;
  274. if( m_enabledTraces.find( aWhat ) == m_enabledTraces.end() )
  275. return false;
  276. }
  277. return true;
  278. }
  279. void TRACE_MANAGER::traceV( const wxString& aWhat, const wxString& aFmt, va_list vargs )
  280. {
  281. if( !IsTraceEnabled( aWhat ) )
  282. return;
  283. wxString str;
  284. str.PrintfV( aFmt, vargs );
  285. #if defined( __UNIX__ ) || defined( _WIN32 )
  286. fprintf( stderr, " %-30s | %s", aWhat.c_str().AsChar(), str.c_str().AsChar() );
  287. #endif
  288. }
  289. void TRACE_MANAGER::init()
  290. {
  291. wxString traceVars;
  292. m_globalTraceEnabled = wxGetEnv( wxT( "KICAD_TRACE" ), &traceVars );
  293. m_printAllTraces = false;
  294. if( !m_globalTraceEnabled )
  295. return;
  296. wxStringTokenizer tokenizer( traceVars, wxT( "," ) );
  297. while( tokenizer.HasMoreTokens() )
  298. {
  299. wxString token = tokenizer.GetNextToken();
  300. m_enabledTraces[token] = true;
  301. if( token.Lower() == wxT( "all" ) )
  302. m_printAllTraces = true;
  303. }
  304. }