Add keystroke for menu item only when action is equal to binding

Antonio Scandurra created

This fixes a bug where we would show `cmd-e` instead of `cmd-f` for
`Edit -> Find` because both bindings would have the `buffer_search::Deploy`
action and we were mistakenly selecting the former.

Change summary

crates/gpui/src/keymap.rs                | 6 +++++-
crates/gpui/src/platform/mac/platform.rs | 2 +-
2 files changed, 6 insertions(+), 2 deletions(-)

Detailed changes

crates/gpui/src/keymap.rs 🔗

@@ -176,7 +176,7 @@ impl Matcher {
         cx: &Context,
     ) -> Option<SmallVec<[Keystroke; 2]>> {
         for binding in self.keymap.bindings.iter().rev() {
-            if binding.action.id() == action.id()
+            if binding.action.eq(action)
                 && binding
                     .context_predicate
                     .as_ref()
@@ -265,6 +265,10 @@ impl Binding {
     pub fn keystrokes(&self) -> &[Keystroke] {
         &self.keystrokes
     }
+
+    pub fn action(&self) -> &dyn Action {
+        self.action.as_ref()
+    }
 }
 
 impl Keystroke {

crates/gpui/src/platform/mac/platform.rs 🔗

@@ -154,7 +154,7 @@ impl MacForegroundPlatform {
                         let mut keystroke = None;
                         if let Some(binding) = keystroke_matcher
                             .bindings_for_action_type(action.as_any().type_id())
-                            .next()
+                            .find(|binding| binding.action().eq(action.as_ref()))
                         {
                             if binding.keystrokes().len() == 1 {
                                 keystroke = binding.keystrokes().first()