浏览代码

WindowServer: Adjust position of flipped submenus by menu item height

Fixes #5950.
Linus Groh 4 年之前
父节点
当前提交
b220c89c5c
共有 2 个文件被更改,包括 5 次插入3 次删除
  1. 4 2
      Userland/Services/WindowServer/Menu.cpp
  2. 1 1
      Userland/Services/WindowServer/Menu.h

+ 4 - 2
Userland/Services/WindowServer/Menu.cpp

@@ -288,7 +288,7 @@ void Menu::update_for_new_hovered_item(bool make_input)
     if (hovered_item() && hovered_item()->is_submenu()) {
     if (hovered_item() && hovered_item()->is_submenu()) {
         VERIFY(menu_window());
         VERIFY(menu_window());
         MenuManager::the().close_everyone_not_in_lineage(*hovered_item()->submenu());
         MenuManager::the().close_everyone_not_in_lineage(*hovered_item()->submenu());
-        hovered_item()->submenu()->do_popup(hovered_item()->rect().top_right().translated(menu_window()->rect().location()), make_input);
+        hovered_item()->submenu()->do_popup(hovered_item()->rect().top_right().translated(menu_window()->rect().location()), make_input, true);
     } else {
     } else {
         MenuManager::the().close_everyone_not_in_lineage(*this);
         MenuManager::the().close_everyone_not_in_lineage(*this);
         ensure_menu_window().set_visible(true);
         ensure_menu_window().set_visible(true);
@@ -518,7 +518,7 @@ void Menu::popup(const Gfx::IntPoint& position)
     do_popup(position, true);
     do_popup(position, true);
 }
 }
 
 
-void Menu::do_popup(const Gfx::IntPoint& position, bool make_input)
+void Menu::do_popup(const Gfx::IntPoint& position, bool make_input, bool as_submenu)
 {
 {
     if (is_empty()) {
     if (is_empty()) {
         dbgln("Menu: Empty menu popup");
         dbgln("Menu: Empty menu popup");
@@ -536,6 +536,8 @@ void Menu::do_popup(const Gfx::IntPoint& position, bool make_input)
     }
     }
     if (adjusted_pos.y() + window.height() >= Screen::the().height() - margin) {
     if (adjusted_pos.y() + window.height() >= Screen::the().height() - margin) {
         adjusted_pos = adjusted_pos.translated(0, -window.height());
         adjusted_pos = adjusted_pos.translated(0, -window.height());
+        if (as_submenu)
+            adjusted_pos = adjusted_pos.translated(0, item_height());
     }
     }
 
 
     if (adjusted_pos.y() < MenuManager::the().menubar_rect().height())
     if (adjusted_pos.y() < MenuManager::the().menubar_rect().height())

+ 1 - 1
Userland/Services/WindowServer/Menu.h

@@ -114,7 +114,7 @@ public:
     void close();
     void close();
 
 
     void popup(const Gfx::IntPoint&);
     void popup(const Gfx::IntPoint&);
-    void do_popup(const Gfx::IntPoint&, bool);
+    void do_popup(const Gfx::IntPoint&, bool make_input, bool as_submenu = false);
 
 
     bool is_menu_ancestor_of(const Menu&) const;
     bool is_menu_ancestor_of(const Menu&) const;