wintab32: Implementing PK_CHANGE and fixing a typo which prevented sending correct pkSerialNumber

Eriks Dobelis eriks.dobelis at moon.lv
Tue Mar 18 16:42:25 CDT 2014


The patch fixes a problem in wintab32/context.c where pkSerialNumber 
value was not correctly sent due to typo.
Secondly, it implements sending PK_CHANGE in winex11.drv/wintab.c. 
Previously, 0 was always sent.

Apparently, due to these problems some applications (most notably 
Photoshop CS4+) did not process tablet input and pressure sensitivity 
was not available. This fixes 
http://bugs.winehq.org/show_bug.cgi?id=18517 and possibly other bugs 
related to availability of pressure sensitivity.

  dlls/winex11.drv/wintab.c | 47 
++++++++++++++++++++++++++++++++++++++++++++++-
  dlls/wintab32/context.c   |  2 +-
  2 files changed, 47 insertions(+), 2 deletions(-)

-------------- next part --------------
>From 83726c92abf9ed164f19b49deecc46e1511ed333 Mon Sep 17 00:00:00 2001
From: Eriks Dobelis <eriks00 at moon.lv>
Date: Tue, 18 Mar 2014 21:13:02 +0000
Subject: Implementing PK_CHANGE and fixing pkSerialNumber

---
 dlls/winex11.drv/wintab.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
 dlls/wintab32/context.c   |  2 +-
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c
index 23a5423..4f75cd6 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -267,7 +267,14 @@ static int           proximity_out_type;
 static HWND          hwndTabletDefault;
 static WTPACKET      gMsgPacket;
 static DWORD         gSerial;
-
+static DWORD         lastX = 0xffff;
+static DWORD         lastY = 0xffff;
+static UINT          lastNormalPressure = 0xffff;
+static DWORD         lastButtons = 0xffff;
+static UINT          lastCursor = 0xffff;
+static ORIENTATION   lastOrientation = {.orAzimuth = 0xffff, .orAltitude = 0xffff, .orTwist = 0xffff };
+static ROTATION      lastRotation = {.roPitch = 0xffff, .roRoll = 0xffff, .roYaw = 0xffff };
+ 
 /* Reference: http://www.wacomeng.com/devsupport/ibmpc/gddevpc.html
  *
  * Cursors come in sets of 3 normally
@@ -532,6 +539,8 @@ BOOL CDECL X11DRV_LoadTabletInfo(HWND hwnddefault)
     gSysContext.lcPktRate = 100;
     gSysContext.lcBtnDnMask = 0xffffffff;
     gSysContext.lcBtnUpMask = 0xffffffff;
+    gSysContext.lcOutExtX = 1600;
+    gSysContext.lcOutExtY = 900;
     gSysContext.lcSensX = 65536;
     gSysContext.lcSensY = 65536;
     gSysContext.lcSensX = 65536;
@@ -845,6 +854,40 @@ static int cursor_from_device(DWORD deviceid, LPWTI_CURSORS_INFO *cursorp)
     return -1;
 }
 
+static DWORD setChanged( WTPACKET *pkt) {
+    DWORD change = 0;
+    if (pkt -> pkX != lastX) {
+        change |= PK_X;
+        lastX = pkt->pkX;
+    }
+    if (pkt -> pkY != lastY) {
+        change |= PK_Y;
+        lastY = pkt->pkY;
+    }
+    if (pkt -> pkNormalPressure != lastNormalPressure) {
+        change |= PK_NORMAL_PRESSURE;
+        lastNormalPressure = pkt->pkNormalPressure;
+    }
+    if (pkt -> pkCursor != lastCursor) {
+        change |= PK_CURSOR;
+        lastCursor = pkt->pkCursor;
+    }
+    if (pkt -> pkButtons != lastButtons) {
+        change |= PK_BUTTONS;
+        lastButtons = pkt->pkButtons;
+    }
+    if (pkt -> pkOrientation.orAzimuth != lastOrientation.orAzimuth || pkt -> pkOrientation.orAltitude != lastOrientation.orAltitude || pkt -> pkOrientation.orTwist != lastOrientation.orTwist) {
+        change |= PK_ORIENTATION;
+        lastOrientation = pkt->pkOrientation;
+    }
+    if (pkt -> pkRotation.roPitch != lastRotation.roPitch || pkt -> pkRotation.roRoll != lastRotation.roRoll || pkt -> pkRotation.roYaw != lastRotation.roYaw) {
+        change |= PK_ROTATION;
+        lastRotation = pkt->pkRotation;
+    }
+
+    return change; 
+}
+
 static void motion_event( HWND hwnd, XEvent *event )
 {
     XDeviceMotionEvent *motion = (XDeviceMotionEvent *)event;
@@ -871,6 +914,7 @@ static void motion_event( HWND hwnd, XEvent *event )
                                            * (gMsgPacket.pkStatus & TPS_INVERT?-1:1));
     gMsgPacket.pkNormalPressure = motion->axis_data[2];
     gMsgPacket.pkButtons = get_button_state(curnum);
+    gMsgPacket.pkChanged = setChanged(&gMsgPacket);
     SendMessageW(hwndTabletDefault,WT_PACKET,gMsgPacket.pkSerialNumber,(LPARAM)hwnd);
 }
 
@@ -900,6 +944,7 @@ static void button_event( HWND hwnd, XEvent *event )
                                            * (gMsgPacket.pkStatus & TPS_INVERT?-1:1));
     gMsgPacket.pkNormalPressure = button->axis_data[2];
     gMsgPacket.pkButtons = get_button_state(curnum);
+    gMsgPacket.pkChanged = setChanged(&gMsgPacket);
     SendMessageW(hwndTabletDefault,WT_PACKET,gMsgPacket.pkSerialNumber,(LPARAM)hwnd);
 }
 
diff --git a/dlls/wintab32/context.c b/dlls/wintab32/context.c
index 7278373..9bc29a4 100644
--- a/dlls/wintab32/context.c
+++ b/dlls/wintab32/context.c
@@ -313,7 +313,7 @@ static LPVOID TABLET_CopyPacketData(LPOPENCONTEXT context, LPVOID lpPkt,
     if (context->context.lcPktData & PK_CHANGED)
         ptr+=CopyTabletData(ptr,&wtp->pkChanged,sizeof(WTPKT));
     if (context->context.lcPktData & PK_SERIAL_NUMBER)
-        ptr+=CopyTabletData(ptr,&wtp->pkChanged,sizeof(UINT));
+        ptr+=CopyTabletData(ptr,&wtp->pkSerialNumber,sizeof(UINT));
     if (context->context.lcPktData & PK_CURSOR)
         ptr+=CopyTabletData(ptr,&wtp->pkCursor,sizeof(UINT));
     if (context->context.lcPktData & PK_BUTTONS)
-- 
1.8.3.2



More information about the wine-patches mailing list