mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-21 10:19:03 +03:00
WindowServer: Simplify a few things in WSEventLoop.
This commit is contained in:
parent
94a5e08faf
commit
2af729a58a
Notes:
sideshowbarker
2024-07-19 14:43:19 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/2af729a58a0
@ -44,11 +44,6 @@ WSEventLoop::~WSEventLoop()
|
||||
{
|
||||
}
|
||||
|
||||
WSEventLoop& WSEventLoop::the()
|
||||
{
|
||||
return static_cast<WSEventLoop&>(CEventLoop::current());
|
||||
}
|
||||
|
||||
void WSEventLoop::drain_server()
|
||||
{
|
||||
sockaddr_un address;
|
||||
@ -102,14 +97,6 @@ void WSEventLoop::drain_keyboard()
|
||||
}
|
||||
}
|
||||
|
||||
void WSEventLoop::notify_client_disconnected(int client_id)
|
||||
{
|
||||
auto* client = WSClientConnection::from_client_id(client_id);
|
||||
if (!client)
|
||||
return;
|
||||
post_event(*client, make<WSClientDisconnectedNotification>(client_id));
|
||||
}
|
||||
|
||||
static WSWindowType from_api(WSAPI_WindowType api_type)
|
||||
{
|
||||
switch (api_type) {
|
||||
@ -261,24 +248,28 @@ void WSEventLoop::process_file_descriptors_after_select(const fd_set& fds)
|
||||
if (FD_ISSET(m_mouse_fd, &fds))
|
||||
drain_mouse();
|
||||
WSClientConnection::for_each_client([&] (WSClientConnection& client) {
|
||||
if (!FD_ISSET(client.fd(), &fds))
|
||||
return;
|
||||
unsigned messages_received = 0;
|
||||
for (;;) {
|
||||
WSAPI_ClientMessage message;
|
||||
// FIXME: Don't go one message at a time, that's so much context switching, oof.
|
||||
ssize_t nread = read(client.fd(), &message, sizeof(WSAPI_ClientMessage));
|
||||
if (nread == 0) {
|
||||
if (!messages_received)
|
||||
notify_client_disconnected(client.client_id());
|
||||
break;
|
||||
}
|
||||
if (nread < 0) {
|
||||
perror("read");
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
on_receive_from_client(client.client_id(), message);
|
||||
++messages_received;
|
||||
}
|
||||
if (FD_ISSET(client.fd(), &fds))
|
||||
drain_client(client);
|
||||
});
|
||||
}
|
||||
|
||||
void WSEventLoop::drain_client(WSClientConnection& client)
|
||||
{
|
||||
unsigned messages_received = 0;
|
||||
for (;;) {
|
||||
WSAPI_ClientMessage message;
|
||||
// FIXME: Don't go one message at a time, that's so much context switching, oof.
|
||||
ssize_t nread = read(client.fd(), &message, sizeof(WSAPI_ClientMessage));
|
||||
if (nread == 0) {
|
||||
if (!messages_received)
|
||||
post_event(client, make<WSClientDisconnectedNotification>(client.client_id()));
|
||||
break;
|
||||
}
|
||||
if (nread < 0) {
|
||||
perror("read");
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
on_receive_from_client(client.client_id(), message);
|
||||
++messages_received;
|
||||
}
|
||||
}
|
||||
|
@ -1,35 +1,26 @@
|
||||
#pragma once
|
||||
|
||||
#include "WSEvent.h"
|
||||
#include <AK/HashMap.h>
|
||||
#include <AK/OwnPtr.h>
|
||||
#include <AK/Vector.h>
|
||||
#include <AK/Function.h>
|
||||
#include <AK/WeakPtr.h>
|
||||
#include <LibCore/CEventLoop.h>
|
||||
|
||||
class CObject;
|
||||
class WSClientConnection;
|
||||
struct WSAPI_ClientMessage;
|
||||
struct WSAPI_ServerMessage;
|
||||
|
||||
class WSEventLoop : public CEventLoop {
|
||||
public:
|
||||
WSEventLoop();
|
||||
virtual ~WSEventLoop() override;
|
||||
|
||||
static WSEventLoop& the();
|
||||
|
||||
void on_receive_from_client(int client_id, const WSAPI_ClientMessage&);
|
||||
void notify_client_disconnected(int client_id);
|
||||
static WSEventLoop& the() { return static_cast<WSEventLoop&>(CEventLoop::current()); }
|
||||
|
||||
private:
|
||||
virtual void add_file_descriptors_for_select(fd_set&, int& max_fd_added) override;
|
||||
virtual void process_file_descriptors_after_select(const fd_set&) override;
|
||||
virtual void do_processing() override { }
|
||||
|
||||
void drain_server();
|
||||
void drain_mouse();
|
||||
void drain_keyboard();
|
||||
void drain_client(WSClientConnection&);
|
||||
void on_receive_from_client(int client_id, const WSAPI_ClientMessage&);
|
||||
|
||||
int m_keyboard_fd { -1 };
|
||||
int m_mouse_fd { -1 };
|
||||
|
Loading…
Reference in New Issue
Block a user