winex11.drv[3/6]: wintab: restructure WTInfoA to dump a category by dumping field by field

Mikolaj Zalewski mikolajz at google.com
Thu Aug 30 20:50:22 CDT 2007


  This main goal of this patch is to make WTInfoA dump the LOGCONTEXT
field by field so that in a later patch the strings 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.
  I've used macros instead of functions as without it I would need to
use very long parameter lists. I hope that in such a special function
this is OK.
-------------- next part --------------
From 0ac8972e09a4a4ff63966c3376e51de3b7271155 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Miko=C5=82aj_Zalewski?= <mikolaj at zalewski.pl>
Date: Thu, 30 Aug 2007 15:19:57 -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 a776bc0..d826c44 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -763,7 +763,7 @@ int X11DRV_GetCurrentPacket(LPWTPACKET *packet)
 }
 
 
-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.
@@ -774,405 +774,206 @@ static inline int CopyTabletData(LPVOID target, LPVOID src, INT size)
     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.4.2


More information about the wine-patches mailing list