Changeset 239 for trunk/dll/dirsize.c


Ignore:
Timestamp:
Aug 9, 2005, 7:12:27 AM (20 years ago)
Author:
root
Message:

Avoid Expand/Collapse hangs while working

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/dirsize.c

    r224 r239  
    1919  06 Jun 05 SHL Drop obsoletes
    2020  19 Jun 05 SHL More 64-bit math fixes
     21  08 Aug 05 SHL Avoid Expand/Collapse hangs while working
    2122
    2223***********************************************************************/
     
    4849
    4950typedef struct {
    50   CHAR      dirname[CCHMAXPATH];
    51   CHAR      pchStopFlag;
     51  CHAR      szDirName[CCHMAXPATH];
     52  CHAR      chStopFlag;
    5253  BOOL      dying;
    5354  BOOL      working;
    5455  HPOINTER  hptr;
    55 } TEMP;
     56} tState;
    5657
    5758
     
    433434MRESULT EXPENTRY DirSizeProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
    434435{
    435   TEMP *pTemp;
     436  tState *pState;
     437  PCNRITEM pci;
     438  CHAR szBytes[44];
     439  CHAR sz[66];
    436440
    437441  switch(msg) {
     
    441445        break;
    442446      }
    443       pTemp = malloc(sizeof(TEMP));
    444       if(!pTemp) {
     447      pState = malloc(sizeof(tState));
     448      if(!pState) {
    445449        WinDismissDlg(hwnd,0);
    446450        break;
    447451      }
    448       memset(pTemp,0,sizeof(TEMP));
    449       strcpy(pTemp->dirname,(CHAR *)mp2);
    450       WinSetWindowPtr(hwnd,0,(PVOID)pTemp);
    451       pTemp->hptr = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,DIRSIZE_ICON);
    452       WinDefDlgProc(hwnd,WM_SETICON,MPFROMLONG(pTemp->hptr),MPVOID);
     452      memset(pState,0,sizeof(tState));
     453      strcpy(pState->szDirName,(CHAR *)mp2);
     454      WinSetWindowPtr(hwnd,0,(PVOID)pState);
     455      pState->hptr = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,DIRSIZE_ICON);
     456      WinDefDlgProc(hwnd,WM_SETICON,MPFROMLONG(pState->hptr),MPVOID);
    453457      {
    454458        CHAR s[CCHMAXPATH + 81];
     
    456460        sprintf(s,
    457461                GetPString(IDS_DIRSIZETITLETEXT),
    458                 pTemp->dirname);
     462                pState->szDirName);
    459463        WinSetWindowText(hwnd,s);
    460464      }
     
    467471          break;
    468472        }
    469         dirsize->pchStopFlag = (CHAR *)&pTemp->pchStopFlag;
    470         dirsize->pszFileName = pTemp->dirname;
     473        dirsize->pchStopFlag = (CHAR *)&pState->chStopFlag;
     474        dirsize->pszFileName = pState->szDirName;
    471475        dirsize->hwndCnr = WinWindowFromID(hwnd,DSZ_CNR);
    472476        if(_beginthread(FillCnrThread,NULL,122880L * 5L,(PVOID)dirsize) == -1) {
     
    475479          break;
    476480        }
    477         pTemp->working = TRUE;
     481        pState->working = TRUE;
     482        WinEnableWindow(WinWindowFromID(hwnd,DSZ_COLLAPSE),FALSE);
     483        WinEnableWindow(WinWindowFromID(hwnd,DSZ_EXPAND),FALSE);
     484        WinEnableWindow(WinWindowFromID(hwnd,DSZ_PRINT),FALSE);
    478485      }
    479486      PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
     
    496503                          MPFROMLONG(CMA_FLWINDOWATTR | CMA_TREEICON |
    497504                                     CMA_LINESPACING | CMA_CXTREEINDENT));
    498         pTemp = INSTDATA(hwnd);
    499         if(pTemp && isalpha(*pTemp->dirname)) {
     505        pState = INSTDATA(hwnd);
     506        if(pState && isalpha(*pState->szDirName)) {
    500507          memset(&fsa,0,sizeof(fsa));
    501           rc = DosQueryFSInfo(toupper(*pTemp->dirname) - '@',FSIL_ALLOC,&fsa,
     508          rc = DosQueryFSInfo(toupper(*pState->szDirName) - '@',FSIL_ALLOC,&fsa,
    502509                              sizeof(FSALLOCATE));
    503510          if (!rc)
     
    533540
    534541    case UM_CONTAINER_FILLED:
    535       pTemp = INSTDATA(hwnd);
    536       if(!pTemp || pTemp->dying) {
    537         if (pTemp)
    538           pTemp->working = FALSE;
     542      pState = INSTDATA(hwnd);
     543      if (!pState || pState->dying) {
     544        if (pState)
     545          pState->working = FALSE;
    539546        WinDismissDlg(hwnd,0);
    540547        return 0;
    541548      }
    542       pTemp->working = FALSE;
     549      pState->working = FALSE;
     550      WinEnableWindow(WinWindowFromID(hwnd,DSZ_COLLAPSE),TRUE);
     551      WinEnableWindow(WinWindowFromID(hwnd,DSZ_EXPAND),TRUE);
     552      WinEnableWindow(WinWindowFromID(hwnd,DSZ_PRINT),TRUE);
     553
     554      pci = WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_QUERYRECORD,MPVOID,
     555                              MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
     556      if(pci && (INT)pci != -1)
     557        WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_EXPANDTREE,MPFROMP(pci),MPVOID);
     558      *sz = 0;
     559      pci = WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_QUERYRECORDEMPHASIS,
     560                              MPFROMLONG(CMA_FIRST),
     561                              MPFROMSHORT(CRA_CURSORED));
     562      if (pci && (INT)pci != -1)
    543563      {
    544         CHAR     tb[44],s[66];
    545         PCNRITEM pci;
    546 
    547         pci = WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_QUERYRECORD,MPVOID,
    548                                 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER));
    549         if(pci && (INT)pci != -1)
    550           WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_EXPANDTREE,MPFROMP(pci),MPVOID);
    551         *s = 0;
    552         pci = WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_QUERYRECORDEMPHASIS,
    553                                 MPFROMLONG(CMA_FIRST),
    554                                 MPFROMSHORT(CRA_CURSORED));
    555         if (pci && (INT)pci != -1)
    556         {
    557           commafmt(tb,sizeof(tb),pci->attrFile);
    558           sprintf(s,
    559                   "%s %s%s",
    560                   tb,
    561                   GetPString(IDS_FILETEXT),
    562                   &"s"[pci->attrFile == 1]);
    563         }
    564         WinSetDlgItemText(hwnd,DSZ_NUMFILES,s);
    565       }
     564        commafmt(szBytes,sizeof(szBytes),pci->attrFile);
     565        sprintf(sz,
     566                "%s %s%s",
     567                szBytes,
     568                GetPString(IDS_FILETEXT),
     569                &"s"[pci->attrFile == 1]);
     570      }
     571      WinSetDlgItemText(hwnd,DSZ_NUMFILES,sz);
     572
    566573      WinSendDlgItemMsg(hwnd,DSZ_CNR,CM_SORTRECORD,MPFROMP(SortSizeCnr),
    567574                        MPVOID);
     
    811818          break;
    812819        case CN_EMPHASIS:
    813           pTemp = INSTDATA(hwnd);
    814           if(pTemp && !pTemp->working && mp2) {
     820          pState = INSTDATA(hwnd);
     821          if(pState && !pState->working && mp2) {
    815822
    816823            PNOTIFYRECORDEMPHASIS pre = mp2;
    817             PCNRITEM              pci;
    818             CHAR                  tb[44],s[66];
    819824
    820825            pci = (PCNRITEM)((pre) ? pre->pRecord : NULL);
    821826            if(pci && (pre->fEmphasisMask & CRA_SELECTED) &&
    822827               (pci->rc.flRecordAttr & CRA_SELECTED)) {
    823               commafmt(tb,sizeof(tb),pci->attrFile);
    824               sprintf(s,
     828              commafmt(szBytes,sizeof(szBytes),pci->attrFile);
     829              sprintf(sz,
    825830                      "%s %s%s",
    826                       tb,
     831                      szBytes,
    827832                      GetPString(IDS_FILETEXT),
    828833                      &"s"[pci->attrFile == 1]);
    829834              WinSetDlgItemText(hwnd,
    830835                                DSZ_NUMFILES,
    831                                 s);
     836                                sz);
    832837            }
    833838          }
     
    846851
    847852        case DSZ_PRINT:
    848           pTemp = INSTDATA(hwnd);
    849           if(pTemp && !pTemp->working) {
     853          // Save button
     854          pState = INSTDATA(hwnd);
     855          if (pState) {
    850856
    851857            CHAR  pszFileName[CCHMAXPATH];
     
    854860            save_dir2(pszFileName);
    855861            sprintf(&pszFileName[strlen(pszFileName)],"\\%csizes.Rpt",
    856                     (pTemp) ? toupper(*pTemp->dirname) : '+');
    857             if(export_filename(hwnd,pszFileName,FALSE) && *pszFileName) {
    858               if(stricmp(pszFileName,"PRN") &&
     862                    (pState) ? toupper(*pState->szDirName) : '+');
     863            if (export_filename(hwnd,pszFileName,FALSE) && *pszFileName) {
     864              if (stricmp(pszFileName,"PRN") &&
    859865                 strnicmp(pszFileName,"\\DEV\\LPT",8) &&
    860866                 !strchr(pszFileName,'.'))
    861867                strcat(pszFileName,".RPT");
    862868              fp = fopen(pszFileName,"a+");
    863               if(fp) {
     869              if (fp) {
    864870                WinSetPointer(HWND_DESKTOP,hptrBusy);
    865871                PrintToFile(WinWindowFromID(hwnd,DSZ_CNR),0,NULL,fp);
     
    881887        case DSZ_EXPAND:
    882888        case DSZ_COLLAPSE:
    883           {
    884             PCNRITEM pci;
    885 
     889          pState = INSTDATA(hwnd);
     890          if (pState) {
    886891            pci = (PCNRITEM)WinSendDlgItemMsg(hwnd,DSZ_CNR,
    887892                                              CM_QUERYRECORDEMPHASIS,
     
    889894                                              MPFROMSHORT(CRA_CURSORED));
    890895            if(pci)
     896            {
     897              WinEnableWindow(WinWindowFromID(hwnd,DID_OK),FALSE);
     898              WinEnableWindow(WinWindowFromID(hwnd,IDM_HELP),FALSE);
     899              WinEnableWindow(WinWindowFromID(hwnd,DSZ_COLLAPSE),FALSE);
     900              WinEnableWindow(WinWindowFromID(hwnd,DSZ_EXPAND),FALSE);
     901              WinEnableWindow(WinWindowFromID(hwnd,DSZ_PRINT),FALSE);
     902              WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
     903              // fixme to use thread - too slow on large trees
    891904              ExpandAll(WinWindowFromID(hwnd,DSZ_CNR),
    892905                        (SHORT1FROMMP(mp1) == DSZ_EXPAND),pci);
     906              WinEnableWindow(WinWindowFromID(hwnd,DID_OK),TRUE);
     907              WinEnableWindow(WinWindowFromID(hwnd,IDM_HELP),TRUE);
     908              WinEnableWindow(WinWindowFromID(hwnd,DSZ_COLLAPSE),TRUE);
     909              WinEnableWindow(WinWindowFromID(hwnd,DSZ_EXPAND),TRUE);
     910              WinEnableWindow(WinWindowFromID(hwnd,DSZ_PRINT),TRUE);
     911              WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),TRUE);
     912            }
    893913          }
    894914          break;
     
    896916        case DID_OK:
    897917        case DID_CANCEL:
    898           pTemp = INSTDATA(hwnd);
    899           if(pTemp) {
    900             if(pTemp->working) {
    901               pTemp->dying = TRUE;
    902               pTemp->pchStopFlag = 0xff;
     918          pState = INSTDATA(hwnd);
     919          if (pState) {
     920            if (pState->working) {
     921              pState->dying = TRUE;
     922              pState->chStopFlag = 0xff;
    903923              DosBeep(1000,100);
    904924            }
     
    907927          }
    908928          break;
    909       }
     929      } // switch mp1
    910930      return 0;
    911931
    912932    case WM_CLOSE:
    913       pTemp = INSTDATA(hwnd);
    914       if(pTemp)
    915         pTemp->pchStopFlag = 0xff;
     933      pState = INSTDATA(hwnd);
     934      if(pState)
     935        pState->chStopFlag = 0xff;
    916936      DosSleep(1L);
    917937      break;
    918938
    919939    case WM_DESTROY:
    920       pTemp = INSTDATA(hwnd);
    921       if(pTemp) {
    922         pTemp->pchStopFlag = 0xff;
    923         if(pTemp->hptr)
    924           WinDestroyPointer(pTemp->hptr);
     940      pState = INSTDATA(hwnd);
     941      if (pState) {
     942        pState->chStopFlag = 0xff;
     943        if (pState->hptr)
     944          WinDestroyPointer(pState->hptr);
    925945        DosSleep(33L);
    926         free(pTemp);
     946        free (pState);          // Let's hope no one is still looking
    927947      }
    928948      DosPostEventSem(CompactSem);
Note: See TracChangeset for help on using the changeset viewer.