81 lines
2.1 KiB
C++
81 lines
2.1 KiB
C++
#ifdef TAB_WINTAB
|
||
#include "tablet.h"
|
||
#define PACKETDATA (PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE)
|
||
//#define PACKETMODE
|
||
#include "pktdef.h"
|
||
#include "wtutil.h"
|
||
|
||
Tablet::Tablet(uintptr_t handle)
|
||
{
|
||
HWND hwnd = reinterpret_cast<HWND>(handle);
|
||
if (!hwnd) { return; }
|
||
|
||
if (!LoadWintab() || !gpWTInfoA(0, 0, NULL)) {
|
||
errormsg = "Wintab not installed.";
|
||
return;
|
||
}
|
||
|
||
NewContext(hwnd);
|
||
}
|
||
|
||
Tablet::~Tablet() {
|
||
if (hctx) { gpWTClose(hctx); }
|
||
UnloadWintab();
|
||
}
|
||
|
||
bool Tablet::GetPacket( Packet& packet ) {
|
||
//Serial number of newest packet.
|
||
UINT oldest, newest;
|
||
//This function returns false when it fails
|
||
//which may happen with a full or empty queue.
|
||
if (!gpWTQueuePacketsEx(hctx, &oldest, &newest)) {
|
||
//Queue may be full, flush it all just in case.
|
||
gpWTPacketsGet(hctx, gpWTQueueSizeGet(hctx), nullptr);
|
||
return false;
|
||
}
|
||
|
||
//Store newest packet in pkt, flush older packets.
|
||
PACKET pkt;
|
||
bool newData = gpWTPacket(hctx, newest, &pkt);
|
||
if (!newData) return false;
|
||
packet.x = static_cast<float>(pkt.pkX) / ext.x;
|
||
packet.y = static_cast<float>(pkt.pkY) / ext.y;
|
||
packet.z = static_cast<float>(pkt.pkZ) / ext.z;
|
||
packet.p = static_cast<float>(pkt.pkNormalPressure) / ext.p;
|
||
packet.buttons = pkt.pkButtons;
|
||
return true;
|
||
}
|
||
|
||
void Tablet::NewContext(HWND hwnd) {
|
||
if (hctx) { gpWTClose(hctx); }
|
||
LOGCONTEXT ctx = {};
|
||
AXIS TabletX = { 0 };
|
||
AXIS TabletY = { 0 };
|
||
AXIS TabletZ = { 0 };
|
||
AXIS TabletPressure = { 0 };
|
||
gpWTInfoA(WTI_DEFCONTEXT, 0, &ctx);
|
||
ctx.lcOptions |= CXO_MESSAGES; //TODO: checker <20>ela
|
||
ctx.lcPktData = PACKETDATA;
|
||
ctx.lcPktMode = 0;
|
||
|
||
//Tablet extents.
|
||
gpWTInfoA(WTI_DEVICES, DVC_X, &TabletX);
|
||
gpWTInfoA(WTI_DEVICES, DVC_Y, &TabletY);
|
||
gpWTInfoA(WTI_DEVICES, DVC_Z, &TabletZ);
|
||
gpWTInfoA(WTI_DEVICES, DVC_NPRESSURE, &TabletPressure);
|
||
|
||
ext.x = static_cast<float>(TabletX.axMax);
|
||
ext.y = static_cast<float>(TabletY.axMax);
|
||
ext.z = static_cast<float>(TabletZ.axMax);
|
||
ext.p = static_cast<float>(TabletPressure.axMax);
|
||
|
||
hctx = gpWTOpenA(hwnd, &ctx, TRUE);
|
||
|
||
if (!hctx)
|
||
{
|
||
errormsg = "Could not open Wintab context.";
|
||
return;
|
||
}
|
||
initialized = true;
|
||
};
|
||
#endif |