[PATCH v2 03/12] x11drv: Extract wintab helpers into a common header.

Elaine Lefler elaineclefler at gmail.com
Thu Mar 24 23:46:17 CDT 2022


Signed-off-by: Elaine Lefler <elaineclefler at gmail.com>
---

v2: Splitting into smaller patches as per feedback.

CopyTabletData has been renamed to TABLET_CopyData due to a name
conflict and for consistency with other wintab32 functions.
---
 dlls/winex11.drv/wintab.c | 326 +++++++++++++++++---------------------
 include/wintab.h          |  48 +++++-
 2 files changed, 188 insertions(+), 186 deletions(-)

diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c
index a157d44807c..5fc1e8089b8 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -203,37 +203,6 @@ typedef struct tagWTI_DEVICES_INFO
 }   WTI_DEVICES_INFO, *LPWTI_DEVICES_INFO;
 
 
-/***********************************************************************
- * WACOM WINTAB EXTENSIONS TO SUPPORT CSR_TYPE
- *   In Wintab 1.2, a CSR_TYPE feature was added.  This adds the
- *   ability to return a type of cursor on a tablet.
- *   Unfortunately, we cannot get the cursor type directly from X,
- *   and it is not specified directly anywhere.  So we virtualize
- *   the type here.  (This is unfortunate, the kernel module has
- *   the exact type, but we have no way of getting that module to
- *   pass us that type).
- *
- *   Reference linuxwacom driver project wcmCommon.c function
- *   idtotype for a much larger list of CSR_TYPE.
- *
- *   http://linuxwacom.cvs.sourceforge.net/linuxwacom/linuxwacom-prod/src/xdrv/wcmCommon.c?view=markup
- *
- *   The WTI_CURSORS_INFO.TYPE data is supposed to be used like this:
- *   (cursor.TYPE & 0x0F06) == target_cursor_type
- *   Reference: Section Unique ID
- *   http://www.wacomeng.com/devsupport/ibmpc/gddevpc.html
- */
-#define CSR_TYPE_PEN        0x822
-#define CSR_TYPE_ERASER     0x82a
-#define CSR_TYPE_MOUSE_2D   0x007
-#define CSR_TYPE_MOUSE_4D   0x094
-/* CSR_TYPE_OTHER is a special value! assumed no real world significance
- * if a stylus type or eraser type eventually have this value
- * it'll be a bug.  As of 2008 05 21 we can be sure because
- * linux wacom lists all the known values and this isn't one of them */
-#define CSR_TYPE_OTHER      0x000
-
-
 #ifdef SONAME_LIBXI
 
 #include <X11/Xlib.h>
@@ -1085,17 +1054,6 @@ int CDECL X11DRV_GetCurrentPacket(LPPACKET packet)
 }
 
 
-static inline int CopyTabletData(LPVOID target, LPCVOID src, INT size)
-{
-    /*
-     * It is valid to call CopyTabletData with NULL.
-     * This handles the WTInfo() case where lpOutput is null.
-     */
-    if(target != NULL)
-        memcpy(target,src,size);
-    return(size);
-}
-
 /***********************************************************************
  *		X11DRV_WTInfoW (X11DRV.@)
  */
@@ -1106,7 +1064,7 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
      * lpOutput == NULL signifies the user only wishes
      * to find the size of the data.
      * NOTE:
-     * From now on use CopyTabletData to fill lpOutput. memcpy will break
+     * From now on use TABLET_CopyData to fill lpOutput. memcpy will break
      * the code.
      */
     int rc = 0;
@@ -1134,24 +1092,24 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
                 case IFC_WINTABID:
                 {
                     static const WCHAR driver[] = {'W','i','n','e',' ','W','i','n','t','a','b',' ','1','.','1',0};
-                    rc = CopyTabletData(lpOutput, driver, (strlenW(driver) + 1) * sizeof(WCHAR));
+                    rc = TABLET_CopyData(lpOutput, driver, (strlenW(driver) + 1) * sizeof(WCHAR));
                     break;
                 }
                 case IFC_SPECVERSION:
                     version = (0x01) | (0x01 << 8);
-                    rc = CopyTabletData(lpOutput, &version,sizeof(WORD));
+                    rc = TABLET_CopyData(lpOutput, &version,sizeof(WORD));
                     break;
                 case IFC_IMPLVERSION:
                     version = (0x00) | (0x01 << 8);
-                    rc = CopyTabletData(lpOutput, &version,sizeof(WORD));
+                    rc = TABLET_CopyData(lpOutput, &version,sizeof(WORD));
                     break;
                 case IFC_NDEVICES:
                     num = 1;
-                    rc = CopyTabletData(lpOutput, &num,sizeof(num));
+                    rc = TABLET_CopyData(lpOutput, &num,sizeof(num));
                     break;
                 case IFC_NCURSORS:
                     num = gNumCursors;
-                    rc = CopyTabletData(lpOutput, &num,sizeof(num));
+                    rc = TABLET_CopyData(lpOutput, &num,sizeof(num));
                     break;
                 default:
                     FIXME("WTI_INTERFACE unhandled index %i\n",nIndex);
@@ -1168,144 +1126,144 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
                     if (0 == gNumCursors)
                         rc = 0;
                     else
-                        rc = CopyTabletData(lpOutput, &gSysContext,
+                        rc = TABLET_CopyData(lpOutput, &gSysContext,
                                 sizeof(LOGCONTEXTW));
                     break;
                 case CTX_NAME:
-                    rc = CopyTabletData(lpOutput, gSysContext.lcName,
+                    rc = TABLET_CopyData(lpOutput, gSysContext.lcName,
                          (strlenW(gSysContext.lcName)+1) * sizeof(WCHAR));
                     break;
                 case CTX_OPTIONS:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcOptions,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOptions,
+                                         sizeof(UINT));
                     break;
                 case CTX_STATUS:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcStatus,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcStatus,
+                                         sizeof(UINT));
                     break;
                 case CTX_LOCKS:
-                    rc= CopyTabletData (lpOutput, &gSysContext.lcLocks,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcLocks,
+                                         sizeof(UINT));
                     break;
                 case CTX_MSGBASE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcMsgBase,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcMsgBase,
+                                         sizeof(UINT));
                     break;
                 case CTX_DEVICE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcDevice,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcDevice,
+                                         sizeof(UINT));
                     break;
                 case CTX_PKTRATE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcPktRate,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcPktRate,
+                                         sizeof(UINT));
                     break;
                 case CTX_PKTDATA:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcPktData,
-                                        sizeof(WTPKT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcPktData,
+                                         sizeof(WTPKT));
                     break;
                 case CTX_PKTMODE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcPktMode,
-                                        sizeof(WTPKT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcPktMode,
+                                         sizeof(WTPKT));
                     break;
                 case CTX_MOVEMASK:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcMoveMask,
-                                        sizeof(WTPKT));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcMoveMask,
+                                         sizeof(WTPKT));
                     break;
                 case CTX_BTNDNMASK:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcBtnDnMask,
-                                        sizeof(DWORD));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcBtnDnMask,
+                                         sizeof(DWORD));
                     break;
                 case CTX_BTNUPMASK:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcBtnUpMask,
-                                        sizeof(DWORD));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcBtnUpMask,
+                                         sizeof(DWORD));
                     break;
                 case CTX_INORGX:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInOrgX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcInOrgX,
+                                         sizeof(LONG));
                     break;
                 case CTX_INORGY:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInOrgY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcInOrgY,
+                                         sizeof(LONG));
                     break;
                 case CTX_INORGZ:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInOrgZ,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcInOrgZ,
+                                         sizeof(LONG));
                     break;
                 case CTX_INEXTX:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInExtX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcInExtX,
+                                         sizeof(LONG));
                     break;
                 case CTX_INEXTY:
-                     rc = CopyTabletData(lpOutput, &gSysContext.lcInExtY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcInExtY,
+                                         sizeof(LONG));
                     break;
                 case CTX_INEXTZ:
-                     rc = CopyTabletData(lpOutput, &gSysContext.lcInExtZ,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcInExtZ,
+                                         sizeof(LONG));
                     break;
                 case CTX_OUTORGX:
-                     rc = CopyTabletData(lpOutput, &gSysContext.lcOutOrgX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOutOrgX,
+                                         sizeof(LONG));
                     break;
                 case CTX_OUTORGY:
-                      rc = CopyTabletData(lpOutput, &gSysContext.lcOutOrgY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOutOrgY,
+                                         sizeof(LONG));
                     break;
                 case CTX_OUTORGZ:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcOutOrgZ,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOutOrgZ,
+                                         sizeof(LONG));
                     break;
                case CTX_OUTEXTX:
-                      rc = CopyTabletData(lpOutput, &gSysContext.lcOutExtX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOutExtX,
+                                         sizeof(LONG));
                     break;
                 case CTX_OUTEXTY:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcOutExtY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOutExtY,
+                                         sizeof(LONG));
                     break;
                 case CTX_OUTEXTZ:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcOutExtZ,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcOutExtZ,
+                                         sizeof(LONG));
                     break;
                 case CTX_SENSX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSensX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSensX,
+                                         sizeof(LONG));
                     break;
                 case CTX_SENSY:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSensY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSensY,
+                                         sizeof(LONG));
                     break;
                 case CTX_SENSZ:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSensZ,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSensZ,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSMODE:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysMode,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysMode,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSORGX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysOrgX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysOrgX,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSORGY:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysOrgY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysOrgY,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSEXTX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysExtX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysExtX,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSEXTY:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysExtY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysExtY,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSSENSX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysSensX,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysSensX,
+                                         sizeof(LONG));
                     break;
                 case CTX_SYSSENSY:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcSysSensY,
-                                        sizeof(LONG));
+                    rc = TABLET_CopyData(lpOutput, &gSysContext.lcSysSensY,
+                                         sizeof(LONG));
                     break;
                 default:
                     FIXME("WTI_DEFSYSCTX unhandled index %i\n",nIndex);
@@ -1336,57 +1294,57 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
                 switch (nIndex)
                 {
                     case CSR_NAME:
-                        rc = CopyTabletData(lpOutput, tgtcursor->NAME,
-                                            (strlenW(tgtcursor->NAME)+1) * sizeof(WCHAR));
+                        rc = TABLET_CopyData(lpOutput, tgtcursor->NAME,
+                                             (strlenW(tgtcursor->NAME)+1) * sizeof(WCHAR));
                         break;
                     case CSR_ACTIVE:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->ACTIVE,
-                                            sizeof(BOOL));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->ACTIVE,
+                                             sizeof(BOOL));
                         break;
                     case CSR_PKTDATA:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->PKTDATA,
-                                            sizeof(WTPKT));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->PKTDATA,
+                                             sizeof(WTPKT));
                         break;
                     case CSR_BUTTONS:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->BUTTONS,
-                                            sizeof(BYTE));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->BUTTONS,
+                                             sizeof(BYTE));
                         break;
                     case CSR_BUTTONBITS:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->BUTTONBITS,
-                                            sizeof(BYTE));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->BUTTONBITS,
+                                             sizeof(BYTE));
                         break;
                     case CSR_BTNNAMES:
                         FIXME("Button Names not returned correctly\n");
-                        rc = CopyTabletData(lpOutput,&tgtcursor->BTNNAMES,
-                                            tgtcursor->cchBTNNAMES*sizeof(WCHAR));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->BTNNAMES,
+                                             tgtcursor->cchBTNNAMES*sizeof(WCHAR));
                         break;
                     case CSR_BUTTONMAP:
-                        rc = CopyTabletData(lpOutput,tgtcursor->BUTTONMAP,
-                                            sizeof(BYTE)*32);
+                        rc = TABLET_CopyData(lpOutput,tgtcursor->BUTTONMAP,
+                                             sizeof(BYTE)*32);
                         break;
                     case CSR_SYSBTNMAP:
-                        rc = CopyTabletData(lpOutput,tgtcursor->SYSBTNMAP,
-                                            sizeof(BYTE)*32);
+                        rc = TABLET_CopyData(lpOutput,tgtcursor->SYSBTNMAP,
+                                             sizeof(BYTE)*32);
                         break;
                     case CSR_NPBTNMARKS:
-                        rc = CopyTabletData(lpOutput,tgtcursor->NPBTNMARKS,
-                                            sizeof(UINT)*2);
+                        rc = TABLET_CopyData(lpOutput,tgtcursor->NPBTNMARKS,
+                                             sizeof(UINT)*2);
                         break;
                     case CSR_NPBUTTON:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->NPBUTTON,
-                                            sizeof(BYTE));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->NPBUTTON,
+                                             sizeof(BYTE));
                         break;
                     case CSR_NPRESPONSE:
                         FIXME("Not returning CSR_NPRESPONSE correctly\n");
                         rc = 0;
                         break;
                     case CSR_TPBUTTON:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->TPBUTTON,
-                                            sizeof(BYTE));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->TPBUTTON,
+                                             sizeof(BYTE));
                         break;
                     case CSR_TPBTNMARKS:
-                        rc = CopyTabletData(lpOutput,tgtcursor->TPBTNMARKS,
-                                            sizeof(UINT)*2);
+                        rc = TABLET_CopyData(lpOutput,tgtcursor->TPBTNMARKS,
+                                             sizeof(UINT)*2);
                         break;
                     case CSR_TPRESPONSE:
                         FIXME("Not returning CSR_TPRESPONSE correctly\n");
@@ -1396,26 +1354,26 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
                     {
                         DWORD id;
                         id = tgtcursor->PHYSID;
-                        rc = CopyTabletData(lpOutput,&id,sizeof(DWORD));
+                        rc = TABLET_CopyData(lpOutput,&id,sizeof(DWORD));
                     }
                         break;
                     case CSR_MODE:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->MODE,sizeof(UINT));
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->MODE,sizeof(UINT));
                         break;
                     case CSR_MINPKTDATA:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->MINPKTDATA,
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->MINPKTDATA,
                             sizeof(UINT));
                         break;
                     case CSR_MINBUTTONS:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->MINBUTTONS,
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->MINBUTTONS,
                             sizeof(UINT));
                         break;
                     case CSR_CAPABILITIES:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->CAPABILITIES,
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->CAPABILITIES,
                             sizeof(UINT));
                         break;
                     case CSR_TYPE:
-                        rc = CopyTabletData(lpOutput,&tgtcursor->TYPE,
+                        rc = TABLET_CopyData(lpOutput,&tgtcursor->TYPE,
                             sizeof(UINT));
                         break;
                     default:
@@ -1428,92 +1386,92 @@ UINT CDECL X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
             switch (nIndex)
             {
                 case DVC_NAME:
-                    rc = CopyTabletData(lpOutput,gSysDevice.NAME,
-                                        (strlenW(gSysDevice.NAME)+1) * sizeof(WCHAR));
+                    rc = TABLET_CopyData(lpOutput,gSysDevice.NAME,
+                                         (strlenW(gSysDevice.NAME)+1) * sizeof(WCHAR));
                     break;
                 case DVC_HARDWARE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.HARDWARE,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.HARDWARE,
+                                         sizeof(UINT));
                     break;
                 case DVC_NCSRTYPES:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.NCSRTYPES,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.NCSRTYPES,
+                                         sizeof(UINT));
                     break;
                 case DVC_FIRSTCSR:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.FIRSTCSR,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.FIRSTCSR,
+                                         sizeof(UINT));
                     break;
                 case DVC_PKTRATE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.PKTRATE,
-                                        sizeof(UINT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.PKTRATE,
+                                         sizeof(UINT));
                     break;
                 case DVC_PKTDATA:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.PKTDATA,
-                                        sizeof(WTPKT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.PKTDATA,
+                                         sizeof(WTPKT));
                     break;
                 case DVC_PKTMODE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.PKTMODE,
-                                        sizeof(WTPKT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.PKTMODE,
+                                         sizeof(WTPKT));
                     break;
                 case DVC_CSRDATA:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.CSRDATA,
-                                        sizeof(WTPKT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.CSRDATA,
+                                         sizeof(WTPKT));
                     break;
                 case DVC_XMARGIN:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.XMARGIN,
-                                        sizeof(INT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.XMARGIN,
+                                         sizeof(INT));
                     break;
                 case DVC_YMARGIN:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.YMARGIN,
-                                        sizeof(INT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.YMARGIN,
+                                         sizeof(INT));
                     break;
                 case DVC_ZMARGIN:
                     rc = 0; /* unsupported */
                     /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.ZMARGIN,
-                                        sizeof(INT));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.ZMARGIN,
+                                         sizeof(INT));
                     */
                     break;
                 case DVC_X:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.X,
-                                        sizeof(AXIS));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.X,
+                                         sizeof(AXIS));
                     break;
                 case DVC_Y:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.Y,
-                                        sizeof(AXIS));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.Y,
+                                         sizeof(AXIS));
                     break;
                 case DVC_Z:
                     rc = 0; /* unsupported */
                     /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.Z,
-                                        sizeof(AXIS));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.Z,
+                                         sizeof(AXIS));
                     */
                     break;
                 case DVC_NPRESSURE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.NPRESSURE,
-                                        sizeof(AXIS));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.NPRESSURE,
+                                         sizeof(AXIS));
                     break;
                 case DVC_TPRESSURE:
                     rc = 0; /* unsupported */
                     /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.TPRESSURE,
-                                        sizeof(AXIS));
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.TPRESSURE,
+                                         sizeof(AXIS));
                     */
                     break;
                 case DVC_ORIENTATION:
-                    rc = CopyTabletData(lpOutput,gSysDevice.ORIENTATION,
-                                        sizeof(AXIS)*3);
+                    rc = TABLET_CopyData(lpOutput,gSysDevice.ORIENTATION,
+                                         sizeof(AXIS)*3);
                     break;
                 case DVC_ROTATION:
                     rc = 0; /* unsupported */
                     /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.ROTATION,
-                                        sizeof(AXIS)*3);
+                    rc = TABLET_CopyData(lpOutput,&gSysDevice.ROTATION,
+                                         sizeof(AXIS)*3);
                     */
                     break;
                 case DVC_PNPID:
-                    rc = CopyTabletData(lpOutput,gSysDevice.PNPID,
-                                        (strlenW(gSysDevice.PNPID)+1)*sizeof(WCHAR));
+                    rc = TABLET_CopyData(lpOutput,gSysDevice.PNPID,
+                                         (strlenW(gSysDevice.PNPID)+1)*sizeof(WCHAR));
                     break;
                 default:
                     FIXME("WTI_DEVICES unhandled index %i\n",nIndex);
diff --git a/include/wintab.h b/include/wintab.h
index d1298b9c20b..e758a52a174 100644
--- a/include/wintab.h
+++ b/include/wintab.h
@@ -794,10 +794,54 @@ BOOL WINAPI WTMgrCsrPressureBtnMarksEx(HMGR, UINT, UINT *, UINT *);
 
 #endif
 
-#endif
+/***********************************************************************
+ * WACOM WINTAB EXTENSIONS TO SUPPORT CSR_TYPE
+ *   In Wintab 1.2, a CSR_TYPE feature was added.  This adds the
+ *   ability to return a type of cursor on a tablet.
+ *   Unfortunately, we cannot get the cursor type directly from X,
+ *   and it is not specified directly anywhere.  So we virtualize
+ *   the type here.  (This is unfortunate, the kernel module has
+ *   the exact type, but we have no way of getting that module to
+ *   pass us that type).
+ *
+ *   Reference linuxwacom driver project wcmCommon.c function
+ *   idtotype for a much larger list of CSR_TYPE.
+ *
+ *   http://linuxwacom.cvs.sourceforge.net/linuxwacom/linuxwacom-prod/src/xdrv/wcmCommon.c?view=markup
+ *
+ *   The WTI_CURSORS_INFO.TYPE data is supposed to be used like this:
+ *   (cursor.TYPE & 0x0F06) == target_cursor_type
+ *   Reference: Section Unique ID
+ *   http://www.wacomeng.com/devsupport/ibmpc/gddevpc.html
+ */
+#define CSR_TYPE_PEN        0x822
+#define CSR_TYPE_ERASER     0x82a
+#define CSR_TYPE_MOUSE_2D   0x007
+#define CSR_TYPE_MOUSE_4D   0x094
+/* CSR_TYPE_OTHER is a special value! assumed no real world significance
+ * if a stylus type or eraser type eventually have this value
+ * it'll be a bug.  As of 2008 05 21 we can be sure because
+ * linux wacom lists all the known values and this isn't one of them */
+#define CSR_TYPE_OTHER      0x000
+
+/***********************************************************************
+ * WINE HELPER FUNCTIONS
+ */
+
+/* Helper for WTInfoW. It is valid to call WTInfoW with lpOutput == NULL, in
+ * which case it must return the size of the data without copying anything.
+ * This function handles that case. */
+static inline int TABLET_CopyData(LPVOID target, LPCVOID src, INT size)
+{
+    if(target != NULL)
+        memcpy(target,src,size);
+    return(size);
+}
+
+#endif /* !defined(NOWTFUNCTIONS) */
 
 #ifdef __cplusplus
 } /* extern "C" */
 #endif /* defined(__cplusplus) */
 
-#endif /* defined(__WINE_WINTAB_H */
+#endif /* !defined(__WINE_WINTAB_H) */
-- 
2.32.0 (Apple Git-132)




More information about the wine-devel mailing list