1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:57:36 +00:00

WindowServer: Add WSClientConnection::post_message().

This way WSWindow doesn't have to grab at the Process.
This commit is contained in:
Andreas Kling 2019-02-14 10:15:49 +01:00
parent 427df5f312
commit 9ab9734da0
3 changed files with 43 additions and 39 deletions

View file

@ -57,6 +57,14 @@ void WSClientConnection::post_error(const String& error_message)
WSMessageLoop::the().post_message_to_client(m_client_id, message); WSMessageLoop::the().post_message_to_client(m_client_id, message);
} }
void WSClientConnection::post_message(GUI_ServerMessage&& message)
{
if (!m_process)
return;
LOCKER(m_process->gui_events_lock());
m_process->gui_events().append(move(message));
}
void WSClientConnection::on_message(WSMessage& message) void WSClientConnection::on_message(WSMessage& message)
{ {
if (message.is_client_request()) { if (message.is_client_request()) {

View file

@ -9,6 +9,7 @@
class WSWindow; class WSWindow;
class WSMenu; class WSMenu;
class WSMenuBar; class WSMenuBar;
struct GUI_ServerMessage;
// FIXME: Remove. // FIXME: Remove.
class Process; class Process;
@ -21,6 +22,8 @@ public:
static WSClientConnection* from_client_id(int client_id); static WSClientConnection* from_client_id(int client_id);
static WSClientConnection* ensure_for_client_id(int client_id); static WSClientConnection* ensure_for_client_id(int client_id);
void post_message(GUI_ServerMessage&&);
// FIXME: Remove. // FIXME: Remove.
Process* process() { return m_process.ptr(); } Process* process() { return m_process.ptr(); }

View file

@ -85,69 +85,62 @@ void WSWindow::on_message(WSMessage& message)
return; return;
} }
GUI_ServerMessage gui_event; GUI_ServerMessage server_message;
gui_event.window_id = window_id(); server_message.window_id = window_id();
switch (message.type()) { switch (message.type()) {
case WSMessage::MouseMove: case WSMessage::MouseMove:
gui_event.type = GUI_ServerMessage::Type::MouseMove; server_message.type = GUI_ServerMessage::Type::MouseMove;
gui_event.mouse.position = static_cast<WSMouseEvent&>(message).position(); server_message.mouse.position = static_cast<WSMouseEvent&>(message).position();
gui_event.mouse.button = GUI_MouseButton::NoButton; server_message.mouse.button = GUI_MouseButton::NoButton;
gui_event.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons(); server_message.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons();
break; break;
case WSMessage::MouseDown: case WSMessage::MouseDown:
gui_event.type = GUI_ServerMessage::Type::MouseDown; server_message.type = GUI_ServerMessage::Type::MouseDown;
gui_event.mouse.position = static_cast<WSMouseEvent&>(message).position(); server_message.mouse.position = static_cast<WSMouseEvent&>(message).position();
gui_event.mouse.button = to_api(static_cast<WSMouseEvent&>(message).button()); server_message.mouse.button = to_api(static_cast<WSMouseEvent&>(message).button());
gui_event.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons(); server_message.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons();
break; break;
case WSMessage::MouseUp: case WSMessage::MouseUp:
gui_event.type = GUI_ServerMessage::Type::MouseUp; server_message.type = GUI_ServerMessage::Type::MouseUp;
gui_event.mouse.position = static_cast<WSMouseEvent&>(message).position(); server_message.mouse.position = static_cast<WSMouseEvent&>(message).position();
gui_event.mouse.button = to_api(static_cast<WSMouseEvent&>(message).button()); server_message.mouse.button = to_api(static_cast<WSMouseEvent&>(message).button());
gui_event.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons(); server_message.mouse.buttons = static_cast<WSMouseEvent&>(message).buttons();
break; break;
case WSMessage::KeyDown: case WSMessage::KeyDown:
gui_event.type = GUI_ServerMessage::Type::KeyDown; server_message.type = GUI_ServerMessage::Type::KeyDown;
gui_event.key.character = static_cast<WSKeyEvent&>(message).character(); server_message.key.character = static_cast<WSKeyEvent&>(message).character();
gui_event.key.key = static_cast<WSKeyEvent&>(message).key(); server_message.key.key = static_cast<WSKeyEvent&>(message).key();
gui_event.key.alt = static_cast<WSKeyEvent&>(message).alt(); server_message.key.alt = static_cast<WSKeyEvent&>(message).alt();
gui_event.key.ctrl = static_cast<WSKeyEvent&>(message).ctrl(); server_message.key.ctrl = static_cast<WSKeyEvent&>(message).ctrl();
gui_event.key.shift = static_cast<WSKeyEvent&>(message).shift(); server_message.key.shift = static_cast<WSKeyEvent&>(message).shift();
break; break;
case WSMessage::KeyUp: case WSMessage::KeyUp:
gui_event.type = GUI_ServerMessage::Type::KeyUp; server_message.type = GUI_ServerMessage::Type::KeyUp;
gui_event.key.character = static_cast<WSKeyEvent&>(message).character(); server_message.key.character = static_cast<WSKeyEvent&>(message).character();
gui_event.key.key = static_cast<WSKeyEvent&>(message).key(); server_message.key.key = static_cast<WSKeyEvent&>(message).key();
gui_event.key.alt = static_cast<WSKeyEvent&>(message).alt(); server_message.key.alt = static_cast<WSKeyEvent&>(message).alt();
gui_event.key.ctrl = static_cast<WSKeyEvent&>(message).ctrl(); server_message.key.ctrl = static_cast<WSKeyEvent&>(message).ctrl();
gui_event.key.shift = static_cast<WSKeyEvent&>(message).shift(); server_message.key.shift = static_cast<WSKeyEvent&>(message).shift();
break; break;
case WSMessage::WindowActivated: case WSMessage::WindowActivated:
gui_event.type = GUI_ServerMessage::Type::WindowActivated; server_message.type = GUI_ServerMessage::Type::WindowActivated;
break; break;
case WSMessage::WindowDeactivated: case WSMessage::WindowDeactivated:
gui_event.type = GUI_ServerMessage::Type::WindowDeactivated; server_message.type = GUI_ServerMessage::Type::WindowDeactivated;
break; break;
case WSMessage::WindowCloseRequest: case WSMessage::WindowCloseRequest:
gui_event.type = GUI_ServerMessage::Type::WindowCloseRequest; server_message.type = GUI_ServerMessage::Type::WindowCloseRequest;
break; break;
default: default:
break; break;
} }
if (gui_event.type == GUI_ServerMessage::Type::Invalid) if (server_message.type == GUI_ServerMessage::Type::Invalid)
return; return;
{ if (auto* client = WSClientConnection::from_client_id(m_client_id))
WSWindowLocker window_locker(*this); client->post_message(move(server_message));
if (auto* client = WSClientConnection::from_client_id(m_client_id)) {
if (auto* process = client->process()) {
LOCKER(process->gui_events_lock());
process->gui_events().append(move(gui_event));
}
}
}
} }
void WSWindow::set_global_cursor_tracking_enabled(bool enabled) void WSWindow::set_global_cursor_tracking_enabled(bool enabled)