summaryrefslogtreecommitdiffstats
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/linuxbsd/x11/display_server_x11.cpp2
-rw-r--r--platform/macos/display_server_macos.h2
-rw-r--r--platform/macos/display_server_macos.mm10
3 files changed, 8 insertions, 6 deletions
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp
index 8343370533..4c5d9552e6 100644
--- a/platform/linuxbsd/x11/display_server_x11.cpp
+++ b/platform/linuxbsd/x11/display_server_x11.cpp
@@ -2848,7 +2848,7 @@ Key DisplayServerX11::keyboard_get_keycode_from_physical(Key p_keycode) const {
Key modifiers = p_keycode & KeyModifierMask::MODIFIER_MASK;
Key keycode_no_mod = p_keycode & KeyModifierMask::CODE_MASK;
unsigned int xkeycode = KeyMappingX11::get_xlibcode(keycode_no_mod);
- KeySym xkeysym = XkbKeycodeToKeysym(x11_display, xkeycode, 0, 0);
+ KeySym xkeysym = XkbKeycodeToKeysym(x11_display, xkeycode, keyboard_get_current_layout(), 0);
if (is_ascii_lower_case(xkeysym)) {
xkeysym -= ('a' - 'A');
}
diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h
index f7c5b0b847..638355a3a8 100644
--- a/platform/macos/display_server_macos.h
+++ b/platform/macos/display_server_macos.h
@@ -188,7 +188,7 @@ private:
Variant tag;
Callable callback;
};
- Vector<MenuCall> deferred_menu_calls;
+ List<MenuCall> deferred_menu_calls;
const NSMenu *_get_menu_root(const String &p_menu_root) const;
NSMenu *_get_menu_root(const String &p_menu_root);
diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm
index 322c3f85bf..9ef1446ea3 100644
--- a/platform/macos/display_server_macos.mm
+++ b/platform/macos/display_server_macos.mm
@@ -3521,14 +3521,16 @@ void DisplayServerMacOS::process_events() {
}
// Process "menu_callback"s.
- for (MenuCall &E : deferred_menu_calls) {
- Variant tag = E.tag;
+ while (List<MenuCall>::Element *call_p = deferred_menu_calls.front()) {
+ MenuCall call = call_p->get();
+ deferred_menu_calls.pop_front(); // Remove before call to avoid infinite loop in case callback is using `process_events` (e.g. EditorProgress).
+
+ Variant tag = call.tag;
Variant *tagp = &tag;
Variant ret;
Callable::CallError ce;
- E.callback.callp((const Variant **)&tagp, 1, ret, ce);
+ call.callback.callp((const Variant **)&tagp, 1, ret, ce);
}
- deferred_menu_calls.clear();
if (!drop_events) {
_process_key_events();