diff options
author | Andreas Kling <kling@serenityos.org> | 2021-03-25 23:08:34 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-03-25 23:08:34 +0100 |
commit | 327866520a46d8e98f42551a0bfb59548c349adc (patch) | |
tree | d0455ab7a2906a99c7865f7e3dfef066f15bf0ea | |
parent | 619a223800e3d61c2f18010e010ff7a939d264eb (diff) | |
download | serenity-327866520a46d8e98f42551a0bfb59548c349adc.zip |
WindowServer: Remove "system menu" concept from WindowServer
-rw-r--r-- | Userland/Services/WindowServer/ClientConnection.cpp | 13 | ||||
-rw-r--r-- | Userland/Services/WindowServer/ClientConnection.h | 1 | ||||
-rw-r--r-- | Userland/Services/WindowServer/Menu.cpp | 2 | ||||
-rw-r--r-- | Userland/Services/WindowServer/Menu.h | 7 | ||||
-rw-r--r-- | Userland/Services/WindowServer/MenuManager.cpp | 107 | ||||
-rw-r--r-- | Userland/Services/WindowServer/MenuManager.h | 14 | ||||
-rw-r--r-- | Userland/Services/WindowServer/WindowManager.cpp | 19 | ||||
-rw-r--r-- | Userland/Services/WindowServer/WindowManager.h | 2 | ||||
-rw-r--r-- | Userland/Services/WindowServer/WindowServer.ipc | 2 |
9 files changed, 19 insertions, 148 deletions
diff --git a/Userland/Services/WindowServer/ClientConnection.cpp b/Userland/Services/WindowServer/ClientConnection.cpp index 1c67bd6166..aa1c756fa3 100644 --- a/Userland/Services/WindowServer/ClientConnection.cpp +++ b/Userland/Services/WindowServer/ClientConnection.cpp @@ -834,19 +834,6 @@ OwnPtr<Messages::WindowServer::StartDragResponse> ClientConnection::handle(const return make<Messages::WindowServer::StartDragResponse>(true); } -OwnPtr<Messages::WindowServer::SetSystemMenuResponse> ClientConnection::handle(const Messages::WindowServer::SetSystemMenu& message) -{ - auto it = m_menus.find(message.menu_id()); - if (it == m_menus.end()) { - did_misbehave("SetSystemMenu called with invalid menu ID"); - return {}; - } - - auto& menu = it->value; - MenuManager::the().set_system_menu(menu); - return make<Messages::WindowServer::SetSystemMenuResponse>(); -} - OwnPtr<Messages::WindowServer::SetSystemThemeResponse> ClientConnection::handle(const Messages::WindowServer::SetSystemTheme& message) { bool success = WindowManager::the().update_theme(message.theme_path(), message.theme_name()); diff --git a/Userland/Services/WindowServer/ClientConnection.h b/Userland/Services/WindowServer/ClientConnection.h index 87fd624c0b..8e2ecd43db 100644 --- a/Userland/Services/WindowServer/ClientConnection.h +++ b/Userland/Services/WindowServer/ClientConnection.h @@ -145,7 +145,6 @@ private: virtual OwnPtr<Messages::WindowServer::SetWindowIconBitmapResponse> handle(const Messages::WindowServer::SetWindowIconBitmap&) override; virtual void handle(const Messages::WindowServer::WM_SetWindowTaskbarRect&) override; virtual OwnPtr<Messages::WindowServer::StartDragResponse> handle(const Messages::WindowServer::StartDrag&) override; - virtual OwnPtr<Messages::WindowServer::SetSystemMenuResponse> handle(const Messages::WindowServer::SetSystemMenu&) override; virtual OwnPtr<Messages::WindowServer::SetSystemThemeResponse> handle(const Messages::WindowServer::SetSystemTheme&) override; virtual OwnPtr<Messages::WindowServer::GetSystemThemeResponse> handle(const Messages::WindowServer::GetSystemTheme&) override; virtual OwnPtr<Messages::WindowServer::SetWindowBaseSizeAndSizeIncrementResponse> handle(const Messages::WindowServer::SetWindowBaseSizeAndSizeIncrement&) override; diff --git a/Userland/Services/WindowServer/Menu.cpp b/Userland/Services/WindowServer/Menu.cpp index 9307f7b2b0..4d72eb8dbb 100644 --- a/Userland/Services/WindowServer/Menu.cpp +++ b/Userland/Services/WindowServer/Menu.cpp @@ -122,7 +122,7 @@ int Menu::content_width() const if (widest_shortcut) widest_item += padding_between_text_and_shortcut() + widest_shortcut; - return max(widest_item, rect_in_global_menubar().width()) + horizontal_padding() + frame_thickness() * 2; + return max(widest_item, rect_in_window_menubar().width()) + horizontal_padding() + frame_thickness() * 2; } void Menu::redraw() diff --git a/Userland/Services/WindowServer/Menu.h b/Userland/Services/WindowServer/Menu.h index d23a1e6907..e5bf27f8eb 100644 --- a/Userland/Services/WindowServer/Menu.h +++ b/Userland/Services/WindowServer/Menu.h @@ -74,11 +74,6 @@ public: callback(item); } - Gfx::IntRect text_rect_in_global_menubar() const { return m_text_rect_in_global_menubar; } - void set_text_rect_in_global_menubar(const Gfx::IntRect& rect) { m_text_rect_in_global_menubar = rect; } - Gfx::IntRect rect_in_global_menubar() const { return m_rect_in_global_menubar; } - void set_rect_in_global_menubar(const Gfx::IntRect& rect) { m_rect_in_global_menubar = rect; } - Gfx::IntRect text_rect_in_window_menubar() const { return m_text_rect_in_window_menubar; } void set_text_rect_in_window_menubar(const Gfx::IntRect& rect) { m_text_rect_in_window_menubar = rect; } Gfx::IntRect rect_in_window_menubar() const { return m_rect_in_window_menubar; } @@ -153,8 +148,6 @@ private: ClientConnection* m_client { nullptr }; int m_menu_id { 0 }; String m_name; - Gfx::IntRect m_rect_in_global_menubar; - Gfx::IntRect m_text_rect_in_global_menubar; Gfx::IntRect m_rect_in_window_menubar; Gfx::IntRect m_text_rect_in_window_menubar; MenuBar* m_menubar { nullptr }; diff --git a/Userland/Services/WindowServer/MenuManager.cpp b/Userland/Services/WindowServer/MenuManager.cpp index 98e692f105..ab8828f764 100644 --- a/Userland/Services/WindowServer/MenuManager.cpp +++ b/Userland/Services/WindowServer/MenuManager.cpp @@ -54,8 +54,6 @@ MenuManager::MenuManager() s_the = this; m_needs_window_resize = true; - set_current_menubar(nullptr); - m_window = Window::construct(*this, WindowType::Menubar); m_window->set_rect(menubar_rect()); @@ -95,24 +93,6 @@ void MenuManager::draw() painter.draw_line({ 0, menubar_rect.bottom() - 1 }, { menubar_rect.right(), menubar_rect.bottom() - 1 }, palette.threed_shadow1()); painter.draw_line({ 0, menubar_rect.bottom() }, { menubar_rect.right(), menubar_rect.bottom() }, palette.threed_shadow2()); - for_each_active_menubar_menu([&](Menu& menu) { - auto text_rect = menu.text_rect_in_global_menubar(); - Color text_color = palette.window_text(); - if (is_open(menu) && &menu == m_current_menu_bar_menu) { - painter.fill_rect(menu.rect_in_global_menubar(), palette.menu_selection()); - painter.draw_rect(menu.rect_in_global_menubar(), palette.menu_selection().darkened()); - text_color = palette.menu_selection_text(); - text_rect.move_by(1, 1); - } - painter.draw_text( - text_rect, - menu.name(), - menu.title_font(), - Gfx::TextAlignment::CenterLeft, - text_color); - return IterationDecision::Continue; - }); - AppletManager::the().draw(); } @@ -126,6 +106,8 @@ void MenuManager::refresh() void MenuManager::event(Core::Event& event) { + auto& wm = WindowManager::the(); + if (static_cast<Event&>(event).is_mouse_event()) { handle_mouse_event(static_cast<MouseEvent&>(event)); return; @@ -173,8 +155,10 @@ void MenuManager::event(Core::Event& event) m_current_menu->set_hovered_item(-1); else { auto* target_menu = previous_menu(m_current_menu); - if (target_menu) - open_menu(*target_menu, true); + if (target_menu) { + target_menu->ensure_menu_window().move_to(target_menu->rect_in_window_menubar().bottom_left().translated(wm.window_with_active_menu()->frame().rect().location()).translated(wm.window_with_active_menu()->frame().menubar_rect().location())); + open_menu(*target_menu, false); + } } } close_everyone_not_in_lineage(*m_current_menu); @@ -185,10 +169,11 @@ void MenuManager::event(Core::Event& event) auto hovered_item = m_current_menu->hovered_item(); if (hovered_item && hovered_item->is_submenu()) m_current_menu->descend_into_submenu_at_hovered_item(); - else if (m_open_menu_stack.size() <= 1) { + else if (m_open_menu_stack.size() <= 1 && wm.window_with_active_menu()) { auto* target_menu = next_menu(m_current_menu); if (target_menu) { - open_menu(*target_menu, true); + target_menu->ensure_menu_window().move_to(target_menu->rect_in_window_menubar().bottom_left().translated(wm.window_with_active_menu()->frame().rect().location()).translated(wm.window_with_active_menu()->frame().menubar_rect().location())); + open_menu(*target_menu, false); close_everyone_not_in_lineage(*target_menu); } } @@ -214,20 +199,6 @@ void MenuManager::event(Core::Event& event) void MenuManager::handle_mouse_event(MouseEvent& mouse_event) { - auto* active_window = WindowManager::the().active_window(); - bool handled_menubar_event = false; - for_each_active_menubar_menu([&](Menu& menu) { - if (menu.rect_in_global_menubar().contains(mouse_event.position())) { - handled_menubar_event = &menu == m_system_menu || !active_window || !active_window->is_modal(); - if (handled_menubar_event) - handle_menu_mouse_event(menu, mouse_event); - return IterationDecision::Break; - } - return IterationDecision::Continue; - }); - if (handled_menubar_event) - return; - if (has_open_menu()) { auto* topmost_menu = m_open_menu_stack.last().ptr(); VERIFY(topmost_menu); @@ -289,27 +260,6 @@ void MenuManager::handle_mouse_event(MouseEvent& mouse_event) AppletManager::the().dispatch_event(static_cast<Event&>(mouse_event)); } -void MenuManager::handle_menu_mouse_event(Menu& menu, const MouseEvent& event) -{ - bool is_hover_with_any_menu_open = event.type() == MouseEvent::MouseMove - && has_open_menu() && m_current_menu_bar_menu - && (m_open_menu_stack.first()->menubar() || m_open_menu_stack.first() == m_system_menu.ptr()); - bool is_mousedown_with_left_button = event.type() == MouseEvent::MouseDown && event.button() == MouseButton::Left; - bool should_open_menu = (&menu != m_current_menu || !m_current_menu_bar_menu) && (is_hover_with_any_menu_open || is_mousedown_with_left_button); - - if (is_mousedown_with_left_button) - m_bar_open = !m_bar_open; - - if (should_open_menu && m_bar_open) { - close_everyone(); - open_menu(menu, true); - return; - } - - if (!m_bar_open && m_current_menu_bar_menu) - close_everyone(); -} - void MenuManager::set_needs_window_resize() { m_needs_window_resize = true; @@ -419,13 +369,8 @@ void MenuManager::open_menu(Menu& menu, bool from_menu_bar, bool as_current_menu if (!menu.is_empty()) { menu.redraw_if_theme_changed(); - bool should_update_position = from_menu_bar; - if (!menu.menu_window()) { - should_update_position = true; + if (!menu.menu_window()) menu.ensure_menu_window(); - } - if (should_update_position) - menu.menu_window()->move_to({ menu.rect_in_global_menubar().x(), menu.rect_in_global_menubar().bottom() + 2 }); menu.menu_window()->set_visible(true); } @@ -497,33 +442,14 @@ Gfx::IntRect MenuManager::menubar_rect() const return { 0, 0, Screen::the().rect().width(), 19 }; } -void MenuManager::set_current_menubar(MenuBar*) -{ - Gfx::IntPoint next_menu_location { MenuManager::menubar_menu_margin() / 2, 0 }; - for_each_active_menubar_menu([&](Menu& menu) { - int text_width = menu.title_font().width(menu.name()); - menu.set_rect_in_global_menubar({ next_menu_location.x() - MenuManager::menubar_menu_margin() / 2, 0, text_width + MenuManager::menubar_menu_margin(), menubar_rect().height() - 1 }); - - Gfx::IntRect text_rect { next_menu_location.translated(0, 1), { text_width, menubar_rect().height() - 3 } }; - - menu.set_text_rect_in_global_menubar(text_rect); - next_menu_location.move_by(menu.rect_in_global_menubar().width(), 0); - return IterationDecision::Continue; - }); - refresh(); -} - -void MenuManager::set_system_menu(Menu& menu) -{ - m_system_menu = menu; - set_current_menubar(nullptr); -} - Menu* MenuManager::previous_menu(Menu* current) { + auto& wm = WindowManager::the(); + if (!wm.window_with_active_menu()) + return nullptr; Menu* found = nullptr; Menu* previous = nullptr; - for_each_active_menubar_menu([&](Menu& menu) { + wm.window_with_active_menu()->menubar()->for_each_menu([&](Menu& menu) { if (current == &menu) { found = previous; return IterationDecision::Break; @@ -538,7 +464,10 @@ Menu* MenuManager::next_menu(Menu* current) { Menu* found = nullptr; bool is_next = false; - for_each_active_menubar_menu([&](Menu& menu) { + auto& wm = WindowManager::the(); + if (!wm.window_with_active_menu()) + return nullptr; + wm.window_with_active_menu()->menubar()->for_each_menu([&](Menu& menu) { if (is_next) { found = &menu; return IterationDecision::Break; diff --git a/Userland/Services/WindowServer/MenuManager.h b/Userland/Services/WindowServer/MenuManager.h index d94b585c03..c1a8e8e035 100644 --- a/Userland/Services/WindowServer/MenuManager.h +++ b/Userland/Services/WindowServer/MenuManager.h @@ -59,8 +59,6 @@ public: void clear_current_menu(); void open_menu(Menu&, bool from_menu_bar, bool as_current_menu = true); - void set_current_menubar(MenuBar*); - void close_bar(); void close_everyone(); void close_everyone_not_in_lineage(Menu&); @@ -68,22 +66,10 @@ public: void close_all_menus_from_client(Badge<ClientConnection>, ClientConnection&); - Menu* system_menu() { return m_system_menu; } - void set_system_menu(Menu&); - int theme_index() const { return m_theme_index; } Window& window() { return *m_window; } - template<typename Callback> - void for_each_active_menubar_menu(Callback callback) - { - if (system_menu()) { - if (callback(*system_menu()) == IterationDecision::Break) - return; - } - } - Menu* previous_menu(Menu* current); Menu* next_menu(Menu* current); diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index b9ed2fd048..5636caa9f7 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -1155,9 +1155,6 @@ Gfx::IntRect WindowManager::arena_rect_for_type(WindowType type) const void WindowManager::event(Core::Event& event) { if (static_cast<Event&>(event).is_mouse_event()) { - if (event.type() != Event::MouseMove) - m_previous_event_is_key_down_logo = false; - Window* hovered_window = nullptr; process_mouse_event(static_cast<MouseEvent&>(event), hovered_window); set_hovered_window(hovered_window); @@ -1187,20 +1184,6 @@ void WindowManager::event(Core::Event& event) return; } - if (key_event.type() == Event::KeyDown && key_event.key() == Key_Super) { - m_previous_event_is_key_down_logo = true; - } else if (m_previous_event_is_key_down_logo) { - m_previous_event_is_key_down_logo = false; - if (!m_dnd_client && key_event.type() == Event::KeyUp && key_event.key() == Key_Super) { - if (MenuManager::the().has_open_menu()) { - MenuManager::the().close_everyone(); - } else { - MenuManager::the().open_menu(*MenuManager::the().system_menu(), true); - } - return; - } - } - if (MenuManager::the().current_menu()) { MenuManager::the().dispatch_event(event); return; @@ -1371,8 +1354,6 @@ void WindowManager::set_active_window(Window* window, bool make_input) Core::EventLoop::current().post_event(*m_active_window, make<Event>(Event::WindowActivated)); m_active_window->invalidate(true, true); tell_wm_listeners_window_state_changed(*m_active_window); - } else { - MenuManager::the().set_current_menubar(nullptr); } // Window shapes may have changed (e.g. shadows for inactive/active windows) diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h index f71f055cf2..b52d065dd4 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -360,8 +360,6 @@ private: String m_dnd_text; RefPtr<Core::MimeData> m_dnd_mime_data; RefPtr<Gfx::Bitmap> m_dnd_bitmap; - - bool m_previous_event_is_key_down_logo { false }; }; template<typename Callback> diff --git a/Userland/Services/WindowServer/WindowServer.ipc b/Userland/Services/WindowServer/WindowServer.ipc index 00f147b49e..0e1b1cb89d 100644 --- a/Userland/Services/WindowServer/WindowServer.ipc +++ b/Userland/Services/WindowServer/WindowServer.ipc @@ -10,8 +10,6 @@ endpoint WindowServer = 2 AddMenuToMenubar(i32 menubar_id, i32 menu_id) => () - SetSystemMenu(i32 menu_id) => () - AddMenuItem( i32 menu_id, i32 identifier, |