-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix crash when KeyBindings change while they are being handled #5055
Merged
grokys
merged 8 commits into
AvaloniaUI:master
from
Fusion86:fix-keybindings-foreach-crash
Jun 14, 2021
Merged
Changes from 1 commit
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
3304d64
Fix crash when KeyBindings change while they are being handled
Fusion86 4b9f082
Merge branch 'master' into fix-keybindings-foreach-crash
grokys 6b94cc4
Added failing test for #5054.
grokys 4285c3d
Don't create a copy of the array unless necessary.
grokys d01a8af
Merge branch 'master' into fix-keybindings-foreach-crash
grokys a11270b
Add a sanity check to the test.
grokys 2812f33
Merge branch 'fix-keybindings-foreach-crash' of https://github.com/Fu…
grokys 2d10536
Merge branch 'master' into fix-keybindings-foreach-crash
maxkatz6 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, this is going to result in an array being copied for every keypress, which I suspect @MarchingCube will have something to say about ;)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if it would be possible to copy the array only when a matching key binding is found?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not sure if I fully understand what you are saying, but maybe this works?
This will create an array with all the KeyBindings which should be evaluated. If there are no bindings to be evaluated then the array will be empty, and nothing will happen.
A small issue with this is that the
x.Gesture?.Matches(ev)
is copied from insidebinding.TryHandle(ev)
and therefore this check will run twice. Once here and once inside theTryHandle
method. Changing this would 'break' the API (though no other code within AvaloniaUI seems to call this method).I also don't know if using LINQ is acceptable in this context.
E: Another issue with this solution is that it will run the
x.Gesture?.Matches(ev)
check on all bindings, even if the first binding that is to be executed changesev.Handled = true
. The old code didn't do this.I guess you could 'fix' that by using the below snippet, but I personally don't really like this approach.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah something like this should work. Using LINQ here isn't ideal as that itself will allocate but I've pushed a change which does that check manually to your branch, along with a unit test.
Really sorry it took so long to get back to this.