summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-02-13 18:48:22 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-02-13 18:49:23 +0100
commitcf432b4c3d366edef40798a777ab2014715fd7f4 (patch)
treeeb8e817191dc090a024ecaf1d6bab3b85b6ed470
parentfbbf57b61c34e548159f70d496dec2b0fbc54545 (diff)
downloadserenity-cf432b4c3d366edef40798a777ab2014715fd7f4.zip
WindowServer: Refactor more of the menu APIs to be message-based.
This is all pretty verbose but I can whittle it down later. :^)
-rw-r--r--Kernel/GUITypes.h11
-rw-r--r--Kernel/ProcessGUI.cpp22
-rw-r--r--Kernel/Syscall.cpp8
-rw-r--r--Kernel/Syscall.h4
-rw-r--r--LibC/gui.cpp24
-rw-r--r--LibC/gui.h4
-rw-r--r--LibGUI/GMenu.cpp29
-rw-r--r--LibGUI/GMenu.h1
-rw-r--r--LibGUI/GMenuBar.cpp12
-rw-r--r--WindowServer/WSMessage.h64
-rw-r--r--WindowServer/WSMessageLoop.cpp13
-rw-r--r--WindowServer/WSWindowManager.cpp197
-rw-r--r--WindowServer/WSWindowManager.h11
13 files changed, 229 insertions, 171 deletions
diff --git a/Kernel/GUITypes.h b/Kernel/GUITypes.h
index e6aed51337..42c91e1972 100644
--- a/Kernel/GUITypes.h
+++ b/Kernel/GUITypes.h
@@ -70,6 +70,10 @@ struct GUI_ServerMessage {
MenuItemActivated,
DidCreateMenubar,
DidDestroyMenubar,
+ DidCreateMenu,
+ DidDestroyMenu,
+ DidAddMenuToMenubar,
+ DidSetApplicationMenubar,
};
Type type { Invalid };
int window_id { -1 };
@@ -104,6 +108,10 @@ struct GUI_ClientMessage {
Invalid,
CreateMenubar,
DestroyMenubar,
+ CreateMenu,
+ DestroyMenu,
+ AddMenuToMenubar,
+ SetApplicationMenubar,
};
Type type { Invalid };
int window_id { -1 };
@@ -112,6 +120,9 @@ struct GUI_ClientMessage {
struct {
int menubar_id;
int menu_id;
+ unsigned identifier;
+ unsigned text_length;
+ char text[256];
} menu;
};
};
diff --git a/Kernel/ProcessGUI.cpp b/Kernel/ProcessGUI.cpp
index 9e8ff1e22a..f098c77cb7 100644
--- a/Kernel/ProcessGUI.cpp
+++ b/Kernel/ProcessGUI.cpp
@@ -292,23 +292,6 @@ DisplayInfo Process::set_video_resolution(int width, int height)
return info;
}
-int Process::gui$menubar_add_menu(int menubar_id, int menu_id)
-{
- return WSWindowManager::the().api$menubar_add_menu(menubar_id, menu_id);
-}
-
-int Process::gui$menu_create(const char* name)
-{
- if (!validate_read_str(name))
- return -EFAULT;
- return WSWindowManager::the().api$menu_create(String(name));
-}
-
-int Process::gui$menu_destroy(int menu_id)
-{
- return WSWindowManager::the().api$menu_destroy(menu_id);
-}
-
int Process::gui$menu_add_separator(int menu_id)
{
return WSWindowManager::the().api$menu_add_separator(menu_id);
@@ -320,8 +303,3 @@ int Process::gui$menu_add_item(int menu_id, unsigned identifier, const char* tex
return -EFAULT;
return WSWindowManager::the().api$menu_add_item(menu_id, identifier, String(text));
}
-
-int Process::gui$set_menubar(int menubar_id)
-{
- return WSWindowManager::the().api$app_set_menubar(menubar_id);
-}
diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp
index f82bfaec74..ad0b1a9416 100644
--- a/Kernel/Syscall.cpp
+++ b/Kernel/Syscall.cpp
@@ -223,18 +223,10 @@ static dword handle(RegisterDump& regs, dword function, dword arg1, dword arg2,
return current->sys$rmdir((const char*)arg1);
case Syscall::SC_chmod:
return current->sys$chmod((const char*)arg1, (mode_t)arg2);
- case Syscall::SC_gui_menubar_add_menu:
- return current->gui$menubar_add_menu((int)arg1, (int)arg2);
- case Syscall::SC_gui_menu_create:
- return current->gui$menu_create((const char*)arg1);
- case Syscall::SC_gui_menu_destroy:
- return current->gui$menu_destroy((int)arg1);
case Syscall::SC_gui_menu_add_separator:
return current->gui$menu_add_separator((int)arg1);
case Syscall::SC_gui_menu_add_item:
return current->gui$menu_add_item((int)arg1, (unsigned)arg2, (const char*)arg3);
- case Syscall::SC_gui_app_set_menubar:
- return current->gui$set_menubar((int)arg1);
default:
kprintf("<%u> int0x80: Unknown function %u requested {%x, %x, %x}\n", current->pid(), function, arg1, arg2, arg3);
break;
diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h
index 878ba916c1..5867034527 100644
--- a/Kernel/Syscall.h
+++ b/Kernel/Syscall.h
@@ -85,12 +85,8 @@
__ENUMERATE_SYSCALL(rmdir) \
__ENUMERATE_SYSCALL(chmod) \
__ENUMERATE_SYSCALL(usleep) \
- __ENUMERATE_SYSCALL(gui_menubar_add_menu) \
- __ENUMERATE_SYSCALL(gui_menu_create) \
- __ENUMERATE_SYSCALL(gui_menu_destroy) \
__ENUMERATE_SYSCALL(gui_menu_add_separator) \
__ENUMERATE_SYSCALL(gui_menu_add_item) \
- __ENUMERATE_SYSCALL(gui_app_set_menubar) \
#ifdef SERENITY
diff --git a/LibC/gui.cpp b/LibC/gui.cpp
index d5e355c589..bf8530fa4e 100644
--- a/LibC/gui.cpp
+++ b/LibC/gui.cpp
@@ -69,24 +69,6 @@ int gui_set_global_cursor_tracking_enabled(int window_id, bool enabled)
__RETURN_WITH_ERRNO(rc, rc, -1);
}
-int gui_menubar_add_menu(int menubar_id, int menu_id)
-{
- int rc = syscall(SC_gui_menubar_add_menu, menubar_id, menu_id);
- __RETURN_WITH_ERRNO(rc, rc, -1);
-}
-
-int gui_menu_create(const char* name)
-{
- int rc = syscall(SC_gui_menu_create, name);
- __RETURN_WITH_ERRNO(rc, rc, -1);
-}
-
-int gui_menu_destroy(int menu_id)
-{
- int rc = syscall(SC_gui_menu_destroy, menu_id);
- __RETURN_WITH_ERRNO(rc, rc, -1);
-}
-
int gui_menu_add_separator(int menu_id)
{
int rc = syscall(SC_gui_menu_add_separator, menu_id);
@@ -98,9 +80,3 @@ int gui_menu_add_item(int menu_id, unsigned identifier, const char* text)
int rc = syscall(SC_gui_menu_add_item, menu_id, identifier, text);
__RETURN_WITH_ERRNO(rc, rc, -1);
}
-
-int gui_app_set_menubar(int menubar_id)
-{
- int rc = syscall(SC_gui_app_set_menubar, menubar_id);
- __RETURN_WITH_ERRNO(rc, rc, -1);
-}
diff --git a/LibC/gui.h b/LibC/gui.h
index 91d8fa9c4a..ab563db558 100644
--- a/LibC/gui.h
+++ b/LibC/gui.h
@@ -16,12 +16,8 @@ int gui_set_window_title(int window_id, const char*, size_t);
int gui_get_window_rect(int window_id, GUI_Rect*);
int gui_set_window_rect(int window_id, const GUI_Rect*);
int gui_set_global_cursor_tracking_enabled(int window_id, bool);
-int gui_menubar_add_menu(int menubar_id, int menu_id);
-int gui_menu_create(const char* name);
-int gui_menu_destroy(int menu_id);
int gui_menu_add_separator(int menu_id);
int gui_menu_add_item(int menu_id, unsigned identifier, const char* text);
-int gui_app_set_menubar(int menubar_id);
__END_DECLS
diff --git a/LibGUI/GMenu.cpp b/LibGUI/GMenu.cpp
index 439a71d9cd..18fb9635b3 100644
--- a/LibGUI/GMenu.cpp
+++ b/LibGUI/GMenu.cpp
@@ -1,5 +1,6 @@
#include <LibGUI/GAction.h>
#include <LibGUI/GMenu.h>
+#include <LibGUI/GEventLoop.h>
#include <LibC/gui.h>
#include <AK/HashMap.h>
@@ -26,11 +27,7 @@ GMenu::GMenu(const String& name)
GMenu::~GMenu()
{
- if (m_menu_id) {
- all_menus().remove(m_menu_id);
- gui_menu_destroy(m_menu_id);
- m_menu_id = 0;
- }
+ unrealize_menu();
}
void GMenu::add_action(OwnPtr<GAction>&& action)
@@ -45,7 +42,15 @@ void GMenu::add_separator()
int GMenu::realize_menu()
{
- m_menu_id = gui_menu_create(m_name.characters());
+ GUI_ClientMessage request;
+ request.type = GUI_ClientMessage::Type::CreateMenu;
+ ASSERT(m_name.length() < sizeof(request.menu.text));
+ strcpy(request.menu.text, m_name.characters());
+ request.menu.text_length = m_name.length();
+
+ auto response = GEventLoop::main().sync_request(request, GUI_ServerMessage::Type::DidCreateMenu);
+ m_menu_id = response.menu.menu_id;
+
ASSERT(m_menu_id > 0);
for (size_t i = 0; i < m_items.size(); ++i) {
auto& item = *m_items[i];
@@ -62,6 +67,18 @@ int GMenu::realize_menu()
return m_menu_id;
}
+void GMenu::unrealize_menu()
+{
+ if (!m_menu_id)
+ return;
+ all_menus().remove(m_menu_id);
+ GUI_ClientMessage request;
+ request.type = GUI_ClientMessage::Type::DestroyMenu;
+ request.menu.menu_id = m_menu_id;
+ GEventLoop::main().sync_request(request, GUI_ServerMessage::Type::DidDestroyMenu);
+ m_menu_id = 0;
+}
+
GAction* GMenu::action_at(size_t index)
{
if (index >= m_items.size())
diff --git a/LibGUI/GMenu.h b/LibGUI/GMenu.h
index dceaad72eb..5d56ac0994 100644
--- a/LibGUI/GMenu.h
+++ b/LibGUI/GMenu.h
@@ -24,6 +24,7 @@ private:
friend class GMenuBar;
int menu_id() const { return m_menu_id; }
int realize_menu();
+ void unrealize_menu();
int m_menu_id { 0 };
String m_name;
diff --git a/LibGUI/GMenuBar.cpp b/LibGUI/GMenuBar.cpp
index 3ad0261891..b44bd5f256 100644
--- a/LibGUI/GMenuBar.cpp
+++ b/LibGUI/GMenuBar.cpp
@@ -44,10 +44,16 @@ void GMenuBar::notify_added_to_application(Badge<GApplication>)
ASSERT(menu);
int menu_id = menu->realize_menu();
ASSERT(menu_id > 0);
- int rc = gui_menubar_add_menu(m_menubar_id, menu_id);
- ASSERT(rc == 0);
+ GUI_ClientMessage request;
+ request.type = GUI_ClientMessage::Type::AddMenuToMenubar;
+ request.menu.menubar_id = m_menubar_id;
+ request.menu.menu_id = menu_id;
+ GEventLoop::main().sync_request(request, GUI_ServerMessage::Type::DidAddMenuToMenubar);
}
- gui_app_set_menubar(m_menubar_id);
+ GUI_ClientMessage request;
+ request.type = GUI_ClientMessage::Type::SetApplicationMenubar;
+ request.menu.menubar_id = m_menubar_id;
+ GEventLoop::main().sync_request(request, GUI_ServerMessage::Type::DidSetApplicationMenubar);
}
void GMenuBar::notify_removed_from_application(Badge<GApplication>)
diff --git a/WindowServer/WSMessage.h b/WindowServer/WSMessage.h
index 8e599d2910..a87b4b302e 100644
--- a/WindowServer/WSMessage.h
+++ b/WindowServer/WSMessage.h
@@ -27,6 +27,10 @@ public:
__Begin_API_Client_Requests,
APICreateMenubarRequest,
APIDestroyMenubarRequest,
+ APIAddMenuToMenubarRequest,
+ APISetApplicationMenubarRequest,
+ APICreateMenuRequest,
+ APIDestroyMenuRequest,
__End_API_Client_Requests,
};
@@ -80,6 +84,66 @@ private:
int m_menubar_id { 0 };
};
+class WSAPISetApplicationMenubarRequest : public WSAPIClientRequest {
+public:
+ WSAPISetApplicationMenubarRequest(int client_id, int menubar_id)
+ : WSAPIClientRequest(WSMessage::APISetApplicationMenubarRequest, client_id)
+ , m_menubar_id(menubar_id)
+ {
+ }
+
+ int menubar_id() const { return m_menubar_id; }
+
+private:
+ int m_menubar_id { 0 };
+};
+
+class WSAPIAddMenuToMenubarRequest : public WSAPIClientRequest {
+public:
+ WSAPIAddMenuToMenubarRequest(int client_id, int menubar_id, int menu_id)
+ : WSAPIClientRequest(WSMessage::APIAddMenuToMenubarRequest, client_id)
+ , m_menubar_id(menubar_id)
+ , m_menu_id(menu_id)
+ {
+ }
+
+ int menubar_id() const { return m_menubar_id; }
+ int menu_id() const { return m_menu_id; }
+
+private:
+ int m_menubar_id { 0 };
+ int m_menu_id { 0 };
+};
+
+class WSAPICreateMenuRequest : public WSAPIClientRequest {
+public:
+ WSAPICreateMenuRequest(int client_id, const String& text)
+ : WSAPIClientRequest(WSMessage::APICreateMenuRequest, client_id)
+ , m_text(text)
+ {
+ }
+
+ String text() const { return m_text; }
+
+private:
+ String m_text;
+};
+
+
+class WSAPIDestroyMenuRequest : public WSAPIClientRequest {
+public:
+ WSAPIDestroyMenuRequest(int client_id, int menu_id)
+ : WSAPIClientRequest(WSMessage::APIDestroyMenuRequest, client_id)
+ , m_menu_id(menu_id)
+ {
+ }
+
+ int menu_id() const { return m_menu_id; }
+
+private:
+ int m_menu_id { 0 };
+};
+
class WSClientFinishedPaintMessage final : public WSMessage {
public:
explicit WSClientFinishedPaintMessage(const Rect& rect = Rect())
diff --git a/WindowServer/WSMessageLoop.cpp b/WindowServer/WSMessageLoop.cpp
index 2c1659eb6c..a786a963ea 100644
--- a/WindowServer/WSMessageLoop.cpp
+++ b/WindowServer/WSMessageLoop.cpp
@@ -274,6 +274,19 @@ ssize_t WSMessageLoop::on_receive_from_client(int client_id, const byte* data, s
case GUI_ClientMessage::Type::DestroyMenubar:
post_message(&WSWindowManager::the(), make<WSAPIDestroyMenubarRequest>(client_id, message.menu.menubar_id));
break;
+ case GUI_ClientMessage::Type::SetApplicationMenubar:
+ post_message(&WSWindowManager::the(), make<WSAPISetApplicationMenubarRequest>(client_id, message.menu.menubar_id));
+ break;
+ case GUI_ClientMessage::Type::AddMenuToMenubar:
+ post_message(&WSWindowManager::the(), make<WSAPIAddMenuToMenubarRequest>(client_id, message.menu.menubar_id, message.menu.menu_id));
+ break;
+ case GUI_ClientMessage::Type::CreateMenu:
+ ASSERT(message.menu.text_length < sizeof(message.menu.text));
+ post_message(&WSWindowManager::the(), make<WSAPICreateMenuRequest>(client_id, String(message.menu.text, message.menu.text_length)));
+ break;
+ case GUI_ClientMessage::Type::DestroyMenu:
+ post_message(&WSWindowManager::the(), make<WSAPIDestroyMenuRequest>(client_id, message.menu.menu_id));
+ break;
}
return size;
}
diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp
index 5ac001bc45..ce1fc57ed1 100644
--- a/WindowServer/WSWindowManager.cpp
+++ b/WindowServer/WSWindowManager.cpp
@@ -734,39 +734,109 @@ void WSWindowManager::on_message(WSMessage& message)
return;
}
- if (message.is_client_request()) {
- auto& request = static_cast<WSAPIClientRequest&>(message);
- switch (request.type()) {
- case WSMessage::APICreateMenubarRequest: {
- int menubar_id = m_next_menubar_id++;
- auto menubar = make<WSMenuBar>(menubar_id, *WSMessageLoop::process_from_client_id(request.client_id()));
- m_menubars.set(menubar_id, move(menubar));
- GUI_ServerMessage response;
- response.type = GUI_ServerMessage::Type::DidCreateMenubar;
- response.menu.menubar_id = menubar_id;
- WSMessageLoop::the().post_message_to_client(request.client_id(), response);
- break;
+ if (message.is_client_request())
+ handle_client_request(static_cast<WSAPIClientRequest&>(message));
+}
+
+void WSWindowManager::handle_client_request(WSAPIClientRequest& request)
+{
+ switch (request.type()) {
+ case WSMessage::APICreateMenubarRequest: {
+ int menubar_id = m_next_menubar_id++;
+ auto menubar = make<WSMenuBar>(menubar_id, *WSMessageLoop::process_from_client_id(request.client_id()));
+ m_menubars.set(menubar_id, move(menubar));
+ GUI_ServerMessage response;
+ response.type = GUI_ServerMessage::Type::DidCreateMenubar;
+ response.menu.menubar_id = menubar_id;
+ WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ break;
+ }
+ case WSMessage::APIDestroyMenubarRequest: {
+ int menubar_id = static_cast<WSAPIDestroyMenubarRequest&>(request).menubar_id();
+ auto it = m_menubars.find(menubar_id);
+ if (it == m_menubars.end()) {
+ ASSERT_NOT_REACHED();
+ // FIXME: Send an error.
+ return;
}
- case WSMessage::APIDestroyMenubarRequest: {
- int menubar_id = static_cast<WSAPIDestroyMenubarRequest&>(request).menubar_id();
- auto it = m_menubars.find(menubar_id);
- if (it == m_menubars.end()) {
- ASSERT_NOT_REACHED();
- // FIXME: Send an error.
- return;
- }
- auto& menubar = *(*it).value;
- if (&menubar == m_current_menubar)
- set_current_menubar(nullptr);
- m_menubars.remove(it);
- GUI_ServerMessage response;
- response.type = GUI_ServerMessage::Type::DidDestroyMenubar;
- response.menu.menubar_id = menubar_id;
- WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ auto& menubar = *(*it).value;
+ if (&menubar == m_current_menubar)
+ set_current_menubar(nullptr);
+ m_menubars.remove(it);
+ GUI_ServerMessage response;
+ response.type = GUI_ServerMessage::Type::DidDestroyMenubar;
+ response.menu.menubar_id = menubar_id;
+ WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ break;
+ }
+ case WSMessage::APICreateMenuRequest: {
+ int menu_id = m_next_menu_id++;
+ auto menu = make<WSMenu>(*WSMessageLoop::process_from_client_id(request.client_id()), menu_id, static_cast<WSAPICreateMenuRequest&>(request).text());
+ m_menus.set(menu_id, move(menu));
+ GUI_ServerMessage response;
+ response.type = GUI_ServerMessage::Type::DidCreateMenu;
+ response.menu.menu_id = menu_id;
+ WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ break;
+ }
+ case WSMessage::APIDestroyMenuRequest: {
+ int menu_id = static_cast<WSAPIDestroyMenuRequest&>(request).menu_id();
+ auto it = m_menus.find(menu_id);
+ if (it == m_menus.end()) {
+ ASSERT_NOT_REACHED();
+ // FIXME: Send an error.
+ return;
+ }
+ auto& menu = *(*it).value;
+ close_menu(menu);
+ m_menus.remove(it);
+ GUI_ServerMessage response;
+ response.type = GUI_ServerMessage::Type::DidDestroyMenu;
+ response.menu.menu_id = menu_id;
+ WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ break;
+ }
+ case WSMessage::APISetApplicationMenubarRequest: {
+ int menubar_id = static_cast<WSAPISetApplicationMenubarRequest&>(request).menubar_id();
+ auto it = m_menubars.find(menubar_id);
+ if (it == m_menubars.end()) {
+ ASSERT_NOT_REACHED();
+ // FIXME: Send an error.
+ return;
}
- default:
- break;
+ auto& menubar = *(*it).value;
+ m_app_menubars.set(request.client_id(), &menubar);
+ if (active_client_id() == request.client_id())
+ set_current_menubar(&menubar);
+ invalidate();
+ GUI_ServerMessage response;
+ response.type = GUI_ServerMessage::Type::DidSetApplicationMenubar;
+ response.menu.menubar_id = menubar_id;
+ WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ break;
+ }
+ case WSMessage::APIAddMenuToMenubarRequest: {
+ int menubar_id = static_cast<WSAPIAddMenuToMenubarRequest&>(request).menubar_id();
+ int menu_id = static_cast<WSAPIAddMenuToMenubarRequest&>(request).menu_id();
+ auto it = m_menubars.find(menubar_id);
+ auto jt = m_menus.find(menu_id);
+ if (it == m_menubars.end() || jt == m_menus.end()) {
+ ASSERT_NOT_REACHED();
+ // FIXME: Send an error.
+ return;
}
+ auto& menubar = *(*it).value;
+ auto& menu = *(*jt).value;
+ menubar.add_menu(&menu);
+ GUI_ServerMessage response;
+ response.type = GUI_ServerMessage::Type::DidAddMenuToMenubar;
+ response.menu.menubar_id = menubar_id;
+ response.menu.menu_id = menu_id;
+ WSMessageLoop::the().post_message_to_client(request.client_id(), response);
+ break;
+ }
+ default:
+ break;
}
}
@@ -786,7 +856,7 @@ void WSWindowManager::set_active_window(WSWindow* window)
invalidate(*m_active_window);
ASSERT(window->process());
- auto it = m_app_menubars.find(window->process());
+ auto it = m_app_menubars.find(window->process()->gui_client_id());
if (it != m_app_menubars.end()) {
auto* menubar = (*it).value;
if (menubar != m_current_menubar)
@@ -880,51 +950,6 @@ void WSWindowManager::close_menu(WSMenu& menu)
close_current_menu();
}
-WSMenu& WSWindowManager::create_menu(String&& name)
-{
- LOCKER(m_lock);
- int menu_id = m_next_menu_id++;
- auto menu = make<WSMenu>(*current, menu_id, move(name));
- auto* menu_ptr = menu.ptr();
- m_menus.set(menu_id, move(menu));
- return *menu_ptr;
-}
-
-int WSWindowManager::api$menubar_add_menu(int menubar_id, int menu_id)
-{
- LOCKER(m_lock);
- auto it = m_menubars.find(menubar_id);
- if (it == m_menubars.end())
- return -EBADMENUBAR;
- auto& menubar = *(*it).value;
-
- auto jt = m_menus.find(menu_id);
- if (jt == m_menus.end())
- return -EBADMENU;
- auto& menu = *(*jt).value;
-
- menubar.add_menu(&menu);
- return 0;
-}
-
-int WSWindowManager::api$menu_create(String&& name)
-{
- LOCKER(m_lock);
- return create_menu(move(name)).menu_id();
-}
-
-int WSWindowManager::api$menu_destroy(int menu_id)
-{
- LOCKER(m_lock);
- auto it = m_menus.find(menu_id);
- if (it == m_menus.end())
- return -EBADMENU;
- auto& menu = *(*it).value;
- close_menu(menu);
- m_menus.remove(it);
- return 0;
-}
-
int WSWindowManager::api$menu_add_separator(int menu_id)
{
LOCKER(m_lock);
@@ -947,24 +972,10 @@ int WSWindowManager::api$menu_add_item(int menu_id, unsigned identifier, String&
return 0;
}
-const Process* WSWindowManager::active_process() const
+int WSWindowManager::active_client_id() const
{
if (m_active_window)
- return m_active_window->process();
- return nullptr;
-}
-
-int WSWindowManager::api$app_set_menubar(int menubar_id)
-{
- LOCKER(m_lock);
- auto it = m_menubars.find(menubar_id);
- if (it == m_menubars.end())
- return -EBADMENUBAR;
- auto& menubar = *(*it).value;
- m_app_menubars.set(current, &menubar);
- if (active_process() == current)
- set_current_menubar(&menubar);
- invalidate();
+ return m_active_window->process()->gui_client_id();
return 0;
}
@@ -996,5 +1007,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(&process);
+ m_app_menubars.remove(process.gui_client_id());
}
diff --git a/WindowServer/WSWindowManager.h b/WindowServer/WSWindowManager.h
index 5a4c315503..9c15055265 100644
--- a/WindowServer/WSWindowManager.h
+++ b/WindowServer/WSWindowManager.h
@@ -12,6 +12,7 @@
#include "WSMenuBar.h"
#include <WindowServer/WSWindowType.h>
+class WSAPIClientRequest;
class WSScreen;
class WSMenuBar;
class WSMouseEvent;
@@ -32,7 +33,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;
+ int active_client_id() const;
void move_to_front(WSWindow&);
@@ -59,12 +60,8 @@ public:
Color menu_selection_color() const { return m_menu_selection_color; }
int menubar_menu_margin() const;
- int api$menubar_add_menu(int menubar_id, int menu_id);
- int api$menu_create(String&&);
- int api$menu_destroy(int menu_id);
int api$menu_add_separator(int menu_id);
int api$menu_add_item(int menu_id, unsigned identifier, String&& text);
- int api$app_set_menubar(int menubar_id);
void destroy_all_menus(Process&);
private:
@@ -76,6 +73,7 @@ private:
void handle_menubar_mouse_event(WSMenuBar&, WSMouseEvent&);
void handle_titlebar_mouse_event(WSWindow&, WSMouseEvent&);
void handle_close_button_mouse_event(WSWindow&, WSMouseEvent&);
+ void handle_client_request(WSAPIClientRequest&);
void set_active_window(WSWindow*);
template<typename Callback> IterationDecision for_each_visible_window_of_type_from_back_to_front(WSWindowType, Callback);
@@ -84,7 +82,6 @@ private:
template<typename Callback> IterationDecision for_each_visible_window_from_back_to_front(Callback);
template<typename Callback> void for_each_active_menubar_menu(Callback);
void close_current_menu();
- WSMenu& create_menu(String&& name);
virtual void on_message(WSMessage&) override;
@@ -156,5 +153,5 @@ private:
WSMenu* m_current_menu { nullptr };
HashMap<int, OwnPtr<WSMenuBar>> m_menubars;
HashMap<int, OwnPtr<WSMenu>> m_menus;
- HashMap<const Process*, WSMenuBar*> m_app_menubars;
+ HashMap<int, WSMenuBar*> m_app_menubars;
};