mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 14:07:42 +00:00
WindowServer: Refactor WSClientConnection to have one function per request.
This is a lot nicer than the big switch full of code. This stuff has a bit of a "please generate me instead" vibe to it, but I need to mess around with it some more to figure out what the needs are. This patch also unbreaks global cursor tracking, which was forgotten in the big messaging refactoring.
This commit is contained in:
parent
aa7947c889
commit
28da956a12
4 changed files with 341 additions and 252 deletions
|
@ -49,7 +49,7 @@ WSClientConnection::~WSClientConnection()
|
|||
void WSClientConnection::on_message(WSMessage& message)
|
||||
{
|
||||
if (message.is_client_request()) {
|
||||
handle_client_request(static_cast<WSAPIClientRequest&>(message));
|
||||
on_request(static_cast<WSAPIClientRequest&>(message));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -61,10 +61,8 @@ void WSClientConnection::on_message(WSMessage& message)
|
|||
}
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
||||
void WSClientConnection::handle_request(WSAPICreateMenubarRequest& 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));
|
||||
|
@ -72,10 +70,11 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
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();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIDestroyMenubarRequest& request)
|
||||
{
|
||||
int menubar_id = request.menubar_id();
|
||||
auto it = m_menubars.find(menubar_id);
|
||||
if (it == m_menubars.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -89,19 +88,21 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
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: {
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPICreateMenuRequest& request)
|
||||
{
|
||||
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());
|
||||
auto menu = make<WSMenu>(*WSMessageLoop::process_from_client_id(request.client_id()), menu_id, 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: {
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIDestroyMenuRequest& request)
|
||||
{
|
||||
int menu_id = static_cast<WSAPIDestroyMenuRequest&>(request).menu_id();
|
||||
auto it = m_menus.find(menu_id);
|
||||
if (it == m_menus.end()) {
|
||||
|
@ -116,10 +117,11 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
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();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPISetApplicationMenubarRequest& request)
|
||||
{
|
||||
int menubar_id = request.menubar_id();
|
||||
auto it = m_menubars.find(menubar_id);
|
||||
if (it == m_menubars.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -133,11 +135,12 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
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();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIAddMenuToMenubarRequest& request)
|
||||
{
|
||||
int menubar_id = request.menubar_id();
|
||||
int menu_id = 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()) {
|
||||
|
@ -151,12 +154,13 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
response.menu.menubar_id = menubar_id;
|
||||
response.menu.menu_id = menu_id;
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIAddMenuItemRequest: {
|
||||
int menu_id = static_cast<WSAPIAddMenuItemRequest&>(request).menu_id();
|
||||
unsigned identifier = static_cast<WSAPIAddMenuItemRequest&>(request).identifier();
|
||||
String text = static_cast<WSAPIAddMenuItemRequest&>(request).text();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIAddMenuItemRequest& request)
|
||||
{
|
||||
int menu_id = request.menu_id();
|
||||
unsigned identifier = request.identifier();
|
||||
String text = request.text();
|
||||
auto it = m_menus.find(menu_id);
|
||||
if (it == m_menus.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -168,10 +172,11 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
response.menu.menu_id = menu_id;
|
||||
response.menu.identifier = identifier;
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIAddMenuSeparatorRequest: {
|
||||
int menu_id = static_cast<WSAPIAddMenuSeparatorRequest&>(request).menu_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIAddMenuSeparatorRequest& request)
|
||||
{
|
||||
int menu_id = request.menu_id();
|
||||
auto it = m_menus.find(menu_id);
|
||||
if (it == m_menus.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -182,20 +187,22 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
response.type = GUI_ServerMessage::Type::DidAddMenuSeparator;
|
||||
response.menu.menu_id = menu_id;
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APISetWindowTitleRequest: {
|
||||
int window_id = static_cast<WSAPISetWindowTitleRequest&>(request).window_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPISetWindowTitleRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
auto& window = *(*it).value;
|
||||
window.set_title(static_cast<WSAPISetWindowTitleRequest&>(request).title());
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIGetWindowTitleRequest: {
|
||||
int window_id = static_cast<WSAPIGetWindowTitleRequest&>(request).window_id();
|
||||
window.set_title(request.title());
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIGetWindowTitleRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -208,20 +215,22 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
strcpy(response.text, window.title().characters());
|
||||
response.text_length = window.title().length();
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APISetWindowRectRequest: {
|
||||
int window_id = static_cast<WSAPISetWindowRectRequest&>(request).window_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPISetWindowRectRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
auto& window = *(*it).value;
|
||||
window.set_rect(static_cast<WSAPISetWindowRectRequest&>(request).rect());
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIGetWindowRectRequest: {
|
||||
int window_id = static_cast<WSAPIGetWindowRectRequest&>(request).window_id();
|
||||
window.set_rect(request.rect());
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIGetWindowRectRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -232,22 +241,24 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
response.window_id = window.window_id();
|
||||
response.window.rect = window.rect();
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APICreateWindowRequest: {
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPICreateWindowRequest& request)
|
||||
{
|
||||
int window_id = m_next_window_id++;
|
||||
auto window = make<WSWindow>(request.client_id(), window_id);
|
||||
window->set_title(static_cast<WSAPICreateWindowRequest&>(request).title());
|
||||
window->set_rect(static_cast<WSAPICreateWindowRequest&>(request).rect());
|
||||
window->set_title(request.title());
|
||||
window->set_rect(request.rect());
|
||||
m_windows.set(window_id, move(window));
|
||||
GUI_ServerMessage response;
|
||||
response.type = GUI_ServerMessage::Type::DidCreateWindow;
|
||||
response.window_id = window_id;
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIDestroyWindowRequest: {
|
||||
int window_id = static_cast<WSAPIGetWindowRectRequest&>(request).window_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIDestroyWindowRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -255,10 +266,11 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
auto& window = *(*it).value;
|
||||
WSWindowManager::the().invalidate(window);
|
||||
m_windows.remove(it);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIInvalidateRectRequest: {
|
||||
int window_id = static_cast<WSAPIInvalidateRectRequest&>(request).window_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIInvalidateRectRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -266,22 +278,24 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
GUI_ServerMessage response;
|
||||
response.type = GUI_ServerMessage::Type::Paint;
|
||||
response.window_id = window_id;
|
||||
response.paint.rect = static_cast<WSAPIInvalidateRectRequest&>(request).rect();
|
||||
response.paint.rect = request.rect();
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIDidFinishPaintingNotification: {
|
||||
int window_id = static_cast<WSAPIDidFinishPaintingNotification&>(request).window_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIDidFinishPaintingNotification& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
auto& window = *(*it).value;
|
||||
WSWindowManager::the().invalidate(window, static_cast<WSAPIDidFinishPaintingNotification&>(request).rect());
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIGetWindowBackingStoreRequest: {
|
||||
int window_id = static_cast<WSAPIGetWindowBackingStoreRequest&>(request).window_id();
|
||||
WSWindowManager::the().invalidate(window, request.rect());
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIGetWindowBackingStoreRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
|
@ -301,15 +315,68 @@ void WSClientConnection::handle_client_request(WSAPIClientRequest& request)
|
|||
response.backing.size = backing_store->size();
|
||||
response.backing.pixels = reinterpret_cast<RGBA32*>(backing_store->client_region()->laddr().as_ptr());
|
||||
WSMessageLoop::the().post_message_to_client(request.client_id(), response);
|
||||
break;
|
||||
}
|
||||
case WSMessage::APIReleaseWindowBackingStoreRequest: {
|
||||
int backing_store_id = static_cast<WSAPIReleaseWindowBackingStoreRequest&>(request).backing_store_id();
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPIReleaseWindowBackingStoreRequest& request)
|
||||
{
|
||||
int backing_store_id = request.backing_store_id();
|
||||
// FIXME: It shouldn't work this way!
|
||||
auto* backing_store = (GraphicsBitmap*)backing_store_id;
|
||||
backing_store->release();
|
||||
break;
|
||||
}
|
||||
|
||||
void WSClientConnection::handle_request(WSAPISetGlobalCursorTrackingRequest& request)
|
||||
{
|
||||
int window_id = request.window_id();
|
||||
auto it = m_windows.find(window_id);
|
||||
if (it == m_windows.end()) {
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
auto& window = *(*it).value;
|
||||
window.set_global_cursor_tracking_enabled(request.value());
|
||||
}
|
||||
|
||||
void WSClientConnection::on_request(WSAPIClientRequest& request)
|
||||
{
|
||||
switch (request.type()) {
|
||||
case WSMessage::APICreateMenubarRequest:
|
||||
return handle_request(static_cast<WSAPICreateMenubarRequest&>(request));
|
||||
case WSMessage::APIDestroyMenubarRequest:
|
||||
return handle_request(static_cast<WSAPIDestroyMenubarRequest&>(request));
|
||||
case WSMessage::APICreateMenuRequest:
|
||||
return handle_request(static_cast<WSAPICreateMenuRequest&>(request));
|
||||
case WSMessage::APIDestroyMenuRequest:
|
||||
return handle_request(static_cast<WSAPIDestroyMenuRequest&>(request));
|
||||
case WSMessage::APISetApplicationMenubarRequest:
|
||||
return handle_request(static_cast<WSAPISetApplicationMenubarRequest&>(request));
|
||||
case WSMessage::APIAddMenuToMenubarRequest:
|
||||
return handle_request(static_cast<WSAPIAddMenuToMenubarRequest&>(request));
|
||||
case WSMessage::APIAddMenuItemRequest:
|
||||
return handle_request(static_cast<WSAPIAddMenuItemRequest&>(request));
|
||||
case WSMessage::APIAddMenuSeparatorRequest:
|
||||
return handle_request(static_cast<WSAPIAddMenuSeparatorRequest&>(request));
|
||||
case WSMessage::APISetWindowTitleRequest:
|
||||
return handle_request(static_cast<WSAPISetWindowTitleRequest&>(request));
|
||||
case WSMessage::APIGetWindowTitleRequest:
|
||||
return handle_request(static_cast<WSAPIGetWindowTitleRequest&>(request));
|
||||
case WSMessage::APISetWindowRectRequest:
|
||||
return handle_request(static_cast<WSAPISetWindowRectRequest&>(request));
|
||||
case WSMessage::APIGetWindowRectRequest:
|
||||
return handle_request(static_cast<WSAPIGetWindowRectRequest&>(request));
|
||||
case WSMessage::APICreateWindowRequest:
|
||||
return handle_request(static_cast<WSAPICreateWindowRequest&>(request));
|
||||
case WSMessage::APIDestroyWindowRequest:
|
||||
return handle_request(static_cast<WSAPIDestroyWindowRequest&>(request));
|
||||
case WSMessage::APIInvalidateRectRequest:
|
||||
return handle_request(static_cast<WSAPIInvalidateRectRequest&>(request));
|
||||
case WSMessage::APIDidFinishPaintingNotification:
|
||||
return handle_request(static_cast<WSAPIDidFinishPaintingNotification&>(request));
|
||||
case WSMessage::APIGetWindowBackingStoreRequest:
|
||||
return handle_request(static_cast<WSAPIGetWindowBackingStoreRequest&>(request));
|
||||
case WSMessage::APIReleaseWindowBackingStoreRequest:
|
||||
return handle_request(static_cast<WSAPIReleaseWindowBackingStoreRequest&>(request));
|
||||
case WSMessage::APISetGlobalCursorTrackingRequest:
|
||||
return handle_request(static_cast<WSAPISetGlobalCursorTrackingRequest&>(request));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -4,11 +4,11 @@
|
|||
#include <AK/OwnPtr.h>
|
||||
#include <AK/WeakPtr.h>
|
||||
#include <WindowServer/WSMessageReceiver.h>
|
||||
#include <WindowServer/WSMessage.h>
|
||||
|
||||
class WSWindow;
|
||||
class WSMenu;
|
||||
class WSMenuBar;
|
||||
class WSAPIClientRequest;
|
||||
|
||||
// FIXME: Remove.
|
||||
class Process;
|
||||
|
@ -30,7 +30,26 @@ public:
|
|||
private:
|
||||
virtual void on_message(WSMessage&) override;
|
||||
|
||||
void handle_client_request(WSAPIClientRequest&);
|
||||
void on_request(WSAPIClientRequest&);
|
||||
void handle_request(WSAPICreateMenubarRequest&);
|
||||
void handle_request(WSAPIDestroyMenubarRequest&);
|
||||
void handle_request(WSAPICreateMenuRequest&);
|
||||
void handle_request(WSAPIDestroyMenuRequest&);
|
||||
void handle_request(WSAPISetApplicationMenubarRequest&);
|
||||
void handle_request(WSAPIAddMenuToMenubarRequest&);
|
||||
void handle_request(WSAPIAddMenuItemRequest&);
|
||||
void handle_request(WSAPIAddMenuSeparatorRequest&);
|
||||
void handle_request(WSAPISetWindowTitleRequest&);
|
||||
void handle_request(WSAPIGetWindowTitleRequest&);
|
||||
void handle_request(WSAPISetWindowRectRequest&);
|
||||
void handle_request(WSAPIGetWindowRectRequest&);
|
||||
void handle_request(WSAPICreateWindowRequest&);
|
||||
void handle_request(WSAPIDestroyWindowRequest&);
|
||||
void handle_request(WSAPIInvalidateRectRequest&);
|
||||
void handle_request(WSAPIDidFinishPaintingNotification&);
|
||||
void handle_request(WSAPIGetWindowBackingStoreRequest&);
|
||||
void handle_request(WSAPIReleaseWindowBackingStoreRequest&);
|
||||
void handle_request(WSAPISetGlobalCursorTrackingRequest&);
|
||||
|
||||
int m_client_id { 0 };
|
||||
|
||||
|
|
|
@ -87,15 +87,18 @@ private:
|
|||
|
||||
class WSAPISetGlobalCursorTrackingRequest : public WSAPIClientRequest {
|
||||
public:
|
||||
WSAPISetGlobalCursorTrackingRequest(int client_id, bool value)
|
||||
WSAPISetGlobalCursorTrackingRequest(int client_id, int window_id, bool value)
|
||||
: WSAPIClientRequest(WSMessage::APISetGlobalCursorTrackingRequest, client_id)
|
||||
, m_window_id(window_id)
|
||||
, m_value(value)
|
||||
{
|
||||
}
|
||||
|
||||
int window_id() const { return m_window_id; }
|
||||
bool value() const { return m_value; }
|
||||
|
||||
private:
|
||||
int m_window_id { 0 };
|
||||
bool m_value { false };
|
||||
};
|
||||
|
||||
|
|
|
@ -344,7 +344,7 @@ ssize_t WSMessageLoop::on_receive_from_client(int client_id, const byte* data, s
|
|||
post_message(client, make<WSAPIReleaseWindowBackingStoreRequest>(client_id, (int)message.backing.backing_store_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::SetGlobalCursorTracking:
|
||||
post_message(client, make<WSAPISetGlobalCursorTrackingRequest>(client_id, message.value));
|
||||
post_message(client, make<WSAPISetGlobalCursorTrackingRequest>(client_id, message.window_id, message.value));
|
||||
break;
|
||||
}
|
||||
server_process().request_wakeup();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue