#include #include #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; } };