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