#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(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(pkt.pkX) / ext.x; packet.y = static_cast(pkt.pkY) / ext.y; packet.z = static_cast(pkt.pkZ) / ext.z; packet.p = static_cast(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 �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(TabletX.axMax); ext.y = static_cast(TabletY.axMax); ext.z = static_cast(TabletZ.axMax); ext.p = static_cast(TabletPressure.axMax); hctx = gpWTOpenA(hwnd, &ctx, TRUE); if (!hctx) { errormsg = "Could not open Wintab context."; return; } initialized = true; }; #endif