yaw-audio/src/yaw-tab/tab.cpp

102 lines
2.1 KiB
C++

#include <string>
#include <Windows.h>
#include "MSGPACK.H"
#include "wintab.h"
#define PACKETDATA (PK_X | PK_Y | PK_Z | PK_BUTTONS | PK_NORMAL_PRESSURE)
#define PACKETMODE PK_BUTTONS
#include "pktdef.h"
#include "wtutil.h"
class Tablet {
public:
Tablet(HWND hwnd) {
if (!hwnd) { return; }
if (!LoadWintab() || !gpWTInfoA(0, 0, NULL)) {
return;
}
NewContext(hwnd);
}
~Tablet() {
if (hctx) { gpWTClose(hctx); }
UnloadWintab();
}
void NewPacket() {
//Serial number of newest packet.
UINT oldest, newest;
//This function returns false when it fails.
if (!gpWTQueuePacketsEx(hctx, &oldest, &newest)) {
//Queue full, flush it all.
gpWTPacketsGet(hctx, gpWTQueueSizeGet(hctx), nullptr);
}
//Store newest packet in pkt, flush older packets.
gpWTPacket(hctx, newest, &pkt);
}
bool wintabAvailable = false;
PACKET pkt = { 0 };
UINT maxPressure = 1;
float extX;
float extY;
float extZ;
float extP;
private:
HCTX hctx = NULL;
UINT wDevice = 0;
AXIS TabletX = { 0 };
AXIS TabletY = { 0 };
AXIS TabletZ = { 0 };
AXIS TabletPressure = { 0 };
LOGCONTEXT ctx = {};
void NewContext(HWND hwnd) {
if (hctx) { gpWTClose(hctx); }
gpWTInfoA(WTI_DEFCONTEXT, 0, &ctx);
ctx.lcOptions |= CXO_MESSAGES; //TODO: checker çela
ctx.lcPktData = PACKETDATA;
ctx.lcPktMode = PACKETMODE;
//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);
ctx.lcInOrgX = TabletX.axMin;
ctx.lcInExtX = TabletX.axMax;
ctx.lcOutOrgX = TabletX.axMin;
ctx.lcOutExtX = TabletX.axMax;
extX = TabletX.axMax;
ctx.lcInOrgY = TabletY.axMin;
ctx.lcInExtY = TabletY.axMax;
ctx.lcOutOrgY = TabletY.axMin;
ctx.lcOutExtY = TabletY.axMax;
extY = TabletY.axMax;
ctx.lcInOrgZ = TabletZ.axMin;
ctx.lcInExtZ = TabletZ.axMax;
ctx.lcOutOrgZ = TabletZ.axMin;
ctx.lcOutExtZ = TabletZ.axMax;
extZ = TabletZ.axMax;
extP = TabletPressure.axMax;
hctx = gpWTOpenA(hwnd, &ctx, FALSE);
if (!hctx) { return; }
gpWTEnable(hctx, TRUE);
wintabAvailable = true;
}
};