Enable Tablet support with both Tilt and Pressure.
This commit is contained in:
parent
4e4460eaef
commit
2eebf3c78e
|
@ -7410,9 +7410,11 @@ _ACEOF
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for ac_header in X11/XKBlib.h \
|
for ac_header in X11/XKBlib.h \
|
||||||
X11/Xutil.h \
|
X11/Xutil.h \
|
||||||
X11/extensions/shape.h \
|
X11/extensions/shape.h \
|
||||||
|
X11/extensions/XInput.h \
|
||||||
X11/extensions/XShm.h \
|
X11/extensions/XShm.h \
|
||||||
X11/extensions/Xrandr.h \
|
X11/extensions/Xrandr.h \
|
||||||
X11/extensions/Xrender.h \
|
X11/extensions/Xrender.h \
|
||||||
|
@ -14333,6 +14335,80 @@ cat >>confdefs.h <<_ACEOF
|
||||||
_ACEOF
|
_ACEOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking for -lXi soname" >&5
|
||||||
|
echo $ECHO_N "checking for -lXi soname... $ECHO_C" >&6
|
||||||
|
if test "${ac_cv_lib_soname_Xi+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
ac_get_soname_save_LIBS=$LIBS
|
||||||
|
LIBS="-lXi $X_LIBS -lXext -lX11 $X_EXTRA_LIBS $LIBS"
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
char XOpenDevice ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
XOpenDevice ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||||
|
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||||
|
(eval $ac_link) 2>conftest.er1
|
||||||
|
ac_status=$?
|
||||||
|
grep -v '^ *+' conftest.er1 >conftest.err
|
||||||
|
rm -f conftest.er1
|
||||||
|
cat conftest.err >&5
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } &&
|
||||||
|
{ ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; } &&
|
||||||
|
{ ac_try='test -s conftest$ac_exeext'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }; then
|
||||||
|
ac_cv_lib_soname_Xi=`$ac_cv_path_LDD conftest$ac_exeext | grep libXi\\.so | sed 's/^.*\(libXi\.so[^ ]*\).*$/\1/'`
|
||||||
|
if test "x$ac_cv_lib_soname_Xi" = "x"
|
||||||
|
then
|
||||||
|
ac_cv_lib_soname_Xi="libXi.so"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
ac_cv_lib_soname_Xi="libXi.so"
|
||||||
|
fi
|
||||||
|
rm -f conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
LIBS=$ac_get_soname_save_LIBS
|
||||||
|
fi
|
||||||
|
echo "$as_me:$LINENO: result: $ac_cv_lib_soname_Xi" >&5
|
||||||
|
echo "${ECHO_T}$ac_cv_lib_soname_Xi" >&6
|
||||||
|
if test "x$ac_cv_lib_soname_Xi" != xNONE
|
||||||
|
then
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SONAME_LIBXI "$ac_cv_lib_soname_Xi"
|
||||||
|
_ACEOF
|
||||||
|
fi
|
||||||
|
|
||||||
echo "$as_me:$LINENO: checking for -lXrender soname" >&5
|
echo "$as_me:$LINENO: checking for -lXrender soname" >&5
|
||||||
echo $ECHO_N "checking for -lXrender soname... $ECHO_C" >&6
|
echo $ECHO_N "checking for -lXrender soname... $ECHO_C" >&6
|
||||||
if test "${ac_cv_lib_soname_Xrender+set}" = set; then
|
if test "${ac_cv_lib_soname_Xrender+set}" = set; then
|
||||||
|
|
|
@ -181,6 +181,7 @@ then
|
||||||
AC_CHECK_HEADERS([X11/XKBlib.h \
|
AC_CHECK_HEADERS([X11/XKBlib.h \
|
||||||
X11/Xutil.h \
|
X11/Xutil.h \
|
||||||
X11/extensions/shape.h \
|
X11/extensions/shape.h \
|
||||||
|
X11/extensions/XInput.h \
|
||||||
X11/extensions/XShm.h \
|
X11/extensions/XShm.h \
|
||||||
X11/extensions/Xrandr.h \
|
X11/extensions/Xrandr.h \
|
||||||
X11/extensions/Xrender.h \
|
X11/extensions/Xrender.h \
|
||||||
|
@ -989,6 +990,7 @@ if test "$LIBEXT" = "so"
|
||||||
then
|
then
|
||||||
WINE_GET_SONAME(X11,XCreateWindow,[$X_LIBS $X_EXTRA_LIBS])
|
WINE_GET_SONAME(X11,XCreateWindow,[$X_LIBS $X_EXTRA_LIBS])
|
||||||
WINE_GET_SONAME(Xext,XextCreateExtension,[$X_LIBS -lX11 $X_EXTRA_LIBS])
|
WINE_GET_SONAME(Xext,XextCreateExtension,[$X_LIBS -lX11 $X_EXTRA_LIBS])
|
||||||
|
WINE_GET_SONAME(Xi,XOpenDevice,[$X_LIBS -lXext -lX11 $X_EXTRA_LIBS])
|
||||||
WINE_GET_SONAME(Xrender,XRenderQueryExtension,[$X_LIBS -lXext -lX11 $X_EXTRA_LIBS])
|
WINE_GET_SONAME(Xrender,XRenderQueryExtension,[$X_LIBS -lXext -lX11 $X_EXTRA_LIBS])
|
||||||
WINE_GET_SONAME(freetype,FT_Init_FreeType,[$X_LIBS])
|
WINE_GET_SONAME(freetype,FT_Init_FreeType,[$X_LIBS])
|
||||||
WINE_GET_SONAME(GL,glXQueryExtension,[$X_LIBS $X_EXTRA_LIBS])
|
WINE_GET_SONAME(GL,glXQueryExtension,[$X_LIBS $X_EXTRA_LIBS])
|
||||||
|
|
|
@ -3,14 +3,15 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = wintab32.dll
|
MODULE = wintab32.dll
|
||||||
IMPORTS = kernel32
|
IMPORTS = user32 kernel32
|
||||||
ALTNAMES = wintab.dll
|
ALTNAMES = wintab.dll
|
||||||
|
|
||||||
SPEC_SRCS16 = $(ALTNAMES:.dll=.spec)
|
SPEC_SRCS16 = $(ALTNAMES:.dll=.spec)
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
context.c \
|
context.c \
|
||||||
manager.c
|
manager.c \
|
||||||
|
wintab32.c
|
||||||
|
|
||||||
C_SRCS16 = \
|
C_SRCS16 = \
|
||||||
wintab16.c
|
wintab16.c
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* Tablet Context
|
* Tablet Context
|
||||||
*
|
*
|
||||||
* Copyright 2002 Patrik Stridvall
|
* Copyright 2002 Patrik Stridvall
|
||||||
|
* Copyright 2003 CodeWeavers, Aric Stewart
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -19,29 +20,333 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
|
||||||
#include "wintab.h"
|
#include "wintab.h"
|
||||||
|
#include "wintab_internal.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(wintab32);
|
WINE_DEFAULT_DEBUG_CHANNEL(wintab32);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Documentation found at
|
||||||
|
* http://www.csl.sony.co.jp/projects/ar/restricted/wintabl.html
|
||||||
|
*/
|
||||||
|
|
||||||
|
static BOOL gLoaded;
|
||||||
|
static LPOPENCONTEXT gOpenContexts;
|
||||||
|
static HCTX gTopContext = (HCTX)0xc00;
|
||||||
|
|
||||||
|
static char* DUMPBITS(int x, char* buf)
|
||||||
|
{
|
||||||
|
strcpy(buf,"{");
|
||||||
|
if (x&PK_CONTEXT) strcat(buf,"PK_CONTEXT ");
|
||||||
|
if (x&PK_STATUS) strcat(buf, "PK_STATUS ");
|
||||||
|
if (x&PK_TIME) strcat(buf, "PK_TIME ");
|
||||||
|
if (x&PK_CHANGED) strcat(buf, "PK_CHANGED ");
|
||||||
|
if (x&PK_SERIAL_NUMBER) strcat(buf, "PK_SERIAL_NUMBER ");
|
||||||
|
if (x&PK_CURSOR) strcat(buf, "PK_CURSOR ");
|
||||||
|
if (x&PK_BUTTONS) strcat(buf, "PK_BUTTONS ");
|
||||||
|
if (x&PK_X) strcat(buf, "PK_X ");
|
||||||
|
if (x&PK_Y) strcat(buf, "PK_Y ");
|
||||||
|
if (x&PK_Z) strcat(buf, "PK_Z ");
|
||||||
|
if (x&PK_NORMAL_PRESSURE) strcat(buf, "PK_NORMAL_PRESSURE ");
|
||||||
|
if (x&PK_TANGENT_PRESSURE) strcat(buf, "PK_TANGENT_PRESSURE ");
|
||||||
|
if (x&PK_ORIENTATION) strcat(buf, "PK_ORIENTATION ");
|
||||||
|
if (x&PK_ROTATION) strcat(buf, "PK_ROTATION ");
|
||||||
|
strcat(buf, "}");
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void DUMPPACKET(WTPACKET packet)
|
||||||
|
{
|
||||||
|
TRACE("pkContext: 0x%x pkStatus: 0x%x pkTime : 0x%x pkChanged: 0x%x pkSerialNumber: 0x%x pkCursor : %i pkButtons: %x pkX: %li pkY: %li pkZ: %li pkNormalPressure: %i pkTangentPressure: %i pkOrientation: (%i,%i,%i) pkRotation: (%i,%i,%i)\n"
|
||||||
|
,(UINT)packet.pkContext,
|
||||||
|
(UINT)packet.pkStatus,
|
||||||
|
(UINT)packet.pkTime,
|
||||||
|
(UINT)packet.pkChanged,
|
||||||
|
packet.pkSerialNumber,
|
||||||
|
packet.pkCursor,
|
||||||
|
(UINT)packet.pkButtons,
|
||||||
|
packet.pkX,
|
||||||
|
packet.pkY,
|
||||||
|
packet.pkZ,
|
||||||
|
packet.pkNormalPressure,
|
||||||
|
packet.pkTangentPressure,
|
||||||
|
packet.pkOrientation.orAzimuth,
|
||||||
|
packet.pkOrientation.orAltitude, packet.pkOrientation.orTwist,
|
||||||
|
packet.pkRotation.roPitch,
|
||||||
|
packet.pkRotation.roRoll, packet.pkRotation.roYaw);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void DUMPCONTEXT(LOGCONTEXTA lc)
|
||||||
|
{
|
||||||
|
CHAR mmsg[4000];
|
||||||
|
CHAR bits[100];
|
||||||
|
CHAR bits1[100];
|
||||||
|
CHAR bits2[100];
|
||||||
|
|
||||||
|
sprintf(mmsg,"%s, %x, %x, %x, %x, %x, %x, %x%s, %x%s, %x%s, %x, %x, %i, %i, %i, %li ,%li, %li, %li, %li, %li,%li, %li, %li, %li, %li, %li, %i, %i, %i, %i, %i %li %li\n",
|
||||||
|
debugstr_a(lc.lcName), lc.lcOptions, lc.lcStatus, lc.lcLocks, lc.lcMsgBase,
|
||||||
|
lc.lcDevice, lc.lcPktRate, (UINT)lc.lcPktData, DUMPBITS(lc.lcPktData,bits),
|
||||||
|
(UINT)lc.lcPktMode, DUMPBITS(lc.lcPktMode,bits1), (UINT)lc.lcMoveMask,
|
||||||
|
DUMPBITS(lc.lcMoveMask,bits2), (INT)lc.lcBtnDnMask, (INT)lc.lcBtnUpMask,
|
||||||
|
(INT)lc.lcInOrgX, (INT)lc.lcInOrgY, (INT)lc.lcInOrgZ, lc.lcInExtX, lc.lcInExtY,
|
||||||
|
lc.lcInExtZ, lc.lcOutOrgX, lc.lcOutOrgY, lc.lcOutOrgZ, lc.lcOutExtX,
|
||||||
|
lc.lcOutExtY, lc.lcOutExtZ, lc.lcSensX, lc.lcSensY, lc.lcSensZ, lc.lcSysMode,
|
||||||
|
lc.lcSysOrgX, lc.lcSysOrgY, lc.lcSysExtX, lc.lcSysExtY, lc.lcSysSensX,
|
||||||
|
lc.lcSysSensY);
|
||||||
|
TRACE("context: %s",mmsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Find an open context given the handle */
|
||||||
|
static LPOPENCONTEXT TABLET_FindOpenContext(HCTX hCtx)
|
||||||
|
{
|
||||||
|
LPOPENCONTEXT ptr = gOpenContexts;
|
||||||
|
while (ptr)
|
||||||
|
{
|
||||||
|
if (ptr->handle == hCtx) return ptr;
|
||||||
|
ptr = ptr->next;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void LoadTablet()
|
||||||
|
{
|
||||||
|
TRACE("Initilizing the tablet to hwnd %p\n",hwndDefault);
|
||||||
|
gLoaded= TRUE;
|
||||||
|
pLoadTabletInfo(hwndDefault);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TABLET_PostTabletMessage(LPOPENCONTEXT newcontext, UINT msg, WPARAM wParam,
|
||||||
|
LPARAM lParam, BOOL send_always)
|
||||||
|
{
|
||||||
|
if ((send_always) || (newcontext->context.lcOptions & CXO_MESSAGES))
|
||||||
|
{
|
||||||
|
TRACE("Posting message %x to %x\n",msg, (UINT)newcontext->hwndOwner);
|
||||||
|
return PostMessageA(newcontext->hwndOwner, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline DWORD ScaleForContext(DWORD In, DWORD InOrg, DWORD InExt, DWORD
|
||||||
|
OutOrg, DWORD OutExt)
|
||||||
|
{
|
||||||
|
if (((InExt > 0 )&&(OutExt > 0)) || ((InExt<0) && (OutExt < 0)))
|
||||||
|
return ((In - InOrg) * abs(OutExt) / abs(InExt)) + OutOrg;
|
||||||
|
else
|
||||||
|
return ((abs(InExt) - (In - InOrg))*abs(OutExt) / abs(InExt)) + OutOrg;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPOPENCONTEXT FindOpenContext(HWND hwnd)
|
||||||
|
{
|
||||||
|
LPOPENCONTEXT ptr;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
ptr = gOpenContexts;
|
||||||
|
while (ptr)
|
||||||
|
{
|
||||||
|
TRACE("Trying Context %p (%p %p)\n",ptr->handle,hwnd,ptr->hwndOwner);
|
||||||
|
if (ptr->hwndOwner == hwnd) break;
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPOPENCONTEXT AddPacketToContextQueue(LPWTPACKET packet, HWND hwnd)
|
||||||
|
{
|
||||||
|
LPOPENCONTEXT ptr=NULL;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
ptr = gOpenContexts;
|
||||||
|
while (ptr)
|
||||||
|
{
|
||||||
|
TRACE("Trying Queue %p (%p %p)\n", ptr->handle, hwnd, ptr->hwndOwner);
|
||||||
|
|
||||||
|
if (ptr->hwndOwner == hwnd)
|
||||||
|
{
|
||||||
|
int tgt;
|
||||||
|
if (!ptr->enabled)
|
||||||
|
{
|
||||||
|
ptr = ptr->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tgt = ptr->PacketsQueued;
|
||||||
|
|
||||||
|
packet->pkContext = ptr->handle;
|
||||||
|
|
||||||
|
/* translate packet data to the context */
|
||||||
|
|
||||||
|
/* Scale as per documentation */
|
||||||
|
packet->pkY = ScaleForContext(packet->pkY, ptr->context.lcInOrgY,
|
||||||
|
ptr->context.lcInExtY, ptr->context.lcOutOrgY,
|
||||||
|
ptr->context.lcOutExtY);
|
||||||
|
|
||||||
|
packet->pkX = ScaleForContext(packet->pkX, ptr->context.lcInOrgX,
|
||||||
|
ptr->context.lcInExtX, ptr->context.lcOutOrgX,
|
||||||
|
ptr->context.lcOutExtX);
|
||||||
|
|
||||||
|
/* flip the Y axis */
|
||||||
|
if (ptr->context.lcOutExtY > 0)
|
||||||
|
packet->pkY = ptr->context.lcOutExtY - packet->pkY;
|
||||||
|
|
||||||
|
DUMPPACKET(*packet);
|
||||||
|
|
||||||
|
if (tgt + 1 == ptr->QueueSize)
|
||||||
|
{
|
||||||
|
TRACE("Queue Overflow %p\n",ptr->handle);
|
||||||
|
packet->pkStatus = TPS_QUEUE_ERR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("Placed in queue %p index %i\n",ptr->handle,tgt);
|
||||||
|
memcpy(&ptr->PacketQueue[tgt], packet, sizeof
|
||||||
|
(WTPACKET));
|
||||||
|
ptr->PacketsQueued++;
|
||||||
|
|
||||||
|
if (ptr->ActiveCursor != packet->pkCursor)
|
||||||
|
{
|
||||||
|
ptr->ActiveCursor = packet->pkCursor;
|
||||||
|
if (ptr->context.lcOptions & CXO_CSRMESSAGES)
|
||||||
|
TABLET_PostTabletMessage(ptr, WT_CSRCHANGE,
|
||||||
|
(WPARAM)packet->pkSerialNumber, (LPARAM)ptr->handle,
|
||||||
|
FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ptr = ptr->next;
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
TRACE("Done (%p)\n",ptr);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int static inline CopyTabletData(LPVOID target, LPVOID src, INT size)
|
||||||
|
{
|
||||||
|
memcpy(target,src,size);
|
||||||
|
return(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static INT TABLET_FindPacket(LPOPENCONTEXT context, UINT wSerial,
|
||||||
|
LPWTPACKET *pkt)
|
||||||
|
{
|
||||||
|
int loop;
|
||||||
|
int index = -1;
|
||||||
|
for (loop = 0; loop < context->PacketsQueued; loop++)
|
||||||
|
if (context->PacketQueue[loop].pkSerialNumber == wSerial)
|
||||||
|
{
|
||||||
|
index = loop;
|
||||||
|
*pkt = &context->PacketQueue[loop];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("%i .. %i\n",context->PacketsQueued,index);
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static LPVOID TABLET_CopyPacketData(LPOPENCONTEXT context, LPVOID lpPkt,
|
||||||
|
LPWTPACKET wtp)
|
||||||
|
{
|
||||||
|
LPBYTE ptr;
|
||||||
|
CHAR bits[100];
|
||||||
|
|
||||||
|
ptr = lpPkt;
|
||||||
|
TRACE("Packet Bits %s\n",DUMPBITS(context->context.lcPktData,bits));
|
||||||
|
|
||||||
|
if (context->context.lcPktData & PK_CONTEXT)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkContext,sizeof(HCTX));
|
||||||
|
if (context->context.lcPktData & PK_STATUS)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkStatus,sizeof(UINT));
|
||||||
|
if (context->context.lcPktData & PK_TIME)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkTime,sizeof(LONG));
|
||||||
|
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));
|
||||||
|
if (context->context.lcPktData & PK_CURSOR)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkCursor,sizeof(UINT));
|
||||||
|
if (context->context.lcPktData & PK_BUTTONS)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkButtons,sizeof(DWORD));
|
||||||
|
if (context->context.lcPktData & PK_X)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkX,sizeof(DWORD));
|
||||||
|
if (context->context.lcPktData & PK_Y)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkY,sizeof(DWORD));
|
||||||
|
if (context->context.lcPktData & PK_Z)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkZ,sizeof(DWORD));
|
||||||
|
if (context->context.lcPktData & PK_NORMAL_PRESSURE)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkNormalPressure,sizeof(UINT));
|
||||||
|
if (context->context.lcPktData & PK_TANGENT_PRESSURE)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkTangentPressure,sizeof(UINT));
|
||||||
|
if (context->context.lcPktData & PK_ORIENTATION)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkOrientation,sizeof(ORIENTATION));
|
||||||
|
if (context->context.lcPktData & PK_ROTATION)
|
||||||
|
ptr+=CopyTabletData(ptr,&wtp->pkRotation,sizeof(ROTATION));
|
||||||
|
|
||||||
|
/*TRACE("Copied %i bytes\n",(INT)ptr - (INT)lpPkt); */
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID TABLET_BlankPacketData(LPOPENCONTEXT context, LPVOID lpPkt, INT n)
|
||||||
|
{
|
||||||
|
int rc = 0;
|
||||||
|
|
||||||
|
if (context->context.lcPktData & PK_CONTEXT)
|
||||||
|
rc +=sizeof(HCTX);
|
||||||
|
if (context->context.lcPktData & PK_STATUS)
|
||||||
|
rc +=sizeof(UINT);
|
||||||
|
if (context->context.lcPktData & PK_TIME)
|
||||||
|
rc += sizeof(LONG);
|
||||||
|
if (context->context.lcPktData & PK_CHANGED)
|
||||||
|
rc += sizeof(WTPKT);
|
||||||
|
if (context->context.lcPktData & PK_SERIAL_NUMBER)
|
||||||
|
rc += sizeof(UINT);
|
||||||
|
if (context->context.lcPktData & PK_CURSOR)
|
||||||
|
rc += sizeof(UINT);
|
||||||
|
if (context->context.lcPktData & PK_BUTTONS)
|
||||||
|
rc += sizeof(DWORD);
|
||||||
|
if (context->context.lcPktData & PK_X)
|
||||||
|
rc += sizeof(DWORD);
|
||||||
|
if (context->context.lcPktData & PK_Y)
|
||||||
|
rc += sizeof(DWORD);
|
||||||
|
if (context->context.lcPktData & PK_Z)
|
||||||
|
rc += sizeof(DWORD);
|
||||||
|
if (context->context.lcPktData & PK_NORMAL_PRESSURE)
|
||||||
|
rc += sizeof(UINT);
|
||||||
|
if (context->context.lcPktData & PK_TANGENT_PRESSURE)
|
||||||
|
rc += sizeof(UINT);
|
||||||
|
if (context->context.lcPktData & PK_ORIENTATION)
|
||||||
|
rc += sizeof(ORIENTATION);
|
||||||
|
if (context->context.lcPktData & PK_ROTATION)
|
||||||
|
rc += sizeof(ROTATION);
|
||||||
|
|
||||||
|
rc *= n;
|
||||||
|
memset(lpPkt,0,rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* WTInfoA (WINTAB32.20)
|
* WTInfoA (WINTAB32.20)
|
||||||
*/
|
*/
|
||||||
UINT WINAPI WTInfoA(UINT wCategory, UINT nIndex, LPVOID lpOutput)
|
UINT WINAPI WTInfoA(UINT wCategory, UINT nIndex, LPVOID lpOutput)
|
||||||
{
|
{
|
||||||
FIXME("(%u, %u, %p): stub\n", wCategory, nIndex, lpOutput);
|
if (gLoaded == FALSE)
|
||||||
|
LoadTablet();
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
return pWTInfoA( wCategory, nIndex, lpOutput );
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -61,11 +366,38 @@ UINT WINAPI WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
|
||||||
*/
|
*/
|
||||||
HCTX WINAPI WTOpenA(HWND hWnd, LPLOGCONTEXTA lpLogCtx, BOOL fEnable)
|
HCTX WINAPI WTOpenA(HWND hWnd, LPLOGCONTEXTA lpLogCtx, BOOL fEnable)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %p, %u): stub\n", hWnd, lpLogCtx, fEnable);
|
LPOPENCONTEXT newcontext;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %p, %u)\n", hWnd, lpLogCtx, fEnable);
|
||||||
|
DUMPCONTEXT(*lpLogCtx);
|
||||||
|
|
||||||
return NULL;
|
newcontext = HeapAlloc(GetProcessHeap(), 0 , sizeof(OPENCONTEXT));
|
||||||
|
memcpy(&(newcontext->context),lpLogCtx,sizeof(LOGCONTEXTA));
|
||||||
|
newcontext->hwndOwner = hWnd;
|
||||||
|
newcontext->enabled = fEnable;
|
||||||
|
newcontext->ActiveCursor = -1;
|
||||||
|
newcontext->QueueSize = 10;
|
||||||
|
newcontext->PacketsQueued = 0;
|
||||||
|
newcontext->PacketQueue=HeapAlloc(GetProcessHeap(),0,sizeof(WTPACKET)*10);
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
newcontext->handle = gTopContext++;
|
||||||
|
newcontext->next = gOpenContexts;
|
||||||
|
gOpenContexts = newcontext;
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
pAttachEventQueueToTablet(hWnd);
|
||||||
|
|
||||||
|
TABLET_PostTabletMessage(newcontext, WT_CTXOPEN, (WPARAM)newcontext->handle,
|
||||||
|
newcontext->context.lcStatus, TRUE);
|
||||||
|
|
||||||
|
newcontext->context.lcStatus = CXS_ONTOP;
|
||||||
|
|
||||||
|
TABLET_PostTabletMessage(newcontext, WT_CTXOVERLAP,
|
||||||
|
(WPARAM)newcontext->handle,
|
||||||
|
newcontext->context.lcStatus, TRUE);
|
||||||
|
|
||||||
|
return newcontext->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -85,9 +417,37 @@ HCTX WINAPI WTOpenW(HWND hWnd, LPLOGCONTEXTW lpLogCtx, BOOL fEnable)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI WTClose(HCTX hCtx)
|
BOOL WINAPI WTClose(HCTX hCtx)
|
||||||
{
|
{
|
||||||
FIXME("(%p): stub\n", hCtx);
|
LPOPENCONTEXT context,ptr;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p)\n", hCtx);
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
ptr = context = gOpenContexts;
|
||||||
|
|
||||||
|
while (context && (context->handle != hCtx))
|
||||||
|
{
|
||||||
|
ptr = context;
|
||||||
|
context = context->next;
|
||||||
|
}
|
||||||
|
if (!context)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (context == gOpenContexts)
|
||||||
|
gOpenContexts = context->next;
|
||||||
|
else
|
||||||
|
ptr->next = context->next;
|
||||||
|
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
TABLET_PostTabletMessage(context, WT_CTXCLOSE, (WPARAM)context->handle,
|
||||||
|
context->context.lcStatus,TRUE);
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(),0,context->PacketQueue);
|
||||||
|
HeapFree(GetProcessHeap(),0,context);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -97,11 +457,39 @@ BOOL WINAPI WTClose(HCTX hCtx)
|
||||||
*/
|
*/
|
||||||
int WINAPI WTPacketsGet(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
|
int WINAPI WTPacketsGet(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %d, %p): stub\n", hCtx, cMaxPkts, lpPkts);
|
int limit;
|
||||||
|
LPOPENCONTEXT context;
|
||||||
|
LPVOID ptr = lpPkts;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %d, %p)\n", hCtx, cMaxPkts, lpPkts);
|
||||||
|
|
||||||
return 0;
|
if (!hCtx || !lpPkts) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
TABLET_BlankPacketData(context,lpPkts,cMaxPkts);
|
||||||
|
|
||||||
|
if (context->PacketsQueued == 0)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(limit = 0; limit < cMaxPkts && limit < context->PacketsQueued; limit++)
|
||||||
|
ptr=TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[limit]);
|
||||||
|
|
||||||
|
if (limit < context->PacketsQueued)
|
||||||
|
{
|
||||||
|
memcpy(context->PacketQueue, &context->PacketQueue[limit],
|
||||||
|
(context->QueueSize - (limit))*sizeof(WTPACKET));
|
||||||
|
}
|
||||||
|
context->PacketsQueued -= limit;
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
TRACE("Copied %i packets\n",limit);
|
||||||
|
|
||||||
|
return limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -109,11 +497,36 @@ int WINAPI WTPacketsGet(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI WTPacket(HCTX hCtx, UINT wSerial, LPVOID lpPkt)
|
BOOL WINAPI WTPacket(HCTX hCtx, UINT wSerial, LPVOID lpPkt)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %d, %p): stub\n", hCtx, wSerial, lpPkt);
|
int rc = 0;
|
||||||
|
LPOPENCONTEXT context;
|
||||||
|
LPWTPACKET wtp;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %d, %p)\n", hCtx, wSerial, lpPkt);
|
||||||
|
|
||||||
return FALSE;
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
|
||||||
|
rc = TABLET_FindPacket(context ,wSerial, &wtp);
|
||||||
|
|
||||||
|
if (rc >= 0)
|
||||||
|
{
|
||||||
|
if (lpPkt)
|
||||||
|
TABLET_CopyPacketData(context ,lpPkt, wtp);
|
||||||
|
|
||||||
|
if ((rc+1) < context->QueueSize)
|
||||||
|
{
|
||||||
|
memcpy(context->PacketQueue, &context->PacketQueue[rc+1],
|
||||||
|
(context->QueueSize - (rc+1))*sizeof(WTPACKET));
|
||||||
|
}
|
||||||
|
context->PacketsQueued -= (rc+1);
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
TRACE("Returning %i\n",rc+1);
|
||||||
|
return rc+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -121,11 +534,18 @@ BOOL WINAPI WTPacket(HCTX hCtx, UINT wSerial, LPVOID lpPkt)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI WTEnable(HCTX hCtx, BOOL fEnable)
|
BOOL WINAPI WTEnable(HCTX hCtx, BOOL fEnable)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %u): stub\n", hCtx, fEnable);
|
LPOPENCONTEXT context;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %u)\n", hCtx, fEnable);
|
||||||
|
|
||||||
return FALSE;
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
context->enabled = fEnable;
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -135,9 +555,7 @@ BOOL WINAPI WTOverlap(HCTX hCtx, BOOL fToTop)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %u): stub\n", hCtx, fToTop);
|
FIXME("(%p, %u): stub\n", hCtx, fToTop);
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
return TRUE;
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -157,11 +575,18 @@ BOOL WINAPI WTConfig(HCTX hCtx, HWND hWnd)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI WTGetA(HCTX hCtx, LPLOGCONTEXTA lpLogCtx)
|
BOOL WINAPI WTGetA(HCTX hCtx, LPLOGCONTEXTA lpLogCtx)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %p): stub\n", hCtx, lpLogCtx);
|
LPOPENCONTEXT context;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %p)\n", hCtx, lpLogCtx);
|
||||||
|
|
||||||
return FALSE;
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
memcpy(lpLogCtx,&context->context,sizeof(LOGCONTEXTA));
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -253,11 +678,30 @@ HCTX WINAPI WTRestore(HWND hWnd, LPVOID lpSaveInfo, BOOL fEnable)
|
||||||
*/
|
*/
|
||||||
int WINAPI WTPacketsPeek(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
|
int WINAPI WTPacketsPeek(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %d, %p): stub\n", hCtx, cMaxPkts, lpPkts);
|
int limit;
|
||||||
|
LPOPENCONTEXT context;
|
||||||
|
LPVOID ptr = lpPkts;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %d, %p)\n", hCtx, cMaxPkts, lpPkts);
|
||||||
|
|
||||||
return 0;
|
if (!hCtx || !lpPkts) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
|
||||||
|
if (context->PacketsQueued == 0)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (limit = 0; limit < cMaxPkts && limit < context->PacketsQueued; limit++)
|
||||||
|
ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[limit]);
|
||||||
|
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
TRACE("Copied %i packets\n",limit);
|
||||||
|
return limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -266,12 +710,56 @@ int WINAPI WTPacketsPeek(HCTX hCtx, int cMaxPkts, LPVOID lpPkts)
|
||||||
int WINAPI WTDataGet(HCTX hCtx, UINT wBegin, UINT wEnd,
|
int WINAPI WTDataGet(HCTX hCtx, UINT wBegin, UINT wEnd,
|
||||||
int cMaxPkts, LPVOID lpPkts, LPINT lpNPkts)
|
int cMaxPkts, LPVOID lpPkts, LPINT lpNPkts)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %u, %u, %d, %p, %p): stub\n",
|
LPOPENCONTEXT context;
|
||||||
|
LPVOID ptr = lpPkts;
|
||||||
|
UINT bgn = 0;
|
||||||
|
UINT end = 0;
|
||||||
|
UINT num = 0;
|
||||||
|
|
||||||
|
TRACE("(%p, %u, %u, %d, %p, %p)\n",
|
||||||
hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts);
|
hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts);
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
return 0;
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
|
||||||
|
if (context->PacketsQueued == 0)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (bgn < context->PacketsQueued &&
|
||||||
|
context->PacketQueue[bgn].pkSerialNumber != wBegin)
|
||||||
|
bgn++;
|
||||||
|
|
||||||
|
end = bgn;
|
||||||
|
while (end < context->PacketsQueued &&
|
||||||
|
context->PacketQueue[end].pkSerialNumber != wEnd)
|
||||||
|
end++;
|
||||||
|
|
||||||
|
if (bgn == end == context->PacketsQueued)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (num = bgn; num <= end; num++)
|
||||||
|
ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[end]);
|
||||||
|
|
||||||
|
/* remove read packets */
|
||||||
|
if ((end+1) < context->PacketsQueued)
|
||||||
|
memcpy( &context->PacketQueue[bgn], &context->PacketQueue[end+1],
|
||||||
|
(context->PacketsQueued - ((end-bgn)+1)) * sizeof (WTPACKET));
|
||||||
|
|
||||||
|
context->PacketsQueued -= ((end-bgn)+1);
|
||||||
|
*lpNPkts = ((end-bgn)+1);
|
||||||
|
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
TRACE("Copied %i packets\n",*lpNPkts);
|
||||||
|
return (end - bgn)+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -280,12 +768,51 @@ int WINAPI WTDataGet(HCTX hCtx, UINT wBegin, UINT wEnd,
|
||||||
int WINAPI WTDataPeek(HCTX hCtx, UINT wBegin, UINT wEnd,
|
int WINAPI WTDataPeek(HCTX hCtx, UINT wBegin, UINT wEnd,
|
||||||
int cMaxPkts, LPVOID lpPkts, LPINT lpNPkts)
|
int cMaxPkts, LPVOID lpPkts, LPINT lpNPkts)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %u, %u, %d, %p, %p): stub\n",
|
LPOPENCONTEXT context;
|
||||||
|
LPVOID ptr = lpPkts;
|
||||||
|
UINT bgn = 0;
|
||||||
|
UINT end = 0;
|
||||||
|
UINT num = 0;
|
||||||
|
|
||||||
|
TRACE("(%p, %u, %u, %d, %p, %p)\n",
|
||||||
hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts);
|
hCtx, wBegin, wEnd, cMaxPkts, lpPkts, lpNPkts);
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
return 0;
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
|
||||||
|
if (context->PacketsQueued == 0)
|
||||||
|
{
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (bgn < context->PacketsQueued &&
|
||||||
|
context->PacketQueue[bgn].pkSerialNumber != wBegin)
|
||||||
|
bgn++;
|
||||||
|
|
||||||
|
end = bgn;
|
||||||
|
while (end < context->PacketsQueued &&
|
||||||
|
context->PacketQueue[end].pkSerialNumber != wEnd)
|
||||||
|
end++;
|
||||||
|
|
||||||
|
if (bgn == context->PacketsQueued || end == context->PacketsQueued)
|
||||||
|
{
|
||||||
|
TRACE("%i %i %i \n", bgn, end, context->PacketsQueued);
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (num = bgn; num <= end; num++)
|
||||||
|
ptr = TABLET_CopyPacketData(context ,ptr, &context->PacketQueue[end]);
|
||||||
|
|
||||||
|
*lpNPkts = ((end-bgn)+1);
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
TRACE("Copied %i packets\n",*lpNPkts);
|
||||||
|
return (end - bgn)+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -293,9 +820,28 @@ int WINAPI WTDataPeek(HCTX hCtx, UINT wBegin, UINT wEnd,
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI WTQueuePacketsEx(HCTX hCtx, UINT *lpOld, UINT *lpNew)
|
BOOL WINAPI WTQueuePacketsEx(HCTX hCtx, UINT *lpOld, UINT *lpNew)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %p, %p): stub\n", hCtx, lpOld, lpNew);
|
LPOPENCONTEXT context;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %p, %p)\n", hCtx, lpOld, lpNew);
|
||||||
|
|
||||||
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
|
||||||
|
if (context->PacketsQueued)
|
||||||
|
{
|
||||||
|
*lpOld = context->PacketQueue[0].pkSerialNumber;
|
||||||
|
*lpNew = context->PacketQueue[context->PacketsQueued-1].pkSerialNumber;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("No packets\n");
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -305,11 +851,15 @@ BOOL WINAPI WTQueuePacketsEx(HCTX hCtx, UINT *lpOld, UINT *lpNew)
|
||||||
*/
|
*/
|
||||||
int WINAPI WTQueueSizeGet(HCTX hCtx)
|
int WINAPI WTQueueSizeGet(HCTX hCtx)
|
||||||
{
|
{
|
||||||
FIXME("(%p): stub\n", hCtx);
|
LPOPENCONTEXT context;
|
||||||
|
TRACE("(%p)\n", hCtx);
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
return 0;
|
EnterCriticalSection(&csTablet);
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
return context->QueueSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
@ -317,9 +867,21 @@ int WINAPI WTQueueSizeGet(HCTX hCtx)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI WTQueueSizeSet(HCTX hCtx, int nPkts)
|
BOOL WINAPI WTQueueSizeSet(HCTX hCtx, int nPkts)
|
||||||
{
|
{
|
||||||
FIXME("(%p, %d): stub\n", hCtx, nPkts);
|
LPOPENCONTEXT context;
|
||||||
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
TRACE("(%p, %d)\n", hCtx, nPkts);
|
||||||
|
|
||||||
return 0;
|
if (!hCtx) return 0;
|
||||||
|
|
||||||
|
EnterCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
context = TABLET_FindOpenContext(hCtx);
|
||||||
|
|
||||||
|
context->PacketQueue = HeapReAlloc(GetProcessHeap(), 0,
|
||||||
|
context->PacketQueue, sizeof(WTPACKET)*nPkts);
|
||||||
|
|
||||||
|
context->QueueSize = nPkts;
|
||||||
|
LeaveCriticalSection(&csTablet);
|
||||||
|
|
||||||
|
return nPkts;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,148 @@
|
||||||
|
/*
|
||||||
|
* WinTab32 library
|
||||||
|
*
|
||||||
|
* Copyright 2003 CodeWeavers, Aric Stewart
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winerror.h"
|
||||||
|
#include "wintab.h"
|
||||||
|
#include "wintab_internal.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(wintab32);
|
||||||
|
|
||||||
|
HWND hwndDefault = NULL;
|
||||||
|
static const WCHAR
|
||||||
|
WC_TABLETCLASSNAME[] = {'W','i','n','e','T','a','b','l','e','t','C','l','a','s','s',0};
|
||||||
|
CRITICAL_SECTION csTablet;
|
||||||
|
|
||||||
|
int (*pLoadTabletInfo)(HWND hwnddefault) = NULL;
|
||||||
|
int (*pGetCurrentPacket)(LPWTPACKET packet) = NULL;
|
||||||
|
int (*pAttachEventQueueToTablet)(HWND hOwner) = NULL;
|
||||||
|
UINT (*pWTInfoA)(UINT wCategory, UINT nIndex, LPVOID lpOutput) = NULL;
|
||||||
|
|
||||||
|
static LRESULT WINAPI TABLET_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||||
|
LPARAM lParam);
|
||||||
|
|
||||||
|
static VOID TABLET_Register()
|
||||||
|
{
|
||||||
|
WNDCLASSW wndClass;
|
||||||
|
ZeroMemory(&wndClass, sizeof(WNDCLASSW));
|
||||||
|
wndClass.style = CS_GLOBALCLASS;
|
||||||
|
wndClass.lpfnWndProc = TABLET_WindowProc;
|
||||||
|
wndClass.cbClsExtra = 0;
|
||||||
|
wndClass.cbWndExtra = 0;
|
||||||
|
wndClass.hCursor = (HCURSOR)NULL;
|
||||||
|
wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW +1);
|
||||||
|
wndClass.lpszClassName = WC_TABLETCLASSNAME;
|
||||||
|
RegisterClassW(&wndClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
static VOID TABLET_Unregister()
|
||||||
|
{
|
||||||
|
UnregisterClassW(WC_TABLETCLASSNAME, (HINSTANCE)NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved)
|
||||||
|
{
|
||||||
|
static const WCHAR name[] = {'T','a','b','l','e','t',0};
|
||||||
|
HMODULE hx11drv;
|
||||||
|
|
||||||
|
TRACE("%p, %lx, %p\n",hInstDLL,fdwReason,lpReserved);
|
||||||
|
switch (fdwReason)
|
||||||
|
{
|
||||||
|
case DLL_PROCESS_ATTACH:
|
||||||
|
TRACE("Initialization\n");
|
||||||
|
InitializeCriticalSection(&csTablet);
|
||||||
|
hx11drv = GetModuleHandleA("x11drv.dll");
|
||||||
|
if (hx11drv)
|
||||||
|
{
|
||||||
|
pLoadTabletInfo = (void *)GetProcAddress(hx11drv, "LoadTabletInfo");
|
||||||
|
pAttachEventQueueToTablet = (void *)GetProcAddress(hx11drv, "AttachEventQueueToTablet");
|
||||||
|
pGetCurrentPacket = (void *)GetProcAddress(hx11drv, "GetCurrentPacket");
|
||||||
|
pWTInfoA = (void *)GetProcAddress(hx11drv, "WTInfoA");
|
||||||
|
TABLET_Register();
|
||||||
|
hwndDefault = CreateWindowW(WC_TABLETCLASSNAME, name,
|
||||||
|
WS_POPUPWINDOW,0,0,0,0,0,0,hInstDLL,0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
TRACE("Detaching\n");
|
||||||
|
if (hwndDefault)
|
||||||
|
{
|
||||||
|
DestroyWindow(hwndDefault);
|
||||||
|
hwndDefault = 0;
|
||||||
|
}
|
||||||
|
TABLET_Unregister();
|
||||||
|
DeleteCriticalSection(&csTablet);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The window proc for the default TABLET window
|
||||||
|
*/
|
||||||
|
static LRESULT WINAPI TABLET_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||||
|
LPARAM lParam)
|
||||||
|
{
|
||||||
|
TRACE("Incomming Message 0x%x (0x%08x, 0x%08x)\n", uMsg, (UINT)wParam,
|
||||||
|
(UINT)lParam);
|
||||||
|
|
||||||
|
switch(uMsg)
|
||||||
|
{
|
||||||
|
case WM_NCCREATE:
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
case WT_PACKET:
|
||||||
|
{
|
||||||
|
WTPACKET packet;
|
||||||
|
LPOPENCONTEXT handler;
|
||||||
|
pGetCurrentPacket(&packet);
|
||||||
|
handler = AddPacketToContextQueue(&packet,(HWND)lParam);
|
||||||
|
if (handler)
|
||||||
|
TABLET_PostTabletMessage(handler, WT_PACKET,
|
||||||
|
(WPARAM)packet.pkSerialNumber,
|
||||||
|
(LPARAM)handler->handle, FALSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WT_PROXIMITY:
|
||||||
|
{
|
||||||
|
LPOPENCONTEXT handler;
|
||||||
|
LPARAM prox;
|
||||||
|
handler = FindOpenContext((HWND)lParam);
|
||||||
|
if (handler)
|
||||||
|
{
|
||||||
|
prox = MAKELPARAM( wParam, 1 );
|
||||||
|
TABLET_PostTabletMessage(handler, WT_PROXIMITY,
|
||||||
|
(WPARAM)handler->handle, (LPARAM)prox,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,163 @@
|
||||||
|
/*
|
||||||
|
* Tablet header
|
||||||
|
*
|
||||||
|
* Copyright 2003 CodeWeavers (Aric Stewart)
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __WINE_WINTAB_INTERNAL_H
|
||||||
|
#define __WINE_WINTAB_INTERNAL_H
|
||||||
|
|
||||||
|
typedef struct tagWTI_INTERFACE_INFO {
|
||||||
|
CHAR WINTABID[1024];
|
||||||
|
/* a copy of the null-terminated tablet hardware identification string
|
||||||
|
* in the user buffer. This string should include make, model, and
|
||||||
|
* revision information in user-readable format.
|
||||||
|
*/
|
||||||
|
WORD SPECVERSION;
|
||||||
|
/* the specification version number. The high-order byte contains the
|
||||||
|
* major version number; the low-order byte contains the minor version
|
||||||
|
* number.
|
||||||
|
*/
|
||||||
|
WORD IMPLVERSION;
|
||||||
|
/* the implementation version number. The high-order byte contains the
|
||||||
|
* major version number; the low-order byte contains the minor version
|
||||||
|
* number.
|
||||||
|
*/
|
||||||
|
UINT NDEVICES;
|
||||||
|
/* the number of devices supported. */
|
||||||
|
UINT NCURSORS;
|
||||||
|
/* the total number of cursor types supported. */
|
||||||
|
UINT NCONTEXTS;
|
||||||
|
/* the number of contexts supported. */
|
||||||
|
UINT CTXOPTIONS;
|
||||||
|
/* flags indicating which context options are supported */
|
||||||
|
UINT CTXSAVESIZE;
|
||||||
|
/* the size of the save information returned from WTSave.*/
|
||||||
|
UINT NEXTENSIONS;
|
||||||
|
/* the number of extension data items supported.*/
|
||||||
|
UINT NMANAGERS;
|
||||||
|
/* the number of manager handles supported.*/
|
||||||
|
}WTI_INTERFACE_INFO, *LPWTI_INTERFACE_INFO;
|
||||||
|
|
||||||
|
typedef struct tagWTI_STATUS_INFO{
|
||||||
|
UINT CONTEXTS;
|
||||||
|
/* the number of contexts currently open.*/
|
||||||
|
UINT SYSCTXS;
|
||||||
|
/* the number of system contexts currently open.*/
|
||||||
|
UINT PKTRATE;
|
||||||
|
/* the maximum packet report rate currently being received by any
|
||||||
|
* context, in Hertz.
|
||||||
|
*/
|
||||||
|
WTPKT PKTDATA;
|
||||||
|
/* a mask indicating which packet data items are requested by at
|
||||||
|
* least one context.
|
||||||
|
*/
|
||||||
|
UINT MANAGERS;
|
||||||
|
/* the number of manager handles currently open.*/
|
||||||
|
BOOL SYSTEM;
|
||||||
|
/* a non-zero value if system pointing is available to the whole
|
||||||
|
* screen; zero otherwise.
|
||||||
|
*/
|
||||||
|
DWORD BUTTONUSE;
|
||||||
|
/* a button mask indicating the logical buttons whose events are
|
||||||
|
* requested by at least one context.
|
||||||
|
*/
|
||||||
|
DWORD SYSBTNUSE;
|
||||||
|
/* a button mask indicating which logical buttons are assigned a system
|
||||||
|
* button function by the current cursor's system button map.
|
||||||
|
*/
|
||||||
|
} WTI_STATUS_INFO, *LPWTI_STATUS_INFO;
|
||||||
|
|
||||||
|
typedef struct tagWTI_EXTENSIONS_INFO
|
||||||
|
{
|
||||||
|
CHAR NAME[256];
|
||||||
|
/* a unique, null-terminated string describing the extension.*/
|
||||||
|
UINT TAG;
|
||||||
|
/* a unique identifier for the extension. */
|
||||||
|
WTPKT MASK;
|
||||||
|
/* a mask that can be bitwise OR'ed with WTPKT-type variables to select
|
||||||
|
* the extension.
|
||||||
|
*/
|
||||||
|
UINT SIZE[2];
|
||||||
|
/* an array of two UINTs specifying the extension's size within a packet
|
||||||
|
* (in bytes). The first is for absolute mode; the second is for
|
||||||
|
* relative mode.
|
||||||
|
*/
|
||||||
|
AXIS *AXES;
|
||||||
|
/* an array of axis descriptions, as needed for the extension. */
|
||||||
|
BYTE *DEFAULT;
|
||||||
|
/* the current global default data, as needed for the extension. This
|
||||||
|
* data is modified via the WTMgrExt function.
|
||||||
|
*/
|
||||||
|
BYTE *DEFCONTEXT;
|
||||||
|
BYTE *DEFSYSCTX;
|
||||||
|
/* the current default context-specific data, as needed for the
|
||||||
|
* extension. The indices identify the digitizing- and system-context
|
||||||
|
* defaults, respectively.
|
||||||
|
*/
|
||||||
|
BYTE *CURSORS;
|
||||||
|
/* Is the first of one or more consecutive indices, one per cursor type.
|
||||||
|
* Each returns the current default cursor-specific data, as need for
|
||||||
|
* the extension. This data is modified via the WTMgrCsrExt function.
|
||||||
|
*/
|
||||||
|
} WTI_EXTENSIONS_INFO, *LPWTI_EXTENSIONS_INFO;
|
||||||
|
|
||||||
|
typedef struct tagWTPACKET {
|
||||||
|
HCTX pkContext;
|
||||||
|
UINT pkStatus;
|
||||||
|
LONG pkTime;
|
||||||
|
WTPKT pkChanged;
|
||||||
|
UINT pkSerialNumber;
|
||||||
|
UINT pkCursor;
|
||||||
|
DWORD pkButtons;
|
||||||
|
DWORD pkX;
|
||||||
|
DWORD pkY;
|
||||||
|
DWORD pkZ;
|
||||||
|
UINT pkNormalPressure;
|
||||||
|
UINT pkTangentPressure;
|
||||||
|
ORIENTATION pkOrientation;
|
||||||
|
ROTATION pkRotation; /* 1.1 */
|
||||||
|
} WTPACKET, *LPWTPACKET;
|
||||||
|
|
||||||
|
typedef struct tagOPENCONTEXT
|
||||||
|
{
|
||||||
|
HCTX handle;
|
||||||
|
LOGCONTEXTA context;
|
||||||
|
HWND hwndOwner;
|
||||||
|
BOOL enabled;
|
||||||
|
INT ActiveCursor;
|
||||||
|
INT QueueSize;
|
||||||
|
INT PacketsQueued;
|
||||||
|
LPWTPACKET PacketQueue;
|
||||||
|
struct tagOPENCONTEXT *next;
|
||||||
|
} OPENCONTEXT, *LPOPENCONTEXT;
|
||||||
|
|
||||||
|
int TABLET_PostTabletMessage(LPOPENCONTEXT newcontext, UINT msg, WPARAM wParam,
|
||||||
|
LPARAM lParam, BOOL send_always);
|
||||||
|
LPOPENCONTEXT AddPacketToContextQueue(LPWTPACKET packet, HWND hwnd);
|
||||||
|
LPOPENCONTEXT FindOpenContext(HWND hwnd);
|
||||||
|
|
||||||
|
/* X11drv functions */
|
||||||
|
extern int (*pLoadTabletInfo)(HWND hwnddefault);
|
||||||
|
extern int (*pGetCurrentPacket)(LPWTPACKET packet);
|
||||||
|
extern int (*pAttachEventQueueToTablet)(HWND hOwner);
|
||||||
|
extern UINT (*pWTInfoA)(UINT wCategory, UINT nIndex, LPVOID lpOutput);
|
||||||
|
|
||||||
|
extern HWND hwndDefault;
|
||||||
|
extern CRITICAL_SECTION csTablet;
|
||||||
|
|
||||||
|
#endif /* __WINE_WINTAB_INTERNAL_H */
|
|
@ -34,6 +34,7 @@ C_SRCS = \
|
||||||
text.c \
|
text.c \
|
||||||
window.c \
|
window.c \
|
||||||
winpos.c \
|
winpos.c \
|
||||||
|
wintab.c \
|
||||||
x11ddraw.c \
|
x11ddraw.c \
|
||||||
x11drv_main.c \
|
x11drv_main.c \
|
||||||
xdnd.c \
|
xdnd.c \
|
||||||
|
|
|
@ -274,9 +274,18 @@ static void EVENT_ProcessEvent( XEvent *event )
|
||||||
if (!hWnd && event->type != PropertyNotify && event->type != MappingNotify)
|
if (!hWnd && event->type != PropertyNotify && event->type != MappingNotify)
|
||||||
WARN( "Got event %s for unknown Window %08lx\n",
|
WARN( "Got event %s for unknown Window %08lx\n",
|
||||||
event_names[event->type], event->xany.window );
|
event_names[event->type], event->xany.window );
|
||||||
|
else if (event->type <= MappingNotify)
|
||||||
|
TRACE("Got event %s for hwnd/window %p/%lx, GetFocus()=%p\n",
|
||||||
|
event_names[event->type], hWnd, event->xany.window, GetFocus() );
|
||||||
else
|
else
|
||||||
TRACE("Got event %s for hwnd %p\n",
|
TRACE("Got extension event for hwnd/window %p/%lx, GetFocus()=%p\n",
|
||||||
event_names[event->type], hWnd );
|
hWnd, event->xany.window, GetFocus() );
|
||||||
|
|
||||||
|
if (X11DRV_ProcessTabletEvent(hWnd, event))
|
||||||
|
{
|
||||||
|
TRACE("Return: filtered by tablet\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch(event->type)
|
switch(event->type)
|
||||||
{
|
{
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -475,6 +475,8 @@ extern INPUT_TYPE X11DRV_EVENT_SetInputMethod(INPUT_TYPE type);
|
||||||
void X11DRV_EVENT_SetDGAStatus(HWND hwnd, int event_base) ;
|
void X11DRV_EVENT_SetDGAStatus(HWND hwnd, int event_base) ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern int X11DRV_ProcessTabletEvent(HWND hwnd, XEvent *event);
|
||||||
|
|
||||||
/* x11drv private window data */
|
/* x11drv private window data */
|
||||||
struct x11drv_win_data
|
struct x11drv_win_data
|
||||||
{
|
{
|
||||||
|
|
|
@ -111,6 +111,12 @@
|
||||||
@ cdecl ShowWindow(long long) X11DRV_ShowWindow
|
@ cdecl ShowWindow(long long) X11DRV_ShowWindow
|
||||||
@ cdecl SysCommandSizeMove(long long) X11DRV_SysCommandSizeMove
|
@ cdecl SysCommandSizeMove(long long) X11DRV_SysCommandSizeMove
|
||||||
|
|
||||||
|
# WinTab32
|
||||||
|
@ cdecl AttachEventQueueToTablet(long) X11DRV_AttachEventQueueToTablet
|
||||||
|
@ cdecl GetCurrentPacket(ptr) X11DRV_GetCurrentPacket
|
||||||
|
@ cdecl LoadTabletInfo(long) X11DRV_LoadTabletInfo
|
||||||
|
@ cdecl WTInfoA(long long ptr) X11DRV_WTInfoA
|
||||||
|
|
||||||
# X11 locks
|
# X11 locks
|
||||||
@ cdecl -norelay wine_tsx11_lock()
|
@ cdecl -norelay wine_tsx11_lock()
|
||||||
@ cdecl -norelay wine_tsx11_unlock()
|
@ cdecl -norelay wine_tsx11_unlock()
|
||||||
|
|
|
@ -1194,6 +1194,11 @@
|
||||||
header file. */
|
header file. */
|
||||||
#undef HAVE_X11_EXTENSIONS_XF86VMODE_H
|
#undef HAVE_X11_EXTENSIONS_XF86VMODE_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
Define to 1 if you have the <X11/extensions/XInput.h>
|
||||||
|
header file. */
|
||||||
|
#undef HAVE_X11_EXTENSIONS_XINPUT_H
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Define to 1 if you have the <X11/extensions/Xrandr.h>
|
Define to 1 if you have the <X11/extensions/Xrandr.h>
|
||||||
header file. */
|
header file. */
|
||||||
|
@ -1378,6 +1383,11 @@
|
||||||
*/
|
*/
|
||||||
#undef SONAME_LIBXEXT
|
#undef SONAME_LIBXEXT
|
||||||
|
|
||||||
|
/*
|
||||||
|
Define to the soname of the libXi library.
|
||||||
|
*/
|
||||||
|
#undef SONAME_LIBXI
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Define to the soname of the libXrender library.
|
Define to the soname of the libXrender library.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -328,7 +328,9 @@ typedef struct tagAXIS {
|
||||||
#define CSR_MINPKTDATA 17 /* 1.1 */
|
#define CSR_MINPKTDATA 17 /* 1.1 */
|
||||||
#define CSR_MINBUTTONS 18 /* 1.1 */
|
#define CSR_MINBUTTONS 18 /* 1.1 */
|
||||||
#define CSR_CAPABILITIES 19 /* 1.1 */
|
#define CSR_CAPABILITIES 19 /* 1.1 */
|
||||||
#define CSR_MAX 19
|
/* from http://www.wacomeng.com/devsupport/ibmpc/wacomwindevfaq.html */
|
||||||
|
#define CSR_TYPE 20
|
||||||
|
#define CSR_MAX 20
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue