macos: Fix menu bar flickering (#37707)

张小白 created

Closes #37526

Release Notes:

- Fixed menu bar flickering when using some IMEs on macOS.

Change summary

crates/zed/src/zed.rs | 34 +++++++++++++++++++++++++---------
1 file changed, 25 insertions(+), 9 deletions(-)

Detailed changes

crates/zed/src/zed.rs 🔗

@@ -1317,15 +1317,31 @@ pub fn handle_keymap_file_changes(
     })
     .detach();
 
-    let mut current_layout_id = cx.keyboard_layout().id().to_string();
-    cx.on_keyboard_layout_change(move |cx| {
-        let next_layout_id = cx.keyboard_layout().id();
-        if next_layout_id != current_layout_id {
-            current_layout_id = next_layout_id.to_string();
-            keyboard_layout_tx.unbounded_send(()).ok();
-        }
-    })
-    .detach();
+    #[cfg(target_os = "windows")]
+    {
+        let mut current_layout_id = cx.keyboard_layout().id().to_string();
+        cx.on_keyboard_layout_change(move |cx| {
+            let next_layout_id = cx.keyboard_layout().id();
+            if next_layout_id != current_layout_id {
+                current_layout_id = next_layout_id.to_string();
+                keyboard_layout_tx.unbounded_send(()).ok();
+            }
+        })
+        .detach();
+    }
+
+    #[cfg(not(target_os = "windows"))]
+    {
+        let mut current_mapping = cx.keyboard_mapper().get_key_equivalents().cloned();
+        cx.on_keyboard_layout_change(move |cx| {
+            let next_mapping = cx.keyboard_mapper().get_key_equivalents();
+            if current_mapping.as_ref() != next_mapping {
+                current_mapping = next_mapping.cloned();
+                keyboard_layout_tx.unbounded_send(()).ok();
+            }
+        })
+        .detach();
+    }
 
     load_default_keymap(cx);