#include "IPC.h" #include #include static Result handle_create_window_message(Client& client) { ui::CreateWindowRequest request; auto rc = client.conn.recv_typed(request); if (rc.has_error()) { if (rc.error() == EAGAIN) { client.rpc_in_progress = true; client.rpc_id = ui::CREATE_WINDOW_ID; return {}; } else return rc.release_error(); } request.rect = request.rect.normalized(); request.rect.height += Window::titlebar_height(); // Make sure we provide the full contents rect that was asked for. auto name = COPY_IPC_STRING(request.name); auto* window = new (std::nothrow) Window(request.rect, request.color, move(name)); if (!window) { os::IPC::send_error(client.conn, ENOMEM); return {}; } int id = static_cast(client.windows.size()); rc = client.windows.try_append(window); if (rc.has_error()) { delete window; os::IPC::send_error(client.conn, rc.error()); return {}; } ui::CreateWindowResponse response; response.window = id; os::IPC::send_async(client.conn, response); return {}; } namespace wind { Result handle_ipc_message(Client& client, u8 id) { client.rpc_in_progress = false; switch (id) { case ui::CREATE_WINDOW_ID: return handle_create_window_message(client); default: os::eprintln("wind: Invalid IPC message from client!"); return err(EINVAL); } } Result handle_ipc(Client& client) { if (client.rpc_in_progress) return handle_ipc_message(client, client.rpc_id); u8 id; auto rc = client.conn.recv_typed(id); if (rc.has_error()) { if (rc.error() == EAGAIN) { return {}; } else return rc.release_error(); } return handle_ipc_message(client, id); } }