Hi Ian,

Some work I did to make sure wxEVT_CHAR_HOOK events get skipped should help 
allow the removal of the older hack.  I think we should at least try it out.

Note that we’ve now added ctrl+W to ctrl+Q, but those are probably the only two 
that need special-case processing.

Cheers,
Jeff.


> On 2 Aug 2019, at 14:01, Ian McInerney <[email protected]> wrote:
> 
> Ok, from the sound of it the accelerator keys will be the blocking issue for 
> solving the shifted key problem. The discussion from this report 
> (https://bugs.launchpad.net/kicad/+bug/1809929 
> <https://bugs.launchpad.net/kicad/+bug/1809929>) should probably be revisited 
> then since a lot of work has been done to the hotkey system since then.
> 
> Looking at how things currently are implemented, the only accelerator table 
> entries in the code base are for the ctrl+Q quiting of the program. The keys 
> shown in the menu items are simply the hotkeys assigned to the actions and 
> there are no actual accelerators associated with them, so there should be no 
> hijacking of the key events between the char hook and char events currently.
> 
> PS: GTK also has the accelerator key acting before the char event, so I think 
> that is for every platform.
> 
> -Ian
> 
> 
> 
> On Wed, Jul 31, 2019 at 4:27 PM jp charras <[email protected] 
> <mailto:[email protected]>> wrote:
> Le 31/07/2019 à 15:22, Wayne Stambaugh a écrit :
> > Hey Ian,
> > 
> > If I remember correctly, the windows platform grabs the wxEVT_CHAR_HOOK
> > events to implement menu accelerators which get priority over the
> > translated wxEVT_CHAR events and breaks our hotkey implementation when
> > there is a conflict.  JP can probably shed some more light on this.  I
> > suspect we could find a better solution where we use the "standard"
> > wxWidgets menu accelerator paradigm and factor out our hotkey
> > implementation but it would most likely be a very painful transition.
> > 
> > Cheers,
> > 
> > Wayne
> 
> I confirm on Windows, if a menu accelerator captures a wxEVT_CHAR_HOOK,
> the corresponding wxEVT_CHAR is not generated.
> 
> > 
> > On 7/31/19 5:50 AM, Ian McInerney wrote:
> >> I was just doing some digging into the processing of the shifted key
> >> codes because there was another bug filed about them
> >> (https://bugs.launchpad.net/kicad/+bug/1838420 
> >> <https://bugs.launchpad.net/kicad/+bug/1838420>), and there seems to be
> >> another problem with their processing.
> >>
> >> Inside RunHotkey there are 2 searches performed for hotkeys, the first
> >> for the actual key combination given and the second (if nothing is found
> >> in the first) with the shift modifier removed. This is posing a problem
> >> with the untranslated shifted key codes in the wxEVT_CHAR_HOOK, since if
> >> there is any hotkey on the non-shifted key then it will be run and the
> >> event is stopped processing and the corresponding wxEVT_CHAR is never
> >> generated.
> >>
> >> For instance, when I set the hotkey for switch track posture to be *
> >> (which on my keyboad is Shift+8) and also have tune differential pair
> >> length on hotkey 8 then the wxEVT_CHAR_HOOK event runs the tune action
> >> and stops the event processing, see the below trace:
> >>
> >> 11:32:28 AM: Trace: (KICAD_KEY_EVENTS) EDA_BASE_FRAME::OnCharHook  
> >>  Hook           SHIFT   306   --S-    0 (U+0000)    65505    0x00000032
> >>  (  298,  171)
> >> 11:32:28 AM: Trace: (KICAD_KEY_EVENTS) TOOL_DISPATCHER::DispatchWxEvent
> >>    Hook             '8'    56   --S-   56 (U+0038)       42  
> >>  0x00000011  (  298,  171)
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_DISPATCHER::DispatchWxEvent
> >> category: keyboard  action: key-pressed key: 56 mods: shift
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> category: keyboard  action: key-pressed key: 56 mods: shift
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) ACTION_MANAGER::RunHotKey Key:
> >> Shift+8
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) ACTION_MANAGER::RunHotKey No
> >> actions found, searching with key: 8
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) ACTION_MANAGER::RunHotKey Running
> >> action: pcbnew.LengthTuner.TuneDiffPair for hotkey Shift+8
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> category: command  action: activate cmd-str: 
> >> pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> category: command  action: activate cmd-str: 
> >> pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> Waking tool pcbnew.InteractiveRouter for event: category: command
> >>  action: activate cmd-str: pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> Waking tool pcbnew.InteractiveSelection for event: category: command
> >>  action: activate cmd-str: pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> Running tool pcbnew.LengthTuner for event: category: command  action:
> >> activate cmd-str: pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> category: command  action: action cmd-str: 
> >> pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> category: command  action: action cmd-str: 
> >> pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> Waking tool pcbnew.InteractiveSelection for event: category: command
> >>  action: action cmd-str: pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> Running tool pcbnew.InteractiveSelection for event: category: command
> >>  action: action cmd-str: pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> handled: true  category: command  action: action cmd-str:
> >> pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchActivation
> >> category: command  action: action cmd-str: 
> >> pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> handled: true  category: command  action: action cmd-str:
> >> pcbnew.InteractiveSelection.Clear
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> category: command  action: activate cmd-str: pcbnew.LengthTuner
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> category: command  action: activate cmd-str: pcbnew.LengthTuner
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> Waking tool pcbnew.InteractiveSelection for event: category: command
> >>  action: activate cmd-str: pcbnew.LengthTuner
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> handled: false  category: command  action: activate cmd-str:
> >> pcbnew.LengthTuner
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchActivation
> >> category: command  action: activate cmd-str: pcbnew.LengthTuner
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchActivation
> >> Running tool pcbnew.LengthTuner for event: category: command  action:
> >> activate cmd-str: pcbnew.LengthTuner
> >> 11:32:28 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> handled: true  category: command  action: activate cmd-str:
> >> pcbnew.LengthTuner
> >> 11:32:29 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchInternal
> >> handled: true  category: command  action: activate cmd-str:
> >> pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:29 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::dispatchActivation
> >> category: command  action: activate cmd-str: 
> >> pcbnew.LengthTuner.TuneDiffPair
> >> 11:32:29 AM: Trace: (KICAD_TOOL_STACK) TOOL_MANAGER::processEvent
> >> handled: true  category: command  action: activate cmd-str:
> >> pcbnew.LengthTuner.TuneDiffPair
> >>
> >>
> >> From the comment about the second search step (action_manager.cpp:101),
> >> it sounds like this was added because of the shifted key problem. This
> >> doesn't seem like a good solution to the problem though, because it
> >> causes more issues with other keys as well (for instance, if nothing is
> >> assigned to shift+A, then it just runs the hotkey for A instead).
> >>
> >> Is there a reason not to just skip all keyboard events with the shift
> >> modifier that happen in a wxEVT_CHAR_HOOK event? That way they will
> >> continue processing and generate the wxEVT_CHAR, and we don't have to
> >> have every tool skipping the keyboard events (which I am also seeing
> >> some issues with in the routing tool). I think that would also mean the
> >> second hotkey search step could be removed, fixing the issues it is
> >> creating.
> >>
> >> I have been doing all of this testing on GTK, so I am not familar with
> >> any of the Windows/Mac processing that it does, so is any of this key
> >> translation also platform specific?
> >>
> >> -Ian
> >>
> >> On Sun, Jul 28, 2019 at 2:27 PM jp charras <[email protected] 
> >> <mailto:[email protected]>
> >> <mailto:[email protected] <mailto:[email protected]>>> wrote:
> >>
> >>     Le 28/07/2019 à 02:22, Jeff Young a écrit :
> >>     > I think JP ran into this earlier, so he might know more about it.
> >>
> >>     In fact issue I h=worked on was the fact the Char events where no
> >>     correctly skipped.
> >>
> >>     If I correctly understand the issue related by this mail, this is a
> >>     dispatch issue.
> >>
> >>     I am thinking I already saw this issue.
> >>     The key event dispatch incorrectly try to dispatch the key events:
> >>     For me it try to find an action that matches the corresponding hotkey 
> >> in
> >>     its lists, regardless the fact the action is attached to the active
> >>     frame (the frame having the focus) or not.
> >>     If this is true, this dispatch behavior is really not correct:
> >>     Only actions depending on the active frame must be taken in account.
> >>     This is what the wxWidgets menu accelerators work.
> >>
> >>
> >>     Now, about wxEVT_CHAR_HOOK and wxEVT_CHAR events (and related hotkeys):
> >>     Among differences between these events, there is one major diff:
> >>     wxEVT_CHAR_HOOK identify the keyboard key (i.e. the not shifted key
> >>     code).
> >>     wxEVT_CHAR identify the key code (depending on the fact the shift key 
> >> is
> >>     pressed or not).
> >>     They are very different for keys that have 2 very different key codes.
> >>
> >>     I explain:
> >>
> >>     On a French keyboard, all "digit" keys have 2 key code (like in many
> >>     other keyboards), but digit keys are shifted.
> >>     For instance the '3' key is also the '"' key.
> >>     In other words '3' and '3' use the same key ( I will call it 3")
> >>     '3' needs to type SHIFT + 3" key
> >>     '"' needs to type the 3" key
> >>
> >>     Now what about wxEVT_CHAR_HOOK:
> >>     wxEVT_CHAR_HOOK returns the key '"' with the modifier Shift.
> >>     wxEVT_CHAR returns the key '3' with the modifier Shift.
> >>
> >>     As a result: to show the 3D viewer in PCBNEW:
> >>     - on an English keyboard you use Alt+3
> >>     - on an French keyboard you use Alt+"
> >>
> >>     And I am not sure this is a bug in wxWidgets:
> >>     some other applications have this annoying behavior, for instance
> >>     Firefox and its zoom commands (but I used also a few other apps showing
> >>     this behavior).
> >>
> >>     >
> >>     > Another issue might be that at the end of the tool loop the event
> >>     will get skipped which will send it to wxWidgets for processing (at
> >>     which point it will probably come back as a hotkey again).  We might
> >>     already have logic to deal with that, but it’s something to look out
> >>     for.
> >>     >
> >>     > At the end of the day, though, we need to design around what is
> >>     “right”.  If what’s right breaks other stuff then we need to fix the
> >>     other stuff.
> >>     >
> >>     > Cheers,
> >>     > Jeff.
> >>     >
> >>     >> On 27 Jul 2019, at 17:48, Ian McInerney <[email protected] 
> >> <mailto:[email protected]>
> >>     <mailto:[email protected] <mailto:[email protected]>>> 
> >> wrote:
> >>     >>
> >>     >> In the tool dispatcher currently, if any action is associated
> >>     with a key combination (even if the action is not handled by any
> >>     active tools) then a key event with that combination will not
> >>     progress further than the dispatchHotKey function in the dispatcher.
> >>     For instance, this means that the letter 'B' will not make it into
> >>     any of the dispatchInternal calls inside any program (e.g. eeschema,
> >>     pleditor, cvpcb, etc.) because it is assigned to a pcbnew action to
> >>     refill the zones, even when those other programs do not use that
> >>     action at all so it goes unhandled in the dispatchHotkey function.
> >>     That event therefore is inaccessible in any tool loops that may be
> >>     running.
> >>     >>
> >>     >> Is there a reason the dispatchHotkey logic looks only at the fact
> >>     an action with that hotkey exists rather than if any tool has
> >>     handled the associated action? For my work in cvpcb it would be
> >>     better if it were the latter, so that any key events not handled by
> >>     the tools continue processing (e.g. for down/up/left/right keys,
> >>     single letter keys, etc.). It should be possible to know if the
> >>     action is handled by the hotkey handler, since they actions are
> >>     spawned immediately and the handled return value is then available.
> >>     >>
> >>     >> Would a change to this system break any of the existing tool
> >>     loops? e.g., are any unable to cope with receiving key pressed
> >>     events (I don't think any would be problematic, since some keys such
> >>     as 'C' don't have an associated action and would therefore generate
> >>     key pressed events in them)?
> >>     >>
> >>     >> -Ian
> >>     >> _______________________________________________
> >>     >> Mailing list: https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >>     >> Post to     : [email protected] 
> >> <mailto:[email protected]>
> >>     <mailto:[email protected] 
> >> <mailto:[email protected]>>
> >>     >> Unsubscribe : https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >>     >> More help   : https://help.launchpad.net/ListHelp 
> >> <https://help.launchpad.net/ListHelp>
> >>     >
> >>     >
> >>     > _______________________________________________
> >>     > Mailing list: https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >>     > Post to     : [email protected] 
> >> <mailto:[email protected]>
> >>     <mailto:[email protected] 
> >> <mailto:[email protected]>>
> >>     > Unsubscribe : https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >>     > More help   : https://help.launchpad.net/ListHelp 
> >> <https://help.launchpad.net/ListHelp>
> >>     >
> >>
> >>
> >>     -- 
> >>     Jean-Pierre CHARRAS
> >>
> >>     _______________________________________________
> >>     Mailing list: https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >>     Post to     : [email protected] 
> >> <mailto:[email protected]>
> >>     <mailto:[email protected] 
> >> <mailto:[email protected]>>
> >>     Unsubscribe : https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >>     More help   : https://help.launchpad.net/ListHelp 
> >> <https://help.launchpad.net/ListHelp>
> >>
> >>
> >> _______________________________________________
> >> Mailing list: https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >> Post to     : [email protected] 
> >> <mailto:[email protected]>
> >> Unsubscribe : https://launchpad.net/~kicad-developers 
> >> <https://launchpad.net/~kicad-developers>
> >> More help   : https://help.launchpad.net/ListHelp 
> >> <https://help.launchpad.net/ListHelp>
> >>
> > 
> > _______________________________________________
> > Mailing list: https://launchpad.net/~kicad-developers 
> > <https://launchpad.net/~kicad-developers>
> > Post to     : [email protected] 
> > <mailto:[email protected]>
> > Unsubscribe : https://launchpad.net/~kicad-developers 
> > <https://launchpad.net/~kicad-developers>
> > More help   : https://help.launchpad.net/ListHelp 
> > <https://help.launchpad.net/ListHelp>
> > 
> 
> 
> -- 
> Jean-Pierre CHARRAS
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers 
> <https://launchpad.net/~kicad-developers>
> Post to     : [email protected] 
> <mailto:[email protected]>
> Unsubscribe : https://launchpad.net/~kicad-developers 
> <https://launchpad.net/~kicad-developers>
> More help   : https://help.launchpad.net/ListHelp 
> <https://help.launchpad.net/ListHelp>
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : [email protected]
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp

_______________________________________________
Mailing list: https://launchpad.net/~kicad-developers
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~kicad-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to