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>
63#define KEY_NON_FOUND -1
66 { wxT(
"F1" ), WXK_F1 },
67 { wxT(
"F2" ), WXK_F2 },
68 { wxT(
"F3" ), WXK_F3 },
69 { wxT(
"F4" ), WXK_F4 },
70 { wxT(
"F5" ), WXK_F5 },
71 { wxT(
"F6" ), WXK_F6 },
72 { wxT(
"F7" ), WXK_F7 },
73 { wxT(
"F8" ), WXK_F8 },
74 { wxT(
"F9" ), WXK_F9 },
75 { wxT(
"F10" ), WXK_F10 },
76 { wxT(
"F11" ), WXK_F11 },
77 { wxT(
"F12" ), WXK_F12 },
78 { wxT(
"F13" ), WXK_F13 },
79 { wxT(
"F14" ), WXK_F14 },
80 { wxT(
"F15" ), WXK_F15 },
81 { wxT(
"F16" ), WXK_F16 },
82 { wxT(
"F17" ), WXK_F17 },
83 { wxT(
"F18" ), WXK_F18 },
84 { wxT(
"F19" ), WXK_F19 },
85 { wxT(
"F20" ), WXK_F20 },
86 { wxT(
"F21" ), WXK_F21 },
87 { wxT(
"F22" ), WXK_F22 },
88 { wxT(
"F23" ), WXK_F23 },
89 { wxT(
"F24" ), WXK_F24 },
91 { wxT(
"Esc" ), WXK_ESCAPE },
92 { wxT(
"Del" ), WXK_DELETE },
93 { wxT(
"Tab" ), WXK_TAB },
94 { wxT(
"Back" ), WXK_BACK },
95 { wxT(
"Ins" ), WXK_INSERT },
97 { wxT(
"Home" ), WXK_HOME },
98 { wxT(
"End" ), WXK_END },
99 { wxT(
"PgUp" ), WXK_PAGEUP },
100 { wxT(
"PgDn" ), WXK_PAGEDOWN },
102 { wxT(
"Up" ), WXK_UP },
103 { wxT(
"Down" ), WXK_DOWN },
104 { wxT(
"Left" ), WXK_LEFT },
105 { wxT(
"Right" ), WXK_RIGHT },
107 { wxT(
"Return" ), WXK_RETURN },
109 { wxT(
"Space" ), WXK_SPACE },
111 { wxT(
"Num Pad 0" ), WXK_NUMPAD0 },
112 { wxT(
"Num Pad 1" ), WXK_NUMPAD1 },
113 { wxT(
"Num Pad 2" ), WXK_NUMPAD2 },
114 { wxT(
"Num Pad 3" ), WXK_NUMPAD3 },
115 { wxT(
"Num Pad 4" ), WXK_NUMPAD4 },
116 { wxT(
"Num Pad 5" ), WXK_NUMPAD5 },
117 { wxT(
"Num Pad 6" ), WXK_NUMPAD6 },
118 { wxT(
"Num Pad 7" ), WXK_NUMPAD7 },
119 { wxT(
"Num Pad 8" ), WXK_NUMPAD8 },
120 { wxT(
"Num Pad 9" ), WXK_NUMPAD9 },
121 { wxT(
"Num Pad +" ), WXK_NUMPAD_ADD },
122 { wxT(
"Num Pad -" ), WXK_NUMPAD_SUBTRACT },
123 { wxT(
"Num Pad *" ), WXK_NUMPAD_MULTIPLY },
124 { wxT(
"Num Pad /" ), WXK_NUMPAD_DIVIDE },
125 { wxT(
"Num Pad ." ), WXK_NUMPAD_SEPARATOR },
126 { wxT(
"Num Pad F1"), WXK_NUMPAD_F1 },
127 { wxT(
"Num Pad F2"), WXK_NUMPAD_F2 },
128 { wxT(
"Num Pad F3"), WXK_NUMPAD_F3 },
129 { wxT(
"Num Pad F4"), WXK_NUMPAD_F4 },
152#define MODIFIER_CTRL wxT( "Cmd+" )
153#define MODIFIER_ALT wxT( "Option+" )
155#define MODIFIER_CTRL wxT( "Ctrl+" )
156#define MODIFIER_ALT wxT( "Alt+" )
158#define MODIFIER_CMD_MAC wxT( "Cmd+" )
159#define MODIFIER_CTRL_BASE wxT( "Ctrl+" )
160#define MODIFIER_SHIFT wxT( "Shift+" )
174 wxString keyname, modifier, fullkeyname;
178 if( aKeycode == WXK_CONTROL )
180 else if( aKeycode == WXK_RAW_CONTROL )
182 else if( aKeycode == WXK_SHIFT )
184 else if( aKeycode == WXK_ALT )
188 if( (aKeycode &
MD_CTRL) != 0 )
191 if( (aKeycode &
MD_ALT) != 0 )
199 if( (aKeycode >
' ') && (aKeycode < 0x7F ) )
202 keyname.Append( (wxChar)aKeycode );
206 for( ii = 0; ; ii++ )
210 keyname = wxT(
"<unknown>" );
226 fullkeyname = modifier + keyname;
239 wxString msg = aText;
242 if( !keyname.IsEmpty() )
253 msg << wxT(
"\t" ) << keyname;
259 msg << wxT(
" (" ) << keyname << wxT(
")" );
284 wxString key = keyname;
317 if( !prefix.IsEmpty() )
318 key.Remove( 0, prefix.Len() );
321 if( (key.length() == 1) && (key[0] >
' ') && (key[0] < 0x7F) )
353 wxString fileName = aFileName;
355 if( fileName.IsEmpty() )
357 wxFileName fn( wxS(
"user" ) );
360 fileName = fn.GetFullPath();
363 if( !wxFile::Exists( fileName ) )
366 wxFFile file( fileName,
"rb" );
368 if( !file.IsOpened() )
372 file.ReadAll( &input );
373 input.Replace(
"\r\n",
"\n" );
374 wxStringTokenizer fileTokenizer( input, wxS(
"\n" ), wxTOKEN_STRTOK );
376 while( fileTokenizer.HasMoreTokens() )
378 wxStringTokenizer lineTokenizer( fileTokenizer.GetNextToken(), wxS(
"\t" ) );
380 wxString cmdName = lineTokenizer.GetNextToken();
381 wxString keyName = lineTokenizer.GetNextToken();
383 if( !cmdName.IsEmpty() )
391 std::map<std::string, int>
hotkeys;
399 action->SetHotKey(
hotkeys[action->GetName()] );
405 std::map<std::string, int>
hotkeys;
406 wxFileName fn(
"user" );
416 hotkeys[ action->GetName() ] = action->GetHotKey();
419 wxFFileOutputStream outStream( fn.GetFullPath() );
420 wxTextOutputStream txtStream( outStream, wxEOL_UNIX );
422 for(
const std::pair<const std::string, int>& entry :
hotkeys )
451 wxFileName fn( aFilename );
456 if( !wxFile::Exists( fn.GetFullPath() ) )
459 wxFFile cfgfile( fn.GetFullPath(),
"rb" );
461 if( !cfgfile.IsOpened() )
465 wxFileOffset size = cfgfile.Length();
468 std::vector<char> buffer( size );
469 cfgfile.Read( buffer.data(), size );
470 wxString data( buffer.data(), wxConvUTF8, size );
473 if( data.StartsWith( wxT(
"Keys="), &data ) )
474 data.Replace(
"\\n",
"\n",
true );
477 wxStringTokenizer tokenizer( data, L
"\r\n", wxTOKEN_STRTOK );
479 while( tokenizer.HasMoreTokens() )
481 wxString line = tokenizer.GetNextToken();
482 wxStringTokenizer lineTokenizer( line );
484 wxString line_type = lineTokenizer.GetNextToken();
486 if( line_type[0] ==
'#' )
489 if( line_type[0] ==
'[' )
492 if( line_type == wxT(
"$Endlist" ) )
495 if( line_type != wxT(
"shortcut" ) )
499 lineTokenizer.SetString( lineTokenizer.GetString(), L
"\"\r\n\t ", wxTOKEN_STRTOK );
500 wxString keyname = lineTokenizer.GetNextToken();
502 wxString remainder = lineTokenizer.GetString();
505 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
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 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.
void ReadHotKeyConfig(const wxString &aFileName, std::map< std::string, int > &aHotKeys)
Reads a hotkey config file into a 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)
Reads 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.