mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-08 17:47:18 +00:00
Bit 3 is set here:
c5b2f55981/hw/input/ps2.c (L736)
Spurious mouse packets can be received without this bit set, for
example when double-clicking and keeping the mouse button depressed
instead of releasing it the second time (i.e. mousedown > mouseup >
mousedown). We should not process such packets.
This makes interaction with our buttons much smoother!
Fixes #5881.
66 lines
2.0 KiB
C++
66 lines
2.0 KiB
C++
/*
|
|
* Copyright (c) 2021, Liav A. <liavalb@hotmail.co.il>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <Kernel/Devices/DeviceManagement.h>
|
|
#include <Kernel/Devices/HID/VMWareMouseDevice.h>
|
|
#include <Kernel/Devices/VMWareBackdoor.h>
|
|
#include <Kernel/Sections.h>
|
|
|
|
namespace Kernel {
|
|
|
|
UNMAP_AFTER_INIT RefPtr<VMWareMouseDevice> VMWareMouseDevice::try_to_initialize(const I8042Controller& ps2_controller)
|
|
{
|
|
if (!VMWareBackdoor::the())
|
|
return {};
|
|
if (!VMWareBackdoor::the()->vmmouse_is_absolute())
|
|
return {};
|
|
auto mouse_device_or_error = DeviceManagement::try_create_device<VMWareMouseDevice>(ps2_controller);
|
|
// FIXME: Find a way to propagate errors
|
|
VERIFY(!mouse_device_or_error.is_error());
|
|
if (mouse_device_or_error.value()->initialize())
|
|
return mouse_device_or_error.release_value();
|
|
return {};
|
|
}
|
|
|
|
void VMWareMouseDevice::irq_handle_byte_read(u8 byte)
|
|
{
|
|
VERIFY(VMWareBackdoor::the());
|
|
VERIFY(VMWareBackdoor::the()->vmmouse_is_absolute());
|
|
|
|
// We won't receive complete packets with the backdoor enabled,
|
|
// we will only get one byte for each event, which we'll just
|
|
// discard. If we were to wait until we *think* that we got a
|
|
// full PS/2 packet then we would create a backlog in the VM
|
|
// because we wouldn't read the appropriate number of mouse
|
|
// packets from VMWareBackdoor.
|
|
auto mouse_packet = VMWareBackdoor::the()->receive_mouse_packet();
|
|
|
|
// Only process packets with bit 3 set.
|
|
// Note that this needs to happen _after_ invoking receive_mouse_packet() above
|
|
if (!(byte & 0x8))
|
|
return;
|
|
|
|
if (mouse_packet.has_value()) {
|
|
m_entropy_source.add_random_event(mouse_packet.value());
|
|
{
|
|
SpinlockLocker lock(m_queue_lock);
|
|
m_queue.enqueue(mouse_packet.value());
|
|
}
|
|
evaluate_block_conditions();
|
|
}
|
|
return;
|
|
}
|
|
|
|
VMWareMouseDevice::VMWareMouseDevice(const I8042Controller& ps2_controller)
|
|
: PS2MouseDevice(ps2_controller)
|
|
{
|
|
}
|
|
VMWareMouseDevice::~VMWareMouseDevice()
|
|
{
|
|
}
|
|
|
|
}
|