mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 19:57:35 +00:00
WindowServer: Convert entire API to be message-based.
One big step towards userspace WindowServer. :^)
This commit is contained in:
parent
ef4e9860fd
commit
f529b845ec
25 changed files with 508 additions and 625 deletions
|
@ -89,6 +89,7 @@ void WSMessageLoop::post_message(WSMessageReceiver* receiver, OwnPtr<WSMessage>&
|
|||
dbgprintf("WSMessageLoop::post_message: {%u} << receiver=%p, message=%p (type=%u)\n", m_queued_messages.size(), receiver, message.ptr(), message->type());
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
if (message->type() == WSMessage::WM_ClientFinishedPaint) {
|
||||
auto& invalidation_message = static_cast<WSClientFinishedPaintMessage&>(*message);
|
||||
for (auto& queued_message : m_queued_messages) {
|
||||
|
@ -118,6 +119,7 @@ void WSMessageLoop::post_message(WSMessageReceiver* receiver, OwnPtr<WSMessage>&
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
m_queued_messages.append({ receiver, move(message) });
|
||||
|
||||
|
@ -262,8 +264,18 @@ void WSMessageLoop::drain_keyboard()
|
|||
}
|
||||
}
|
||||
|
||||
void WSMessageLoop::notify_client_died(int client_id)
|
||||
{
|
||||
LOCKER(m_lock);
|
||||
post_message(&WSWindowManager::the(), make<WSClientDisconnectedNotification>(client_id));
|
||||
}
|
||||
|
||||
ssize_t WSMessageLoop::on_receive_from_client(int client_id, const byte* data, size_t size)
|
||||
{
|
||||
// FIXME: This should not be necessary.. why is this necessary?
|
||||
while (!running())
|
||||
Scheduler::yield();
|
||||
|
||||
LOCKER(m_lock);
|
||||
ASSERT(size == sizeof(GUI_ClientMessage));
|
||||
auto& message = *reinterpret_cast<const GUI_ClientMessage*>(data);
|
||||
|
@ -281,15 +293,53 @@ ssize_t WSMessageLoop::on_receive_from_client(int client_id, const byte* data, s
|
|||
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)));
|
||||
ASSERT(message.text_length < sizeof(message.text));
|
||||
post_message(&WSWindowManager::the(), make<WSAPICreateMenuRequest>(client_id, String(message.text, message.text_length)));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::DestroyMenu:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIDestroyMenuRequest>(client_id, message.menu.menu_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::AddMenuItem:
|
||||
ASSERT(message.menu.text_length < sizeof(message.menu.text));
|
||||
post_message(&WSWindowManager::the(), make<WSAPIAddMenuItemRequest>(client_id, message.menu.menu_id, message.menu.identifier, String(message.menu.text, message.menu.text_length)));
|
||||
ASSERT(message.text_length < sizeof(message.text));
|
||||
post_message(&WSWindowManager::the(), make<WSAPIAddMenuItemRequest>(client_id, message.menu.menu_id, message.menu.identifier, String(message.text, message.text_length)));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::CreateWindow:
|
||||
ASSERT(message.text_length < sizeof(message.text));
|
||||
post_message(&WSWindowManager::the(), make<WSAPICreateWindowRequest>(client_id, message.window.rect, String(message.text, message.text_length)));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::DestroyWindow:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIDestroyWindowRequest>(client_id, message.window_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::SetWindowTitle:
|
||||
ASSERT(message.text_length < sizeof(message.text));
|
||||
post_message(&WSWindowManager::the(), make<WSAPISetWindowTitleRequest>(client_id, message.window_id, String(message.text, message.text_length)));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::GetWindowTitle:
|
||||
ASSERT(message.text_length < sizeof(message.text));
|
||||
post_message(&WSWindowManager::the(), make<WSAPIGetWindowTitleRequest>(client_id, message.window_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::SetWindowRect:
|
||||
post_message(&WSWindowManager::the(), make<WSAPISetWindowRectRequest>(client_id, message.window_id, message.window.rect));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::GetWindowRect:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIGetWindowRectRequest>(client_id, message.window_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::InvalidateRect:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIInvalidateRectRequest>(client_id, message.window_id, message.window.rect));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::DidFinishPainting:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIDidFinishPaintingNotification>(client_id, message.window_id, message.window.rect));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::GetWindowBackingStore:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIGetWindowBackingStoreRequest>(client_id, message.window_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::ReleaseWindowBackingStore:
|
||||
post_message(&WSWindowManager::the(), make<WSAPIReleaseWindowBackingStoreRequest>(client_id, (int)message.backing.backing_store_id));
|
||||
break;
|
||||
case GUI_ClientMessage::Type::SetGlobalCursorTracking:
|
||||
post_message(&WSWindowManager::the(), make<WSAPISetGlobalCursorTrackingRequest>(client_id, message.value));
|
||||
break;
|
||||
}
|
||||
server_process().request_wakeup();
|
||||
return size;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue