winex11.drv[1/4]: wintab: restructure WTInfoA to dump a category by dumping field by field (resend)

Mikolaj Zalewski mikolajz at google.com
Fri Aug 31 13:11:37 CDT 2007


  I see that my patch to skip non-pressure-sensitive devices didn't
get it. I will try to look into it next week while now I'll resend the
Unicode patches that are easier. Here the first patch could be
controversial as I use a lot of macros. But that allows me not to use
long parameter lists.
  This main goal of this patch is to make WTInfoA dump the LOGCONTEXT
field by field so that in a later patch the string fields could be
converted between ANSI and Unicode as needed. I've also added the
possibility of dumping all the elements of other categories with
nIndex==0 (native have such an option) even if I don't think where are
applications that uses it - unlike categories that returns LOGCONTEXT
in other categories the strings don't use a constant number of
characters but (strlen+1) so it's impossible to make a C structure
that will receive
the output (unless someone will hardcode the length of the strings he
expects to receive but let's hope there is no such program). Also for
wCategory==0 we return a value that we are sure is not too small.
-------------- next part --------------
From ad409e667cd5402ced07cd901c97b3933e391637 Mon Sep 17 00:00:00 2001
From: Mikolaj Zalewski <mikolaj at zalewski.pl>
Date: Fri, 31 Aug 2007 11:02:00 -0700
Subject: [PATCH] winex11.drv: wintab: restructure WTInfoA to dump a category by dumping field by field
---
 dlls/winex11.drv/wintab.c |  575 +++++++++++++++------------------------------
 1 files changed, 188 insertions(+), 387 deletions(-)

diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c
index 8846342..330bc3f 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -754,7 +754,7 @@ int X11DRV_GetCurrentPacket(LPWTPACKET *
 }
 
 
-static inline int CopyTabletData(LPVOID target, LPVOID src, INT size)
+static inline int CopyTabletData(LPVOID target, LPCVOID src, INT size)
 {
     /*
      * It is valid to call CopyTabletData with NULL.
@@ -765,405 +765,206 @@ static inline int CopyTabletData(LPVOID 
     return(size);
 }
 
+#define WTINFO_COPY_STRING_N(data_index, string, len) \
+    if (nIndex == data_index || nIndex == 0) \
+    { \
+        int size = CopyTabletData(lpBuffer, string, len); \
+        total_size += size; \
+        if (lpBuffer != NULL) \
+            lpBuffer += size; \
+    }
+
+#define WTINFO_COPY_STRING(data_index, string) \
+    WTINFO_COPY_STRING_N(data_index, string, strlen(string)+1);
+
+#define WTINFO_COPY_DATA(data_index, data) \
+    if (nIndex == data_index || nIndex == 0) \
+    { \
+        int size = CopyTabletData(lpBuffer, &data, sizeof(data)); \
+        total_size += size; \
+        if (lpBuffer != NULL) \
+            lpBuffer += size; \
+    }
+
+#define WTINFO_UNSUPPORTED(data_index) \
+    if (nIndex == data_index || nIndex == 0) \
+    { \
+        TRACE("Index " #data_index " not supported - no data written\n"); \
+        bSkipedKnownIdx = TRUE; \
+    }
+
+#define WTINFO_FIXME_NO_DATA(data_index) \
+    if (nIndex == data_index || nIndex == 0) \
+        FIXME("Not returning " #data_index " correctly\n");
+
+#define WTINFO_END_CATEGORY \
+    { \
+        bFoundCategory = TRUE; \
+        if (total_size == 0 && !bSkipedKnownIdx) \
+            FIXME("Category %d - unhandled index %d\n", wCategory, nIndex); \
+    }
+
 /***********************************************************************
  *		X11DRV_WTInfoA (X11DRV.@)
+ *
+ * REMARKS
+ * It is valid to call WTInfoA with lpOutput == NULL, as per standard.
+ * lpOutput == NULL signifies the user only wishes to find the size of
+ * the data. 
  */
 UINT X11DRV_WTInfoA(UINT wCategory, UINT nIndex, LPVOID lpOutput)
 {
-    /*
-     * It is valid to call WTInfoA with lpOutput == NULL, as per standard.
-     * 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
-     * the code.
-     */
-    int rc = 0;
+    int total_size = 0;
+    BOOL bSkipedKnownIdx = FALSE;
+    BOOL bFoundCategory = FALSE;
+    char *lpBuffer = (char *)lpOutput;
     LPWTI_CURSORS_INFO  tgtcursor;
     TRACE("(%u, %u, %p)\n", wCategory, nIndex, lpOutput);
 
-    switch(wCategory)
+    /* Apps often starts with a call to WTInfo(0, 0, NULL) to check if there is any cursor
+     */
+    if (gNumCursors == 0)
+        return 0;
+
+    if (wCategory == 0)
     {
-        case 0:
-            /* return largest necessary buffer */
-            TRACE("%i cursors\n",gNumCursors);
-            if (gNumCursors>0)
-            {
-                FIXME("Return proper size\n");
-                rc = 200;
-            }
-            break;
-        case WTI_INTERFACE:
-            switch (nIndex)
-            {
-                WORD version;
-                case IFC_WINTABID:
-                    strcpy(lpOutput,"Wine Wintab 1.1");
-                    rc = 16;
-                    break;
-                case IFC_SPECVERSION:
-                    version = (0x01) | (0x01 << 8);
-                    rc = CopyTabletData(lpOutput, &version,sizeof(WORD));
-                    break;
-                case IFC_IMPLVERSION:
-                    version = (0x00) | (0x01 << 8);
-                    rc = CopyTabletData(lpOutput, &version,sizeof(WORD));
-                    break;
-                default:
-                    FIXME("WTI_INTERFACE unhandled index %i\n",nIndex);
-                    rc = 0;
+        /* In such a case we should compute the size of the biggest category.
+         * We will compute the sum of the sizes of all categories as an upper
+         * estimation of the former
+         */
+        lpBuffer = NULL;
+        nIndex = 0;
+    }
 
-            }
-        case WTI_DEFSYSCTX:
-        case WTI_DDCTXS:
-        case WTI_DEFCONTEXT:
-            switch (nIndex)
-            {
-                case 0:
-                    rc = CopyTabletData(lpOutput, &gSysContext,
-                            sizeof(LOGCONTEXTA));
-                    break;
-                case CTX_NAME:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcName,
-                         strlen(gSysContext.lcName)+1);
-                    break;
-                case CTX_OPTIONS:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcOptions,
-                                        sizeof(UINT));
-                    break;
-                case CTX_STATUS:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcStatus,
-                                        sizeof(UINT));
-                    break;
-                case CTX_LOCKS:
-                    rc= CopyTabletData (lpOutput, &gSysContext.lcLocks,
-                                        sizeof(UINT));
-                    break;
-                case CTX_MSGBASE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcMsgBase,
-                                        sizeof(UINT));
-                    break;
-                case CTX_DEVICE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcDevice,
-                                        sizeof(UINT));
-                    break;
-                case CTX_PKTRATE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcPktRate,
-                                        sizeof(UINT));
-                    break;
-                case CTX_PKTMODE:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcPktMode,
-                                        sizeof(WTPKT));
-                    break;
-                case CTX_MOVEMASK:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcMoveMask,
-                                        sizeof(WTPKT));
-                    break;
-                case CTX_BTNDNMASK:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcBtnDnMask,
-                                        sizeof(DWORD));
-                    break;
-                case CTX_BTNUPMASK:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcBtnUpMask,
-                                        sizeof(DWORD));
-                    break;
-                case CTX_INORGX:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInOrgX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_INORGY:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInOrgY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_INORGZ:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInOrgZ,
-                                        sizeof(LONG));
-                    break;
-                case CTX_INEXTX:
-                    rc = CopyTabletData(lpOutput, &gSysContext.lcInExtX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_INEXTY:
-                     rc = CopyTabletData(lpOutput, &gSysContext.lcInExtY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_INEXTZ:
-                     rc = CopyTabletData(lpOutput, &gSysContext.lcInExtZ,
-                                        sizeof(LONG));
-                    break;
-                case CTX_OUTORGX:
-                     rc = CopyTabletData(lpOutput, &gSysContext.lcOutOrgX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_OUTORGY:
-                      rc = CopyTabletData(lpOutput, &gSysContext.lcOutOrgY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_OUTORGZ:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcOutOrgZ,
-                                        sizeof(LONG));
-                    break;
-               case CTX_OUTEXTX:
-                      rc = CopyTabletData(lpOutput, &gSysContext.lcOutExtX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_OUTEXTY:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcOutExtY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_OUTEXTZ:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcOutExtZ,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SENSX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSensX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SENSY:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSensY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SENSZ:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSensZ,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSMODE:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysMode,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSORGX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysOrgX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSORGY:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysOrgY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSEXTX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysExtX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSEXTY:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysExtY,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSSENSX:
-                        rc = CopyTabletData(lpOutput, &gSysContext.lcSysSensX,
-                                        sizeof(LONG));
-                    break;
-                case CTX_SYSSENSY:
-                       rc = CopyTabletData(lpOutput, &gSysContext.lcSysSensY,
-                                        sizeof(LONG));
-                    break;
-                default:
-                    FIXME("WTI_DEFSYSCTX unhandled index %i\n",nIndex);
-                    rc = 0;
-            }
-            break;
-        case WTI_CURSORS:
-        case WTI_CURSORS+1:
-        case WTI_CURSORS+2:
-        case WTI_CURSORS+3:
-        case WTI_CURSORS+4:
-        case WTI_CURSORS+5:
-        case WTI_CURSORS+6:
-        case WTI_CURSORS+7:
-        case WTI_CURSORS+8:
-        case WTI_CURSORS+9:
-            tgtcursor = &gSysCursor[wCategory - WTI_CURSORS];
-            switch (nIndex)
-            {
-                case CSR_NAME:
-                    rc = CopyTabletData(lpOutput, &tgtcursor->NAME,
-                                        strlen(tgtcursor->NAME)+1);
-                    break;
-                case CSR_ACTIVE:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->ACTIVE,
-                                        sizeof(BOOL));
-                    break;
-                case CSR_PKTDATA:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->PKTDATA,
-                                        sizeof(WTPKT));
-                    break;
-                case CSR_BUTTONS:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->BUTTONS,
-                                        sizeof(BYTE));
-                    break;
-                case CSR_BUTTONBITS:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->BUTTONBITS,
-                                        sizeof(BYTE));
-                    break;
-                case CSR_BTNNAMES:
-                    FIXME("Button Names not returned correctly\n");
-                    rc = CopyTabletData(lpOutput,&tgtcursor->BTNNAMES,
-                                        strlen(tgtcursor->BTNNAMES)+1);
-                    break;
-                case CSR_BUTTONMAP:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->BUTTONMAP,
-                                        sizeof(BYTE)*32);
-                    break;
-                case CSR_SYSBTNMAP:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->SYSBTNMAP,
-                                        sizeof(BYTE)*32);
-                    break;
-                case CSR_NPBTNMARKS:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->NPBTNMARKS,
-                                        sizeof(UINT)*2);
-                    break;
-                case CSR_NPBUTTON:
-                    rc = CopyTabletData(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));
-                    break;
-                case CSR_TPBTNMARKS:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->TPBTNMARKS,
-                                        sizeof(UINT)*2);
-                    break;
-                case CSR_TPRESPONSE:
-                    FIXME("Not returning CSR_TPRESPONSE correctly\n");
-                    rc = 0;
-                    break;
-                case CSR_PHYSID:
-                {
-                    DWORD id;
-                    id = tgtcursor->PHYSID;
-                    id += (wCategory - WTI_CURSORS);
-                    rc = CopyTabletData(lpOutput,&id,sizeof(DWORD));
-                }
-                    break;
-                case CSR_MODE:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->MODE,sizeof(UINT));
-                    break;
-                case CSR_MINPKTDATA:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->MINPKTDATA,
-                        sizeof(UINT));
-                    break;
-                case CSR_MINBUTTONS:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->MINBUTTONS,
-                        sizeof(UINT));
-                    break;
-                case CSR_CAPABILITIES:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->CAPABILITIES,
-                        sizeof(UINT));
-                    break;
-                case CSR_TYPE:
-                    rc = CopyTabletData(lpOutput,&tgtcursor->TYPE,
-                        sizeof(UINT));
-                    break;
-                default:
-                    FIXME("WTI_CURSORS unhandled index %i\n",nIndex);
-                    rc = 0;
-            }
-            break;
-        case WTI_DEVICES:
-            switch (nIndex)
-            {
-                case DVC_NAME:
-                    rc = CopyTabletData(lpOutput,gSysDevice.NAME,
-                                        strlen(gSysDevice.NAME)+1);
-                    break;
-                case DVC_HARDWARE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.HARDWARE,
-                                        sizeof(UINT));
-                    break;
-                case DVC_NCSRTYPES:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.NCSRTYPES,
-                                        sizeof(UINT));
-                    break;
-                case DVC_FIRSTCSR:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.FIRSTCSR,
-                                        sizeof(UINT));
-                    break;
-                case DVC_PKTRATE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.PKTRATE,
-                                        sizeof(UINT));
-                    break;
-                case DVC_PKTDATA:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.PKTDATA,
-                                        sizeof(WTPKT));
-                    break;
-                case DVC_PKTMODE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.PKTMODE,
-                                        sizeof(WTPKT));
-                    break;
-                case DVC_CSRDATA:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.CSRDATA,
-                                        sizeof(WTPKT));
-                    break;
-                case DVC_XMARGIN:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.XMARGIN,
-                                        sizeof(INT));
-                    break;
-                case DVC_YMARGIN:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.YMARGIN,
-                                        sizeof(INT));
-                    break;
-                case DVC_ZMARGIN:
-                    rc = 0; /* unsupported */
-                    /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.ZMARGIN,
-                                        sizeof(INT));
-                    */
-                    break;
-                case DVC_X:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.X,
-                                        sizeof(AXIS));
-                    break;
-                case DVC_Y:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.Y,
-                                        sizeof(AXIS));
-                    break;
-                case DVC_Z:
-                    rc = 0; /* unsupported */
-                    /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.Z,
-                                        sizeof(AXIS));
-                    */
-                    break;
-                case DVC_NPRESSURE:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.NPRESSURE,
-                                        sizeof(AXIS));
-                    break;
-                case DVC_TPRESSURE:
-                    rc = 0; /* unsupported */
-                    /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.TPRESSURE,
-                                        sizeof(AXIS));
-                    */
-                    break;
-                case DVC_ORIENTATION:
-                    rc = CopyTabletData(lpOutput,&gSysDevice.ORIENTATION,
-                                        sizeof(AXIS)*3);
-                    break;
-                case DVC_ROTATION:
-                    rc = 0; /* unsupported */
-                    /*
-                    rc = CopyTabletData(lpOutput,&gSysDevice.ROTATION,
-                                        sizeof(AXIS)*3);
-                    */
-                    break;
-                case DVC_PNPID:
-                    rc = CopyTabletData(lpOutput,gSysDevice.PNPID,
-                                        strlen(gSysDevice.PNPID)+1);
-                    break;
-                default:
-                    FIXME("WTI_DEVICES unhandled index %i\n",nIndex);
-                    rc = 0;
-            }
-            break;
-        default:
-            FIXME("Unhandled Category %i\n",wCategory);
+    if (nIndex == 0 && wCategory != 0 && wCategory !=  WTI_DEFSYSCTX &&
+        wCategory !=  WTI_DDCTXS && wCategory != WTI_DEFCONTEXT)
+    {
+        FIXME("Dumping full category is untested for category %d\n", wCategory);
     }
-    return rc;
+
+
+    if (wCategory == 0 || wCategory ==  WTI_INTERFACE)
+    {
+        WORD impl_version = 0x100;
+        WORD spec_version  = 0x101;
+
+        WTINFO_COPY_STRING(IFC_WINTABID, "Wine Wintab 1.1");
+        WTINFO_COPY_DATA(IFC_SPECVERSION, spec_version);
+        WTINFO_COPY_DATA(IFC_IMPLVERSION, impl_version);
+        WTINFO_END_CATEGORY
+    }
+
+    if (wCategory == 0 || wCategory ==  WTI_DEFSYSCTX || wCategory ==  WTI_DDCTXS || wCategory == WTI_DEFCONTEXT)
+    {
+        WTINFO_COPY_STRING_N(CTX_NAME, gSysContext.lcName, LCNAMELEN);
+        WTINFO_COPY_DATA(CTX_OPTIONS, gSysContext.lcOptions);
+        WTINFO_COPY_DATA(CTX_STATUS, gSysContext.lcStatus);
+        WTINFO_COPY_DATA(CTX_LOCKS, gSysContext.lcLocks);
+        WTINFO_COPY_DATA(CTX_MSGBASE, gSysContext.lcMsgBase);
+        WTINFO_COPY_DATA(CTX_DEVICE, gSysContext.lcDevice);
+        WTINFO_COPY_DATA(CTX_PKTRATE, gSysContext.lcPktRate);
+        WTINFO_COPY_DATA(CTX_PKTDATA, gSysContext.lcPktData);
+        WTINFO_COPY_DATA(CTX_PKTMODE, gSysContext.lcPktMode);
+        WTINFO_COPY_DATA(CTX_MOVEMASK, gSysContext.lcMoveMask);
+        WTINFO_COPY_DATA(CTX_BTNDNMASK, gSysContext.lcBtnDnMask);
+        WTINFO_COPY_DATA(CTX_BTNUPMASK, gSysContext.lcBtnUpMask);
+        WTINFO_COPY_DATA(CTX_INORGX, gSysContext.lcInOrgX);
+        WTINFO_COPY_DATA(CTX_INORGY, gSysContext.lcInOrgY);
+        WTINFO_COPY_DATA(CTX_INORGZ, gSysContext.lcInOrgZ);
+        WTINFO_COPY_DATA(CTX_INEXTX, gSysContext.lcInExtX);
+        WTINFO_COPY_DATA(CTX_INEXTY, gSysContext.lcInExtY);
+        WTINFO_COPY_DATA(CTX_INEXTZ, gSysContext.lcInExtZ);
+        WTINFO_COPY_DATA(CTX_OUTORGX, gSysContext.lcOutOrgX);
+        WTINFO_COPY_DATA(CTX_OUTORGY, gSysContext.lcOutOrgY);
+        WTINFO_COPY_DATA(CTX_OUTORGZ, gSysContext.lcOutOrgZ);
+        WTINFO_COPY_DATA(CTX_OUTEXTX, gSysContext.lcOutExtX);
+        WTINFO_COPY_DATA(CTX_OUTEXTY, gSysContext.lcOutExtY);
+        WTINFO_COPY_DATA(CTX_OUTEXTZ, gSysContext.lcOutExtZ);
+        WTINFO_COPY_DATA(CTX_SENSX, gSysContext.lcSensX);
+        WTINFO_COPY_DATA(CTX_SENSY, gSysContext.lcSensY);
+        WTINFO_COPY_DATA(CTX_SENSZ, gSysContext.lcSensZ);
+        WTINFO_COPY_DATA(CTX_SYSMODE, gSysContext.lcSysMode);
+        WTINFO_COPY_DATA(CTX_SYSORGX, gSysContext.lcSysOrgX);
+        WTINFO_COPY_DATA(CTX_SYSORGY, gSysContext.lcSysOrgY);
+        WTINFO_COPY_DATA(CTX_SYSEXTX, gSysContext.lcSysExtX);
+        WTINFO_COPY_DATA(CTX_SYSEXTY, gSysContext.lcSysExtY);
+        WTINFO_COPY_DATA(CTX_SYSSENSX, gSysContext.lcSysSensX);
+        WTINFO_COPY_DATA(CTX_SYSSENSY, gSysContext.lcSysSensY);
+        WTINFO_END_CATEGORY
+    }
+
+    if (wCategory == 0 || (wCategory >= WTI_CURSORS && wCategory <= WTI_CURSORS+9))
+    {
+        tgtcursor = &gSysCursor[wCategory - WTI_CURSORS];
+    
+        WTINFO_COPY_STRING(CSR_NAME, tgtcursor->NAME);
+        WTINFO_COPY_DATA(CSR_ACTIVE, tgtcursor->ACTIVE);
+        WTINFO_COPY_DATA(CSR_PKTDATA, tgtcursor->PKTDATA);
+        WTINFO_COPY_DATA(CSR_BUTTONS, tgtcursor->BUTTONS);
+        WTINFO_COPY_DATA(CSR_BUTTONBITS, tgtcursor->BUTTONBITS);
+        if (nIndex == CSR_BTNNAMES || nIndex == 0)
+                FIXME("Button Names not returned correctly\n");
+        WTINFO_COPY_DATA(CSR_BTNNAMES, tgtcursor->BTNNAMES);
+        WTINFO_COPY_DATA(CSR_BUTTONMAP, tgtcursor->BUTTONMAP);
+        WTINFO_COPY_DATA(CSR_SYSBTNMAP, tgtcursor->SYSBTNMAP);
+        WTINFO_COPY_DATA(CSR_NPBTNMARKS, tgtcursor->NPBTNMARKS);
+        WTINFO_COPY_DATA(CSR_NPBUTTON, tgtcursor->NPBUTTON);
+        WTINFO_FIXME_NO_DATA(CSR_NPRESPONSE);
+        WTINFO_COPY_DATA(CSR_TPBUTTON, tgtcursor->TPBUTTON);
+        WTINFO_COPY_DATA(CSR_TPBTNMARKS, tgtcursor->TPBTNMARKS);
+        WTINFO_FIXME_NO_DATA(CSR_TPRESPONSE);
+        if (nIndex == CSR_PHYSID || nIndex == 0)
+        {
+            DWORD id;
+            id = tgtcursor->PHYSID;
+            id += (wCategory - WTI_CURSORS);
+            WTINFO_COPY_DATA(CSR_PHYSID, id);
+        }
+        WTINFO_COPY_DATA(CSR_MODE, tgtcursor->MODE);
+        WTINFO_COPY_DATA(CSR_MINPKTDATA, tgtcursor->MINPKTDATA);
+        WTINFO_COPY_DATA(CSR_MINBUTTONS, tgtcursor->MINBUTTONS);
+        WTINFO_COPY_DATA(CSR_CAPABILITIES, tgtcursor->CAPABILITIES);
+        WTINFO_COPY_DATA(CSR_TYPE, tgtcursor->TYPE);
+        WTINFO_END_CATEGORY
+    }
+
+    if (wCategory == 0 || wCategory ==  WTI_DEVICES)
+    {
+        WTINFO_COPY_STRING(DVC_NAME, gSysDevice.NAME);
+        WTINFO_COPY_DATA(DVC_HARDWARE, gSysDevice.HARDWARE);
+        WTINFO_COPY_DATA(DVC_NCSRTYPES, gSysDevice.NCSRTYPES);
+        WTINFO_COPY_DATA(DVC_FIRSTCSR, gSysDevice.FIRSTCSR);
+        WTINFO_COPY_DATA(DVC_PKTRATE, gSysDevice.PKTRATE);
+        WTINFO_COPY_DATA(DVC_PKTDATA, gSysDevice.PKTDATA);
+        WTINFO_COPY_DATA(DVC_PKTMODE, gSysDevice.PKTMODE);
+        WTINFO_COPY_DATA(DVC_CSRDATA, gSysDevice.CSRDATA);
+        WTINFO_COPY_DATA(DVC_XMARGIN, gSysDevice.XMARGIN);
+        WTINFO_COPY_DATA(DVC_YMARGIN, gSysDevice.YMARGIN);
+        WTINFO_UNSUPPORTED(DVC_ZMARGIN); /* gSysDevice.ZMARGIN */
+        WTINFO_COPY_DATA(DVC_X, gSysDevice.X);
+        WTINFO_COPY_DATA(DVC_Y, gSysDevice.Y);
+        WTINFO_UNSUPPORTED(DVC_Z); /* gSysDevice.Z */
+        WTINFO_COPY_DATA(DVC_NPRESSURE, gSysDevice.NPRESSURE);
+        WTINFO_UNSUPPORTED(DVC_TPRESSURE); /* gSysDevice.TPRESSURE */
+        WTINFO_COPY_DATA(DVC_ORIENTATION, gSysDevice.ORIENTATION);
+        WTINFO_UNSUPPORTED(DVC_ROTATION);
+        WTINFO_COPY_STRING(DVC_PNPID, gSysDevice.PNPID);
+        WTINFO_END_CATEGORY
+    }
+
+    if (!bFoundCategory)
+        FIXME("Unhandled category %d\n", wCategory);
+
+    return total_size;
 }
 
+#undef WTINFO_COPY_STRING_N
+#undef WTINFO_COPY_STRING
+#undef WTINFO_COPY_DATA
+#undef WTINFO_UNSUPPORTED
+#undef WTINFO_FIXME_NO_DATA
+#undef WTINFO_END_CATEGORY
+
 #else /* SONAME_LIBXI */
 
 /***********************************************************************
-- 
1.4.1


More information about the wine-patches mailing list