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; };