37#include <wx/apptrait.h>
38#include <wx/stdpaths.h>
39#include <wx/tokenzr.h>
40#include <wx/txtstrm.h>
41#include <wx/wfstream.h>
64#define KEY_NON_FOUND -1
67 { wxT(
"F1" ), WXK_F1 },
68 { wxT(
"F2" ), WXK_F2 },
69 { wxT(
"F3" ), WXK_F3 },
70 { wxT(
"F4" ), WXK_F4 },
71 { wxT(
"F5" ), WXK_F5 },
72 { wxT(
"F6" ), WXK_F6 },
73 { wxT(
"F7" ), WXK_F7 },
74 { wxT(
"F8" ), WXK_F8 },
75 { wxT(
"F9" ), WXK_F9 },
76 { wxT(
"F10" ), WXK_F10 },
77 { wxT(
"F11" ), WXK_F11 },
78 { wxT(
"F12" ), WXK_F12 },
79 { wxT(
"F13" ), WXK_F13 },
80 { wxT(
"F14" ), WXK_F14 },
81 { wxT(
"F15" ), WXK_F15 },
82 { wxT(
"F16" ), WXK_F16 },
83 { wxT(
"F17" ), WXK_F17 },
84 { wxT(
"F18" ), WXK_F18 },
85 { wxT(
"F19" ), WXK_F19 },
86 { wxT(
"F20" ), WXK_F20 },
87 { wxT(
"F21" ), WXK_F21 },
88 { wxT(
"F22" ), WXK_F22 },
89 { wxT(
"F23" ), WXK_F23 },
90 { wxT(
"F24" ), WXK_F24 },
92 { wxT(
"Esc" ), WXK_ESCAPE },
93 { wxT(
"Del" ), WXK_DELETE },
94 { wxT(
"Tab" ), WXK_TAB },
95 { wxT(
"Back" ), WXK_BACK },
96 { wxT(
"Ins" ), WXK_INSERT },
98 { wxT(
"Home" ), WXK_HOME },
99 { wxT(
"End" ), WXK_END },
100 { wxT(
"PgUp" ), WXK_PAGEUP },
101 { wxT(
"PgDn" ), WXK_PAGEDOWN },
103 { wxT(
"Up" ), WXK_UP },
104 { wxT(
"Down" ), WXK_DOWN },
105 { wxT(
"Left" ), WXK_LEFT },
106 { wxT(
"Right" ), WXK_RIGHT },
108 { wxT(
"Return" ), WXK_RETURN },
110 { wxT(
"Space" ), WXK_SPACE },
112 { wxT(
"Num Pad 0" ), WXK_NUMPAD0 },
113 { wxT(
"Num Pad 1" ), WXK_NUMPAD1 },
114 { wxT(
"Num Pad 2" ), WXK_NUMPAD2 },
115 { wxT(
"Num Pad 3" ), WXK_NUMPAD3 },
116 { wxT(
"Num Pad 4" ), WXK_NUMPAD4 },
117 { wxT(
"Num Pad 5" ), WXK_NUMPAD5 },
118 { wxT(
"Num Pad 6" ), WXK_NUMPAD6 },
119 { wxT(
"Num Pad 7" ), WXK_NUMPAD7 },
120 { wxT(
"Num Pad 8" ), WXK_NUMPAD8 },
121 { wxT(
"Num Pad 9" ), WXK_NUMPAD9 },
122 { wxT(
"Num Pad +" ), WXK_NUMPAD_ADD },
123 { wxT(
"Num Pad -" ), WXK_NUMPAD_SUBTRACT },
124 { wxT(
"Num Pad *" ), WXK_NUMPAD_MULTIPLY },
125 { wxT(
"Num Pad /" ), WXK_NUMPAD_DIVIDE },
126 { wxT(
"Num Pad ." ), WXK_NUMPAD_SEPARATOR },
127 { wxT(
"Num Pad Enter" ), WXK_NUMPAD_ENTER },
128 { wxT(
"Num Pad F1"), WXK_NUMPAD_F1 },
129 { wxT(
"Num Pad F2"), WXK_NUMPAD_F2 },
130 { wxT(
"Num Pad F3"), WXK_NUMPAD_F3 },
131 { wxT(
"Num Pad F4"), WXK_NUMPAD_F4 },
154#define MODIFIER_CTRL wxT( "Cmd+" )
155#define MODIFIER_ALT wxT( "Option+" )
157#define MODIFIER_CTRL wxT( "Ctrl+" )
158#define MODIFIER_ALT wxT( "Alt+" )
160#define MODIFIER_CMD_MAC wxT( "Cmd+" )
161#define MODIFIER_CTRL_BASE wxT( "Ctrl+" )
162#define MODIFIER_SHIFT wxT( "Shift+" )
163#define MODIFIER_META wxT( "Meta+" )
164#define MODIFIER_WIN wxT( "Win+" )
165#define MODIFIER_SUPER wxT( "Super+" )
166#define MODIFIER_ALTGR wxT( "AltGr+" )
171 wxString keyname, modifier, fullkeyname;
175 if( aKeycode == WXK_CONTROL )
177 else if( aKeycode == WXK_RAW_CONTROL )
179 else if( aKeycode == WXK_SHIFT )
181 else if( aKeycode == WXK_ALT )
183#ifdef WXK_WINDOWS_LEFT
184 else if( aKeycode == WXK_WINDOWS_LEFT || aKeycode == WXK_WINDOWS_RIGHT )
188 else if( aKeycode == WXK_META )
193 if( (aKeycode &
MD_CTRL) != 0 )
196 if( (aKeycode &
MD_ALT) != 0 )
202 if( (aKeycode &
MD_META) != 0 )
213 if( (aKeycode >
' ') && (aKeycode < 0x7F ) )
216 keyname.Append( (wxChar)aKeycode );
220 for( ii = 0; ; ii++ )
224 keyname = wxT(
"<unknown>" );
240 fullkeyname = modifier + keyname;
247 wxString msg = aText;
250 if( !keyname.IsEmpty() )
261 msg << wxT(
"\t" ) << keyname;
267 msg << wxT(
" (" ) << keyname << wxT(
")" );
289 wxString key = keyname;
342 if( !prefix.IsEmpty() )
343 key.Remove( 0, prefix.Len() );
346 if( (key.length() == 1) && (key[0] >
' ') && (key[0] < 0x7F) )
374 std::map<std::string, std::pair<int, int>>& aHotKeys )
376 wxString fileName = aFileName;
378 if( fileName.IsEmpty() )
380 wxFileName fn( wxS(
"user" ) );
383 fileName = fn.GetFullPath();
386 if( !wxFile::Exists( fileName ) )
389 wxFFile file( fileName,
"rb" );
391 if( !file.IsOpened() )
395 file.ReadAll( &input );
396 input.Replace(
"\r\n",
"\n" );
397 wxStringTokenizer fileTokenizer( input,
"\n", wxTOKEN_STRTOK );
399 while( fileTokenizer.HasMoreTokens() )
401 wxStringTokenizer lineTokenizer( fileTokenizer.GetNextToken(),
"\t" );
403 wxString cmdName = lineTokenizer.GetNextToken();
404 wxString primary = lineTokenizer.GetNextToken();
405 wxString secondary = lineTokenizer.GetNextToken();
407 if( !cmdName.IsEmpty() )
418 std::map<std::string, std::pair<int, int>>
hotkeys;
428 std::pair<int, int> keys =
hotkeys[action->GetName()];
429 action->SetHotKey( keys.first, keys.second );
437 std::map<std::string, std::pair<int, int>>
hotkeys;
438 wxFileName fn(
"user" );
448 hotkeys[ action->GetName() ] = std::pair<int, int>( action->GetHotKey(),
449 action->GetHotKeyAlt() );
452 wxFFileOutputStream outStream( fn.GetFullPath() );
453 wxTextOutputStream txtStream( outStream, wxEOL_UNIX );
455 for(
const std::pair<
const std::string, std::pair<int, int>>& entry :
hotkeys )
456 txtStream << entry.first
486 wxFileName fn( aFilename );
491 if( !wxFile::Exists( fn.GetFullPath() ) )
494 wxFFile cfgfile( fn.GetFullPath(),
"rb" );
496 if( !cfgfile.IsOpened() )
500 wxFileOffset size = cfgfile.Length();
503 std::vector<char> buffer( size );
504 cfgfile.Read( buffer.data(), size );
505 wxString data( buffer.data(), wxConvUTF8, size );
508 if( data.StartsWith( wxT(
"Keys="), &data ) )
509 data.Replace(
"\\n",
"\n",
true );
512 wxStringTokenizer tokenizer( data,
"\r\n", wxTOKEN_STRTOK );
514 while( tokenizer.HasMoreTokens() )
516 wxString line = tokenizer.GetNextToken();
517 wxStringTokenizer lineTokenizer( line,
" \t\r\n" );
519 wxString line_type = lineTokenizer.GetNextToken();
521 if( line_type[0] ==
'#' )
524 if( line_type[0] ==
'[' )
527 if( line_type == wxT(
"$Endlist" ) )
530 if( line_type != wxT(
"shortcut" ) )
534 lineTokenizer.SetString( lineTokenizer.GetString(), L
"\"\r\n\t ", wxTOKEN_STRTOK );
535 wxString keyname = lineTokenizer.GetNextToken();
537 wxString remainder = lineTokenizer.GetString();
540 wxString fctname = remainder.AfterFirst(
'\"' ).BeforeFirst(
'\"' );
A dialog that presents the user with a read-only list of hotkeys and their current bindings.
The base frame for deriving all KiCad main window classes.
static wxString GetUserSettingsPath()
Return the user configuration path used to store KiCad's configuration files.
Hotkey list dialog (as opposed to editor)
Base window classes and related definitions.
#define LIB_EDIT_FRAME_NAME
#define FOOTPRINT_EDIT_FRAME_NAME
#define SCH_EDIT_FRAME_NAME
#define PCB_EDIT_FRAME_NAME
static const std::string HotkeyFileExtension
int ReadLegacyHotkeyConfigFile(const wxString &aFilename, std::map< std::string, int > &aMap)
Read hotkey configuration for a given app.
wxString AddHotkeyName(const wxString &aText, int aHotKey, HOTKEY_ACTION_TYPE aStyle)
void ReadHotKeyConfig(const wxString &aFileName, std::map< std::string, std::pair< int, int > > &aHotKeys)
Read a hotkey config file into a map.
void DisplayHotkeyList(EDA_BASE_FRAME *aParent)
Display the current hotkey list.
int ReadLegacyHotkeyConfig(const wxString &aAppname, std::map< std::string, int > &aMap)
Read configuration data and fill the current hotkey list with hotkeys.
wxString KeyNameFromKeyCode(int aKeycode, bool *aIsFound)
Return the key name from the key code.
int WriteHotKeyConfig(const std::vector< TOOL_ACTION * > &aActions)
Update the hotkeys config file with the hotkeys from the given actions map.
#define MODIFIER_CTRL_BASE
static struct hotkey_name_descr hotkeyNameList[]
int KeyCodeFromKeyName(const wxString &keyname)
Return the key code from its user-friendly key name (ie: "Ctrl+M").
void ReadHotKeyConfigIntoActions(const wxString &aFileName, std::vector< TOOL_ACTION * > &aActions)
Read a hotkey config file into a list of actions.
#define EESCHEMA_HOTKEY_NAME
#define PCBNEW_HOTKEY_NAME
HOTKEY_ACTION_TYPE
In menus we can add a hot key, or an accelerator, or sometimes just a comment.
#define PSEUDO_WXK_DBLCLICK
Definition of file extensions used in Kicad.