Key events are handled by wxEVT_CHAR instead of wxEVT_KEY_[UP|DOWN]. Fixed issue of chars that require modifiers (e.g. ? is Shift+/ on US keyboard layout).

This commit is contained in:
Maciej Suminski 2014-04-09 17:33:22 +02:00
parent 50b202fe99
commit 3f8d9da31f
9 changed files with 60 additions and 53 deletions

View File

@ -83,8 +83,7 @@ EDA_DRAW_PANEL_GAL::EDA_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWin
Connect( wxEVT_MIDDLE_DCLICK, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); Connect( wxEVT_MIDDLE_DCLICK, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_MOUSEWHEEL, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); Connect( wxEVT_MOUSEWHEEL, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_CHAR_HOOK, wxEventHandler( EDA_DRAW_PANEL_GAL::skipEvent ) ); Connect( wxEVT_CHAR_HOOK, wxEventHandler( EDA_DRAW_PANEL_GAL::skipEvent ) );
Connect( wxEVT_KEY_UP, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); Connect( wxEVT_CHAR, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_KEY_DOWN, wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );
Connect( wxEVT_ENTER_WINDOW, wxEventHandler( EDA_DRAW_PANEL_GAL::onEnter ), NULL, this ); Connect( wxEVT_ENTER_WINDOW, wxEventHandler( EDA_DRAW_PANEL_GAL::onEnter ), NULL, this );
Connect( KIGFX::WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE, Connect( KIGFX::WX_VIEW_CONTROLS::EVT_REFRESH_MOUSE,
wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this ); wxEventHandler( EDA_DRAW_PANEL_GAL::onEvent ), NULL, this );

View File

@ -115,10 +115,22 @@ void ACTION_MANAGER::RunAction( const TOOL_ACTION* aAction ) const
bool ACTION_MANAGER::RunHotKey( int aHotKey ) const bool ACTION_MANAGER::RunHotKey( int aHotKey ) const
{ {
HOTKEY_LIST::const_iterator it = m_actionHotKeys.find( aHotKey ); int key = std::toupper( aHotKey & ~MD_MODIFIER_MASK );
int mod = aHotKey & MD_MODIFIER_MASK;
HOTKEY_LIST::const_iterator it = m_actionHotKeys.find( key | mod );
// If no luck, try without modifier, to handle keys that require a modifier
// e.g. to get ? you need to press Shift+/ without US keyboard layout
// Hardcoding ? as Shift+/ is a bad idea, as on another layout you may need to press a
// different combination
if( it == m_actionHotKeys.end() ) if( it == m_actionHotKeys.end() )
return false; // no appropriate action found for the hotkey {
it = m_actionHotKeys.find( key );
if( it == m_actionHotKeys.end() )
return false; // no appropriate action found for the hotkey
}
const std::list<TOOL_ACTION*>& actions = it->second; const std::list<TOOL_ACTION*>& actions = it->second;

View File

@ -243,23 +243,26 @@ void TOOL_DISPATCHER::DispatchWxEvent( wxEvent& aEvent )
} }
// Keyboard handling // Keyboard handling
else if( type == wxEVT_KEY_UP || type == wxEVT_KEY_DOWN ) else if( type == wxEVT_CHAR )
{ {
wxKeyEvent* ke = static_cast<wxKeyEvent*>( &aEvent ); wxKeyEvent* ke = static_cast<wxKeyEvent*>( &aEvent );
int key = ke->GetKeyCode(); int key = ke->GetKeyCode();
int mods = decodeModifiers<wxKeyEvent>( ke ); int mods = decodeModifiers<wxKeyEvent>( ke );
if( type == wxEVT_KEY_UP ) if( mods & MD_CTRL )
{ {
evt = TOOL_EVENT( TC_KEYBOARD, TA_KEY_UP, key | mods ); // wxWidgets have a quirk related to Ctrl+letter hot keys handled by CHAR_EVT
// http://docs.wxwidgets.org/trunk/classwx_key_event.html:
// "char events for ASCII letters in this case carry codes corresponding to the ASCII
// value of Ctrl-Latter, i.e. 1 for Ctrl-A, 2 for Ctrl-B and so on until 26 for Ctrl-Z."
if( key >= WXK_CONTROL_A && key <= WXK_CONTROL_Z )
key += 'A' - 1;
} }
if( key == WXK_ESCAPE ) // ESC is the special key for cancelling tools
evt = TOOL_EVENT( TC_COMMAND, TA_CANCEL_TOOL );
else else
{ evt = TOOL_EVENT( TC_KEYBOARD, TA_KEY_PRESSED, key | mods );
if( key == WXK_ESCAPE ) // ESC is the special key for cancelling tools
evt = TOOL_EVENT( TC_COMMAND, TA_CANCEL_TOOL );
else
evt = TOOL_EVENT( TC_KEYBOARD, TA_KEY_DOWN, key | mods );
}
} }
if( evt ) if( evt )

View File

@ -81,8 +81,7 @@ const std::string TOOL_EVENT::Format() const
{ TA_MOUSE_DRAG, "drag" }, { TA_MOUSE_DRAG, "drag" },
{ TA_MOUSE_MOTION, "motion" }, { TA_MOUSE_MOTION, "motion" },
{ TA_MOUSE_WHEEL, "wheel" }, { TA_MOUSE_WHEEL, "wheel" },
{ TA_KEY_UP, "key-up" }, { TA_KEY_PRESSED, "key-pressed" },
{ TA_KEY_DOWN, "key-down" },
{ TA_VIEW_REFRESH, "view-refresh" }, { TA_VIEW_REFRESH, "view-refresh" },
{ TA_VIEW_ZOOM, "view-zoom" }, { TA_VIEW_ZOOM, "view-zoom" },
{ TA_VIEW_PAN, "view-pan" }, { TA_VIEW_PAN, "view-pan" },

View File

@ -417,7 +417,7 @@ void TOOL_MANAGER::dispatchInternal( TOOL_EVENT& aEvent )
bool TOOL_MANAGER::dispatchStandardEvents( TOOL_EVENT& aEvent ) bool TOOL_MANAGER::dispatchStandardEvents( TOOL_EVENT& aEvent )
{ {
if( aEvent.Action() == TA_KEY_UP ) if( aEvent.Action() == TA_KEY_PRESSED )
{ {
// Check if there is a hotkey associated // Check if there is a hotkey associated
if( m_actionMgr->RunHotKey( aEvent.Modifier() | aEvent.KeyCode() ) ) if( m_actionMgr->RunHotKey( aEvent.Modifier() | aEvent.KeyCode() ) )

View File

@ -64,36 +64,35 @@ enum TOOL_ACTIONS
TA_MOUSE_WHEEL = 0x0040, TA_MOUSE_WHEEL = 0x0040,
TA_MOUSE = 0x007f, TA_MOUSE = 0x007f,
TA_KEY_UP = 0x0080, TA_KEY_PRESSED = 0x0080,
TA_KEY_DOWN = 0x0100, TA_KEYBOARD = TA_KEY_PRESSED,
TA_KEYBOARD = TA_KEY_UP | TA_KEY_DOWN,
// View related events // View related events
TA_VIEW_REFRESH = 0x0200, TA_VIEW_REFRESH = 0x0100,
TA_VIEW_ZOOM = 0x0400, TA_VIEW_ZOOM = 0x0200,
TA_VIEW_PAN = 0x0800, TA_VIEW_PAN = 0x0400,
TA_VIEW_DIRTY = 0x1000, TA_VIEW_DIRTY = 0x0800,
TA_VIEW = 0x1e00, TA_VIEW = 0x0f00,
TA_CHANGE_LAYER = 0x2000, TA_CHANGE_LAYER = 0x1000,
// Tool cancel event. Issued automagically when the user hits escape or selects End Tool from // Tool cancel event. Issued automagically when the user hits escape or selects End Tool from
// the context menu. // the context menu.
TA_CANCEL_TOOL = 0x4000, TA_CANCEL_TOOL = 0x2000,
// Context menu update. Issued whenever context menu is open and the user hovers the mouse // Context menu update. Issued whenever context menu is open and the user hovers the mouse
// over one of choices. Used in dynamic highligting in disambiguation menu // over one of choices. Used in dynamic highligting in disambiguation menu
TA_CONTEXT_MENU_UPDATE = 0x8000, TA_CONTEXT_MENU_UPDATE = 0x4000,
// Context menu choice. Sent if the user picked something from the context menu or // Context menu choice. Sent if the user picked something from the context menu or
// closed it without selecting anything. // closed it without selecting anything.
TA_CONTEXT_MENU_CHOICE = 0x10000, TA_CONTEXT_MENU_CHOICE = 0x8000,
// This event is sent *before* undo/redo command is performed. // This event is sent *before* undo/redo command is performed.
TA_UNDO_REDO = 0x20000, TA_UNDO_REDO = 0x10000,
// Tool action (allows to control tools) // Tool action (allows to control tools)
TA_ACTION = 0x40000, TA_ACTION = 0x20000,
TA_ANY = 0xffffffff TA_ANY = 0xffffffff
}; };
@ -277,14 +276,9 @@ public:
return m_keyCode; return m_keyCode;
} }
bool IsKeyUp() const bool IsKeyPressed() const
{ {
return m_actions == TA_KEY_UP; return m_actions == TA_KEY_PRESSED;
}
bool IsKeyDown() const
{
return m_actions == TA_KEY_DOWN;
} }
void SetMouseDragOrigin( const VECTOR2D& aP ) void SetMouseDragOrigin( const VECTOR2D& aP )

View File

@ -45,11 +45,11 @@
using namespace KIGFX; using namespace KIGFX;
using boost::optional; using boost::optional;
static TOOL_ACTION ACT_AutoEndRoute( "pcbnew.InteractiveRouter.AutoEndRoute", AS_CONTEXT, 'G' ); //static TOOL_ACTION ACT_AutoEndRoute( "pcbnew.InteractiveRouter.AutoEndRoute", AS_CONTEXT, 'G' );
static TOOL_ACTION ACT_PlaceVia( "pcbnew.InteractiveRouter.PlaceVia", AS_CONTEXT, 'V' ); //static TOOL_ACTION ACT_PlaceVia( "pcbnew.InteractiveRouter.PlaceVia", AS_CONTEXT, 'V' );
static TOOL_ACTION ACT_OpenRouteOptions( "pcbnew.InteractiveRouter.OpenRouterOptions", AS_CONTEXT, 'T' ); //static TOOL_ACTION ACT_OpenRouteOptions( "pcbnew.InteractiveRouter.OpenRouterOptions", AS_CONTEXT, 'T' );
static TOOL_ACTION ACT_SwitchPosture( "pcbnew.InteractiveRouter.SwitchPosture", AS_CONTEXT, '/' ); //static TOOL_ACTION ACT_SwitchPosture( "pcbnew.InteractiveRouter.SwitchPosture", AS_CONTEXT, '/' );
static TOOL_ACTION ACT_EndTrack( "pcbnew.InteractiveRouter.EndTrack", AS_CONTEXT, WXK_END ); //static TOOL_ACTION ACT_EndTrack( "pcbnew.InteractiveRouter.EndTrack", AS_CONTEXT, WXK_END );
ROUTER_TOOL::ROUTER_TOOL() : ROUTER_TOOL::ROUTER_TOOL() :
TOOL_INTERACTIVE( "pcbnew.InteractiveRouter" ) TOOL_INTERACTIVE( "pcbnew.InteractiveRouter" )
@ -367,9 +367,9 @@ void ROUTER_TOOL::startRouting()
m_router->Move( m_endSnapPoint, m_endItem ); m_router->Move( m_endSnapPoint, m_endItem );
} }
else if( evt->IsKeyUp() ) else if( evt->IsKeyPressed() )
{ {
switch( evt->KeyCode() ) switch( std::toupper( evt->KeyCode() ) )
{ {
case 'V': case 'V':
{ {

View File

@ -148,11 +148,11 @@ TOOL_ACTION COMMON_ACTIONS::highContrastMode( "pcbnew.highContrastMode",
"", "" ); "", "" );
TOOL_ACTION COMMON_ACTIONS::highContrastInc( "pcbnew.highContrastInc", TOOL_ACTION COMMON_ACTIONS::highContrastInc( "pcbnew.highContrastInc",
AS_GLOBAL, MD_SHIFT + '.', // shift+. == > AS_GLOBAL, '>',
"", "" ); "", "" );
TOOL_ACTION COMMON_ACTIONS::highContrastDec( "pcbnew.highContrastDec", TOOL_ACTION COMMON_ACTIONS::highContrastDec( "pcbnew.highContrastDec",
AS_GLOBAL, MD_SHIFT + 60, // shift+, == < AS_GLOBAL, '<',
"", "" ); "", "" );
@ -198,11 +198,11 @@ TOOL_ACTION COMMON_ACTIONS::layerPrev( "pcbnew.layerPrev",
"", "" ); "", "" );
TOOL_ACTION COMMON_ACTIONS::layerAlphaInc( "pcbnew.layerAlphaInc", TOOL_ACTION COMMON_ACTIONS::layerAlphaInc( "pcbnew.layerAlphaInc",
AS_GLOBAL, MD_SHIFT + ']', // shift+] == } AS_GLOBAL, '}',
"", "" ); "", "" );
TOOL_ACTION COMMON_ACTIONS::layerAlphaDec( "pcbnew.layerAlphaDec", TOOL_ACTION COMMON_ACTIONS::layerAlphaDec( "pcbnew.layerAlphaDec",
AS_GLOBAL, MD_SHIFT + '[', // shift+[ == { AS_GLOBAL, '{',
"", "" ); "", "" );
@ -252,7 +252,7 @@ TOOL_ACTION COMMON_ACTIONS::switchUnits( "pcbnew.switchUnits",
"", "" ); "", "" );
TOOL_ACTION COMMON_ACTIONS::showHelp( "pcbnew.showHelp", TOOL_ACTION COMMON_ACTIONS::showHelp( "pcbnew.showHelp",
AS_GLOBAL, MD_SHIFT + '/', // shift+/ == ? AS_GLOBAL, '?',
"", "" ); "", "" );

View File

@ -135,7 +135,7 @@ int DRAWING_TOOL::DrawArc( TOOL_EVENT& aEvent )
break; break;
} }
else if( evt->IsKeyUp() && step != SET_ORIGIN ) else if( evt->IsKeyPressed() && step != SET_ORIGIN )
{ {
int width = arc->GetWidth(); int width = arc->GetWidth();
@ -427,7 +427,7 @@ int DRAWING_TOOL::DrawDimension( TOOL_EVENT& aEvent )
break; break;
} }
else if( evt->IsKeyUp() && step != SET_ORIGIN ) else if( evt->IsKeyPressed() && step != SET_ORIGIN )
{ {
width = dimension->GetWidth(); width = dimension->GetWidth();
@ -603,7 +603,7 @@ int DRAWING_TOOL::PlaceTarget( TOOL_EVENT& aEvent )
if( evt->IsCancel() ) if( evt->IsCancel() )
break; break;
else if( evt->IsKeyUp() ) else if( evt->IsKeyPressed() )
{ {
int width = target->GetWidth(); int width = target->GetWidth();
@ -822,7 +822,7 @@ int DRAWING_TOOL::drawSegment( int aShape, bool aContinous )
m_controls->SetAutoPan( false ); m_controls->SetAutoPan( false );
} }
else if( graphic && evt->IsKeyUp() ) else if( graphic && evt->IsKeyPressed() )
{ {
int width = graphic->GetWidth(); int width = graphic->GetWidth();