[wintab32 1/5] Don't return information for non existent cursors

Jeremy White jwhite at codeweavers.com
Mon Dec 24 13:34:34 CST 2007


---
 dlls/winex11.drv/wintab.c |  181 +++++++++++++++++++++++---------------------
 1 files changed, 95 insertions(+), 86 deletions(-)

diff --git a/dlls/winex11.drv/wintab.c b/dlls/winex11.drv/wintab.c
index 56b7d6e..6921f93 100644
--- a/dlls/winex11.drv/wintab.c
+++ b/dlls/winex11.drv/wintab.c
@@ -1111,95 +1111,104 @@ UINT X11DRV_WTInfoW(UINT wCategory, UINT nIndex, LPVOID lpOutput)
         case WTI_CURSORS+7:
         case WTI_CURSORS+8:
         case WTI_CURSORS+9:
-            tgtcursor = &gSysCursor[wCategory - WTI_CURSORS];
-            switch (nIndex)
+            if (wCategory - WTI_CURSORS >= gNumCursors)
             {
-                case CSR_NAME:
-                    rc = CopyTabletData(lpOutput, &tgtcursor->NAME,
-                                        (strlenW(tgtcursor->NAME)+1) * sizeof(WCHAR));
-                    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,
-                                        tgtcursor->cchBTNNAMES*sizeof(WCHAR));
-                    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:
+                rc = 0;
+                WARN("Requested cursor information for non existent cursor %d; only %d cursors\n",
+                        wCategory - WTI_CURSORS, gNumCursors);
+            }
+            else
+            {
+                tgtcursor = &gSysCursor[wCategory - WTI_CURSORS];
+                switch (nIndex)
                 {
-                    DWORD id;
-                    id = tgtcursor->PHYSID;
-                    rc = CopyTabletData(lpOutput,&id,sizeof(DWORD));
+                    case CSR_NAME:
+                        rc = CopyTabletData(lpOutput, &tgtcursor->NAME,
+                                            (strlenW(tgtcursor->NAME)+1) * sizeof(WCHAR));
+                        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,
+                                            tgtcursor->cchBTNNAMES*sizeof(WCHAR));
+                        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;
+                        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 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:



More information about the wine-patches mailing list