Changeset 618 for trunk/dll/draglist.c
- Timestamp:
- Apr 20, 2007, 9:19:03 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/draglist.c
r606 r618 14 14 06 Apr 07 GKY Add DeleteDragitemStrHandles 15 15 06 Apr 07 GKY Add some error checking in drag/drop 16 19 Apr 07 SHL Rework DeleteDragitemStrHandles to be FreeDragInfoData 17 19 Apr 07 SHL Add more drag/drop error checking 18 19 Apr 07 SHL Optimize DRAGITEM DRAGIMAGE array access 16 19 17 20 ***********************************************************************/ … … 19 22 #define INCL_DOS 20 23 #define INCL_WIN 24 #define INCL_SHLERRORS 21 25 #include <os2.h> 22 26 … … 30 34 static PSZ pszSrcFile = __FILE__; 31 35 32 #pragma alloc_text(DRAGLIST,DragOne,DoFileDrag,DragList,PickUp,DeleteDragitemStrHandles) 33 /* work around for DrgDeleteDraginfoStrHandles 34 which seems to fail with a large number of strings */ 35 BOOL DeleteDragitemStrHandles (PDRAGINFO pDInfo) 36 #pragma alloc_text(DRAGLIST,DragOne,DoFileDrag,DragList,PickUp,FreeDragInfoData) 37 38 /** 39 * Delete drag item string handles. 40 * Work around for DrgDeleteDraginfoStrHandles 41 * which seems to fail with a large number of strings 42 * Assume called after successful DrgAccessDraginfo 43 */ 44 45 46 // #define USE_FAST_FREE // Define to let PM do free 47 48 VOID FreeDragInfoData (HWND hwnd, PDRAGINFO pDInfo) 36 49 { 37 PDRAGITEM pDItem; 38 ULONG cDitem; 39 UINT i = 0; 40 APIRET rc; 41 42 cDitem = DrgQueryDragitemCount(pDInfo); 43 for (; i < (UINT)cDitem; i++){ 44 pDItem = DrgQueryDragitemPtr(pDInfo, i); 45 if (!pDItem) 46 return FALSE; 47 else { 48 DrgDeleteStrHandle(pDItem->hstrType); 49 DrgDeleteStrHandle(pDItem->hstrRMF); 50 DrgDeleteStrHandle(pDItem->hstrContainerName); 51 rc = DrgDeleteStrHandle(pDItem->hstrSourceName); 52 if (!rc) 53 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 54 "DrgDeleteStrHandle"); 55 DrgDeleteStrHandle(pDItem->hstrTargetName); 56 } 57 } // for 58 return TRUE; 50 PDRAGITEM pDItem; 51 ULONG cDitem; 52 ULONG curitem; 53 APIRET ok; 54 55 # ifdef USE_FAST_FREE 56 if (!DrgDeleteDraginfoStrHandles(pDInfo)) { 57 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 58 "DrgDeleteDraginfoStrHandles"); 59 } 60 # else // The slow way 61 cDitem = DrgQueryDragitemCount(pDInfo); 62 for (curitem = 0; curitem < cDitem; curitem++) { 63 pDItem = DrgQueryDragitemPtr(pDInfo, curitem); 64 if (!pDItem) { 65 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 66 "DrgQueryDragitemPtr(%u)", curitem); 67 } 68 else { 69 ok = DrgDeleteStrHandle(pDItem->hstrType); 70 if (!ok) { 71 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 72 "DrgDeleteStrHandle(0x%x) hstrType",pDItem->hstrType); 73 } 74 ok = DrgDeleteStrHandle(pDItem->hstrRMF); 75 if (!ok) { 76 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 77 "DrgDeleteStrHandle(0x%x) hstrRMF",pDItem->hstrRMF); 78 } 79 ok = DrgDeleteStrHandle(pDItem->hstrContainerName); 80 if (!ok) { 81 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 82 "DrgDeleteStrHandle(0x%x) hstrContainerName",pDItem->hstrContainerName); 83 } 84 ok = DrgDeleteStrHandle(pDItem->hstrSourceName); 85 if (!ok) { 86 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 87 "DrgDeleteStrHandle(0x%x) hstrSourceName",pDItem->hstrSourceName); 88 } 89 ok = DrgDeleteStrHandle(pDItem->hstrTargetName); 90 if (!ok) { 91 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 92 "DrgDeleteStrHandle(0x%x) hstrTargetName",pDItem->hstrTargetName); 93 } 94 } 95 } // for 96 # endif 97 if (!DrgFreeDraginfo(pDInfo)) { 98 // fixme to find callers responsible for PMERR_SOURCE_SAME_AS_TARGET 99 if ((WinGetLastError(WinQueryAnchorBlock(hwnd)) & 0xffff) != PMERR_SOURCE_SAME_AS_TARGET) { 100 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 101 "DrgFreeDraginfo"); 102 } 103 else 104 DbgMsg(pszSrcFile, __LINE__, "DrgFreeDraginfo PMERR_SOURCE_SAME_AS_TARGET"); 105 } 59 106 } 60 107 … … 95 142 hptrDir : hptrFile; 96 143 memset(&DItem, 0, sizeof(DRAGITEM)); 97 DItem.hwndItem = (hwndObj) ? hwndObj : hwndCnr; / * Initialize DRAGITEM */144 DItem.hwndItem = (hwndObj) ? hwndObj : hwndCnr; // Initialize DRAGITEM 98 145 // DItem.hwndItem = hwndCnr; 99 146 DItem.ulItemID = 1; … … 103 150 DItem.hstrSourceName = DrgAddStrHandle(szFile); 104 151 if (!DItem.hstrSourceName) 105 106 152 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 153 "DrgQueryStrName"); 107 154 DItem.hstrTargetName = DrgAddStrHandle(szFile); 108 155 DItem.fsControl = 0; … … 125 172 fakeicon.cxOffset = -16; 126 173 fakeicon.cyOffset = 0; 127 pDInfo = DrgAllocDraginfo(1); /* Allocate DRAGINFO */174 pDInfo = DrgAllocDraginfo(1); 128 175 if (pDInfo) { 129 176 if (IsFullName(filename) && … … 136 183 pDInfo->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 137 184 // pDInfo->hwndSource = hwndCnr; 138 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */ 139 &DItem, /* Pointer to DRAGITEM */ 140 sizeof(DRAGITEM), /* Size of DRAGITEM */ 141 0); /* Index of DRAGITEM */ 185 DrgSetDragitem(pDInfo, &DItem, sizeof(DRAGITEM), 0); 142 186 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); 143 hDrop = DrgDrag(hwndCnr, /* Initiate drag */ 144 pDInfo, /* DRAGINFO structure */ 145 &fakeicon, 1L, VK_ENDDRAG, /* End of drag indicator */ 146 (PVOID) NULL); /* Reserved */ 147 //if (hDrop == NULLHANDLE) 148 if (!DeleteDragitemStrHandles(pDInfo)) //) 149 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 150 "DeleteDragistr"); 151 DrgDeleteDraginfoStrHandles (pDInfo); 152 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 187 hDrop = DrgDrag(hwndCnr, 188 pDInfo, 189 &fakeicon, 190 1, // DragImage count 191 VK_ENDDRAG, // Drag end button 192 NULL); 193 if (hDrop == NULLHANDLE) 194 FreeDragInfoData(hwndCnr, pDInfo); 153 195 WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 154 196 } … … 161 203 CHAR * directory, BOOL moveok) 162 204 { 163 / * drag files from a container */205 // Drag files from a container 164 206 165 207 BOOL isdir, rooting = FALSE; 166 208 PCNRITEM pci; 167 registerCHAR *p;209 CHAR *p; 168 210 INT attribute = CRA_CURSORED; 169 211 PDRAGINFO pDInfo = NULL; 170 DRAGITEM **ppDItem = NULL, **ppTest; 212 DRAGITEM **ppDItem = NULL, **ppDITest; 213 DRAGITEM *pDItem; 171 214 PCNRITEM pciRec = (PCNRITEM) pcd->pRecord; 172 HWND hDrop = 0;173 register ULONG ulNumfiles = 0L, numdragalloc = 0L,Select, ulNumIcon = 0;215 HWND hDrop = NULLHANDLE; 216 ULONG ulNumfiles = 0, ulNumDIAlloc = 0, ulSelect, ulNumIcon = 0; 174 217 CHAR szFile[CCHMAXPATH], szBuffer[CCHMAXPATH]; 175 DRAGIMAGE *padiIcon = NULL, *padiTest, diFakeIcon; 176 APIRET rc; 177 178 fExceedPMDrgLimit = 0; 218 DRAGIMAGE *paDImgIcons = NULL, *pDImg, dimgFakeIcon; 219 BOOL ok; 220 221 // fixme to be multi-drag safe - count needs to be in DCD etc. and passed to UnHilite 222 NumItemsToUnhilite = 0; 179 223 if (!pciRec && directory && *directory) 180 224 return DragOne(hwndCnr, hwndObj, directory, moveok); … … 202 246 } 203 247 204 Select = 0L;248 ulSelect = 0; 205 249 while (pci && (INT) pci > -1) { 206 250 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) { … … 223 267 if (!arcfile) { 224 268 // Filesystem object 225 isdir = ((pci->attrFile & FILE_DIRECTORY) != 0); 226 if (ulNumfiles + 2L > numdragalloc) { 227 if (!padiIcon) { 228 padiTest = 229 xrealloc(padiIcon, sizeof(DRAGIMAGE) * (numdragalloc + 4L), 269 isdir = pci->attrFile & FILE_DIRECTORY; 270 // fixme to expand smarter - expand fast at first - do same for similar code 271 if (ulNumfiles + 2 > ulNumDIAlloc) { 272 // Expand 273 if (!paDImgIcons) { 274 pDImg = 275 xrealloc(paDImgIcons, sizeof(DRAGIMAGE) * (ulNumDIAlloc + 4L), 230 276 pszSrcFile, __LINE__); 231 if (padiTest) 232 padiIcon = padiTest; 233 else 277 if (!pDImg) 234 278 break; 279 paDImgIcons = pDImg; 235 280 } 236 281 else if (!ulNumIcon) { 237 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 238 padiIcon[ulNumfiles].cptl = 0; 239 padiIcon[ulNumfiles].hImage = hptrLast; 240 padiIcon[ulNumfiles].fl = DRG_ICON; 241 padiIcon[ulNumfiles].sizlStretch.cx = 32; 242 padiIcon[ulNumfiles].sizlStretch.cy = 32; 243 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 4); 244 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 7); 282 pDImg = &paDImgIcons[ulNumfiles]; 283 pDImg->cb = sizeof(DRAGIMAGE); 284 pDImg->cptl = 0; 285 pDImg->hImage = hptrLast; 286 pDImg->fl = DRG_ICON; 287 pDImg->sizlStretch.cx = 32; 288 pDImg->sizlStretch.cy = 32; 289 pDImg->cxOffset = -16 + (ulNumfiles * 4); 290 pDImg->cyOffset = 0 + (ulNumfiles * 7); 245 291 ulNumIcon = ulNumfiles + 1; 246 292 } 247 pp Test =248 xrealloc(ppDItem, sizeof(DRAGITEM *) * ( numdragalloc + 4L),293 ppDITest = 294 xrealloc(ppDItem, sizeof(DRAGITEM *) * (ulNumDIAlloc + 4L), 249 295 pszSrcFile, __LINE__); 250 if (ppTest) { 251 ppDItem = ppTest; 252 numdragalloc += 4L; 253 } 254 else 296 if (!ppDITest) 255 297 break; 256 } 257 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 258 if (ppDItem[ulNumfiles]) { 259 if (!ulNumIcon) { 260 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 261 padiIcon[ulNumfiles].cptl = 0; 262 padiIcon[ulNumfiles].hImage = pci->rc.hptrIcon; 263 if (!padiIcon[ulNumfiles].hImage) 264 padiIcon[ulNumfiles].hImage = (isdir) ? hptrDir : hptrFile; 265 padiIcon[ulNumfiles].fl = DRG_ICON; 266 padiIcon[ulNumfiles].sizlStretch.cx = 32; 267 padiIcon[ulNumfiles].sizlStretch.cy = 32; 268 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 3); 269 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 6); 270 } 271 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 272 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 273 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 274 ppDItem[ulNumfiles]->ulItemID = (ULONG) pci; 275 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 276 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 277 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer); 278 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 279 if (!ppDItem[ulNumfiles]->hstrSourceName){ 280 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType); 281 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF); 282 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName); 283 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName); 284 xfree(ppDItem[ulNumfiles]); 285 fExceedPMDrgLimit = ulNumfiles - 1; 286 break; 287 } 288 /*Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 289 "DrgAddStrHandle");*/ 290 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 291 ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0; 292 if (IsFullName(pci->szFileName) && 293 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE)) 294 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 295 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 296 if (moveok && IsFullName(pci->szFileName) && 297 !(driveflags[toupper(*pci->szFileName) - 'A'] & 298 DRIVE_NOTWRITEABLE)) 299 ppDItem[ulNumfiles]->fsSupportedOps |= DO_MOVEABLE; 300 if (IsRoot(pci->szFileName)) { 301 ppDItem[ulNumfiles]->fsSupportedOps = DO_LINKABLE; 302 rooting = TRUE; 303 } 304 //if (ulNumfiles >= 2000){ 305 // pDInfo = DrgAllocDraginfo(ulNumfiles); 306 // fExceedPMDrgLimit = TRUE; 307 // goto Thatsall; 308 // } 309 ulNumfiles++; 310 ppDItem[ulNumfiles] = NULL; 311 } 312 else 298 ppDItem = ppDITest; 299 ulNumDIAlloc += 4L; 300 } 301 pDItem = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 302 if (!pDItem) 303 break; // Already complained 304 ppDItem[ulNumfiles] = pDItem; 305 if (!ulNumIcon) { 306 pDImg = &paDImgIcons[ulNumfiles]; 307 pDImg->cb = sizeof(DRAGIMAGE); 308 pDImg->cptl = 0; 309 pDImg->hImage = pci->rc.hptrIcon; 310 if (!pDImg->hImage) 311 pDImg->hImage = isdir ? hptrDir : hptrFile; 312 pDImg->fl = DRG_ICON; 313 pDImg->sizlStretch.cx = 32; 314 pDImg->sizlStretch.cy = 32; 315 pDImg->cxOffset = -16 + (ulNumfiles * 3); 316 pDImg->cyOffset = 0 + (ulNumfiles * 6); 317 } 318 // Initialize DRAGITEM 319 memset(pDItem, 0, sizeof(DRAGITEM)); 320 pDItem->hwndItem = (hwndObj) ? hwndObj : hwndCnr; 321 pDItem->hwndItem = hwndCnr; 322 pDItem->ulItemID = (ULONG) pci; 323 pDItem->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 324 ok = pDItem->hstrType; 325 pDItem->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 326 ok = ok && pDItem->hstrRMF; 327 pDItem->hstrContainerName = DrgAddStrHandle(szBuffer); 328 ok = ok && pDItem->hstrContainerName; 329 pDItem->hstrSourceName = DrgAddStrHandle(szFile); 330 ok = ok && pDItem->hstrSourceName; 331 pDItem->hstrTargetName = DrgAddStrHandle(szFile); 332 ok = ok && pDItem->hstrTargetName; 333 if (!ok) { 334 DbgMsg(pszSrcFile, __LINE__, "DrgAddStrHandle failed at %lu for %s", ulNumfiles, szFile); 335 // Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__,"DrgAddStrHandle"); 336 if (pDItem->hstrType) 337 DrgDeleteStrHandle(pDItem->hstrType); 338 if (pDItem->hstrRMF) 339 DrgDeleteStrHandle(pDItem->hstrRMF); 340 if (pDItem->hstrContainerName) 341 DrgDeleteStrHandle(pDItem->hstrContainerName); 342 if (pDItem->hstrSourceName) 343 DrgDeleteStrHandle(pDItem->hstrSourceName); 344 if (pDItem->hstrTargetName) 345 DrgDeleteStrHandle(pDItem->hstrTargetName); 346 xfree(pDItem); 347 // ppDItem[ulNumfiles] = NULL; // Why bother - we can count - fixme to be gone 348 NumItemsToUnhilite = ulNumfiles + 1; // Use +1 to ensure non-zero on any failure 313 349 break; 350 } 351 pDItem->fsControl = isdir ? DC_CONTAINER : 0; 352 if (IsFullName(pci->szFileName) && 353 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE)) 354 pDItem->fsControl |= DC_REMOVEABLEMEDIA; 355 pDItem->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 356 if (moveok && IsFullName(pci->szFileName) && 357 !(driveflags[toupper(*pci->szFileName) - 'A'] & 358 DRIVE_NOTWRITEABLE)) 359 pDItem->fsSupportedOps |= DO_MOVEABLE; 360 if (IsRoot(pci->szFileName)) { 361 pDItem->fsSupportedOps = DO_LINKABLE; 362 rooting = TRUE; 363 } 364 ulNumfiles++; 365 // ppDItem[ulNumfiles] = NULL; // Why bother - can't we count - fixme to be gone? 314 366 } 315 367 else { 316 368 // Archive object 317 if (ulNumfiles + 3L > numdragalloc) {318 pp Test =319 xrealloc(ppDItem, sizeof(DRAGITEM *) * ( numdragalloc + 5L),369 if (ulNumfiles + 3L > ulNumDIAlloc) { 370 ppDITest = 371 xrealloc(ppDItem, sizeof(DRAGITEM *) * (ulNumDIAlloc + 5L), 320 372 pszSrcFile, __LINE__); 321 if (!pp Test)373 if (!ppDITest) 322 374 break; 323 else { 324 ppDItem = ppTest; 325 numdragalloc += 5L; 326 } 327 } 328 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 329 if (!ppDItem[ulNumfiles]) 375 ppDItem = ppDITest; 376 ulNumDIAlloc += 5L; 377 } 378 pDItem = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 379 if (!pDItem) 330 380 break; 331 else { 332 diFakeIcon.hImage = hptrFile; 333 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 334 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 335 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 336 ppDItem[ulNumfiles]->ulItemID = (ULONG) pci; 337 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 338 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFOS2FILE); 339 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile); 340 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 341 if (!ppDItem[ulNumfiles]->hstrSourceName){ 342 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType); 343 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF); 344 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName); 345 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName); 346 xfree(ppDItem[ulNumfiles]); 347 fExceedPMDrgLimit = ulNumfiles - 1; 348 break; 349 } 350 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 351 ppDItem[ulNumfiles]->fsControl = DC_PREPARE; 381 ppDItem[ulNumfiles] = pDItem; 382 dimgFakeIcon.hImage = hptrFile; 383 // Initialize DRAGITEM 384 memset(pDItem, 0, sizeof(DRAGITEM)); 385 pDItem->hwndItem = (hwndObj) ? hwndObj : hwndCnr; 386 pDItem->hwndItem = hwndCnr; 387 pDItem->ulItemID = (ULONG) pci; 388 pDItem->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 389 ok = pDItem->hstrType; 390 pDItem->hstrRMF = DrgAddStrHandle(DRMDRFOS2FILE); 391 ok = ok && pDItem->hstrRMF; 392 pDItem->hstrContainerName = DrgAddStrHandle(arcfile); 393 ok = ok && pDItem->hstrContainerName; 394 pDItem->hstrSourceName = DrgAddStrHandle(szFile); 395 ok = ok && pDItem->hstrSourceName; 396 pDItem->hstrTargetName = DrgAddStrHandle(szFile); 397 ok = ok && pDItem->hstrTargetName; 398 if (!ok){ 399 if (pDItem->hstrType) 400 DrgDeleteStrHandle(pDItem->hstrType); 401 if (pDItem->hstrRMF) 402 DrgDeleteStrHandle(pDItem->hstrRMF); 403 if (pDItem->hstrContainerName) 404 DrgDeleteStrHandle(pDItem->hstrContainerName); 405 if (pDItem->hstrSourceName) 406 DrgDeleteStrHandle(pDItem->hstrSourceName); 407 if (pDItem->hstrTargetName) 408 DrgDeleteStrHandle(pDItem->hstrTargetName); 409 xfree(pDItem); 410 NumItemsToUnhilite = ulNumfiles + 1; // +1 to ensure non-zero 411 break; 412 } 413 pDItem->fsControl = DC_PREPARE; 414 if (IsFullName(arcfile) && 415 (driveflags[toupper(*arcfile) - 'A'] & DRIVE_REMOVABLE)) 416 pDItem->fsControl |= DC_REMOVEABLEMEDIA; 417 pDItem->fsSupportedOps = DO_COPYABLE; 418 ulNumfiles++; 419 420 pDItem = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 421 if (pDItem) { 422 ppDItem[ulNumfiles] = pDItem; 423 dimgFakeIcon.hImage = hptrFile; 424 // Initialize DRAGITEM 425 memset(pDItem, 0, sizeof(DRAGITEM)); 426 pDItem->hwndItem = (hwndObj) ? hwndObj : hwndCnr; 427 pDItem->hwndItem = hwndCnr; 428 pDItem->ulItemID = ulSelect++; 429 pDItem->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 430 ok = ok && pDItem->hstrType; 431 pDItem->hstrRMF = DrgAddStrHandle(DRMDRFFM2ARC); 432 ok = ok && pDItem->hstrRMF; 433 pDItem->hstrContainerName = DrgAddStrHandle(arcfile); 434 ok = ok && pDItem->hstrContainerName; 435 pDItem->hstrSourceName = DrgAddStrHandle(szFile); 436 ok = ok && pDItem->hstrSourceName; 437 pDItem->hstrTargetName = DrgAddStrHandle(szFile); 438 ok = ok && pDItem->hstrTargetName; 439 if (!ok) { 440 DbgMsg(pszSrcFile, __LINE__, "DrgAddStrHandle failed at %lu for %s", ulNumfiles, szFile); 441 if (pDItem->hstrType) 442 DrgDeleteStrHandle(pDItem->hstrType); 443 if (pDItem->hstrRMF) 444 DrgDeleteStrHandle(pDItem->hstrRMF); 445 if (pDItem->hstrContainerName) 446 DrgDeleteStrHandle(pDItem->hstrContainerName); 447 if (pDItem->hstrSourceName) 448 DrgDeleteStrHandle(pDItem->hstrSourceName); 449 if (pDItem->hstrTargetName) 450 DrgDeleteStrHandle(pDItem->hstrTargetName); 451 xfree(pDItem); 452 // pDItem = NULL; // Why bother - fixme to be gone? 453 NumItemsToUnhilite = ulNumfiles + 1; 454 break; 455 } 456 pDItem->fsControl = 0; 352 457 if (IsFullName(arcfile) && 353 458 (driveflags[toupper(*arcfile) - 'A'] & DRIVE_REMOVABLE)) 354 p pDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA;355 p pDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE;459 pDItem->fsControl |= DC_REMOVEABLEMEDIA; 460 pDItem->fsSupportedOps = DO_COPYABLE; 356 461 ulNumfiles++; 357 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 358 if (ppDItem[ulNumfiles]) { 359 diFakeIcon.hImage = hptrFile; 360 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 361 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 362 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 363 ppDItem[ulNumfiles]->ulItemID = Select++; 364 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 365 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFFM2ARC); 366 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile); 367 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 368 if (!ppDItem[ulNumfiles]->hstrSourceName){ 369 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType); 370 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF); 371 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName); 372 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName); 373 xfree(ppDItem[ulNumfiles]); 374 fExceedPMDrgLimit = ulNumfiles - 1; 375 break; 376 } 377 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 378 ppDItem[ulNumfiles]->fsControl = 0; 379 if (IsFullName(arcfile) && 380 (driveflags[toupper(*arcfile) - 'A'] & DRIVE_REMOVABLE)) 381 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 382 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE; 383 //if (ulNumfiles >= 1000){ 384 // pDInfo = DrgAllocDraginfo(ulNumfiles); 385 // fexceedpmdrglimit = TRUE; 386 // goto Thatsall; 387 // } 388 ulNumfiles++; 389 } 390 ppDItem[ulNumfiles] = NULL; 391 } 462 } 463 // ppDItem[ulNumfiles] = NULL; // Why bother - fixme to be gone? 392 464 } 393 465 WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), … … 400 472 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci), 401 473 MPFROMSHORT(attribute)); 402 } // while 403 if (fExceedPMDrgLimit) 404 ulNumfiles = ulNumfiles - 1; 474 } // while 475 405 476 if (ulNumfiles) { 406 pDInfo = DrgAllocDraginfo(ulNumfiles); /* Allocate DRAGINFO */477 pDInfo = DrgAllocDraginfo(ulNumfiles); 407 478 if (pDInfo) { 408 479 if ((arcfile && *arcfile) || (IsFullName(szBuffer) && … … 416 487 pDInfo->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 417 488 // pDInfo->hwndSource = hwndCnr; 418 for (Select = 0L; Select < ulNumfiles; Select++) { 419 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */ 420 ppDItem[Select], /* Pointer to DRAGITEM */ 421 sizeof(DRAGITEM), /* Size of DRAGITEM */ 422 Select); /* Index of DRAGITEM */ 423 xfree(ppDItem[Select]); 489 for (ulSelect = 0; ulSelect < ulNumfiles; ulSelect++) { 490 DrgSetDragitem(pDInfo, ppDItem[ulSelect], sizeof(DRAGITEM), ulSelect); 491 xfree(ppDItem[ulSelect]); 424 492 } 425 493 #ifdef __DEBUG_ALLOC__ … … 427 495 #endif 428 496 xfree(ppDItem); 429 ppDItem = NULL; 497 ppDItem = NULL; // Remember gone 430 498 DosPostEventSem(CompactSem); 431 499 432 500 if (arcfile) { 433 di FakeIcon.cb = sizeof(DRAGIMAGE);434 di FakeIcon.cptl = 0;501 dimgFakeIcon.cb = sizeof(DRAGIMAGE); 502 dimgFakeIcon.cptl = 0; 435 503 if (ulNumfiles > 1) 436 di FakeIcon.hImage = hptrFile;437 di FakeIcon.fl = DRG_ICON;438 di FakeIcon.sizlStretch.cx = 32;439 di FakeIcon.sizlStretch.cy = 32;440 di FakeIcon.cxOffset = -16;441 di FakeIcon.cyOffset = 0;442 pa diIcon = &diFakeIcon;504 dimgFakeIcon.hImage = hptrFile; 505 dimgFakeIcon.fl = DRG_ICON; 506 dimgFakeIcon.sizlStretch.cx = 32; 507 dimgFakeIcon.sizlStretch.cy = 32; 508 dimgFakeIcon.cxOffset = -16; 509 dimgFakeIcon.cyOffset = 0; 510 paDImgIcons = &dimgFakeIcon; 443 511 } 444 512 if (!arcfile) { … … 447 515 } 448 516 else 449 ulNumIcon = 1 L;517 ulNumIcon = 1; 450 518 451 519 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); 452 hDrop = DrgDrag(hwndCnr, /* Initiate drag */ 453 pDInfo, /* DRAGINFO structure */ 454 padiIcon, ulNumIcon, VK_ENDDRAG, /* End of drag indicator */ 455 (PVOID) NULL); /* Reserved */ 456 rc = DeleteDragitemStrHandles(pDInfo); 457 if (!rc) 458 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 459 "DeleteDragistr"); 460 DrgDeleteDraginfoStrHandles (pDInfo); 461 rc = DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 462 if (!rc) 463 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 464 "DrgFreeDraginfo"); 465 if (padiIcon && padiIcon != &diFakeIcon) 466 xfree(padiIcon); 467 padiIcon = NULL; 520 hDrop = DrgDrag(hwndCnr, 521 pDInfo, 522 paDImgIcons, 523 ulNumIcon, 524 VK_ENDDRAG, // Drag end button 525 NULL); 468 526 WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 469 DosPostEventSem(CompactSem);470 527 } 471 528 } 529 530 if (hDrop == NULLHANDLE ) { 531 NumItemsToUnhilite = 0; 532 if (pDInfo) 533 FreeDragInfoData(hwndCnr, pDInfo); 534 } 535 472 536 if (ppDItem) 473 537 xfree(ppDItem); 474 if (padiIcon && padiIcon != &diFakeIcon) 475 xfree(padiIcon); 538 if (paDImgIcons && paDImgIcons != &dimgFakeIcon) 539 xfree(paDImgIcons); 540 DosPostEventSem(CompactSem); 476 541 MarkAll(hwndCnr, TRUE, FALSE, TRUE); 477 542 return hDrop; … … 480 545 HWND DragList(HWND hwnd, HWND hwndObj, CHAR ** list, BOOL moveok) 481 546 { 482 483 /* drag a linked list of files */ 547 // Drag a linked list of files 484 548 485 549 BOOL isdir; 486 550 register CHAR *p; 487 551 PDRAGINFO pDInfo = NULL; 488 DRAGITEM **ppDItem = NULL, **ppTest; 552 DRAGITEM **ppDItem = NULL, **ppDITest; 553 DRAGITEM *pDItem; 489 554 HWND hDrop = (HWND) 0; 490 register ULONG ulNumfiles = 0L, numdragalloc = 0L,Select, ulNumIcon = 0;555 ULONG ulNumfiles = 0, ulNumDIAlloc = 0, ulSelect, ulNumIcon = 0; 491 556 CHAR szFile[CCHMAXPATH], szBuffer[CCHMAXPATH]; 492 DRAGIMAGE *pa diIcon = NULL, *padiTest;557 DRAGIMAGE *paDImgIcons = NULL, *pDImg; 493 558 FILESTATUS3 fs3; 559 BOOL ok; 494 560 495 561 if (!list || !list[0]) 496 562 return hDrop; 497 for ( Select = 0; list[Select];Select++) {498 if ((!IsRoot(list[ Select]) || !IsValidDrive(*list[Select])) &&499 DosQueryPathInfo(list[ Select], FIL_STANDARD, &fs3, sizeof(fs3)))563 for (ulSelect = 0; list[ulSelect]; ulSelect++) { 564 if ((!IsRoot(list[ulSelect]) || !IsValidDrive(*list[ulSelect])) && 565 DosQueryPathInfo(list[ulSelect], FIL_STANDARD, &fs3, sizeof(fs3))) 500 566 continue; 501 strcpy(szBuffer, list[ Select]);567 strcpy(szBuffer, list[ulSelect]); 502 568 p = strrchr(szBuffer, '\\'); 503 569 if (p) { … … 509 575 continue; 510 576 if (*szFile) { 511 isdir = (IsRoot(list[Select])) ? TRUE :512 ((fs3.attrFile & FILE_DIRECTORY) != 0); 513 if (ulNumfiles + 2 L > numdragalloc) {514 if (!pa diIcon) {515 p adiTest=516 xrealloc(pa diIcon, sizeof(DRAGIMAGE) * (numdragalloc + 4L),577 isdir = IsRoot(list[ulSelect]) || fs3.attrFile & FILE_DIRECTORY; 578 // fixme to expand smarter - expand fast at first - do same for similar code 579 if (ulNumfiles + 2 > ulNumDIAlloc) { 580 if (!paDImgIcons) { 581 pDImg = 582 xrealloc(paDImgIcons, sizeof(DRAGIMAGE) * (ulNumDIAlloc + 4L), 517 583 pszSrcFile, __LINE__); 518 if (!p adiTest)584 if (!pDImg) 519 585 break; 520 else 521 padiIcon = padiTest; 586 paDImgIcons = pDImg; 522 587 } 523 588 else if (!ulNumIcon) { 524 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 525 padiIcon[ulNumfiles].cptl = 0; 526 padiIcon[ulNumfiles].hImage = hptrLast; 527 padiIcon[ulNumfiles].fl = DRG_ICON; 528 padiIcon[ulNumfiles].sizlStretch.cx = 32; 529 padiIcon[ulNumfiles].sizlStretch.cy = 32; 530 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 4); 531 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 7); 589 pDImg = &paDImgIcons[ulNumfiles]; 590 pDImg->cb = sizeof(DRAGIMAGE); 591 pDImg->cptl = 0; 592 pDImg->hImage = hptrLast; 593 pDImg->fl = DRG_ICON; 594 pDImg->sizlStretch.cx = 32; 595 pDImg->sizlStretch.cy = 32; 596 pDImg->cxOffset = -16 + (ulNumfiles * 4); 597 pDImg->cyOffset = 0 + (ulNumfiles * 7); 532 598 ulNumIcon = ulNumfiles + 1; 533 599 } 534 pp Test =535 xrealloc(ppDItem, sizeof(DRAGITEM *) * ( numdragalloc + 4L),600 ppDITest = 601 xrealloc(ppDItem, sizeof(DRAGITEM *) * (ulNumDIAlloc + 4L), 536 602 pszSrcFile, __LINE__); 537 if (!pp Test)603 if (!ppDITest) 538 604 break; 539 else { 540 ppDItem = ppTest; 541 numdragalloc += 4L; 542 } 543 } 544 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 545 if (!ppDItem[ulNumfiles]) 605 ppDItem = ppDITest; 606 ulNumDIAlloc += 4L; 607 } 608 pDItem = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 609 if (!pDItem) 546 610 break; 547 else { 548 if (!ulNumIcon) { 549 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 550 padiIcon[ulNumfiles].cptl = 0; 551 padiIcon[ulNumfiles].hImage = (isdir) ? hptrDir : hptrFile; 552 padiIcon[ulNumfiles].fl = DRG_ICON; 553 padiIcon[ulNumfiles].sizlStretch.cx = 32; 554 padiIcon[ulNumfiles].sizlStretch.cy = 32; 555 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 3); 556 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 6); 557 } 558 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 559 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwnd; /* Initialize DRAGITEM */ 560 // ppDItem[ulNumfiles]->hwndItem = hwnd; 561 ppDItem[ulNumfiles]->ulItemID = (ULONG) Select; 562 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 563 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 564 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer); 565 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 566 if (!ppDItem[ulNumfiles]->hstrSourceName){ 567 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrType); 568 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrRMF); 569 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrContainerName); 570 DrgDeleteStrHandle(ppDItem[ulNumfiles]->hstrSourceName); 571 xfree(ppDItem[ulNumfiles]); 572 fExceedPMDrgLimit = ulNumfiles - 1; 573 break; 574 } 575 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 576 ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0; 577 if (IsFullName(list[Select]) && 578 (driveflags[toupper(*list[Select]) - 'A'] & DRIVE_REMOVABLE)) 579 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 580 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 581 if (moveok && IsFullName(list[Select]) && 582 !(driveflags[toupper(*list[Select]) - 'A'] & DRIVE_NOTWRITEABLE)) 583 ppDItem[ulNumfiles]->fsSupportedOps |= DO_MOVEABLE; 584 if (IsRoot(list[Select])) 585 ppDItem[ulNumfiles]->fsControl = DO_LINKABLE; 586 ulNumfiles++; 587 ppDItem[ulNumfiles] = NULL; 588 } 589 } 590 } // for 591 if (fExceedPMDrgLimit) 592 ulNumfiles = ulNumfiles - 1; 611 ppDItem[ulNumfiles] = pDItem; 612 if (!ulNumIcon) { 613 pDImg = &paDImgIcons[ulNumfiles]; 614 pDImg->cb = sizeof(DRAGIMAGE); 615 pDImg->cptl = 0; 616 pDImg->hImage = isdir ? hptrDir : hptrFile; 617 pDImg->fl = DRG_ICON; 618 pDImg->sizlStretch.cx = 32; 619 pDImg->sizlStretch.cy = 32; 620 pDImg->cxOffset = -16 + (ulNumfiles * 3); 621 pDImg->cyOffset = 0 + (ulNumfiles * 6); 622 } 623 memset(pDItem, 0, sizeof(DRAGITEM)); 624 pDItem->hwndItem = (hwndObj) ? hwndObj : hwnd; 625 // pDItem->hwndItem = hwnd; 626 pDItem->ulItemID = (ULONG) ulSelect; 627 pDItem->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 628 ok = pDItem->hstrType; 629 pDItem->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 630 ok = ok && pDItem->hstrRMF; 631 pDItem->hstrContainerName = DrgAddStrHandle(szBuffer); 632 ok = ok && pDItem->hstrContainerName; 633 pDItem->hstrSourceName = DrgAddStrHandle(szFile); 634 ok = ok && pDItem->hstrSourceName; 635 pDItem->hstrTargetName = DrgAddStrHandle(szFile); 636 ok = ok && pDItem->hstrTargetName; 637 if (!ok) { 638 if (pDItem->hstrType) 639 DrgDeleteStrHandle(pDItem->hstrType); 640 if (pDItem->hstrRMF) 641 DrgDeleteStrHandle(pDItem->hstrRMF); 642 if (pDItem->hstrContainerName) 643 DrgDeleteStrHandle(pDItem->hstrContainerName); 644 if (pDItem->hstrSourceName) 645 DrgDeleteStrHandle(pDItem->hstrSourceName); 646 if (pDItem->hstrTargetName) 647 DrgDeleteStrHandle(pDItem->hstrTargetName); 648 xfree(pDItem); 649 // pDItem = NULL; // Why bother, we can count - fixme to be gone 650 NumItemsToUnhilite = ulNumfiles + 1; 651 break; 652 } 653 pDItem->fsControl = isdir ? DC_CONTAINER : 0; 654 if (IsFullName(list[ulSelect]) && 655 (driveflags[toupper(*list[ulSelect]) - 'A'] & DRIVE_REMOVABLE)) 656 pDItem->fsControl |= DC_REMOVEABLEMEDIA; 657 pDItem->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 658 if (moveok && IsFullName(list[ulSelect]) && 659 !(driveflags[toupper(*list[ulSelect]) - 'A'] & DRIVE_NOTWRITEABLE)) 660 pDItem->fsSupportedOps |= DO_MOVEABLE; 661 if (IsRoot(list[ulSelect])) 662 pDItem->fsControl = DO_LINKABLE; 663 ulNumfiles++; 664 // ppDItem[ulNumfiles] = NULL; // Why bother - fixme to be gone 665 } 666 } // for 593 667 if (ulNumfiles) { 594 pDInfo = DrgAllocDraginfo(ulNumfiles); /* Allocate DRAGINFO */668 pDInfo = DrgAllocDraginfo(ulNumfiles); 595 669 if (pDInfo) { 596 670 if ((IsFullName(szBuffer) && … … 601 675 if (IsRoot(list[0])) 602 676 pDInfo->usOperation = DO_LINK; 603 pDInfo->hwndSource = (hwndObj)? hwndObj : hwnd;677 pDInfo->hwndSource = hwndObj ? hwndObj : hwnd; 604 678 // pDInfo->hwndSource = hwnd; 605 for ( Select = 0L; Select < ulNumfiles;Select++) {606 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */607 ppDItem[Select], /* Pointer to DRAGITEM */608 sizeof(DRAGITEM), /* Size of DRAGITEM */609 Select); /* Index of DRAGITEM */610 free(ppDItem[ Select]);611 } 679 for (ulSelect = 0; ulSelect < ulNumfiles; ulSelect++) { 680 if (!DrgSetDragitem(pDInfo, ppDItem[ulSelect], sizeof(DRAGITEM), ulSelect)) { 681 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 682 "DrgSetDragitem"); 683 } 684 free(ppDItem[ulSelect]); 685 } // for 612 686 #ifdef __DEBUG_ALLOC__ 613 687 _heap_check(); 614 688 #endif 615 689 free(ppDItem); 616 ppDItem = NULL; 690 ppDItem = NULL; // Remember gone 617 691 DosPostEventSem(CompactSem); 618 692 … … 621 695 622 696 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); 623 hDrop = DrgDrag(hwnd, /* Initiate drag */ 624 pDInfo, /* DRAGINFO structure */ 625 padiIcon, ulNumIcon, VK_ENDDRAG, /* End of drag indicator */ 626 (PVOID) NULL); /* Reserved */ 627 if (!DeleteDragitemStrHandles(pDInfo)) 628 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 629 "DeleteDragistr"); 630 DrgDeleteDraginfoStrHandles (pDInfo); 631 if (!DrgFreeDraginfo(pDInfo)); /* Free DRAGINFO struct */ 632 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 633 "DrgFreeDraginfo"); 634 xfree(padiIcon); 635 padiIcon = NULL; 697 hDrop = DrgDrag(hwnd, 698 pDInfo, 699 paDImgIcons, 700 ulNumIcon, 701 VK_ENDDRAG, // Drag end button 702 (PVOID) NULL); 703 if (hDrop == NULLHANDLE) { 704 NumItemsToUnhilite = 0; 705 FreeDragInfoData(hwnd, pDInfo); 706 } 707 xfree(paDImgIcons); 708 paDImgIcons = NULL; // Remember gone 636 709 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 637 710 DosPostEventSem(CompactSem); … … 640 713 if (ppDItem) 641 714 free(ppDItem); 642 if (pa diIcon)643 free(pa diIcon);715 if (paDImgIcons) 716 free(paDImgIcons); 644 717 return hDrop; 645 718 } 646 719 647 #ifdef NEVER 720 #ifdef NEVER // fixme to be enabled someday? 648 721 649 722 BOOL PickUp(HWND hwndCnr, HWND hwndObj, PCNRDRAGINIT pcd) … … 655 728 ULONG cditem = 0; 656 729 DRAGITEM ditem; 657 DRAGIMAGE di FakeIcon;730 DRAGIMAGE dimgFakeIcon; 658 731 CHAR szDir[CCHMAXPATH], szFile[CCHMAXPATH], *p; 659 732 … … 702 775 ditem.hstrContainerName = DrgAddStrHandle(szDir); 703 776 ditem.hstrSourceName = DrgAddStrHandle(szFile); 704 if (!ditem.hstrSourceName) 705 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 706 "DrgAddStrHandle"); 777 // fixme to check better if code ever enabled 778 if (!ditem.hstrSourceName) { 779 Win_Error(HWND_DESKTOP, HWND_DESKTOP, pszSrcFile, __LINE__, 780 "DrgAddStrHandle"); 781 } 707 782 ditem.hstrTargetName = DrgAddStrHandle(szFile); 708 783 ditem.fsControl = 0; … … 719 794 if (IsRoot(pci->szFileName)) 720 795 ditem.fsSupportedOps = DO_LINKABLE; 721 memset(&di FakeIcon, 0, sizeof(DRAGIMAGE));722 di FakeIcon.hImage = pci->rc.hptrIcon;723 di FakeIcon.cb = sizeof(DRAGIMAGE);724 di FakeIcon.cptl = 0;725 di FakeIcon.fl = DRG_ICON;726 di FakeIcon.sizlStretch.cx = 32;727 di FakeIcon.sizlStretch.cy = 32;728 di FakeIcon.cxOffset = -16;729 di FakeIcon.cyOffset = 0;796 memset(&dimgFakeIcon, 0, sizeof(DRAGIMAGE)); 797 dimgFakeIcon.hImage = pci->rc.hptrIcon; 798 dimgFakeIcon.cb = sizeof(DRAGIMAGE); 799 dimgFakeIcon.cptl = 0; 800 dimgFakeIcon.fl = DRG_ICON; 801 dimgFakeIcon.sizlStretch.cx = 32; 802 dimgFakeIcon.sizlStretch.cy = 32; 803 dimgFakeIcon.cxOffset = -16; 804 dimgFakeIcon.cyOffset = 0; 730 805 if (IsFullName(pci->szFileName) && 731 806 (driveflags[toupper(*pci->szFileName) - 'A'] & … … 743 818 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, 744 819 MPFROMP(pci), MPFROMSHORT(CRA_SELECTED)); 745 } 820 } // while 746 821 if (pdinfoCurrent) 747 return DrgLazyDrag(hwndCnr, pdinfoCurrent, &di FakeIcon, 1, NULL);822 return DrgLazyDrag(hwndCnr, pdinfoCurrent, &dimgFakeIcon, 1, NULL); 748 823 } 749 824 return FALSE;
Note:
See TracChangeset
for help on using the changeset viewer.