1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-04 12:00:25 +00:00

Feature adding Windows native menu close callback

This commit is contained in:
Marcelo Vilas Boas Correa Filho
2024-12-31 18:22:35 -03:00
parent 2582793d40
commit 3bb2309f6b
3 changed files with 22 additions and 5 deletions

View File

@@ -366,7 +366,7 @@
<param index="0" name="rid" type="RID" /> <param index="0" name="rid" type="RID" />
<description> <description>
Returns global menu close callback. 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.
</description> </description>
</method> </method>
<method name="get_popup_open_callback" qualifiers="const"> <method name="get_popup_open_callback" qualifiers="const">
@@ -708,7 +708,7 @@
<description> <description>
Registers callable to emit when the menu is about to show. 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] 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.
</description> </description>
</method> </method>
<method name="set_popup_open_callback"> <method name="set_popup_open_callback">

View File

@@ -177,6 +177,16 @@ void NativeMenuWindows::popup(const RID &p_rid, const Vector2i &p_position) {
} }
SetForegroundWindow(hwnd); SetForegroundWindow(hwnd);
TrackPopupMenuEx(md->menu, flags, p_position.x, p_position.y, hwnd, nullptr); 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); 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) { 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 { Callable NativeMenuWindows::get_popup_close_callback(const RID &p_rid) const {
// Not supported. const MenuData *md = menus.get_or_null(p_rid);
return Callable(); ERR_FAIL_NULL_V(md, Callable());
return md->close_cb;
} }
void NativeMenuWindows::set_minimum_width(const RID &p_rid, float p_width) { void NativeMenuWindows::set_minimum_width(const RID &p_rid, float p_width) {

View File

@@ -61,6 +61,8 @@ class NativeMenuWindows : public NativeMenu {
struct MenuData { struct MenuData {
HMENU menu = 0; HMENU menu = 0;
Callable close_cb;
bool is_rtl = false; bool is_rtl = false;
}; };