51 lines
1.3 KiB
C++
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();
|
|
}
|