diff --git a/doc/classes/NativeMenu.xml b/doc/classes/NativeMenu.xml
index 2b9e4141068..6081d7afc51 100644
--- a/doc/classes/NativeMenu.xml
+++ b/doc/classes/NativeMenu.xml
@@ -366,7 +366,7 @@
Returns global menu close callback.
- b]Note:[/b] This method is implemented only on macOS.
+ [b]Note:[/b] This method is implemented on macOS and Windows.
@@ -708,7 +708,7 @@
Registers callable to emit when the menu is about to show.
[b]Note:[/b] The OS can simulate menu opening to track menu item changes and global shortcuts, in which case the corresponding close callback is not triggered. Use [method is_opened] to check if the menu is currently opened.
- [b]Note:[/b] This method is implemented only on macOS.
+ [b]Note:[/b] This method is implemented on macOS and Windows.
diff --git a/platform/windows/native_menu_windows.cpp b/platform/windows/native_menu_windows.cpp
index 9fa2849e7b9..84d9302403e 100644
--- a/platform/windows/native_menu_windows.cpp
+++ b/platform/windows/native_menu_windows.cpp
@@ -177,6 +177,16 @@ void NativeMenuWindows::popup(const RID &p_rid, const Vector2i &p_position) {
}
SetForegroundWindow(hwnd);
TrackPopupMenuEx(md->menu, flags, p_position.x, p_position.y, hwnd, nullptr);
+
+ if (md->close_cb.is_valid()) {
+ Variant ret;
+ Callable::CallError ce;
+ md->close_cb.callp(nullptr, 0, ret, ce);
+ if (ce.error != Callable::CallError::CALL_OK) {
+ ERR_PRINT(vformat("Failed to execute popup close callback: %s.", Variant::get_callable_error_text(md->close_cb, nullptr, 0, ce)));
+ }
+ }
+
PostMessage(hwnd, WM_NULL, 0, 0);
}
@@ -200,12 +210,17 @@ Callable NativeMenuWindows::get_popup_open_callback(const RID &p_rid) const {
}
void NativeMenuWindows::set_popup_close_callback(const RID &p_rid, const Callable &p_callback) {
- // Not supported.
+ MenuData *md = menus.get_or_null(p_rid);
+ ERR_FAIL_NULL(md);
+
+ md->close_cb = p_callback;
}
Callable NativeMenuWindows::get_popup_close_callback(const RID &p_rid) const {
- // Not supported.
- return Callable();
+ const MenuData *md = menus.get_or_null(p_rid);
+ ERR_FAIL_NULL_V(md, Callable());
+
+ return md->close_cb;
}
void NativeMenuWindows::set_minimum_width(const RID &p_rid, float p_width) {
diff --git a/platform/windows/native_menu_windows.h b/platform/windows/native_menu_windows.h
index 09e4640b400..c23ac61fa25 100644
--- a/platform/windows/native_menu_windows.h
+++ b/platform/windows/native_menu_windows.h
@@ -61,6 +61,8 @@ class NativeMenuWindows : public NativeMenu {
struct MenuData {
HMENU menu = 0;
+
+ Callable close_cb;
bool is_rtl = false;
};