Kernel: Add mouse move and scroll event merging back
This makes mouse work much faster when reading can't keep up with the amount of events.
This commit is contained in:
parent
4cd9252ff6
commit
60b396fee5
|
@ -35,6 +35,8 @@ namespace Kernel
|
||||||
const dev_t m_rdev;
|
const dev_t m_rdev;
|
||||||
const BAN::String m_name;
|
const BAN::String m_name;
|
||||||
|
|
||||||
|
const Type m_type;
|
||||||
|
|
||||||
mutable SpinLock m_event_lock;
|
mutable SpinLock m_event_lock;
|
||||||
Semaphore m_event_semaphore;
|
Semaphore m_event_semaphore;
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ namespace Kernel
|
||||||
: CharacterDevice(0440, 0, 901)
|
: CharacterDevice(0440, 0, 901)
|
||||||
, m_rdev(get_rdev(type))
|
, m_rdev(get_rdev(type))
|
||||||
, m_name(MUST(BAN::String::formatted(get_name_format(type), minor(m_rdev))))
|
, m_name(MUST(BAN::String::formatted(get_name_format(type), minor(m_rdev))))
|
||||||
|
, m_type(type)
|
||||||
, m_event_size(get_event_size(type))
|
, m_event_size(get_event_size(type))
|
||||||
{
|
{
|
||||||
MUST(m_event_buffer.resize(m_event_size * m_max_event_count, 0));
|
MUST(m_event_buffer.resize(m_event_size * m_max_event_count, 0));
|
||||||
|
@ -63,6 +64,25 @@ namespace Kernel
|
||||||
SpinLockGuard _(m_event_lock);
|
SpinLockGuard _(m_event_lock);
|
||||||
ASSERT(event.size() == m_event_size);
|
ASSERT(event.size() == m_event_size);
|
||||||
|
|
||||||
|
if (m_type == Type::Mouse && m_event_count > 0)
|
||||||
|
{
|
||||||
|
const size_t last_index = (m_event_head + m_max_event_count - 1) % m_max_event_count;
|
||||||
|
|
||||||
|
auto& last_event = *reinterpret_cast<LibInput::MouseEvent*>(&m_event_buffer[last_index * m_event_size]);
|
||||||
|
auto& curr_event = event.as<const LibInput::MouseEvent>();
|
||||||
|
if (last_event.type == LibInput::MouseEventType::MouseMoveEvent && curr_event.type == LibInput::MouseEventType::MouseMoveEvent)
|
||||||
|
{
|
||||||
|
last_event.move_event.rel_x += curr_event.move_event.rel_x;
|
||||||
|
last_event.move_event.rel_y += curr_event.move_event.rel_y;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (last_event.type == LibInput::MouseEventType::MouseScrollEvent && curr_event.type == LibInput::MouseEventType::MouseScrollEvent)
|
||||||
|
{
|
||||||
|
last_event.scroll_event.scroll += curr_event.scroll_event.scroll;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (m_event_count == m_max_event_count)
|
if (m_event_count == m_max_event_count)
|
||||||
{
|
{
|
||||||
m_event_tail = (m_event_tail + 1) % m_max_event_count;
|
m_event_tail = (m_event_tail + 1) % m_max_event_count;
|
||||||
|
|
Loading…
Reference in New Issue