2024-05-06 02:15:26 +01:00
|
|
|
#include "Tablet.hpp"
|
|
|
|
|
#include "../defines.hpp"
|
|
|
|
|
#include "../protocols/Tablet.hpp"
|
2024-06-08 10:07:59 +02:00
|
|
|
#include "../protocols/core/Compositor.hpp"
|
2024-07-21 13:09:54 +02:00
|
|
|
#include <aquamarine/input/Input.hpp>
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
SP<CTablet> CTablet::create(SP<Aquamarine::ITablet> tablet) {
|
2024-05-06 02:15:26 +01:00
|
|
|
SP<CTablet> pTab = SP<CTablet>(new CTablet(tablet));
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
pTab->m_self = pTab;
|
2024-05-06 02:15:26 +01:00
|
|
|
|
|
|
|
|
PROTO::tablet->registerDevice(pTab);
|
|
|
|
|
|
|
|
|
|
return pTab;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
SP<CTabletTool> CTabletTool::create(SP<Aquamarine::ITabletTool> tablet) {
|
2024-05-06 02:15:26 +01:00
|
|
|
SP<CTabletTool> pTab = SP<CTabletTool>(new CTabletTool(tablet));
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
pTab->m_self = pTab;
|
2024-05-06 02:15:26 +01:00
|
|
|
|
|
|
|
|
PROTO::tablet->registerDevice(pTab);
|
|
|
|
|
|
|
|
|
|
return pTab;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
SP<CTabletPad> CTabletPad::create(SP<Aquamarine::ITabletPad> tablet) {
|
2024-05-06 02:15:26 +01:00
|
|
|
SP<CTabletPad> pTab = SP<CTabletPad>(new CTabletPad(tablet));
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
pTab->m_self = pTab;
|
2024-05-06 02:15:26 +01:00
|
|
|
|
|
|
|
|
PROTO::tablet->registerDevice(pTab);
|
|
|
|
|
|
|
|
|
|
return pTab;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
static uint32_t aqUpdateToHl(uint32_t aq) {
|
2024-05-06 02:15:26 +01:00
|
|
|
uint32_t result = 0;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_X)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_X;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_Y)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_Y;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_DISTANCE)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_DISTANCE;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_PRESSURE)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_PRESSURE;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_TILT_X)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_TILT_X;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_TILT_Y)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_TILT_Y;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_ROTATION)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_ROTATION;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_SLIDER)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_SLIDER;
|
2024-07-21 13:09:54 +02:00
|
|
|
if (aq & Aquamarine::AQ_TABLET_TOOL_AXIS_WHEEL)
|
2024-05-06 02:15:26 +01:00
|
|
|
result |= CTablet::eTabletToolAxes::HID_TABLET_TOOL_AXIS_WHEEL;
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t CTablet::getCapabilities() {
|
|
|
|
|
return HID_INPUT_CAPABILITY_POINTER | HID_INPUT_CAPABILITY_TABLET;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
SP<Aquamarine::ITablet> CTablet::aq() {
|
2025-04-29 19:51:07 +02:00
|
|
|
return m_tablet.lock();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
CTablet::CTablet(SP<Aquamarine::ITablet> tablet_) : m_tablet(tablet_) {
|
|
|
|
|
if (!m_tablet)
|
2024-05-06 02:15:26 +01:00
|
|
|
return;
|
|
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.destroy = m_tablet->events.destroy.listen([this] {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_tablet.reset();
|
|
|
|
|
m_events.destroy.emit();
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.axis = m_tablet->events.axis.listen([this](const Aquamarine::ITablet::SAxisEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_tabletEvents.axis.emit(SAxisEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.tool = event.tool,
|
2025-04-29 19:51:07 +02:00
|
|
|
.tablet = m_self.lock(),
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.updatedAxes = aqUpdateToHl(event.updatedAxes),
|
|
|
|
|
.axis = event.absolute,
|
|
|
|
|
.axisDelta = event.delta,
|
|
|
|
|
.tilt = event.tilt,
|
|
|
|
|
.pressure = event.pressure,
|
|
|
|
|
.distance = event.distance,
|
|
|
|
|
.rotation = event.rotation,
|
|
|
|
|
.slider = event.slider,
|
|
|
|
|
.wheelDelta = event.wheelDelta,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.proximity = m_tablet->events.proximity.listen([this](const Aquamarine::ITablet::SProximityEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_tabletEvents.proximity.emit(SProximityEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.tool = event.tool,
|
2025-04-29 19:51:07 +02:00
|
|
|
.tablet = m_self.lock(),
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.proximity = event.absolute,
|
|
|
|
|
.in = event.in,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.tip = m_tablet->events.tip.listen([this](const Aquamarine::ITablet::STipEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_tabletEvents.tip.emit(STipEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.tool = event.tool,
|
2025-04-29 19:51:07 +02:00
|
|
|
.tablet = m_self.lock(),
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.tip = event.absolute,
|
|
|
|
|
.in = event.down,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.button = m_tablet->events.button.listen([this](const Aquamarine::ITablet::SButtonEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_tabletEvents.button.emit(SButtonEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.tool = event.tool,
|
2025-04-29 19:51:07 +02:00
|
|
|
.tablet = m_self.lock(),
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.button = event.button,
|
|
|
|
|
.down = event.down,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
m_deviceName = m_tablet->getName();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CTablet::~CTablet() {
|
|
|
|
|
PROTO::tablet->recheckRegisteredDevices();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
eHIDType CTablet::getType() {
|
|
|
|
|
return HID_TYPE_TABLET;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t CTabletPad::getCapabilities() {
|
|
|
|
|
return HID_INPUT_CAPABILITY_TABLET;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
SP<Aquamarine::ITabletPad> CTabletPad::aq() {
|
2025-04-29 19:51:07 +02:00
|
|
|
return m_pad.lock();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
eHIDType CTabletPad::getType() {
|
|
|
|
|
return HID_TYPE_TABLET_PAD;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
CTabletPad::CTabletPad(SP<Aquamarine::ITabletPad> pad_) : m_pad(pad_) {
|
|
|
|
|
if (!m_pad)
|
2024-05-06 02:15:26 +01:00
|
|
|
return;
|
|
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.destroy = m_pad->events.destroy.listen([this] {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_pad.reset();
|
|
|
|
|
m_events.destroy.emit();
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.button = m_pad->events.button.listen([this](const Aquamarine::ITabletPad::SButtonEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_padEvents.button.emit(SButtonEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.button = event.button,
|
|
|
|
|
.down = event.down,
|
|
|
|
|
.mode = event.mode,
|
|
|
|
|
.group = event.group,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.ring = m_pad->events.ring.listen([this](const Aquamarine::ITabletPad::SRingEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_padEvents.ring.emit(SRingEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.finger = event.source == Aquamarine::ITabletPad::AQ_TABLET_PAD_RING_SOURCE_FINGER,
|
|
|
|
|
.ring = event.ring,
|
|
|
|
|
.position = event.pos,
|
|
|
|
|
.mode = event.mode,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.strip = m_pad->events.strip.listen([this](const Aquamarine::ITabletPad::SStripEvent& event) {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_padEvents.strip.emit(SStripEvent{
|
2025-07-08 09:56:40 -07:00
|
|
|
.timeMs = event.timeMs,
|
|
|
|
|
.finger = event.source == Aquamarine::ITabletPad::AQ_TABLET_PAD_STRIP_SOURCE_FINGER,
|
|
|
|
|
.strip = event.strip,
|
|
|
|
|
.position = event.pos,
|
|
|
|
|
.mode = event.mode,
|
2024-05-06 02:15:26 +01:00
|
|
|
});
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.attach = m_pad->events.attach.listen([] {
|
2024-07-21 13:09:54 +02:00
|
|
|
; // TODO: this doesn't do anything in aq atm
|
|
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
m_deviceName = m_pad->getName();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CTabletPad::~CTabletPad() {
|
|
|
|
|
PROTO::tablet->recheckRegisteredDevices();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t CTabletTool::getCapabilities() {
|
|
|
|
|
return HID_INPUT_CAPABILITY_POINTER | HID_INPUT_CAPABILITY_TABLET;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-21 13:09:54 +02:00
|
|
|
SP<Aquamarine::ITabletTool> CTabletTool::aq() {
|
2025-04-29 19:51:07 +02:00
|
|
|
return m_tool.lock();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
eHIDType CTabletTool::getType() {
|
|
|
|
|
return HID_TYPE_TABLET_TOOL;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
CTabletTool::CTabletTool(SP<Aquamarine::ITabletTool> tool_) : m_tool(tool_) {
|
|
|
|
|
if (!m_tool)
|
2024-05-06 02:15:26 +01:00
|
|
|
return;
|
|
|
|
|
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.destroyTool = m_tool->events.destroy.listen([this] {
|
2025-04-29 19:51:07 +02:00
|
|
|
m_tool.reset();
|
|
|
|
|
m_events.destroy.emit();
|
2024-07-21 13:09:54 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
if (m_tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_TILT)
|
|
|
|
|
m_toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_TILT;
|
|
|
|
|
if (m_tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_PRESSURE)
|
|
|
|
|
m_toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_PRESSURE;
|
|
|
|
|
if (m_tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_DISTANCE)
|
|
|
|
|
m_toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_DISTANCE;
|
|
|
|
|
if (m_tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_ROTATION)
|
|
|
|
|
m_toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_ROTATION;
|
|
|
|
|
if (m_tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_SLIDER)
|
|
|
|
|
m_toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_SLIDER;
|
|
|
|
|
if (m_tool->capabilities & Aquamarine::ITabletTool::AQ_TABLET_TOOL_CAPABILITY_WHEEL)
|
|
|
|
|
m_toolCapabilities |= HID_TABLET_TOOL_CAPABILITY_WHEEL;
|
|
|
|
|
|
|
|
|
|
m_deviceName = std::format("{:x}-{:x}", m_tool->serial, m_tool->id);
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CTabletTool::~CTabletTool() {
|
|
|
|
|
PROTO::tablet->recheckRegisteredDevices();
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-08 10:07:59 +02:00
|
|
|
SP<CWLSurfaceResource> CTabletTool::getSurface() {
|
2025-04-29 19:51:07 +02:00
|
|
|
return m_surface.lock();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
2024-06-08 10:07:59 +02:00
|
|
|
void CTabletTool::setSurface(SP<CWLSurfaceResource> surf) {
|
2025-04-29 19:51:07 +02:00
|
|
|
if (surf == m_surface)
|
2024-05-06 02:15:26 +01:00
|
|
|
return;
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
if (m_surface) {
|
|
|
|
|
m_listeners.destroySurface.reset();
|
|
|
|
|
m_surface.reset();
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
|
2025-04-29 19:51:07 +02:00
|
|
|
m_surface = surf;
|
2024-05-06 02:15:26 +01:00
|
|
|
|
|
|
|
|
if (surf) {
|
2025-07-08 09:56:40 -07:00
|
|
|
m_listeners.destroySurface = surf->m_events.destroy.listen([this] {
|
2025-04-29 19:51:07 +02:00
|
|
|
PROTO::tablet->proximityOut(m_self.lock());
|
|
|
|
|
m_surface.reset();
|
|
|
|
|
m_listeners.destroySurface.reset();
|
2024-06-08 10:07:59 +02:00
|
|
|
});
|
2024-05-06 02:15:26 +01:00
|
|
|
}
|
|
|
|
|
}
|