Changeset 1060

Show
Ignore:
Timestamp:
07/08/08 22:09:33 (7 weeks ago)
Author:
jbs
Message:

Ticket 242: Ensure that obsolete INI keys are deleted when re-saving
a directory container state with fewer open windows than those in the
previous state.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/dll/mainwnd.c

    r1056 r1060  
    9696static BOOL CloseDirCnrChildren(HWND hwndClient); 
    9797static BOOL RestoreDirCnrState(HWND hwndClient, PSZ pszStateName, BOOL noview); 
     98static VOID DeletePresParams(PSZ pszKeyroot); 
    9899 
    99100static MRESULT EXPENTRY MainObjectWndProc(HWND hwnd, ULONG msg, MPARAM mp1, 
     
    27932794  HWND hwndChild, hwndDir, hwndC; 
    27942795  ULONG numsaves = 0, flWindowAttr; 
     2796  ULONG previous_numsaves, ulTemp = sizeof(ULONG); 
    27952797  CHAR szPrefix[STATE_NAME_MAX_BYTES + 1]; 
    27962798  CHAR szKey[STATE_NAME_MAX_BYTES + 80]; 
    27972799  CHAR szDir[CCHMAXPATH]; 
    27982800  SWP swp; 
    2799   INT nSaved = 0; 
    28002801  DIRCNRDATA *dcd; 
    28012802  BOOL fIsShutDownState; 
     
    29012902            sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, numsaves++); 
    29022903            PrfWriteProfileString(fmprof, FM3Str, szKey, szDir); 
    2903             nSaved++; 
    29042904          } 
    29052905        } 
     
    29092909  WinEndEnumWindows(henum); 
    29102910 
    2911   if (nSaved) { 
    2912     if (WinQueryWindowPos(hwndTree, &swp)) { 
    2913       sprintf(szKey, "%sLastTreePos", szPrefix); 
    2914       PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP)); 
    2915     } 
    2916     sprintf(szKey, "%sNumDirsLastTime", szPrefix); 
     2911  sprintf(szKey, "%sNumDirsLastTime", szPrefix); 
     2912  if (PrfQueryProfileData(fmprof, FM3Str, szKey, (PVOID) &previous_numsaves, &ulTemp)) 
     2913    for (ulTemp = numsaves; ulTemp < previous_numsaves; ulTemp++) { 
     2914      sprintf(szKey, "%sDirCnrPos.%lu", szPrefix, ulTemp); 
     2915      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(SWP)); 
     2916      sprintf(szKey, "%sDirCnrSort.%lu", szPrefix, ulTemp); 
     2917      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(INT)); 
     2918      sprintf(szKey, "%sDirCnrFilter.%lu", szPrefix, ulTemp); 
     2919      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(MASK)); 
     2920      sprintf(szKey, "%sDirCnrView.%lu", szPrefix, ulTemp); 
     2921      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(ULONG)); 
     2922      sprintf(szKey, "%sDirCnr.%lu.DetailsLongname", szPrefix, ulTemp); 
     2923      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2924      sprintf(szKey, "%sDirCnr.%lu.DetailsSubject", szPrefix, ulTemp); 
     2925      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2926      sprintf(szKey, "%sDirCnr.%lu.DetailsSize", szPrefix, ulTemp); 
     2927      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2928      sprintf(szKey, "%sDirCnr.%lu.DetailsEA", szPrefix, ulTemp); 
     2929      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2930      sprintf(szKey, "%sDirCnr.%lu.DetailsAttr", szPrefix, ulTemp); 
     2931      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2932      sprintf(szKey, "%sDirCnr.%lu.DetailsIcon", szPrefix, ulTemp); 
     2933      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2934      sprintf(szKey, "%sDirCnr.%lu.DetailsLWDate", szPrefix, ulTemp); 
     2935      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2936      sprintf(szKey, "%sDirCnr.%lu.DetailsLWTime", szPrefix, ulTemp); 
     2937      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2938      sprintf(szKey, "%sDirCnr.%lu.DetailsLADate", szPrefix, ulTemp); 
     2939      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2940      sprintf(szKey, "%sDirCnr.%lu.DetailsLATime", szPrefix, ulTemp); 
     2941      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2942      sprintf(szKey, "%sDirCnr.%lu.DetailsCRDate", szPrefix, ulTemp); 
     2943      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2944      sprintf(szKey, "%sDirCnr.%lu.DetailsCRTime", szPrefix, ulTemp); 
     2945      PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, sizeof(BOOL)); 
     2946      sprintf(szKey, "%sDirCnrDir.%lu", szPrefix, ulTemp); 
     2947      PrfWriteProfileString(fmprof, FM3Str, szKey, NULL); 
     2948      sprintf(szKey, "%sDirCnr.%lu.", szPrefix, ulTemp); 
     2949      DeletePresParams(szKey); 
     2950    } 
     2951  sprintf(szKey, "%sNumDirsLastTime", szPrefix); 
     2952  if (numsaves) { 
    29172953    PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & numsaves, sizeof(ULONG)); 
    29182954    WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swp); 
    29192955    sprintf(szKey, "%sMySizeLastTime", szPrefix); 
    29202956    PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP)); 
     2957    if (WinQueryWindowPos(hwndTree, &swp)) { 
     2958      sprintf(szKey, "%sLastTreePos", szPrefix); 
     2959      PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & swp, sizeof(SWP)); 
     2960    } 
    29212961  } 
    29222962  else if (fIsShutDownState) { 
    2923     sprintf(szKey, "%sNumDirsLastTime", szPrefix); 
    29242963    PrfWriteProfileData(fmprof, FM3Str, szKey, (PVOID) & numsaves, sizeof(ULONG)); 
    29252964  } 
    29262965 
    2927   return nSaved; 
     2966  return numsaves; 
    29282967} 
    29292968 
     
    30123051    WinQueryWindowPos(WinQueryWindow(hwndClient, QW_PARENT), &swpO); 
    30133052  } 
    3014   // If restoring saved shutdown state or internally saved state, forget info 
     3053  // If restoring internally saved state, forget info 
    30153054  if (fDeleteState) 
    30163055    PrfWriteProfileData(fmprof, FM3Str, szKey, NULL, 0L); 
     
    63676406} 
    63686407 
     6408VOID DeletePresParams(CHAR * pchKeyroot) 
     6409// This code assumes that pchKeyroot points to a buffer large enough to 
     6410// hold the full INI key: The state name.dircnr-number.PPName. The 
     6411// PPNames are listed below. 
     6412{ 
     6413  PSZ apszPPNames[] = 
     6414  { 
     6415    "Backgroundcolor", 
     6416    "Foregroundcolor", 
     6417    "Hilitebackgroundcolor", 
     6418    "Hiliteforegroundcolor", 
     6419    "Bordercolor", 
     6420    "Fontnamesize" 
     6421  }; 
     6422 
     6423  ULONG ulSize, ulArraySize = sizeof(apszPPNames) / sizeof(PSZ), x; 
     6424  CHAR * eos = pchKeyroot + strlen(pchKeyroot); 
     6425 
     6426  for (x = 0; x < ulArraySize; x++) 
     6427  { 
     6428    strcpy(eos, apszPPNames[x]); 
     6429    if (PrfQueryProfileSize(fmprof, appname, pchKeyroot, &ulSize) && ulSize) 
     6430    { 
     6431      PrfWriteProfileData(fmprof, appname, pchKeyroot, NULL, ulSize); 
     6432    } 
     6433  } 
     6434} 
     6435 
    63696436#pragma alloc_text(MISC8,SetToggleChecks,FindDirCnrByName,TopWindow) 
    63706437#pragma alloc_text(MISC8,TopWindowName,CountDirCnrs)