33#include <wx/apptrait.h>
34#include <wx/stdpaths.h>
35#include <wx/tokenzr.h>
36#include <wx/txtstrm.h>
37#include <wx/wfstream.h>
60#define KEY_NON_FOUND -1
63 { wxT(
"F1" ), WXK_F1 },
64 { wxT(
"F2" ), WXK_F2 },
65 { wxT(
"F3" ), WXK_F3 },
66 { wxT(
"F4" ), WXK_F4 },
67 { wxT(
"F5" ), WXK_F5 },
68 { wxT(
"F6" ), WXK_F6 },
69 { wxT(
"F7" ), WXK_F7 },
70 { wxT(
"F8" ), WXK_F8 },
71 { wxT(
"F9" ), WXK_F9 },
72 { wxT(
"F10" ), WXK_F10 },
73 { wxT(
"F11" ), WXK_F11 },
74 { wxT(
"F12" ), WXK_F12 },
75 { wxT(
"F13" ), WXK_F13 },
76 { wxT(
"F14" ), WXK_F14 },
77 { wxT(
"F15" ), WXK_F15 },
78 { wxT(
"F16" ), WXK_F16 },
79 { wxT(
"F17" ), WXK_F17 },
80 { wxT(
"F18" ), WXK_F18 },
81 { wxT(
"F19" ), WXK_F19 },
82 { wxT(
"F20" ), WXK_F20 },
83 { wxT(
"F21" ), WXK_F21 },
84 { wxT(
"F22" ), WXK_F22 },
85 { wxT(
"F23" ), WXK_F23 },
86 { wxT(
"F24" ), WXK_F24 },
88 { wxT(
"Esc" ), WXK_ESCAPE },
89 { wxT(
"Del" ), WXK_DELETE },
90 { wxT(
"Tab" ), WXK_TAB },
91 { wxT(
"Back" ), WXK_BACK },
92 { wxT(
"Ins" ), WXK_INSERT },
94 { wxT(
"Home" ), WXK_HOME },
95 { wxT(
"End" ), WXK_END },
96 { wxT(
"PgUp" ), WXK_PAGEUP },
97 { wxT(
"PgDn" ), WXK_PAGEDOWN },
99 { wxT(
"Up" ), WXK_UP },
100 { wxT(
"Down" ), WXK_DOWN },
101 { wxT(
"Left" ), WXK_LEFT },
102 { wxT(
"Right" ), WXK_RIGHT },
104 { wxT(
"Return" ), WXK_RETURN },
106 { wxT(
"Space" ), WXK_SPACE },
108 { wxT(
"Num Pad 0" ), WXK_NUMPAD0 },
109 { wxT(
"Num Pad 1" ), WXK_NUMPAD1 },
110 { wxT(
"Num Pad 2" ), WXK_NUMPAD2 },
111 { wxT(
"Num Pad 3" ), WXK_NUMPAD3 },
112 { wxT(
"Num Pad 4" ), WXK_NUMPAD4 },
113 { wxT(
"Num Pad 5" ), WXK_NUMPAD5 },
114 { wxT(
"Num Pad 6" ), WXK_NUMPAD6 },
115 { wxT(
"Num Pad 7" ), WXK_NUMPAD7 },
116 { wxT(
"Num Pad 8" ), WXK_NUMPAD8 },
117 { wxT(
"Num Pad 9" ), WXK_NUMPAD9 },
118 { wxT(
"Num Pad +" ), WXK_NUMPAD_ADD },
119 { wxT(
"Num Pad -" ), WXK_NUMPAD_SUBTRACT },
120 { wxT(
"Num Pad *" ), WXK_NUMPAD_MULTIPLY },
121 { wxT(
"Num Pad /" ), WXK_NUMPAD_DIVIDE },
122 { wxT(
"Num Pad ." ), WXK_NUMPAD_SEPARATOR },
123 { wxT(
"Num Pad Enter" ), WXK_NUMPAD_ENTER },
124 { wxT(
"Num Pad F1"), WXK_NUMPAD_F1 },
125 { wxT(
"Num Pad F2"), WXK_NUMPAD_F2 },
126 { wxT(
"Num Pad F3"), WXK_NUMPAD_F3 },
127 { wxT(
"Num Pad F4"), WXK_NUMPAD_F4 },
150#define MODIFIER_CTRL wxT( "Cmd+" )
151#define MODIFIER_ALT wxT( "Option+" )
153#define MODIFIER_CTRL wxT( "Ctrl+" )
154#define MODIFIER_ALT wxT( "Alt+" )
156#define MODIFIER_CMD_MAC wxT( "Cmd+" )
157#define MODIFIER_CTRL_BASE wxT( "Ctrl+" )
158#define MODIFIER_SHIFT wxT( "Shift+" )
159#define MODIFIER_META wxT( "Meta+" )
160#define MODIFIER_WIN wxT( "Win+" )
161#define MODIFIER_SUPER wxT( "Super+" )
162#define MODIFIER_ALTGR wxT( "AltGr+" )
167 wxString keyname, modifier, fullkeyname;
171 if( aKeycode == WXK_CONTROL )
173 else if( aKeycode == WXK_RAW_CONTROL )
175 else if( aKeycode == WXK_SHIFT )
177 else if( aKeycode == WXK_ALT )
179#ifdef WXK_WINDOWS_LEFT
180 else if( aKeycode == WXK_WINDOWS_LEFT || aKeycode == WXK_WINDOWS_RIGHT )
184 else if( aKeycode == WXK_META )
189 if( (aKeycode &
MD_CTRL) != 0 )
192 if( (aKeycode &
MD_ALT) != 0 )
198 if( (aKeycode &
MD_META) != 0 )
209 if( (aKeycode >
' ') && (aKeycode < 0x7F ) )
212 keyname.Append( (wxChar)aKeycode );
216 for( ii = 0; ; ii++ )
220 keyname = wxT(
"<unknown>" );
236 fullkeyname = modifier + keyname;
243 wxString msg = aText;
246 if( !keyname.IsEmpty() )
257 msg << wxT(
"\t" ) << keyname;
263 msg << wxT(
" (" ) << keyname << wxT(
")" );
285 wxString key = keyname;
338 if( !prefix.IsEmpty() )
339 key.Remove( 0, prefix.Len() );
342 if( (key.length() == 1) && (key[0] >
' ') && (key[0] < 0x7F) )
370 std::map<std::string, std::pair<int, int>>& aHotKeys )
372 wxString fileName = aFileName;
374 if( fileName.IsEmpty() )
376 wxFileName fn( wxS(
"user" ) );
379 fileName = fn.GetFullPath();
382 if( !wxFile::Exists( fileName ) )
385 wxFFile file( fileName,
"rb" );
387 if( !file.IsOpened() )
391 file.ReadAll( &input );
392 input.Replace(
"\r\n",
"\n" );
393 wxStringTokenizer fileTokenizer( input,
"\n", wxTOKEN_STRTOK );
395 while( fileTokenizer.HasMoreTokens() )
397 wxStringTokenizer lineTokenizer( fileTokenizer.GetNextToken(),
"\t" );
399 wxString cmdName = lineTokenizer.GetNextToken();
400 wxString primary = lineTokenizer.GetNextToken();
401 wxString secondary = lineTokenizer.GetNextToken();
403 if( !cmdName.IsEmpty() )
414 std::map<std::string, std::pair<int, int>>
hotkeys;
424 std::pair<int, int> keys =
hotkeys[action->GetName()];
425 action->SetHotKey( keys.first, keys.second );
433 std::map<std::string, std::pair<int, int>>
hotkeys;
434 wxFileName fn(
"user" );
444 hotkeys[ action->GetName() ] = std::pair<int, int>( action->GetHotKey(),
445 action->GetHotKeyAlt() );
448 wxFFileOutputStream outStream( fn.GetFullPath() );
449 wxTextOutputStream txtStream( outStream, wxEOL_UNIX );
451 for(
const std::pair<
const std::string, std::pair<int, int>>& entry :
hotkeys )
452 txtStream << entry.first
482 wxFileName fn( aFilename );
487 if( !wxFile::Exists( fn.GetFullPath() ) )
490 wxFFile cfgfile( fn.GetFullPath(),
"rb" );
492 if( !cfgfile.IsOpened() )
496 wxFileOffset size = cfgfile.Length();
499 std::vector<char> buffer( size );
500 cfgfile.Read( buffer.data(), size );
501 wxString data( buffer.data(), wxConvUTF8, size );
504 if( data.StartsWith( wxT(
"Keys="), &data ) )
505 data.Replace(
"\\n",
"\n",
true );
508 wxStringTokenizer tokenizer( data,
"\r\n", wxTOKEN_STRTOK );
510 while( tokenizer.HasMoreTokens() )
512 wxString line = tokenizer.GetNextToken();
513 wxStringTokenizer lineTokenizer( line,
" \t\r\n" );
515 wxString line_type = lineTokenizer.GetNextToken();
517 if( line_type[0] ==
'#' )
520 if( line_type[0] ==
'[' )
523 if( line_type == wxT(
"$Endlist" ) )
526 if( line_type != wxT(
"shortcut" ) )
530 lineTokenizer.SetString( lineTokenizer.GetString(),
L"\"\r\n\t ", wxTOKEN_STRTOK );
531 wxString keyname = lineTokenizer.GetNextToken();
533 wxString remainder = lineTokenizer.GetString();
536 wxString fctname = remainder.AfterFirst(
'\"' ).BeforeFirst(
'\"' );
A dialog that presents the user with a list of hotkeys and allows editing their 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.