WindowServer: Simplify a few things in WSEventLoop.

This commit is contained in:
Andreas Kling 2019-04-14 05:37:07 +02:00
parent 94a5e08faf
commit 2af729a58a
Notes: sideshowbarker 2024-07-19 14:43:19 +09:00
2 changed files with 27 additions and 45 deletions

View File

@ -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;
}
}

View File

@ -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 };