Luna/kernel/src/fs/devices/MouseDevice.cpp

51 lines
1.3 KiB
C++

#include "fs/devices/MouseDevice.h"
SharedPtr<MouseDevice> MouseDevice::s_mouse_device = {};
Result<void> MouseDevice::create()
{
auto device = TRY(make_shared<MouseDevice>());
s_mouse_device = device;
return DeviceRegistry::register_special_device(DeviceRegistry::Input, 0, device, 0600);
}
Result<usize> MouseDevice::read(u8* buf, usize, usize length) const
{
usize nread = 0;
while (length >= sizeof(moon::MousePacket))
{
if (!m_packet_queue.try_pop(*(moon::MousePacket*)buf)) break;
buf += sizeof(moon::MousePacket);
length -= sizeof(moon::MousePacket);
nread += sizeof(moon::MousePacket);
}
return nread;
}
Result<usize> MouseDevice::write(const u8* buf, usize, usize length)
{
usize nwritten = 0;
while (length >= sizeof(moon::MousePacket))
{
if (!m_packet_queue.try_push(*(const moon::MousePacket*)buf)) break;
buf += sizeof(moon::MousePacket);
length -= sizeof(moon::MousePacket);
nwritten += sizeof(moon::MousePacket);
}
return nwritten;
}
void MouseDevice::add_mouse_event(const moon::MousePacket& packet)
{
if (s_mouse_device) s_mouse_device->m_packet_queue.try_push(packet);
}
bool MouseDevice::will_block_if_read() const
{
return m_packet_queue.is_empty();
}