102 lines
2.1 KiB
C++
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;
|
|
}
|
|
|
|
|
|
}; |