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 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.