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