From 732f273949fd22ab23ad9ae154ba2623e97db681 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 13 Feb 2019 00:19:21 +0100 Subject: [PATCH] WindowServer: Switch menubar based on the currently active window. --- WindowServer/WSWindow.h | 2 ++ WindowServer/WSWindowManager.cpp | 22 +++++++++++++++++----- WindowServer/WSWindowManager.h | 2 ++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/WindowServer/WSWindow.h b/WindowServer/WSWindow.h index ea124e5de7..db5e148a77 100644 --- a/WindowServer/WSWindow.h +++ b/WindowServer/WSWindow.h @@ -20,6 +20,8 @@ public: explicit WSWindow(WSMenu&); virtual ~WSWindow() override; + const Process* process() const { return m_process; } + WSWindowType type() const { return m_type; } int window_id() const { return m_window_id; } diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index c0b0d115e4..58e60cdb23 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -707,6 +707,12 @@ void WSWindowManager::set_active_window(WSWindow* window) if (m_active_window) { WSMessageLoop::the().post_message(m_active_window.ptr(), make(WSMessage::WindowActivated)); invalidate(*m_active_window); + + auto it = m_app_menubars.find(window->process()); + if (it != m_app_menubars.end()) + set_current_menubar((*it).value); + else + set_current_menubar(nullptr); } } @@ -883,6 +889,13 @@ int WSWindowManager::api$menu_add_item(int menu_id, unsigned identifier, String& return 0; } +const Process* WSWindowManager::active_process() const +{ + if (m_active_window) + return m_active_window->process(); + return nullptr; +} + int WSWindowManager::api$app_set_menubar(int menubar_id) { LOCKER(m_lock); @@ -890,11 +903,9 @@ int WSWindowManager::api$app_set_menubar(int menubar_id) if (it == m_menubars.end()) return -EBADMENUBAR; auto& menubar = *(*it).value; - if (&menubar == m_current_menubar) - return 0; - set_current_menubar(&menubar); - // FIXME: Maybe leave the system menu even if the app menu changes? - close_current_menu(); + m_app_menubars.set(current, &menubar); + if (active_process() == current) + set_current_menubar(&menubar); invalidate(); return 0; } @@ -927,4 +938,5 @@ void WSWindowManager::destroy_all_menus(Process& process) set_current_menubar(nullptr); for (int menubar_id : menubar_ids) m_menubars.remove(menubar_id); + m_app_menubars.remove(current); } diff --git a/WindowServer/WSWindowManager.h b/WindowServer/WSWindowManager.h index 54b9def9bd..2e479c9929 100644 --- a/WindowServer/WSWindowManager.h +++ b/WindowServer/WSWindowManager.h @@ -30,6 +30,7 @@ public: void notify_rect_changed(WSWindow&, const Rect& oldRect, const Rect& newRect); WSWindow* active_window() { return m_active_window.ptr(); } + const Process* active_process() const; void move_to_front(WSWindow&); @@ -152,4 +153,5 @@ private: WSMenu* m_current_menu { nullptr }; HashMap> m_menubars; HashMap> m_menus; + HashMap m_app_menubars; };