winex11: Implement PK_CHANGE for wintab.

Based on a patch by Eriks Dobelis.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alistair Leslie-Hughes 2019-04-10 03:42:53 +00:00 committed by Alexandre Julliard
parent 4c7ffaecaf
commit 0652a2ccc9
2 changed files with 40 additions and 0 deletions

View File

@ -267,6 +267,7 @@ static int proximity_out_type;
static HWND hwndTabletDefault;
static WTPACKET gMsgPacket;
static DWORD gSerial;
static WTPACKET last_packet;
/* Reference: http://www.wacomeng.com/devsupport/ibmpc/gddevpc.html
*
@ -839,6 +840,40 @@ static int cursor_from_device(DWORD deviceid, LPWTI_CURSORS_INFO *cursorp)
return -1;
}
static DWORD get_changed_state( WTPACKET *pkt)
{
DWORD change = 0;
if (pkt->pkX != last_packet.pkX)
change |= PK_X;
if (pkt->pkY != last_packet.pkY)
change |= PK_Y;
if (pkt->pkZ != last_packet.pkZ)
change |= PK_Z;
if (pkt->pkSerialNumber != last_packet.pkSerialNumber)
change |= PK_SERIAL_NUMBER;
if (pkt->pkTime != last_packet.pkTime)
change |= PK_TIME;
if (pkt->pkNormalPressure != last_packet.pkNormalPressure)
change |= PK_NORMAL_PRESSURE;
if (pkt->pkTangentPressure != last_packet.pkTangentPressure)
change |= PK_TANGENT_PRESSURE;
if (pkt->pkCursor != last_packet.pkCursor)
change |= PK_CURSOR;
if (pkt->pkButtons != last_packet.pkButtons)
change |= PK_BUTTONS;
if (pkt->pkOrientation.orAzimuth != last_packet.pkOrientation.orAzimuth ||
pkt->pkOrientation.orAltitude != last_packet.pkOrientation.orAltitude ||
pkt->pkOrientation.orTwist != last_packet.pkOrientation.orTwist)
change |= PK_ORIENTATION;
if (pkt->pkRotation.roPitch != last_packet.pkRotation.roPitch ||
pkt->pkRotation.roRoll != last_packet.pkRotation.roRoll ||
pkt->pkRotation.roYaw != last_packet.pkRotation.roYaw)
change |= PK_ROTATION;
return change;
}
static BOOL motion_event( HWND hwnd, XEvent *event )
{
XDeviceMotionEvent *motion = (XDeviceMotionEvent *)event;
@ -865,7 +900,9 @@ static BOOL 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 = get_changed_state(&gMsgPacket);
SendMessageW(hwndTabletDefault,WT_PACKET,gMsgPacket.pkSerialNumber,(LPARAM)hwnd);
last_packet = gMsgPacket;
return TRUE;
}
@ -895,7 +932,9 @@ static BOOL 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 = get_changed_state(&gMsgPacket);
SendMessageW(hwndTabletDefault,WT_PACKET,gMsgPacket.pkSerialNumber,(LPARAM)hwnd);
last_packet = gMsgPacket;
return TRUE;
}

View File

@ -215,6 +215,7 @@ LPOPENCONTEXT AddPacketToContextQueue(LPWTPACKET packet, HWND hwnd)
packet->pkContext = ptr->handle;
/* translate packet data to the context */
packet->pkChanged = packet->pkChanged & ptr->context.lcPktData;
/* Scale as per documentation */
packet->pkY = ScaleForContext(packet->pkY, ptr->context.lcInOrgY,