1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-19 08:12:06 +00:00

WindowServer: Port to the new IPC system

This patch introduces code generation for the WindowServer IPC with
its clients. The client/server endpoints are defined by the two .ipc
files in Servers/WindowServer/: WindowServer.ipc and WindowClient.ipc

It now becomes significantly easier to add features and capabilities
to WindowServer since you don't have to know nearly as much about all
the intricate paths that IPC messages take between LibGUI and WSWindow.

The new system also uses significantly less IPC bandwidth since we're
now doing packed serialization instead of passing fixed-sized structs
of ~600 bytes for each message.

Some repaint coalescing optimizations are lost in this conversion and
we'll need to look at how to implement those in the new world.

The old CoreIPC::Client::Connection and CoreIPC::Server::Connection
classes are removed by this patch and replaced by use of ConnectionNG,
which will be renamed eventually.

Goodbye, old WindowServer IPC. You served us well :^)
This commit is contained in:
Andreas Kling 2019-12-02 09:33:37 +01:00
parent 30db7813de
commit 272d65e3e2
42 changed files with 843 additions and 2853 deletions

View file

@ -3,8 +3,8 @@
#include "WSEventLoop.h"
#include "WSScreen.h"
#include "WSWindowManager.h"
#include <WindowServer/WSAPITypes.h>
#include <WindowServer/WSClientConnection.h>
#include <WindowServer/WindowClientEndpoint.h>
static String default_window_icon_path()
{
@ -41,7 +41,7 @@ WSWindow::WSWindow(WSClientConnection& client, WSWindowType window_type, int win
{
// FIXME: This should not be hard-coded here.
if (m_type == WSWindowType::Taskbar) {
m_wm_event_mask = WSAPI_WMEventMask::WindowStateChanges | WSAPI_WMEventMask::WindowRemovals | WSAPI_WMEventMask::WindowIconChanges;
m_wm_event_mask = WSWMEventMask::WindowStateChanges | WSWMEventMask::WindowRemovals | WSWMEventMask::WindowIconChanges;
m_listens_to_wm_events = true;
}
WSWindowManager::the().add_window(*this);
@ -73,76 +73,29 @@ void WSWindow::set_rect(const Rect& rect)
m_frame.notify_window_rect_changed(old_rect, rect);
}
// FIXME: Just use the same types.
static WSAPI_MouseButton to_api(MouseButton button)
{
switch (button) {
case MouseButton::None:
return WSAPI_MouseButton::NoButton;
case MouseButton::Left:
return WSAPI_MouseButton::Left;
case MouseButton::Right:
return WSAPI_MouseButton::Right;
case MouseButton::Middle:
return WSAPI_MouseButton::Middle;
}
ASSERT_NOT_REACHED();
}
void WSWindow::handle_mouse_event(const WSMouseEvent& event)
{
set_automatic_cursor_tracking_enabled(event.buttons() != 0);
WSAPI_ServerMessage server_message;
server_message.window_id = window_id();
switch (event.type()) {
case WSEvent::MouseMove:
server_message.type = WSAPI_ServerMessage::Type::MouseMove;
m_client->post_message(WindowClient::MouseMove(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()));
break;
case WSEvent::MouseDown:
server_message.type = WSAPI_ServerMessage::Type::MouseDown;
m_client->post_message(WindowClient::MouseDown(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()));
break;
case WSEvent::MouseDoubleClick:
server_message.type = WSAPI_ServerMessage::Type::MouseDoubleClick;
m_client->post_message(WindowClient::MouseDoubleClick(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()));
break;
case WSEvent::MouseUp:
server_message.type = WSAPI_ServerMessage::Type::MouseUp;
m_client->post_message(WindowClient::MouseUp(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()));
break;
case WSEvent::MouseWheel:
server_message.type = WSAPI_ServerMessage::Type::MouseWheel;
m_client->post_message(WindowClient::MouseWheel(m_window_id, event.position(), (u32)event.button(), event.buttons(), event.modifiers(), event.wheel_delta()));
break;
default:
ASSERT_NOT_REACHED();
}
server_message.mouse.position = event.position();
server_message.mouse.button = to_api(event.button());
server_message.mouse.buttons = event.buttons();
server_message.mouse.modifiers = event.modifiers();
server_message.mouse.wheel_delta = event.wheel_delta();
m_client->post_message(server_message);
}
static WSAPI_WindowType to_api(WSWindowType ws_type)
{
switch (ws_type) {
case WSWindowType::Normal:
return WSAPI_WindowType::Normal;
case WSWindowType::Menu:
return WSAPI_WindowType::Menu;
case WSWindowType::WindowSwitcher:
return WSAPI_WindowType::WindowSwitcher;
case WSWindowType::Taskbar:
return WSAPI_WindowType::Taskbar;
case WSWindowType::Tooltip:
return WSAPI_WindowType::Tooltip;
case WSWindowType::Menubar:
return WSAPI_WindowType::Menubar;
default:
ASSERT_NOT_REACHED();
}
}
void WSWindow::set_minimized(bool minimized)
@ -183,101 +136,96 @@ void WSWindow::event(CEvent& event)
if (is_blocked_by_modal_window())
return;
WSAPI_ServerMessage server_message;
server_message.window_id = window_id();
if (static_cast<WSEvent&>(event).is_mouse_event())
return handle_mouse_event(static_cast<const WSMouseEvent&>(event));
switch (event.type()) {
case WSEvent::WindowEntered:
server_message.type = WSAPI_ServerMessage::Type::WindowEntered;
m_client->post_message(WindowClient::WindowEntered(m_window_id));
break;
case WSEvent::WindowLeft:
server_message.type = WSAPI_ServerMessage::Type::WindowLeft;
m_client->post_message(WindowClient::WindowLeft(m_window_id));
break;
case WSEvent::KeyDown:
server_message.type = WSAPI_ServerMessage::Type::KeyDown;
server_message.key.character = static_cast<const WSKeyEvent&>(event).character();
server_message.key.key = static_cast<const WSKeyEvent&>(event).key();
server_message.key.modifiers = static_cast<const WSKeyEvent&>(event).modifiers();
m_client->post_message(
WindowClient::KeyDown(m_window_id,
(u8) static_cast<const WSKeyEvent&>(event).character(),
(u32) static_cast<const WSKeyEvent&>(event).key(),
static_cast<const WSKeyEvent&>(event).modifiers()));
break;
case WSEvent::KeyUp:
server_message.type = WSAPI_ServerMessage::Type::KeyUp;
server_message.key.character = static_cast<const WSKeyEvent&>(event).character();
server_message.key.key = static_cast<const WSKeyEvent&>(event).key();
server_message.key.modifiers = static_cast<const WSKeyEvent&>(event).modifiers();
m_client->post_message(
WindowClient::KeyUp(m_window_id,
(u8) static_cast<const WSKeyEvent&>(event).character(),
(u32) static_cast<const WSKeyEvent&>(event).key(),
static_cast<const WSKeyEvent&>(event).modifiers()));
break;
case WSEvent::WindowActivated:
server_message.type = WSAPI_ServerMessage::Type::WindowActivated;
m_client->post_message(WindowClient::WindowActivated(m_window_id));
break;
case WSEvent::WindowDeactivated:
server_message.type = WSAPI_ServerMessage::Type::WindowDeactivated;
m_client->post_message(WindowClient::WindowDeactivated(m_window_id));
break;
case WSEvent::WindowCloseRequest:
server_message.type = WSAPI_ServerMessage::Type::WindowCloseRequest;
m_client->post_message(WindowClient::WindowCloseRequest(m_window_id));
break;
case WSEvent::WindowResized:
server_message.type = WSAPI_ServerMessage::Type::WindowResized;
server_message.window.old_rect = static_cast<const WSResizeEvent&>(event).old_rect();
server_message.window.rect = static_cast<const WSResizeEvent&>(event).rect();
m_client->post_message(
WindowClient::WindowResized(
m_window_id,
static_cast<const WSResizeEvent&>(event).old_rect(),
static_cast<const WSResizeEvent&>(event).rect()));
break;
case WSEvent::WM_WindowRemoved: {
auto& removed_event = static_cast<const WSWMWindowRemovedEvent&>(event);
server_message.type = WSAPI_ServerMessage::Type::WM_WindowRemoved;
server_message.wm.client_id = removed_event.client_id();
server_message.wm.window_id = removed_event.window_id();
m_client->post_message(WindowClient::WM_WindowRemoved(
removed_event.client_id(),
removed_event.window_id()));
break;
}
case WSEvent::WM_WindowStateChanged: {
auto& changed_event = static_cast<const WSWMWindowStateChangedEvent&>(event);
server_message.type = WSAPI_ServerMessage::Type::WM_WindowStateChanged;
server_message.wm.client_id = changed_event.client_id();
server_message.wm.window_id = changed_event.window_id();
server_message.wm.is_active = changed_event.is_active();
server_message.wm.is_minimized = changed_event.is_minimized();
server_message.wm.window_type = to_api(changed_event.window_type());
ASSERT(changed_event.title().length() < (int)sizeof(server_message.text));
memcpy(server_message.text, changed_event.title().characters(), changed_event.title().length());
server_message.text_length = changed_event.title().length();
server_message.wm.rect = changed_event.rect();
m_client->post_message(WindowClient::WM_WindowStateChanged(
changed_event.client_id(),
changed_event.window_id(),
changed_event.is_active(),
changed_event.is_minimized(),
(i32)(changed_event.window_type()),
changed_event.title(),
changed_event.rect()));
break;
}
case WSEvent::WM_WindowIconBitmapChanged: {
auto& changed_event = static_cast<const WSWMWindowIconBitmapChangedEvent&>(event);
server_message.type = WSAPI_ServerMessage::Type::WM_WindowIconBitmapChanged;
server_message.wm.client_id = changed_event.client_id();
server_message.wm.window_id = changed_event.window_id();
server_message.wm.icon_buffer_id = changed_event.icon_buffer_id();
server_message.wm.icon_size = changed_event.icon_size();
// FIXME: Perhaps we should update the bitmap sharing list somewhere else instead?
ASSERT(client());
dbg() << "WindowServer: Sharing icon buffer " << changed_event.icon_buffer_id() << " with PID " << client()->client_pid();
if (share_buffer_with(changed_event.icon_buffer_id(), client()->client_pid()) < 0) {
if (share_buffer_with(changed_event.icon_buffer_id(), m_client->client_pid()) < 0) {
ASSERT_NOT_REACHED();
}
m_client->post_message(
WindowClient::WM_WindowIconBitmapChanged(
changed_event.client_id(),
changed_event.window_id(),
changed_event.icon_buffer_id(),
changed_event.icon_size()));
break;
}
case WSEvent::WM_WindowRectChanged: {
auto& changed_event = static_cast<const WSWMWindowRectChangedEvent&>(event);
server_message.type = WSAPI_ServerMessage::Type::WM_WindowRectChanged;
server_message.wm.client_id = changed_event.client_id();
server_message.wm.window_id = changed_event.window_id();
server_message.wm.rect = changed_event.rect();
m_client->post_message(
WindowClient::WM_WindowRectChanged(
changed_event.client_id(),
changed_event.window_id(),
changed_event.rect()));
break;
}
default:
break;
}
if (server_message.type == WSAPI_ServerMessage::Type::Invalid)
return;
m_client->post_message(server_message);
}
void WSWindow::set_global_cursor_tracking_enabled(bool enabled)