From 90370a08ecbdf670267ffebcecc53054f820b8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Tue, 26 Aug 2025 11:23:18 +0300 Subject: [PATCH] Clamp menus at the bottom of the screen. --- scene/gui/menu_button.cpp | 10 ++++++++++ scene/gui/popup_menu.cpp | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp index ae74936a208..eb2e30ad0de 100644 --- a/scene/gui/menu_button.cpp +++ b/scene/gui/menu_button.cpp @@ -85,6 +85,16 @@ void MenuButton::show_popup() { Transform2D xform = get_viewport()->get_popup_base_transform_native(); rect = xform.xform(rect); } + Rect2i scr_usable = DisplayServer::get_singleton()->screen_get_usable_rect(get_window()->get_current_screen()); + Size2i max_size; + if (scr_usable.has_area()) { + real_t max_h = scr_usable.get_end().y - rect.position.y; + real_t max_w = scr_usable.get_end().x - rect.position.x; + if (max_h >= 4 * rect.size.height && max_w >= rect.size.width) { + max_size = Size2i(max_w, max_h); + } + } + popup->set_max_size(max_size); rect.size.height = 0; popup->set_size(rect.size); if (is_layout_rtl()) { diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 33d2051d545..58fdaa50e1e 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -3230,6 +3230,10 @@ void PopupMenu::_pre_popup() { set_content_scale_factor(popup_scale); Size2 minsize = get_contents_minimum_size() * popup_scale; minsize.height = Math::ceil(minsize.height); // Ensures enough height at fractional content scales to prevent the v_scroll_bar from showing. + real_t max_h = get_max_size().height; + if (max_h > 0) { + minsize.height = MIN(minsize.height, max_h); + } set_min_size(minsize); // `height` is truncated here by the cast to Size2i for Window.min_size. reset_size(); // Shrinkwraps to min size. }