Changeset 397 for trunk/dll/misc.c


Ignore:
Timestamp:
Jul 28, 2006, 8:43:22 PM (19 years ago)
Author:
root
Message:

Comments, apply indent

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/misc.c

    r369 r397  
    1717  17 Jul 06 SHL Use Runtime_Error
    1818  26 Jul 06 SHL Use chop_at_crnl
     19  27 Jul 06 SHL Comments, apply indent
    1920
    2021***********************************************************************/
     
    7172VOID SetShiftState(VOID)
    7273{
    73     shiftstate = 0;
    74     if (WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000)
    75         shiftstate |= KC_CTRL;
    76     if (WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000)
    77         shiftstate |= KC_SHIFT;
    78     if (WinGetKeyState(HWND_DESKTOP, VK_ALT) & 0x8000)
    79         shiftstate |= KC_ALT;
     74  shiftstate = 0;
     75  if (WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000)
     76    shiftstate |= KC_CTRL;
     77  if (WinGetKeyState(HWND_DESKTOP, VK_SHIFT) & 0x8000)
     78    shiftstate |= KC_SHIFT;
     79  if (WinGetKeyState(HWND_DESKTOP, VK_ALT) & 0x8000)
     80    shiftstate |= KC_ALT;
    8081}
    8182
    8283void EmphasizeButton(HWND hwnd, BOOL on)
    8384{
    84     HPS hps;
    85 
    86     hps = DrgGetPS(hwnd);
    87     if (hps)
    88     {
    89 
    90         POINTL ptl;
    91         SWP swp;
    92 
    93         WinQueryWindowPos(hwnd, &swp);
    94         ptl.x = 1;
    95         ptl.y = 1;
    96         GpiMove(hps, &ptl);
    97         GpiSetColor(hps, ((on) ? CLR_BLACK : CLR_PALEGRAY));
    98         ptl.x = swp.cx - 2;
    99         ptl.y = swp.cy - 2;
    100         GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
    101         DrgReleasePS(hps);
    102         if (remove)
    103             WinInvalidateRect(hwnd, NULL, FALSE);
    104     }
    105 }
    106 
    107 void DrawTargetEmphasis(HWND hwnd, BOOL on)
    108 {
    109     HPS hps;
    110 
    111     hps = DrgGetPS(WinQueryWindow(hwnd, QW_PARENT));
    112     if (hps)
    113     {
    114         BoxWindow(hwnd, hps, ((on) ? CLR_BLACK : CLR_PALEGRAY));
    115         DrgReleasePS(hps);
    116     }
    117 }
    118 
    119 void BoxWindow(HWND hwnd, HPS hps, LONG color)
    120 {
     85  HPS hps = DrgGetPS(hwnd);
     86
     87  // fixme to complain?
     88  if (hps) {
    12189    POINTL ptl;
    12290    SWP swp;
    123     BOOL releaseme = FALSE;
    124 
    125     if (!hps)
    126     {
    127         hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
    128         releaseme = TRUE;
    129     }
    130     if (hps && WinQueryWindowPos(hwnd, &swp))
    131     {
    132         ptl.x = swp.x - 2;
    133         ptl.y = swp.y - 2;
    134         GpiMove(hps, &ptl);
    135         GpiSetColor(hps, color);
    136         ptl.x = swp.x + swp.cx + 1;
    137         ptl.y = swp.y + swp.cy + 1;
    138         GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
    139     }
    140     if (releaseme && hps)
    141         WinReleasePS(hps);
     91
     92    WinQueryWindowPos(hwnd, &swp);
     93    ptl.x = 1;
     94    ptl.y = 1;
     95    GpiMove(hps, &ptl);
     96    GpiSetColor(hps, ((on) ? CLR_BLACK : CLR_PALEGRAY));
     97    ptl.x = swp.cx - 2;
     98    ptl.y = swp.cy - 2;
     99    GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
     100    DrgReleasePS(hps);
     101    if (remove)
     102      WinInvalidateRect(hwnd, NULL, FALSE);
     103  }
     104}
     105
     106void DrawTargetEmphasis(HWND hwnd, BOOL on)
     107{
     108  HPS hps = DrgGetPS(WinQueryWindow(hwnd, QW_PARENT));
     109  if (hps) {
     110    BoxWindow(hwnd, hps, ((on) ? CLR_BLACK : CLR_PALEGRAY));
     111    DrgReleasePS(hps);
     112  }
     113}
     114
     115void BoxWindow(HWND hwnd, HPS hps, LONG color)
     116{
     117  POINTL ptl;
     118  SWP swp;
     119  BOOL releaseme = FALSE;
     120
     121  if (!hps) {
     122    hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
     123    releaseme = TRUE;
     124  }
     125  if (hps && WinQueryWindowPos(hwnd, &swp)) {
     126    ptl.x = swp.x - 2;
     127    ptl.y = swp.y - 2;
     128    GpiMove(hps, &ptl);
     129    GpiSetColor(hps, color);
     130    ptl.x = swp.x + swp.cx + 1;
     131    ptl.y = swp.y + swp.cy + 1;
     132    GpiBox(hps, DRO_OUTLINE, &ptl, 0, 0);
     133  }
     134  if (releaseme && hps)
     135    WinReleasePS(hps);
    142136}
    143137
    144138void PaintSTextWindow(HWND hwnd, HPS hps)
    145139{
    146     /*
    147      * paint a text window such that the rightmost part of the text is
    148      * always visible even if the text length exceeds the length of the
    149      * window -- otherwise, paint the window so that it is left-justified
    150      * and vertically centered.
    151      */
    152 
    153     char *s = NULL;
    154     long len;
    155     POINTL aptl[TXTBOX_COUNT], ptl;
    156     RECTL rcl;
    157     char *p;
    158     BOOL releaseme = FALSE;
    159 
    160     if (!hps)
    161     {
    162         releaseme = TRUE;
    163         hps = WinGetPS(hwnd);
    164     }
    165     if (hps)
    166     {
    167         WinQueryWindowRect(hwnd, &rcl);
    168         WinFillRect(hps,
    169                     &rcl,
    170                     CLR_PALEGRAY);
    171         len = WinQueryWindowTextLength(hwnd);
    172         if (len)
    173             s = xmalloc(len + 1,pszSrcFile,__LINE__);
    174         if (s)
    175         {
    176             *s = 0;
    177             WinQueryWindowText(hwnd, CCHMAXPATH, s);
    178             if (*s)
    179             {
    180                 rcl.xRight -= 3;
    181                 p = s;
    182                 GpiQueryTextBox(hps,
    183                                 3,
    184                                 "...",
    185                                 TXTBOX_COUNT,
    186                                 aptl);
    187                 len = aptl[TXTBOX_TOPRIGHT].x;
    188                 do
    189                 {
    190                     GpiQueryTextBox(hps,
    191                                     strlen(p),
    192                                     p,
    193                                     TXTBOX_COUNT,
    194                                     aptl);
    195                     if (aptl[TXTBOX_TOPRIGHT].x >
    196                             (rcl.xRight - ((p != s) ? len : 0)))
    197                         p++;
    198                     else
    199                         break;
    200                 }
    201                 while (*p);
    202                 if (*p)
    203                 {
    204                     GpiSetMix(hps, FM_OVERPAINT);
    205                     GpiSetColor(hps, CLR_BLACK);
    206                     ptl.x = 3;
    207                     ptl.y = ((rcl.yTop / 2) -
    208                              ((aptl[TXTBOX_TOPRIGHT].y +
    209                                aptl[TXTBOX_BOTTOMLEFT].y) / 2));
    210                     GpiMove(hps, &ptl);
    211                     if (p != s)
    212                         GpiCharString(hps,
    213                                       3,
    214                                       "...");
    215                     GpiCharString(hps,
    216                                   strlen(p),
    217                                   p);
    218                 }
    219             }
    220             free(s);
     140  /*
     141   * paint a text window such that the rightmost part of the text is
     142   * always visible even if the text length exceeds the length of the
     143   * window -- otherwise, paint the window so that it is left-justified
     144   * and vertically centered.
     145   */
     146
     147  char *s = NULL;
     148  long len;
     149  POINTL aptl[TXTBOX_COUNT], ptl;
     150  RECTL rcl;
     151  char *p;
     152  BOOL releaseme = FALSE;
     153
     154  if (!hps) {
     155    releaseme = TRUE;
     156    hps = WinGetPS(hwnd);
     157  }
     158  if (hps) {
     159    WinQueryWindowRect(hwnd, &rcl);
     160    WinFillRect(hps, &rcl, CLR_PALEGRAY);
     161    len = WinQueryWindowTextLength(hwnd);
     162    if (len)
     163      s = xmalloc(len + 1, pszSrcFile, __LINE__);
     164    if (s) {
     165      *s = 0;
     166      WinQueryWindowText(hwnd, CCHMAXPATH, s);
     167      if (*s) {
     168        rcl.xRight -= 3;
     169        p = s;
     170        GpiQueryTextBox(hps, 3, "...", TXTBOX_COUNT, aptl);
     171        len = aptl[TXTBOX_TOPRIGHT].x;
     172        do {
     173          GpiQueryTextBox(hps, strlen(p), p, TXTBOX_COUNT, aptl);
     174          if (aptl[TXTBOX_TOPRIGHT].x > (rcl.xRight - ((p != s) ? len : 0)))
     175            p++;
     176          else
     177            break;
    221178        }
    222         if (releaseme)
    223             WinReleasePS(hps);
    224     }
     179        while (*p);
     180        if (*p) {
     181          GpiSetMix(hps, FM_OVERPAINT);
     182          GpiSetColor(hps, CLR_BLACK);
     183          ptl.x = 3;
     184          ptl.y = ((rcl.yTop / 2) -
     185                   ((aptl[TXTBOX_TOPRIGHT].y +
     186                     aptl[TXTBOX_BOTTOMLEFT].y) / 2));
     187          GpiMove(hps, &ptl);
     188          if (p != s)
     189            GpiCharString(hps, 3, "...");
     190          GpiCharString(hps, strlen(p), p);
     191        }
     192      }
     193      free(s);
     194    }
     195    if (releaseme)
     196      WinReleasePS(hps);
     197  }
    225198}
    226199
    227200VOID PaintRecessedWindow(HWND hwnd, HPS hps, BOOL outtie, BOOL dbl)
    228201{
    229     /*
    230      * paint a recessed box around the window
    231      * two pixels width required around window for painting...
    232      */
    233     BOOL releaseme = FALSE;
    234 
    235     if (!hps)
    236     {
    237         hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
    238         releaseme = TRUE;
    239     }
    240     if (hps)
    241     {
    242 
    243         POINTL ptl;
    244         SWP swp;
    245 
    246         WinQueryWindowPos(hwnd, &swp);
    247         ptl.x = swp.x - 1;
    248         ptl.y = swp.y - 1;
    249         GpiMove(hps, &ptl);
    250         if (!outtie)
    251             GpiSetColor(hps, CLR_WHITE);
     202  /*
     203   * paint a recessed box around the window
     204   * two pixels width required around window for painting...
     205   */
     206  BOOL releaseme = FALSE;
     207
     208  if (!hps) {
     209    hps = WinGetPS(WinQueryWindow(hwnd, QW_PARENT));
     210    releaseme = TRUE;
     211  }
     212  if (hps) {
     213
     214    POINTL ptl;
     215    SWP swp;
     216
     217    WinQueryWindowPos(hwnd, &swp);
     218    ptl.x = swp.x - 1;
     219    ptl.y = swp.y - 1;
     220    GpiMove(hps, &ptl);
     221    if (!outtie)
     222      GpiSetColor(hps, CLR_WHITE);
     223    else
     224      GpiSetColor(hps, CLR_DARKGRAY);
     225    ptl.x = swp.x + swp.cx;
     226    GpiLine(hps, &ptl);
     227    ptl.y = swp.y + swp.cy;
     228    GpiLine(hps, &ptl);
     229    if (dbl) {
     230      ptl.x = swp.x - 2;
     231      ptl.y = swp.y - 2;
     232      GpiMove(hps, &ptl);
     233      ptl.x = swp.x + swp.cx + 1;
     234      GpiLine(hps, &ptl);
     235      ptl.y = swp.y + swp.cy + 1;
     236      GpiLine(hps, &ptl);
     237    }
     238    if (!outtie)
     239      GpiSetColor(hps, CLR_DARKGRAY);
     240    else
     241      GpiSetColor(hps, CLR_WHITE);
     242    if (dbl) {
     243      ptl.x = swp.x - 2;
     244      GpiLine(hps, &ptl);
     245      ptl.y = swp.y - 2;
     246      GpiLine(hps, &ptl);
     247      ptl.x = swp.x + swp.cx;
     248      ptl.y = swp.y + swp.cy;
     249      GpiMove(hps, &ptl);
     250    }
     251    ptl.x = swp.x - 1;
     252    GpiLine(hps, &ptl);
     253    ptl.y = swp.y - 1;
     254    GpiLine(hps, &ptl);
     255    GpiSetColor(hps, CLR_PALEGRAY);
     256    ptl.x = swp.x - (2 + (dbl != FALSE));
     257    ptl.y = swp.y - (2 + (dbl != FALSE));
     258    GpiMove(hps, &ptl);
     259    ptl.x = swp.x + swp.cx + (1 + (dbl != FALSE));
     260    GpiLine(hps, &ptl);
     261    ptl.y = swp.y + swp.cy + (1 + (dbl != FALSE));
     262    GpiLine(hps, &ptl);
     263    ptl.x = swp.x - (2 + (dbl != FALSE));
     264    GpiLine(hps, &ptl);
     265    ptl.y = swp.y - (2 + (dbl != FALSE));
     266    GpiLine(hps, &ptl);
     267    if (releaseme)
     268      WinReleasePS(hps);
     269  }
     270}
     271
     272BOOL AdjustCnrColVis(HWND hwndCnr, CHAR * title, BOOL visible, BOOL toggle)
     273{
     274  PFIELDINFO pfi = (PFIELDINFO)WinSendMsg(hwndCnr,
     275                                        CM_QUERYDETAILFIELDINFO,
     276                                        MPVOID, MPFROMSHORT(CMA_FIRST));
     277  while (pfi) {
     278    if (!strcmp(pfi->pTitleData, title)) {
     279      if (toggle) {
     280        if (pfi->flData & CFA_INVISIBLE)
     281          pfi->flData &= (~CFA_INVISIBLE);
    252282        else
    253             GpiSetColor(hps, CLR_DARKGRAY);
    254         ptl.x = swp.x + swp.cx;
    255         GpiLine(hps, &ptl);
    256         ptl.y = swp.y + swp.cy;
    257         GpiLine(hps, &ptl);
    258         if (dbl)
    259         {
    260             ptl.x = swp.x - 2;
    261             ptl.y = swp.y - 2;
    262             GpiMove(hps, &ptl);
    263             ptl.x = swp.x + swp.cx + 1;
    264             GpiLine(hps, &ptl);
    265             ptl.y = swp.y + swp.cy + 1;
    266             GpiLine(hps, &ptl);
     283          pfi->flData |= CFA_INVISIBLE;
     284        return !(pfi->flData & CFA_INVISIBLE);
     285      }
     286      else {
     287        if (visible)
     288          pfi->flData &= (~CFA_INVISIBLE);
     289        else
     290          pfi->flData |= CFA_INVISIBLE;
     291      }
     292      return TRUE;
     293    }
     294    pfi = pfi->pNextFieldInfo;
     295  }
     296  return FALSE;
     297}
     298
     299BOOL AdjustCnrColRO(HWND hwndCnr, CHAR * title, BOOL readonly, BOOL toggle)
     300{
     301  PFIELDINFO pfi = (PFIELDINFO)WinSendMsg(hwndCnr,
     302                                          CM_QUERYDETAILFIELDINFO,
     303                                          MPVOID, MPFROMSHORT(CMA_FIRST));
     304  while (pfi) {
     305    if (!strcmp(pfi->pTitleData, title)) {
     306      if (toggle) {
     307        if (pfi->flData & CFA_FIREADONLY)
     308          pfi->flData &= (~CFA_FIREADONLY);
     309        else
     310          pfi->flData |= CFA_FIREADONLY;
     311        return (pfi->flData & CFA_FIREADONLY);
     312      }
     313      else {
     314        if (!readonly)
     315          pfi->flData &= (~CFA_FIREADONLY);
     316        else
     317          pfi->flData |= CFA_FIREADONLY;
     318      }
     319      return TRUE;
     320    }
     321    pfi = pfi->pNextFieldInfo;
     322  }
     323  return FALSE;
     324}
     325
     326VOID AdjustCnrColsForFSType(HWND hwndCnr, CHAR * directory, DIRCNRDATA * dcd)
     327{
     328  CHAR FileSystem[CCHMAXPATH];
     329  INT x;
     330  BOOL hasCreateDT;
     331  BOOL hasAccessDT;
     332  BOOL hasLongNames;
     333  BOOL *pBool;
     334
     335  if (!directory || !*directory)
     336    return;
     337  x = CheckDrive(toupper(*directory), FileSystem, NULL);
     338  if (x != -1) {
     339    if (!stricmp(FileSystem, HPFS) ||
     340        !stricmp(FileSystem, JFS) ||
     341        !stricmp(FileSystem, FAT32) || !stricmp(FileSystem, HPFS386)) {
     342      hasCreateDT = TRUE;
     343      hasAccessDT = TRUE;
     344      hasLongNames = TRUE;
     345    }
     346    else if (!strcmp(FileSystem, CDFS)) {
     347      hasCreateDT = TRUE;
     348      hasAccessDT = FALSE;
     349      hasLongNames = FALSE;
     350    }
     351    else {
     352      // Assume FAT
     353      hasCreateDT = FALSE;
     354      hasAccessDT = FALSE;
     355      hasLongNames = FALSE;
     356    }
     357  }
     358  else {
     359    // Assume FAT
     360    hasCreateDT = FALSE;
     361    hasAccessDT = FALSE;
     362    hasLongNames = FALSE;
     363  }
     364  pBool = (dcd) ? &dcd->detailsladate : &detailsladate;
     365  AdjustCnrColVis(hwndCnr, GetPString(IDS_LADATE),
     366                  (*pBool) ? hasAccessDT : FALSE, FALSE);
     367  pBool = (dcd) ? &dcd->detailslatime : &detailslatime;
     368  AdjustCnrColVis(hwndCnr, GetPString(IDS_LATIME),
     369                  (*pBool) ? hasAccessDT : FALSE, FALSE);
     370  pBool = (dcd) ? &dcd->detailscrdate : &detailscrdate;
     371  AdjustCnrColVis(hwndCnr, GetPString(IDS_CRDATE),
     372                  (*pBool) ? hasCreateDT : FALSE, FALSE);
     373  pBool = (dcd) ? &dcd->detailscrtime : &detailscrtime;
     374  AdjustCnrColVis(hwndCnr, GetPString(IDS_CRTIME),
     375                  (*pBool) ? hasCreateDT : FALSE, FALSE);
     376  pBool = (dcd) ? &dcd->detailslongname : &detailslongname;
     377  AdjustCnrColVis(hwndCnr, GetPString(IDS_LNAME),
     378                  (*pBool) ? hasLongNames : FALSE, FALSE);
     379  WinSendMsg(hwndCnr, CM_INVALIDATEDETAILFIELDINFO, MPVOID, MPVOID);
     380}
     381
     382VOID AdjustCnrColsForPref(HWND hwndCnr, CHAR * directory, DIRCNRDATA * dcd,
     383                          BOOL compare)
     384{
     385  BOOL *bool;
     386
     387  bool = (dcd) ? &dcd->detailssubject : &detailssubject;
     388  AdjustCnrColVis(hwndCnr, ((compare) ? GetPString(IDS_STATUS) :
     389                            GetPString(IDS_SUBJ)), *bool, FALSE);
     390  bool = (dcd) ? &dcd->detailsattr : &detailsattr;
     391  AdjustCnrColVis(hwndCnr, GetPString(IDS_ATTR), *bool, FALSE);
     392  bool = (dcd) ? &dcd->detailsicon : &detailsicon;
     393  AdjustCnrColVis(hwndCnr, GetPString(IDS_ICON), *bool, FALSE);
     394  bool = (dcd) ? &dcd->detailslwdate : &detailslwdate;
     395  AdjustCnrColVis(hwndCnr, GetPString(IDS_LWDATE), *bool, FALSE);
     396  bool = (dcd) ? &dcd->detailslwtime : &detailslwtime;
     397  AdjustCnrColVis(hwndCnr, GetPString(IDS_LWTIME), *bool, FALSE);
     398  bool = (dcd) ? &dcd->detailsea : &detailsea;
     399  AdjustCnrColVis(hwndCnr, GetPString(IDS_EA), *bool, FALSE);
     400  bool = (dcd) ? &dcd->detailssize : &detailssize;
     401  AdjustCnrColVis(hwndCnr, GetPString(IDS_SIZE), *bool, FALSE);
     402  if (!directory) {
     403    bool = (dcd) ? &dcd->detailsladate : &detailsladate;
     404    AdjustCnrColVis(hwndCnr, GetPString(IDS_LADATE), *bool, FALSE);
     405    bool = (dcd) ? &dcd->detailslatime : &detailslatime;
     406    AdjustCnrColVis(hwndCnr, GetPString(IDS_LATIME), *bool, FALSE);
     407    bool = (dcd) ? &dcd->detailscrdate : &detailscrdate;
     408    AdjustCnrColVis(hwndCnr, GetPString(IDS_CRDATE), *bool, FALSE);
     409    bool = (dcd) ? &dcd->detailscrtime : &detailscrtime;
     410    AdjustCnrColVis(hwndCnr, GetPString(IDS_CRTIME), *bool, FALSE);
     411    bool = (dcd) ? &dcd->detailslongname : &detailslongname;
     412    AdjustCnrColVis(hwndCnr, GetPString(IDS_LNAME), *bool, FALSE);
     413    WinSendMsg(hwndCnr, CM_INVALIDATEDETAILFIELDINFO, MPVOID, MPVOID);
     414  }
     415  else
     416    AdjustCnrColsForFSType(hwndCnr, directory, dcd);
     417}
     418
     419BOOL SetCnrCols(HWND hwndCnr, BOOL compare)
     420{
     421  BOOL fSuccess = TRUE;
     422  PFIELDINFO pfi, pfiLastLeftCol, pfiIconCol;
     423
     424  // Allocate storage for container column data
     425
     426  pfi = WinSendMsg(hwndCnr, CM_ALLOCDETAILFIELDINFO,
     427                   MPFROMLONG(CONTAINER_COLUMNS), NULL);
     428
     429  if (pfi) {
     430
     431    PFIELDINFO pfiFirst;
     432    FIELDINFOINSERT fii;
     433
     434    // Store original value of pfi so we won't lose it when it changes.
     435    // This will be needed on the CM_INSERTDETAILFIELDINFO message.
     436
     437    pfiFirst = pfi;
     438
     439    // Fill in column information for the icon column
     440
     441    pfi->flData = CFA_BITMAPORICON | CFA_CENTER | CFA_FIREADONLY;
     442    pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
     443    pfi->pTitleData = GetPString(IDS_ICON);
     444    pfi->offStruct = FIELDOFFSET(MINIRECORDCORE, hptrIcon);
     445
     446    pfiIconCol = pfi;
     447
     448    // Fill in column information for the file name. Note that we are
     449    // using the pszFileName variable rather than szFileName. We do this
     450    // because the container needs a pointer to the file name. If we used
     451    // szFileName (a character array, not a pointer), the container would
     452    // take the first 4 bytes of szFileName and think it was a pointer,
     453    // which of course it is not. Later in the FillInRecord* functions we set
     454    // pszFileName to point to szFileName.
     455
     456    pfi = pfi->pNextFieldInfo;
     457    pfi->flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
     458    pfi->flTitle = CFA_CENTER;
     459    pfi->pTitleData = GetPString(IDS_FILENAME);
     460    pfi->offStruct = FIELDOFFSET(CNRITEM, pszFileName);
     461
     462    // Fill in column information for the longname.
     463
     464    pfi = pfi->pNextFieldInfo;
     465    pfi->flData = CFA_STRING | CFA_LEFT;
     466    pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
     467    pfi->pTitleData = GetPString(IDS_LNAME);
     468    pfi->offStruct = FIELDOFFSET(CNRITEM, pszLongname);
     469
     470    // Store the current pfi value as that will be used to indicate the
     471    // last column in the lefthand container window (we have a splitbar)
     472
     473    pfiLastLeftCol = pfi;
     474
     475    // Fill in column info for subjects
     476
     477    pfi = pfi->pNextFieldInfo;
     478    pfi->flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
     479    if (compare)
     480      pfi->flData |= CFA_FIREADONLY;
     481    pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
     482    pfi->pTitleData = (compare) ? GetPString(IDS_STATUS) :
     483      GetPString(IDS_SUBJ);
     484    pfi->offStruct = FIELDOFFSET(CNRITEM, pszSubject);
     485
     486    // Fill in column information for the file size
     487
     488    pfi = pfi->pNextFieldInfo;
     489    pfi->flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
     490    pfi->flTitle = CFA_CENTER;
     491    pfi->pTitleData = GetPString(IDS_SIZE);
     492    pfi->offStruct = FIELDOFFSET(CNRITEM, cbFile);
     493
     494    // Fill in the column information for the file's ea size
     495
     496    pfi = pfi->pNextFieldInfo;
     497    pfi->flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
     498    pfi->flTitle = CFA_CENTER;
     499    pfi->pTitleData = GetPString(IDS_EA);
     500    pfi->offStruct = FIELDOFFSET(CNRITEM, easize);
     501
     502    // Fill in the column information for the file attribute
     503
     504    pfi = pfi->pNextFieldInfo;
     505    pfi->flData = CFA_STRING | CFA_CENTER | CFA_SEPARATOR | CFA_FIREADONLY;
     506    pfi->flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
     507    pfi->pTitleData = GetPString(IDS_ATTR);
     508    pfi->offStruct = FIELDOFFSET(CNRITEM, pszDispAttr);
     509
     510    // Fill in column information for last write file date
     511
     512    pfi = pfi->pNextFieldInfo;
     513    pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
     514    pfi->flTitle = CFA_CENTER;
     515    pfi->pTitleData = GetPString(IDS_LWDATE);
     516    pfi->offStruct = FIELDOFFSET(CNRITEM, date);
     517
     518    // Fill in column information for the last write file time
     519
     520    pfi = pfi->pNextFieldInfo;
     521    pfi->flData = CFA_TIME | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
     522    pfi->flTitle = CFA_CENTER;
     523    pfi->pTitleData = GetPString(IDS_LWTIME);
     524    pfi->offStruct = FIELDOFFSET(CNRITEM, time);
     525
     526    // Fill in column information for last access file date
     527
     528    pfi = pfi->pNextFieldInfo;
     529    pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
     530    pfi->flTitle = CFA_CENTER;
     531    pfi->pTitleData = GetPString(IDS_LADATE);
     532    pfi->offStruct = FIELDOFFSET(CNRITEM, ladate);
     533
     534    // Fill in column information for the last access file time
     535
     536    pfi = pfi->pNextFieldInfo;
     537    pfi->flData = CFA_TIME | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
     538    pfi->flTitle = CFA_CENTER;
     539    pfi->pTitleData = GetPString(IDS_LATIME);
     540    pfi->offStruct = FIELDOFFSET(CNRITEM, latime);
     541
     542    // Fill in column information for create file date
     543
     544    pfi = pfi->pNextFieldInfo;
     545    pfi->flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
     546    pfi->flTitle = CFA_CENTER;
     547    pfi->pTitleData = GetPString(IDS_CRDATE);
     548    pfi->offStruct = FIELDOFFSET(CNRITEM, crdate);
     549
     550    // Fill in column information for the create file time
     551
     552    pfi = pfi->pNextFieldInfo;
     553    pfi->flData = CFA_TIME | CFA_RIGHT | CFA_FIREADONLY;
     554    pfi->flTitle = CFA_CENTER;
     555    pfi->pTitleData = GetPString(IDS_CRTIME);
     556    pfi->offStruct = FIELDOFFSET(CNRITEM, crtime);
     557
     558    // Use the CM_INSERTDETAILFIELDINFO message to tell the container
     559    // all the column information it needs to function properly. Place
     560    // this column info first in the column list and update the display
     561    // after they are inserted (fInvalidateFieldInfo = TRUE)
     562
     563    (void)memset(&fii, 0, sizeof(FIELDINFOINSERT));
     564
     565    fii.cb = sizeof(FIELDINFOINSERT);
     566    fii.pFieldInfoOrder = (PFIELDINFO) CMA_FIRST;
     567    fii.cFieldInfoInsert = (SHORT) CONTAINER_COLUMNS;
     568    fii.fInvalidateFieldInfo = TRUE;
     569
     570    if (!WinSendMsg(hwndCnr, CM_INSERTDETAILFIELDINFO, MPFROMP(pfiFirst),
     571                    MPFROMP(&fii)))
     572      fSuccess = FALSE;
     573  }
     574  else
     575    fSuccess = FALSE;
     576
     577  if (fSuccess) {
     578
     579    CNRINFO cnri;
     580    ULONG size;
     581
     582    // Tell the container about the splitbar and where it goes
     583
     584    cnri.cb = sizeof(CNRINFO);
     585    cnri.pFieldInfoLast = pfiLastLeftCol;
     586    cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 32;
     587    cnri.pFieldInfoObject = pfiIconCol;
     588    size = sizeof(LONG);
     589    PrfQueryProfileData(fmprof,
     590                        appname, "CnrSplitBar", &cnri.xVertSplitbar, &size);
     591    if (cnri.xVertSplitbar <= 0)
     592      cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 32;
     593    if (!WinSendMsg(hwndCnr, CM_SETCNRINFO, MPFROMP(&cnri),
     594                    MPFROMLONG(CMA_PFIELDINFOLAST | CMA_PFIELDINFOOBJECT |
     595                               CMA_XVERTSPLITBAR)))
     596      fSuccess = FALSE;
     597  }
     598
     599  return fSuccess;
     600}
     601
     602MRESULT CnrDirectEdit(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
     603{
     604  switch (SHORT2FROMMP(mp1)) {
     605  case CN_BEGINEDIT:
     606    if (mp2) {
     607      PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo;
     608      PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord;
     609
     610      if (pci &&
     611          (INT)pci != -1 &&
     612          !IsRoot(pci->szFileName) &&
     613          !(pci->flags & RECFLAGS_ENV) && !(pci->flags & RECFLAGS_UNDERENV)) {
     614        if (!pfi || pfi->offStruct == FIELDOFFSET(CNRITEM, pszFileName)) {
     615          PostMsg(hwnd, UM_FIXEDITNAME, MPFROMP(pci->szFileName), MPVOID);
    267616        }
    268         if (!outtie)
    269             GpiSetColor(hps, CLR_DARKGRAY);
     617        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, pszSubject))
     618          PostMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(40), MPVOID);
    270619        else
    271             GpiSetColor(hps, CLR_WHITE);
    272         if (dbl)
    273         {
    274             ptl.x = swp.x - 2;
    275             GpiLine(hps, &ptl);
    276             ptl.y = swp.y - 2;
    277             GpiLine(hps, &ptl);
    278             ptl.x = swp.x + swp.cx;
    279             ptl.y = swp.y + swp.cy;
    280             GpiMove(hps, &ptl);
    281         }
    282         ptl.x = swp.x - 1;
    283         GpiLine(hps, &ptl);
    284         ptl.y = swp.y - 1;
    285         GpiLine(hps, &ptl);
    286         GpiSetColor(hps, CLR_PALEGRAY);
    287         ptl.x = swp.x - (2 + (dbl != FALSE));
    288         ptl.y = swp.y - (2 + (dbl != FALSE));
    289         GpiMove(hps, &ptl);
    290         ptl.x = swp.x + swp.cx + (1 + (dbl != FALSE));
    291         GpiLine(hps, &ptl);
    292         ptl.y = swp.y + swp.cy + (1 + (dbl != FALSE));
    293         GpiLine(hps, &ptl);
    294         ptl.x = swp.x - (2 + (dbl != FALSE));
    295         GpiLine(hps, &ptl);
    296         ptl.y = swp.y - (2 + (dbl != FALSE));
    297         GpiLine(hps, &ptl);
    298         if (releaseme)
    299             WinReleasePS(hps);
    300     }
    301 }
    302 
    303 BOOL AdjustCnrColVis(HWND hwndCnr, CHAR * title, BOOL visible, BOOL toggle)
    304 {
    305     PFIELDINFO pfi;
    306 
    307     pfi = (PFIELDINFO) WinSendMsg(hwndCnr,
    308                                   CM_QUERYDETAILFIELDINFO,
    309                                   MPVOID,
    310                                   MPFROMSHORT(CMA_FIRST));
    311     while (pfi)
    312     {
    313         if (!strcmp(pfi -> pTitleData, title))
    314         {
    315             if (toggle)
    316             {
    317                 if (pfi -> flData & CFA_INVISIBLE)
    318                     pfi -> flData &= (~CFA_INVISIBLE);
    319                 else
    320                     pfi -> flData |= CFA_INVISIBLE;
    321                 return !(pfi -> flData & CFA_INVISIBLE);
     620          PostMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
     621      }
     622      else
     623        PostMsg(hwnd, CM_CLOSEEDIT, MPVOID, MPVOID);
     624    }
     625    break;
     626
     627  case CN_REALLOCPSZ:
     628    if (mp2) {
     629      PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo;
     630      PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord;
     631      CHAR szData[CCHMAXPATH], testname[CCHMAXPATH], *p;
     632      HWND hwndMLE = WinWindowFromID(hwnd, CID_MLE);
     633
     634      if (pci && (INT) pci != -1 && !IsRoot(pci->szFileName)) {
     635        if (pfi && pfi->offStruct == FIELDOFFSET(CNRITEM, pszSubject)) {
     636
     637          APIRET rc;
     638          EAOP2 eaop;
     639          PFEA2LIST pfealist = NULL;
     640          CHAR szSubject[256];
     641          ULONG ealen;
     642          USHORT len;
     643          CHAR *eaval;
     644
     645          WinQueryWindowText(hwndMLE, 40, szSubject);
     646          szSubject[39] = 0;
     647          chop_at_crnl(szSubject);
     648          bstrip(szSubject);
     649          WinSetWindowText(hwndMLE, szSubject);
     650          len = strlen(szSubject);
     651          if (len)
     652            ealen = sizeof(FEA2LIST) + 9 + len + 4;
     653          else
     654            ealen = sizeof(FEALIST) + 9;
     655          rc = DosAllocMem((PPVOID) & pfealist, ealen + 64L,
     656                           OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
     657          if (rc)
     658            Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile,
     659                      __LINE__, GetPString(IDS_OUTOFMEMORY));
     660          else {
     661            memset(pfealist, 0, ealen + 1);
     662            pfealist->cbList = ealen;
     663            pfealist->list[0].oNextEntryOffset = 0L;
     664            pfealist->list[0].fEA = 0;
     665            pfealist->list[0].cbName = 8;
     666            strcpy(pfealist->list[0].szName, SUBJECT);
     667            if (len) {
     668              eaval = pfealist->list[0].szName + 9;
     669              *(USHORT *) eaval = (USHORT) EAT_ASCII;
     670              eaval += sizeof(USHORT);
     671              *(USHORT *) eaval = (USHORT) len;
     672              eaval += sizeof(USHORT);
     673              memcpy(eaval, szSubject, len);
     674              pfealist->list[0].cbValue = len + (sizeof(USHORT) * 2);
    322675            }
    323676            else
    324             {
    325                 if (visible)
    326                     pfi -> flData &= (~CFA_INVISIBLE);
    327                 else
    328                     pfi -> flData |= CFA_INVISIBLE;
     677              pfealist->list[0].cbValue = 0;
     678            eaop.fpGEA2List = (PGEA2LIST) 0;
     679            eaop.fpFEA2List = pfealist;
     680            eaop.oError = 0L;
     681            rc = DosSetPathInfo(pci->szFileName,
     682                                FIL_QUERYEASIZE,
     683                                (PVOID) & eaop, sizeof(EAOP2), DSPI_WRTTHRU);
     684            DosFreeMem(pfealist);
     685            if (rc)
     686              return FALSE;
     687          }
     688          return (MRESULT) TRUE;
     689        }
     690        else if (pfi && pfi->offStruct == FIELDOFFSET(CNRITEM, pszLongname)) {
     691
     692          CHAR longname[CCHMAXPATHCOMP];
     693
     694          *longname = 0;
     695          WinQueryWindowText(hwndMLE, sizeof(longname), longname);
     696          longname[CCHMAXPATHCOMP - 1] = 0;
     697          chop_at_crnl(longname);
     698          WinSetWindowText(hwndMLE, longname);
     699          return (MRESULT) WriteLongName(pci->szFileName, longname);
     700        }
     701        else {
     702          WinQueryWindowText(hwndMLE, sizeof(szData), szData);
     703          if (strchr(szData, '?') ||
     704              strchr(szData, '*') || IsRoot(pci->szFileName))
     705            return (MRESULT) FALSE;
     706          /* If the text changed, rename the file system object. */
     707          chop_at_crnl(szData);
     708          bstrip(szData);
     709          if (!IsFullName(szData))
     710            Runtime_Error(pszSrcFile, __LINE__, "bad name");
     711          else {
     712            if (DosQueryPathInfo(szData,
     713                                 FIL_QUERYFULLNAME,
     714                                 testname, sizeof(testname)))
     715              return FALSE;
     716            if (DosQueryPathInfo(pci->szFileName,
     717                                 FIL_QUERYFULLNAME, szData, sizeof(szData)))
     718              strcpy(szData, pci->szFileName);
     719            WinSetWindowText(hwndMLE, szData);
     720            if (strcmp(szData, testname)) {
     721              if (stricmp(szData, testname) && IsFile(testname) != -1) {
     722                DosBeep(50, 100);       /* exists; disallow */
     723                return (MRESULT) FALSE;
     724              }
     725              if (docopyf(MOVE, szData, "%s", testname))
     726                Runtime_Error(pszSrcFile, __LINE__, "docopyf");
     727              else {
     728                CHAR *filename;
     729
     730                filename = xstrdup(testname, pszSrcFile, __LINE__);
     731                if (filename) {
     732                  if (!PostMsg(hwnd,
     733                               UM_FIXEDITNAME, MPVOID, MPFROMP(filename)))
     734                    free(filename);
     735                }
     736                if (stricmp(testname, pci->szFileName)) {
     737                  PostMsg(hwnd, UM_FIXEDITNAME, MPFROMLONG(-1), MPFROMP(pci));
     738                  filename = xstrdup(pci->szFileName, pszSrcFile, __LINE__);
     739                  if (filename) {
     740                    if (!PostMsg(hwnd,
     741                                 UM_FIXEDITNAME, MPVOID, MPFROMP(filename)))
     742                      free(filename);
     743                  }
     744                }
     745              }
    329746            }
    330             return TRUE;
     747          }
    331748        }
    332         pfi = pfi -> pNextFieldInfo;
     749      }
    333750    }
    334751    return FALSE;
    335 }
    336 
    337 BOOL AdjustCnrColRO(HWND hwndCnr, CHAR * title, BOOL readonly, BOOL toggle)
    338 {
    339     PFIELDINFO pfi;
    340 
    341     pfi = (PFIELDINFO) WinSendMsg(hwndCnr,
    342                                   CM_QUERYDETAILFIELDINFO,
    343                                   MPVOID,
    344                                   MPFROMSHORT(CMA_FIRST));
    345     while (pfi)
    346     {
    347         if (!strcmp(pfi -> pTitleData, title))
    348         {
    349             if (toggle)
    350             {
    351                 if (pfi -> flData & CFA_FIREADONLY)
    352                     pfi -> flData &= (~CFA_FIREADONLY);
    353                 else
    354                     pfi -> flData |= CFA_FIREADONLY;
    355                 return (pfi -> flData & CFA_FIREADONLY);
    356             }
    357             else
    358             {
    359                 if (!readonly)
    360                     pfi -> flData &= (~CFA_FIREADONLY);
    361                 else
    362                     pfi -> flData |= CFA_FIREADONLY;
    363             }
    364             return TRUE;
    365         }
    366         pfi = pfi -> pNextFieldInfo;
    367     }
    368     return FALSE;
    369 }
    370 
    371 VOID AdjustCnrColsForFSType(HWND hwndCnr, CHAR * directory,
    372                             DIRCNRDATA * dcd)
    373 {
    374     CHAR FileSystem[CCHMAXPATH];
    375     INT x;
    376     BOOL hasCreateDT;
    377     BOOL hasAccessDT;
    378     BOOL hasLongNames;
    379     BOOL *pBool;
    380 
    381     if (!directory || !*directory)
    382         return;
    383     x = CheckDrive(toupper(*directory), FileSystem, NULL);
    384     if (x != -1)
    385     {
    386         if (!stricmp(FileSystem, HPFS) ||
    387                 !stricmp(FileSystem, JFS) ||
    388                 !stricmp(FileSystem, FAT32) ||
    389                 !stricmp(FileSystem, HPFS386))
    390         {
    391             hasCreateDT = TRUE;
    392             hasAccessDT = TRUE;
    393             hasLongNames = TRUE;
    394         }
    395         else if (!strcmp(FileSystem, CDFS))
    396         {
    397             hasCreateDT = TRUE;
    398             hasAccessDT = FALSE;
    399             hasLongNames = FALSE;
    400         }
    401         else
    402         {
    403             // Assume FAT
    404             hasCreateDT = FALSE;
    405             hasAccessDT = FALSE;
    406             hasLongNames = FALSE;
    407         }
    408     }
    409     else
    410     {
    411         // Assume FAT
    412         hasCreateDT = FALSE;
    413         hasAccessDT = FALSE;
    414         hasLongNames = FALSE;
    415     }
    416     pBool = (dcd) ? &dcd -> detailsladate : &detailsladate;
    417     AdjustCnrColVis(hwndCnr, GetPString(IDS_LADATE),
    418                     (*pBool) ? hasAccessDT : FALSE, FALSE);
    419     pBool = (dcd) ? &dcd -> detailslatime : &detailslatime;
    420     AdjustCnrColVis(hwndCnr, GetPString(IDS_LATIME),
    421                     (*pBool) ? hasAccessDT : FALSE, FALSE);
    422     pBool = (dcd) ? &dcd -> detailscrdate : &detailscrdate;
    423     AdjustCnrColVis(hwndCnr, GetPString(IDS_CRDATE),
    424                     (*pBool) ? hasCreateDT : FALSE, FALSE);
    425     pBool = (dcd) ? &dcd -> detailscrtime : &detailscrtime;
    426     AdjustCnrColVis(hwndCnr, GetPString(IDS_CRTIME),
    427                     (*pBool) ? hasCreateDT : FALSE, FALSE);
    428     pBool = (dcd) ? &dcd -> detailslongname : &detailslongname;
    429     AdjustCnrColVis(hwndCnr, GetPString(IDS_LNAME),
    430                     (*pBool) ? hasLongNames : FALSE, FALSE);
    431     WinSendMsg(hwndCnr,
    432                CM_INVALIDATEDETAILFIELDINFO,
    433                MPVOID,
    434                MPVOID);
    435 }
    436 
    437 VOID AdjustCnrColsForPref(HWND hwndCnr, CHAR * directory, DIRCNRDATA * dcd,
    438                           BOOL compare)
    439 {
    440     BOOL *bool;
    441 
    442     bool = (dcd) ? &dcd -> detailssubject : &detailssubject;
    443     AdjustCnrColVis(hwndCnr, ((compare) ? GetPString(IDS_STATUS) :
    444                               GetPString(IDS_SUBJ)),
    445                     *bool, FALSE);
    446     bool = (dcd) ? &dcd -> detailsattr : &detailsattr;
    447     AdjustCnrColVis(hwndCnr, GetPString(IDS_ATTR),
    448                     *bool, FALSE);
    449     bool = (dcd) ? &dcd -> detailsicon : &detailsicon;
    450     AdjustCnrColVis(hwndCnr, GetPString(IDS_ICON),
    451                     *bool, FALSE);
    452     bool = (dcd) ? &dcd -> detailslwdate : &detailslwdate;
    453     AdjustCnrColVis(hwndCnr, GetPString(IDS_LWDATE),
    454                     *bool, FALSE);
    455     bool = (dcd) ? &dcd -> detailslwtime : &detailslwtime;
    456     AdjustCnrColVis(hwndCnr, GetPString(IDS_LWTIME),
    457                     *bool, FALSE);
    458     bool = (dcd) ? &dcd -> detailsea : &detailsea;
    459     AdjustCnrColVis(hwndCnr, GetPString(IDS_EA),
    460                     *bool, FALSE);
    461     bool = (dcd) ? &dcd -> detailssize : &detailssize;
    462     AdjustCnrColVis(hwndCnr, GetPString(IDS_SIZE),
    463                     *bool, FALSE);
    464     if (!directory)
    465     {
    466         bool = (dcd) ? &dcd -> detailsladate : &detailsladate;
    467         AdjustCnrColVis(hwndCnr, GetPString(IDS_LADATE),
    468                         *bool, FALSE);
    469         bool = (dcd) ? &dcd -> detailslatime : &detailslatime;
    470         AdjustCnrColVis(hwndCnr, GetPString(IDS_LATIME),
    471                         *bool, FALSE);
    472         bool = (dcd) ? &dcd -> detailscrdate : &detailscrdate;
    473         AdjustCnrColVis(hwndCnr, GetPString(IDS_CRDATE),
    474                         *bool, FALSE);
    475         bool = (dcd) ? &dcd -> detailscrtime : &detailscrtime;
    476         AdjustCnrColVis(hwndCnr, GetPString(IDS_CRTIME),
    477                         *bool, FALSE);
    478         bool = (dcd) ? &dcd -> detailslongname : &detailslongname;
    479         AdjustCnrColVis(hwndCnr, GetPString(IDS_LNAME),
    480                         *bool, FALSE);
    481         WinSendMsg(hwndCnr,
    482                    CM_INVALIDATEDETAILFIELDINFO,
    483                    MPVOID,
    484                    MPVOID);
    485     }
    486     else
    487         AdjustCnrColsForFSType(hwndCnr,
    488                                directory,
    489                                dcd);
    490 }
    491 
    492 BOOL SetCnrCols(HWND hwndCnr, BOOL compare)
    493 {
    494     BOOL fSuccess = TRUE;
    495     PFIELDINFO pfi, pfiLastLeftCol, pfiIconCol;
    496 
    497     // Allocate storage for container column data
    498 
    499     pfi = WinSendMsg(hwndCnr, CM_ALLOCDETAILFIELDINFO,
    500                      MPFROMLONG(CONTAINER_COLUMNS), NULL);
    501 
    502     if (pfi)
    503     {
    504 
    505         PFIELDINFO pfiFirst;
    506         FIELDINFOINSERT fii;
    507 
    508         // Store original value of pfi so we won't lose it when it changes.
    509         // This will be needed on the CM_INSERTDETAILFIELDINFO message.
    510 
    511         pfiFirst = pfi;
    512 
    513         // Fill in column information for the icon column
    514 
    515         pfi -> flData = CFA_BITMAPORICON | CFA_CENTER | CFA_FIREADONLY;
    516         pfi -> flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
    517         pfi -> pTitleData = GetPString(IDS_ICON);
    518         pfi -> offStruct = FIELDOFFSET(MINIRECORDCORE, hptrIcon);
    519 
    520         pfiIconCol = pfi;
    521 
    522         // Fill in column information for the file name. Note that we are
    523         // using the pszFileName variable rather than szFileName. We do this
    524         // because the container needs a pointer to the file name. If we used
    525         // szFileName (a character array, not a pointer), the container would
    526         // take the first 4 bytes of szFileName and think it was a pointer,
    527         // which of course it is not. Later in the FillInRecord* functions we set
    528         // pszFileName to point to szFileName.
    529 
    530         pfi = pfi -> pNextFieldInfo;
    531         pfi -> flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
    532         pfi -> flTitle = CFA_CENTER;
    533         pfi -> pTitleData = GetPString(IDS_FILENAME);
    534         pfi -> offStruct = FIELDOFFSET(CNRITEM, pszFileName);
    535 
    536         // Fill in column information for the longname.
    537 
    538         pfi = pfi -> pNextFieldInfo;
    539         pfi -> flData = CFA_STRING | CFA_LEFT;
    540         pfi -> flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
    541         pfi -> pTitleData = GetPString(IDS_LNAME);
    542         pfi -> offStruct = FIELDOFFSET(CNRITEM, pszLongname);
    543 
    544         // Store the current pfi value as that will be used to indicate the
    545         // last column in the lefthand container window (we have a splitbar)
    546 
    547         pfiLastLeftCol = pfi;
    548 
    549         // Fill in column info for subjects
    550 
    551         pfi = pfi -> pNextFieldInfo;
    552         pfi -> flData = CFA_STRING | CFA_LEFT | CFA_SEPARATOR;
    553         if (compare)
    554             pfi -> flData |= CFA_FIREADONLY;
    555         pfi -> flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
    556         pfi -> pTitleData = (compare) ? GetPString(IDS_STATUS) :
    557             GetPString(IDS_SUBJ);
    558         pfi -> offStruct = FIELDOFFSET(CNRITEM, pszSubject);
    559 
    560         // Fill in column information for the file size
    561 
    562         pfi = pfi -> pNextFieldInfo;
    563         pfi -> flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
    564         pfi -> flTitle = CFA_CENTER;
    565         pfi -> pTitleData = GetPString(IDS_SIZE);
    566         pfi -> offStruct = FIELDOFFSET(CNRITEM, cbFile);
    567 
    568         // Fill in the column information for the file's ea size
    569 
    570         pfi = pfi -> pNextFieldInfo;
    571         pfi -> flData = CFA_ULONG | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
    572         pfi -> flTitle = CFA_CENTER;
    573         pfi -> pTitleData = GetPString(IDS_EA);
    574         pfi -> offStruct = FIELDOFFSET(CNRITEM, easize);
    575 
    576         // Fill in the column information for the file attribute
    577 
    578         pfi = pfi -> pNextFieldInfo;
    579         pfi -> flData = CFA_STRING | CFA_CENTER | CFA_SEPARATOR | CFA_FIREADONLY;
    580         pfi -> flTitle = CFA_CENTER | CFA_FITITLEREADONLY;
    581         pfi -> pTitleData = GetPString(IDS_ATTR);
    582         pfi -> offStruct = FIELDOFFSET(CNRITEM, pszDispAttr);
    583 
    584         // Fill in column information for last write file date
    585 
    586         pfi = pfi -> pNextFieldInfo;
    587         pfi -> flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
    588         pfi -> flTitle = CFA_CENTER;
    589         pfi -> pTitleData = GetPString(IDS_LWDATE);
    590         pfi -> offStruct = FIELDOFFSET(CNRITEM, date);
    591 
    592         // Fill in column information for the last write file time
    593 
    594         pfi = pfi -> pNextFieldInfo;
    595         pfi -> flData = CFA_TIME | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
    596         pfi -> flTitle = CFA_CENTER;
    597         pfi -> pTitleData = GetPString(IDS_LWTIME);
    598         pfi -> offStruct = FIELDOFFSET(CNRITEM, time);
    599 
    600         // Fill in column information for last access file date
    601 
    602         pfi = pfi -> pNextFieldInfo;
    603         pfi -> flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
    604         pfi -> flTitle = CFA_CENTER;
    605         pfi -> pTitleData = GetPString(IDS_LADATE);
    606         pfi -> offStruct = FIELDOFFSET(CNRITEM, ladate);
    607 
    608         // Fill in column information for the last access file time
    609 
    610         pfi = pfi -> pNextFieldInfo;
    611         pfi -> flData = CFA_TIME | CFA_RIGHT | CFA_SEPARATOR | CFA_FIREADONLY;
    612         pfi -> flTitle = CFA_CENTER;
    613         pfi -> pTitleData = GetPString(IDS_LATIME);
    614         pfi -> offStruct = FIELDOFFSET(CNRITEM, latime);
    615 
    616         // Fill in column information for create file date
    617 
    618         pfi = pfi -> pNextFieldInfo;
    619         pfi -> flData = CFA_DATE | CFA_RIGHT | CFA_FIREADONLY;
    620         pfi -> flTitle = CFA_CENTER;
    621         pfi -> pTitleData = GetPString(IDS_CRDATE);
    622         pfi -> offStruct = FIELDOFFSET(CNRITEM, crdate);
    623 
    624         // Fill in column information for the create file time
    625 
    626         pfi = pfi -> pNextFieldInfo;
    627         pfi -> flData = CFA_TIME | CFA_RIGHT | CFA_FIREADONLY;
    628         pfi -> flTitle = CFA_CENTER;
    629         pfi -> pTitleData = GetPString(IDS_CRTIME);
    630         pfi -> offStruct = FIELDOFFSET(CNRITEM, crtime);
    631 
    632         // Use the CM_INSERTDETAILFIELDINFO message to tell the container
    633         // all the column information it needs to function properly. Place
    634         // this column info first in the column list and update the display
    635         // after they are inserted (fInvalidateFieldInfo = TRUE)
    636 
    637         (void) memset(&fii, 0, sizeof(FIELDINFOINSERT));
    638 
    639         fii.cb = sizeof(FIELDINFOINSERT);
    640         fii.pFieldInfoOrder = (PFIELDINFO) CMA_FIRST;
    641         fii.cFieldInfoInsert = (SHORT) CONTAINER_COLUMNS;
    642         fii.fInvalidateFieldInfo = TRUE;
    643 
    644         if (!WinSendMsg(hwndCnr, CM_INSERTDETAILFIELDINFO, MPFROMP(pfiFirst),
    645                         MPFROMP(&fii)))
    646             fSuccess = FALSE;
    647     }
    648     else
    649         fSuccess = FALSE;
    650 
    651     if (fSuccess)
    652     {
    653 
    654         CNRINFO cnri;
    655         ULONG size;
    656 
    657         // Tell the container about the splitbar and where it goes
    658 
    659         cnri.cb = sizeof(CNRINFO);
    660         cnri.pFieldInfoLast = pfiLastLeftCol;
    661         cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 32;
    662         cnri.pFieldInfoObject = pfiIconCol;
    663         size = sizeof(LONG);
    664         PrfQueryProfileData(fmprof,
    665                             appname,
    666                             "CnrSplitBar",
    667                             &cnri.xVertSplitbar,
    668                             &size);
    669         if (cnri.xVertSplitbar <= 0)
    670             cnri.xVertSplitbar = DIR_SPLITBAR_OFFSET - 32;
    671         if (!WinSendMsg(hwndCnr, CM_SETCNRINFO, MPFROMP(&cnri),
    672                       MPFROMLONG(CMA_PFIELDINFOLAST | CMA_PFIELDINFOOBJECT |
    673                                  CMA_XVERTSPLITBAR)))
    674             fSuccess = FALSE;
    675     }
    676 
    677     return fSuccess;
    678 }
    679 
    680 MRESULT CnrDirectEdit(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
    681 {
    682     switch (SHORT2FROMMP(mp1))
    683     {
    684     case CN_BEGINEDIT:
    685         if (mp2)
    686         {
    687 
    688             PFIELDINFO pfi = ((PCNREDITDATA) mp2) -> pFieldInfo;
    689             PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2) -> pRecord;
    690 
    691             if (pci &&
    692                     (INT) pci != -1 &&
    693                     !IsRoot(pci -> szFileName) &&
    694                     !(pci -> flags & RECFLAGS_ENV) &&
    695                     !(pci -> flags & RECFLAGS_UNDERENV))
    696             {
    697                 if (!pfi ||
    698                       pfi -> offStruct == FIELDOFFSET(CNRITEM, pszFileName))
    699                 {
    700                     PostMsg(hwnd,
    701                             UM_FIXEDITNAME,
    702                             MPFROMP(pci -> szFileName),
    703                             MPVOID);
    704                 }
    705                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, pszSubject))
    706                     PostMsg(hwnd,
    707                             UM_FIXCNRMLE,
    708                             MPFROMLONG(40),
    709                             MPVOID);
    710                 else
    711                     PostMsg(hwnd,
    712                             UM_FIXCNRMLE,
    713                             MPFROMLONG(CCHMAXPATH),
    714                             MPVOID);
    715             }
    716             else
    717                 PostMsg(hwnd,
    718                         CM_CLOSEEDIT,
    719                         MPVOID,
    720                         MPVOID);
    721         }
    722         break;
    723 
    724     case CN_REALLOCPSZ:
    725         if (mp2)
    726         {
    727 
    728             PFIELDINFO pfi = ((PCNREDITDATA) mp2) -> pFieldInfo;
    729             PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2) -> pRecord;
    730             CHAR szData[CCHMAXPATH], testname[CCHMAXPATH], *p;
    731             HWND hwndMLE = WinWindowFromID(hwnd, CID_MLE);
    732 
    733             if (pci &&
    734                     (INT) pci != -1 &&
    735                     !IsRoot(pci -> szFileName))
    736             {
    737                 if (pfi &&
    738                         pfi -> offStruct == FIELDOFFSET(CNRITEM, pszSubject))
    739                 {
    740 
    741                     APIRET rc;
    742                     EAOP2 eaop;
    743                     PFEA2LIST pfealist = NULL;
    744                     CHAR szSubject[256];
    745                     ULONG ealen;
    746                     USHORT len;
    747                     CHAR *eaval;
    748 
    749                     WinQueryWindowText(hwndMLE, 40, szSubject);
    750                     szSubject[39] = 0;
    751                     chop_at_crnl(szSubject);
    752                     bstrip(szSubject);
    753                     WinSetWindowText(hwndMLE, szSubject);
    754                     len = strlen(szSubject);
    755                     if (len)
    756                         ealen = sizeof(FEA2LIST) + 9 + len + 4;
    757                     else
    758                         ealen = sizeof(FEALIST) + 9;
    759                     rc = DosAllocMem((PPVOID) & pfealist,ealen + 64L,
    760                                      OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
    761                     if (rc)
    762                       Dos_Error(MB_CANCEL,rc,HWND_DESKTOP,pszSrcFile,__LINE__,GetPString(IDS_OUTOFMEMORY));
    763                     else {
    764                         memset(pfealist, 0, ealen + 1);
    765                         pfealist -> cbList = ealen;
    766                         pfealist -> list[0].oNextEntryOffset = 0L;
    767                         pfealist -> list[0].fEA = 0;
    768                         pfealist -> list[0].cbName = 8;
    769                         strcpy(pfealist -> list[0].szName, SUBJECT);
    770                         if (len)
    771                         {
    772                             eaval = pfealist -> list[0].szName + 9;
    773                             *(USHORT *) eaval = (USHORT) EAT_ASCII;
    774                             eaval += sizeof(USHORT);
    775                             *(USHORT *) eaval = (USHORT) len;
    776                             eaval += sizeof(USHORT);
    777                             memcpy(eaval, szSubject, len);
    778                             pfealist -> list[0].cbValue = len + (sizeof(USHORT) * 2);
    779                         }
    780                         else
    781                             pfealist -> list[0].cbValue = 0;
    782                         eaop.fpGEA2List = (PGEA2LIST) 0;
    783                         eaop.fpFEA2List = pfealist;
    784                         eaop.oError = 0L;
    785                         rc = DosSetPathInfo(pci -> szFileName,
    786                                             FIL_QUERYEASIZE,
    787                                             (PVOID) & eaop,
    788                                             sizeof(EAOP2),
    789                                             DSPI_WRTTHRU);
    790                         DosFreeMem(pfealist);
    791                         if (rc)
    792                             return FALSE;
    793                     }
    794                     return (MRESULT) TRUE;
    795                 }
    796                 else if (pfi &&
    797                       pfi -> offStruct == FIELDOFFSET(CNRITEM, pszLongname))
    798                 {
    799 
    800                     CHAR longname[CCHMAXPATHCOMP];
    801 
    802                     *longname = 0;
    803                     WinQueryWindowText(hwndMLE,
    804                                        sizeof(longname),
    805                                        longname);
    806                     longname[CCHMAXPATHCOMP - 1] = 0;
    807                     chop_at_crnl(longname);
    808                     WinSetWindowText(hwndMLE,
    809                                      longname);
    810                     return (MRESULT) WriteLongName(pci -> szFileName,
    811                                                    longname);
    812                 }
    813                 else
    814                 {
    815                     WinQueryWindowText(hwndMLE,
    816                                        sizeof(szData),
    817                                        szData);
    818                     if (strchr(szData, '?') ||
    819                             strchr(szData, '*') ||
    820                             IsRoot(pci -> szFileName))
    821                         return (MRESULT) FALSE;
    822                     /* If the text changed, rename the file system object. */
    823                     chop_at_crnl(szData);
    824                     bstrip(szData);
    825                     if (!IsFullName(szData))
    826                         Runtime_Error(pszSrcFile, __LINE__, "bad name");
    827                     else
    828                     {
    829                         if (DosQueryPathInfo(szData,
    830                                              FIL_QUERYFULLNAME,
    831                                              testname,
    832                                              sizeof(testname)))
    833                             return FALSE;
    834                         if (DosQueryPathInfo(pci -> szFileName,
    835                                              FIL_QUERYFULLNAME,
    836                                              szData,
    837                                              sizeof(szData)))
    838                             strcpy(szData, pci -> szFileName);
    839                         WinSetWindowText(hwndMLE,
    840                                          szData);
    841                         if (strcmp(szData, testname))
    842                         {
    843                             if (stricmp(szData, testname) &&
    844                                     IsFile(testname) != -1)
    845                             {
    846                                 DosBeep(50, 100);       /* exists; disallow */
    847                                 return (MRESULT) FALSE;
    848                             }
    849                             if (docopyf(MOVE,szData,"%s",testname))
    850                                 Runtime_Error(pszSrcFile, __LINE__, "docopyf");
    851                             else {
    852                                 CHAR *filename;
    853 
    854                                 filename = xstrdup(testname,pszSrcFile,__LINE__);
    855                                 if (filename)
    856                                 {
    857                                     if (!PostMsg(hwnd,
    858                                                  UM_FIXEDITNAME,
    859                                                  MPVOID,
    860                                                  MPFROMP(filename)))
    861                                         free(filename);
    862                                 }
    863                                 if (stricmp(testname, pci -> szFileName))
    864                                 {
    865                                     PostMsg(hwnd,
    866                                             UM_FIXEDITNAME,
    867                                             MPFROMLONG(-1),
    868                                             MPFROMP(pci));
    869                                     filename = xstrdup(pci -> szFileName,pszSrcFile,__LINE__);
    870                                     if (filename)
    871                                     {
    872                                         if (!PostMsg(hwnd,
    873                                                      UM_FIXEDITNAME,
    874                                                      MPVOID,
    875                                                      MPFROMP(filename)))
    876                                             free(filename);
    877                                     }
    878                                 }
    879                             }
    880                         }
    881                     }
    882                 }
    883             }
    884         }
    885         return FALSE;
    886 
    887     case CN_ENDEDIT:
    888         if (mp2)
    889         {
    890 
    891             PFIELDINFO pfi = ((PCNREDITDATA) mp2) -> pFieldInfo;
    892             PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2) -> pRecord;
    893 
    894             if (pci &&
    895                     (INT) pci != -1 &&
    896                     !IsRoot(pci -> szFileName))
    897             {
    898                 WinSendMsg(hwnd,
    899                            CM_INVALIDATERECORD,
    900                            MPFROMP(&pci),
    901                            MPFROM2SHORT(1, CMA_ERASE | CMA_TEXTCHANGED));
    902                 if (pfi &&
    903                       pfi -> offStruct == FIELDOFFSET(CNRITEM, pszFileName))
    904                     PostMsg(hwnd,
    905                             UM_SORTRECORD,
    906                             MPVOID,
    907                             MPVOID);
    908             }
    909             else
    910             {
    911 
    912                 USHORT cmd = 0;
    913 
    914                 if (!pfi ||
    915                       pfi -> offStruct == FIELDOFFSET(CNRITEM, pszFileName))
    916                     cmd = IDM_SORTSMARTNAME;
    917                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, cbFile))
    918                     cmd = IDM_SORTSIZE;
    919                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, easize))
    920                     cmd = IDM_SORTEASIZE;
    921                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, date))
    922                     cmd = IDM_SORTLWDATE;
    923                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, time))
    924                     cmd = IDM_SORTLWDATE;
    925                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, ladate))
    926                     cmd = IDM_SORTLADATE;
    927                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, latime))
    928                     cmd = IDM_SORTLADATE;
    929                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, crdate))
    930                     cmd = IDM_SORTCRDATE;
    931                 else if (pfi -> offStruct == FIELDOFFSET(CNRITEM, crtime))
    932                     cmd = IDM_SORTCRDATE;
    933                 if (cmd)
    934                     PostMsg(hwnd,
    935                             WM_COMMAND,
    936                             MPFROM2SHORT(cmd, 0),
    937                             MPVOID);
    938             }
    939         }
    940         break;
    941     }
    942     return (MRESULT) - 1;
     752
     753  case CN_ENDEDIT:
     754    if (mp2) {
     755      PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo;
     756      PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord;
     757
     758      if (pci && (INT) pci != -1 && !IsRoot(pci->szFileName)) {
     759        WinSendMsg(hwnd,
     760                   CM_INVALIDATERECORD,
     761                   MPFROMP(&pci),
     762                   MPFROM2SHORT(1, CMA_ERASE | CMA_TEXTCHANGED));
     763        if (pfi && pfi->offStruct == FIELDOFFSET(CNRITEM, pszFileName))
     764          PostMsg(hwnd, UM_SORTRECORD, MPVOID, MPVOID);
     765      }
     766      else {
     767        USHORT cmd = 0;
     768
     769        if (!pfi || pfi->offStruct == FIELDOFFSET(CNRITEM, pszFileName))
     770          cmd = IDM_SORTSMARTNAME;
     771        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, cbFile))
     772          cmd = IDM_SORTSIZE;
     773        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, easize))
     774          cmd = IDM_SORTEASIZE;
     775        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, date))
     776          cmd = IDM_SORTLWDATE;
     777        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, time))
     778          cmd = IDM_SORTLWDATE;
     779        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, ladate))
     780          cmd = IDM_SORTLADATE;
     781        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, latime))
     782          cmd = IDM_SORTLADATE;
     783        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, crdate))
     784          cmd = IDM_SORTCRDATE;
     785        else if (pfi->offStruct == FIELDOFFSET(CNRITEM, crtime))
     786          cmd = IDM_SORTCRDATE;
     787        if (cmd)
     788          PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID);
     789      }
     790    }
     791    break;
     792  }
     793  return (MRESULT) - 1;
    943794}
    944795
     
    946797                  CHAR * savename)
    947798{
    948     if (toggle)
    949     {
    950         *bool = (*bool) ? FALSE : TRUE;
    951         if (savename && *savename)
    952             PrfWriteProfileData(fmprof,
    953                                 appname,
    954                                 savename,
    955                                 bool,
    956                                 sizeof(BOOL));
    957     }
    958     WinSendMsg(hwndMenu, MM_SETITEMATTR,
    959                MPFROM2SHORT(id, 1),
    960                MPFROM2SHORT(MIA_CHECKED,
    961                             MIA_CHECKED * (*bool != 0)));
    962     return *bool;
     799  if (toggle) {
     800    *bool = (*bool) ? FALSE : TRUE;
     801    if (savename && *savename)
     802      PrfWriteProfileData(fmprof, appname, savename, bool, sizeof(BOOL));
     803  }
     804  WinSendMsg(hwndMenu, MM_SETITEMATTR,
     805             MPFROM2SHORT(id, 1),
     806             MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED * (*bool != 0)));
     807  return *bool;
    963808}
    964809
    965810VOID disable_menuitem(HWND hwndMenu, USHORT id, BOOL enable)
    966811{
    967     WinSendMsg(hwndMenu, MM_SETITEMATTR,
    968                MPFROM2SHORT(id, TRUE),
    969             MPFROM2SHORT(MIA_DISABLED, ((enable == FALSE) * MIA_DISABLED)));
     812  WinSendMsg(hwndMenu, MM_SETITEMATTR,
     813             MPFROM2SHORT(id, TRUE),
     814             MPFROM2SHORT(MIA_DISABLED, ((enable == FALSE) * MIA_DISABLED)));
    970815}
    971816
    972817BOOL ViewHelp(CHAR * filename)
    973818{
    974     CHAR s[CCHMAXPATH + 81];
    975     FILE *fp;
    976     INT ret = -1;
    977 
    978     fp = _fsopen(filename, "rb", SH_DENYNO);
    979     if (fp)
    980     {
    981         *s = 0;
    982         fread(s, 1, 3, fp);
    983         if (*s != 'H' || s[1] != 'S' || s[2] != 'P')
    984         {
    985             fclose(fp);
    986             return FALSE;
    987         }
    988         fclose(fp);
    989         ret = runemf2(SEPARATE | WINDOWED, HWND_DESKTOP, NULL, NULL,
    990                       "VIEW.EXE \"%s\"",
    991                       filename);
    992     }
    993 
    994     return (ret != -1);
     819  CHAR s[CCHMAXPATH + 81];
     820  FILE *fp;
     821  INT ret = -1;
     822
     823  fp = _fsopen(filename, "rb", SH_DENYNO);
     824  if (fp) {
     825    *s = 0;
     826    fread(s, 1, 3, fp);
     827    if (*s != 'H' || s[1] != 'S' || s[2] != 'P') {
     828      fclose(fp);
     829      return FALSE;
     830    }
     831    fclose(fp);
     832    ret = runemf2(SEPARATE | WINDOWED, HWND_DESKTOP, NULL, NULL,
     833                  "VIEW.EXE \"%s\"", filename);
     834  }
     835
     836  return (ret != -1);
    995837}
    996838
    997839INT ExecFile(HWND hwnd, CHAR * filename)
    998840{
    999     EXECARGS ex;
    1000     CHAR cl[1001], path[CCHMAXPATH], *p;
    1001     APIRET ret;
    1002     static INT lastflags = 0;
    1003 
    1004     strcpy(path, filename);
    1005     p = strrchr(path, '\\');
    1006     if (!p)
    1007         p = strrchr(path, ':');
    1008     if (p)
    1009     {
    1010         if (*p == ':')
    1011         {
    1012             p++;
    1013             *p = '\\';
    1014             p++;
    1015         }
    1016         *p = 0;
    1017     }
    1018     else
    1019         *path = 0;
    1020     *cl = 0;
    1021     if (needs_quoting(filename))
    1022         strcat(cl, "\"");
    1023     strcat(cl, filename);
    1024     if (needs_quoting(filename))
    1025         strcat(cl, "\"");
    1026     memset(&ex, 0, sizeof(ex));
    1027     ex.flags = lastflags;
    1028     ex.commandline = cl;
    1029     *ex.path = 0;
    1030     *ex.environment = 0;
    1031     ret = WinDlgBox(HWND_DESKTOP, hwnd, CmdLineDlgProc, FM3ModHandle,
    1032                     EXEC_FRAME, &ex);
    1033     if (ret == 1)
    1034     {
    1035         lastflags = ex.flags;
    1036         return (runemf2(ex.flags, hwnd, path,
    1037                         (*ex.environment) ? ex.environment : NULL,
    1038                         "%s", cl) != -1);
    1039     }
    1040     else if (ret != 0)
    1041         return -1;
    1042     return 0;
     841  EXECARGS ex;
     842  CHAR cl[1001], path[CCHMAXPATH], *p;
     843  APIRET ret;
     844  static INT lastflags = 0;
     845
     846  strcpy(path, filename);
     847  p = strrchr(path, '\\');
     848  if (!p)
     849    p = strrchr(path, ':');
     850  if (p) {
     851    if (*p == ':') {
     852      p++;
     853      *p = '\\';
     854      p++;
     855    }
     856    *p = 0;
     857  }
     858  else
     859    *path = 0;
     860  *cl = 0;
     861  if (needs_quoting(filename))
     862    strcat(cl, "\"");
     863  strcat(cl, filename);
     864  if (needs_quoting(filename))
     865    strcat(cl, "\"");
     866  memset(&ex, 0, sizeof(ex));
     867  ex.flags = lastflags;
     868  ex.commandline = cl;
     869  *ex.path = 0;
     870  *ex.environment = 0;
     871  ret = WinDlgBox(HWND_DESKTOP, hwnd, CmdLineDlgProc, FM3ModHandle,
     872                  EXEC_FRAME, &ex);
     873  if (ret == 1) {
     874    lastflags = ex.flags;
     875    return (runemf2(ex.flags, hwnd, path,
     876                    (*ex.environment) ? ex.environment : NULL,
     877                    "%s", cl) != -1);
     878  }
     879  else if (ret != 0)
     880    return -1;
     881  return 0;
    1043882}
    1044883
    1045884VOID EmptyCnr(HWND hwnd)
    1046885{
    1047     /* Empty out a container in preparation to it dying */
    1048 
    1049     PCNRITEM pci;
    1050     PFIELDINFO pfi;
    1051 
    1052     pci = (PCNRITEM) WinSendMsg(hwnd, CM_QUERYRECORD, MPVOID,
     886  /* Empty out a container in preparation to it dying */
     887  PCNRITEM pci;
     888  PFIELDINFO pfi;
     889
     890  pci = (PCNRITEM) WinSendMsg(hwnd, CM_QUERYRECORD, MPVOID,
     891                              MPFROMSHORT(CMA_FIRST));
     892  if (pci && (INT) pci != -1)
     893    WinSendMsg(hwnd, CM_REMOVERECORD, MPVOID, MPFROM2SHORT(0, CMA_FREE));
     894  pfi = (PFIELDINFO) WinSendMsg(hwnd, CM_QUERYDETAILFIELDINFO, MPVOID,
    1053895                                MPFROMSHORT(CMA_FIRST));
    1054     if (pci && (INT) pci != -1)
    1055         WinSendMsg(hwnd, CM_REMOVERECORD, MPVOID, MPFROM2SHORT(0, CMA_FREE));
    1056     pfi = (PFIELDINFO) WinSendMsg(hwnd, CM_QUERYDETAILFIELDINFO, MPVOID,
    1057                                   MPFROMSHORT(CMA_FIRST));
    1058     if (pfi)
    1059         WinSendMsg(hwnd, CM_REMOVEDETAILFIELDINFO, MPVOID,
    1060                    MPFROM2SHORT(0, CMA_FREE));
     896  if (pfi)
     897    WinSendMsg(hwnd, CM_REMOVEDETAILFIELDINFO, MPVOID,
     898               MPFROM2SHORT(0, CMA_FREE));
    1061899}
    1062900
    1063901VOID SetDetailsSwitches(HWND hwnd, DIRCNRDATA * dcd)
    1064902{
    1065     WinCheckMenuItem(hwnd, IDM_SHOWLNAMES, (dcd) ? dcd -> detailslongname : detailslongname);
    1066     WinCheckMenuItem(hwnd, IDM_SHOWSUBJECT, (dcd) ? dcd -> detailssubject : detailssubject);
    1067     WinCheckMenuItem(hwnd, IDM_SHOWEAS, (dcd) ? dcd -> detailsea : detailsea);
    1068     WinCheckMenuItem(hwnd, IDM_SHOWSIZE, (dcd) ? dcd -> detailssize : detailssize);
    1069     WinCheckMenuItem(hwnd, IDM_SHOWICON, (dcd) ? dcd -> detailsicon : detailsicon);
    1070     WinCheckMenuItem(hwnd, IDM_SHOWLWDATE, (dcd) ? dcd -> detailslwdate : detailslwdate);
    1071     WinCheckMenuItem(hwnd, IDM_SHOWLWTIME, (dcd) ? dcd -> detailslwtime : detailslwtime);
    1072     WinCheckMenuItem(hwnd, IDM_SHOWLADATE, (dcd) ? dcd -> detailsladate : detailsladate);
    1073     WinCheckMenuItem(hwnd, IDM_SHOWLATIME, (dcd) ? dcd -> detailslatime : detailslatime);
    1074     WinCheckMenuItem(hwnd, IDM_SHOWCRDATE, (dcd) ? dcd -> detailscrdate : detailscrdate);
    1075     WinCheckMenuItem(hwnd, IDM_SHOWCRTIME, (dcd) ? dcd -> detailscrtime : detailscrtime);
    1076     WinCheckMenuItem(hwnd, IDM_SHOWATTR, (dcd) ? dcd -> detailsattr : detailsattr);
     903  WinCheckMenuItem(hwnd, IDM_SHOWLNAMES,
     904                   (dcd) ? dcd->detailslongname : detailslongname);
     905  WinCheckMenuItem(hwnd, IDM_SHOWSUBJECT,
     906                   (dcd) ? dcd->detailssubject : detailssubject);
     907  WinCheckMenuItem(hwnd, IDM_SHOWEAS, (dcd) ? dcd->detailsea : detailsea);
     908  WinCheckMenuItem(hwnd, IDM_SHOWSIZE,
     909                   (dcd) ? dcd->detailssize : detailssize);
     910  WinCheckMenuItem(hwnd, IDM_SHOWICON,
     911                   (dcd) ? dcd->detailsicon : detailsicon);
     912  WinCheckMenuItem(hwnd, IDM_SHOWLWDATE,
     913                   (dcd) ? dcd->detailslwdate : detailslwdate);
     914  WinCheckMenuItem(hwnd, IDM_SHOWLWTIME,
     915                   (dcd) ? dcd->detailslwtime : detailslwtime);
     916  WinCheckMenuItem(hwnd, IDM_SHOWLADATE,
     917                   (dcd) ? dcd->detailsladate : detailsladate);
     918  WinCheckMenuItem(hwnd, IDM_SHOWLATIME,
     919                   (dcd) ? dcd->detailslatime : detailslatime);
     920  WinCheckMenuItem(hwnd, IDM_SHOWCRDATE,
     921                   (dcd) ? dcd->detailscrdate : detailscrdate);
     922  WinCheckMenuItem(hwnd, IDM_SHOWCRTIME,
     923                   (dcd) ? dcd->detailscrtime : detailscrtime);
     924  WinCheckMenuItem(hwnd, IDM_SHOWATTR,
     925                   (dcd) ? dcd->detailsattr : detailsattr);
    1077926}
    1078927
     
    1081930                           DIRCNRDATA * dcd, BOOL compare)
    1082931{
    1083     CHAR s[CCHMAXPATH], *eos = s;
    1084     BOOL *bool = NULL;
    1085 
    1086     *s = 0;
    1087     if (keyroot)
    1088     {
    1089         strcpy(s, keyroot);
    1090         strcat(s, ".");
    1091         eos = &s[strlen(s)];
    1092     }
    1093     switch (cmd)
    1094     {
    1095     case IDM_SHOWLNAMES:
    1096         bool = (dcd) ? &dcd -> detailslongname : &detailslongname;
    1097         strcpy(eos, "DetailsLongname");
     932  CHAR s[CCHMAXPATH], *eos = s;
     933  BOOL *bool = NULL;
     934
     935  *s = 0;
     936  if (keyroot) {
     937    strcpy(s, keyroot);
     938    strcat(s, ".");
     939    eos = &s[strlen(s)];
     940  }
     941  switch (cmd) {
     942  case IDM_SHOWLNAMES:
     943    bool = (dcd) ? &dcd->detailslongname : &detailslongname;
     944    strcpy(eos, "DetailsLongname");
     945    break;
     946  case IDM_SHOWSUBJECT:
     947    bool = (dcd) ? &dcd->detailssubject : &detailssubject;
     948    strcpy(eos, "DetailsSubject");
     949    break;
     950  case IDM_SHOWEAS:
     951    bool = (dcd) ? &dcd->detailsea : &detailsea;
     952    strcpy(eos, "DetailsEA");
     953    break;
     954  case IDM_SHOWSIZE:
     955    bool = (dcd) ? &dcd->detailssize : &detailssize;
     956    strcpy(eos, "DetailsSize");
     957    break;
     958  case IDM_SHOWICON:
     959    bool = (dcd) ? &dcd->detailsicon : &detailsicon;
     960    strcpy(eos, "DetailsIcon");
     961    break;
     962  case IDM_SHOWLWDATE:
     963    bool = (dcd) ? &dcd->detailslwdate : &detailslwdate;
     964    strcpy(eos, "DetailsLWDate");
     965    break;
     966  case IDM_SHOWLWTIME:
     967    bool = (dcd) ? &dcd->detailslwtime : &detailslwtime;
     968    strcpy(eos, "DetailsLWTime");
     969    break;
     970  case IDM_SHOWLADATE:
     971    bool = (dcd) ? &dcd->detailsladate : &detailsladate;
     972    strcpy(eos, "DetailsLADate");
     973    break;
     974  case IDM_SHOWLATIME:
     975    bool = (dcd) ? &dcd->detailslatime : &detailslatime;
     976    strcpy(eos, "DetailsLATime");
     977    break;
     978  case IDM_SHOWCRDATE:
     979    bool = (dcd) ? &dcd->detailscrdate : &detailscrdate;
     980    strcpy(eos, "DetailsCRDate");
     981    break;
     982  case IDM_SHOWCRTIME:
     983    bool = (dcd) ? &dcd->detailscrtime : &detailscrtime;
     984    strcpy(eos, "DetailsCRTime");
     985    break;
     986  case IDM_SHOWATTR:
     987    bool = (dcd) ? &dcd->detailsattr : &detailsattr;
     988    strcpy(eos, "DetailsAttr");
     989    break;
     990  default:
     991    if (hwndMenu)
     992      SetDetailsSwitches(hwndMenu, dcd);
     993    return;
     994  }
     995  if (bool)
     996    *bool = (*bool) ? FALSE : TRUE;
     997  if (*s && bool)
     998    PrfWriteProfileData(fmprof, appname, s, bool, sizeof(BOOL));
     999  if (hwnd)
     1000    AdjustCnrColsForPref(hwnd, directory, dcd, compare);
     1001  if (hwndMenu)
     1002    SetDetailsSwitches(hwndMenu, dcd);
     1003}
     1004
     1005VOID SetConditionalCascade(HWND hwndMenu, USHORT id, USHORT def)
     1006{
     1007  MENUITEM mi;
     1008
     1009  mi.iPosition = MIT_END;
     1010  mi.hItem = 0L;
     1011  mi.hwndSubMenu = (HWND) 0;
     1012  mi.afAttribute = 0;
     1013  mi.afStyle = MIS_TEXT;
     1014  if (WinSendMsg
     1015      (hwndMenu, MM_QUERYITEM, MPFROM2SHORT(id, TRUE), MPFROMP(&mi))) {
     1016    WinSetWindowBits(mi.hwndSubMenu, QWL_STYLE, MS_CONDITIONALCASCADE,
     1017                     MS_CONDITIONALCASCADE);
     1018    WinSendMsg(mi.hwndSubMenu, MM_SETDEFAULTITEMID, MPFROMSHORT(def), MPVOID);
     1019    WinCheckMenuItem(mi.hwndSubMenu, def, TRUE);
     1020  }
     1021}
     1022
     1023VOID SetSortChecks(HWND hwndMenu, INT sortflags)
     1024{
     1025  WinCheckMenuItem(hwndMenu, IDM_SORTNONE, FALSE);
     1026  WinCheckMenuItem(hwndMenu, IDM_SORTFIRST, FALSE);
     1027  WinCheckMenuItem(hwndMenu, IDM_SORTLAST, FALSE);
     1028  WinCheckMenuItem(hwndMenu, IDM_SORTSIZE, FALSE);
     1029  WinCheckMenuItem(hwndMenu, IDM_SORTEASIZE, FALSE);
     1030  WinCheckMenuItem(hwndMenu, IDM_SORTLWDATE, FALSE);
     1031  WinCheckMenuItem(hwndMenu, IDM_SORTLADATE, FALSE);
     1032  WinCheckMenuItem(hwndMenu, IDM_SORTCRDATE, FALSE);
     1033  WinCheckMenuItem(hwndMenu, IDM_SORTFILENAME, FALSE);
     1034  WinCheckMenuItem(hwndMenu, IDM_SORTNAME, FALSE);
     1035  WinCheckMenuItem(hwndMenu, IDM_SORTSUBJECT, FALSE);
     1036  WinCheckMenuItem(hwndMenu, IDM_SORTDIRSFIRST, FALSE);
     1037  WinCheckMenuItem(hwndMenu, IDM_SORTDIRSLAST, FALSE);
     1038  WinCheckMenuItem(hwndMenu, IDM_SORTREVERSE, FALSE);
     1039  if (sortflags & SORT_FIRSTEXTENSION)
     1040    WinCheckMenuItem(hwndMenu, IDM_SORTFIRST, TRUE);
     1041  else if (sortflags & SORT_LASTEXTENSION)
     1042    WinCheckMenuItem(hwndMenu, IDM_SORTLAST, TRUE);
     1043  else if (sortflags & SORT_SIZE)
     1044    WinCheckMenuItem(hwndMenu, IDM_SORTSIZE, TRUE);
     1045  else if (sortflags & SORT_EASIZE)
     1046    WinCheckMenuItem(hwndMenu, IDM_SORTEASIZE, TRUE);
     1047  else if (sortflags & SORT_LWDATE)
     1048    WinCheckMenuItem(hwndMenu, IDM_SORTLWDATE, TRUE);
     1049  else if (sortflags & SORT_LADATE)
     1050    WinCheckMenuItem(hwndMenu, IDM_SORTLADATE, TRUE);
     1051  else if (sortflags & SORT_CRDATE)
     1052    WinCheckMenuItem(hwndMenu, IDM_SORTCRDATE, TRUE);
     1053  else if (sortflags & SORT_FILENAME)
     1054    WinCheckMenuItem(hwndMenu, IDM_SORTFILENAME, TRUE);
     1055  else if (sortflags & SORT_NOSORT)
     1056    WinCheckMenuItem(hwndMenu, IDM_SORTNONE, TRUE);
     1057  else if (sortflags & SORT_SUBJECT)
     1058    WinCheckMenuItem(hwndMenu, IDM_SORTSUBJECT, TRUE);
     1059  else
     1060    WinCheckMenuItem(hwndMenu, IDM_SORTNAME, TRUE);
     1061  if (sortflags & SORT_DIRSFIRST)
     1062    WinCheckMenuItem(hwndMenu, IDM_SORTDIRSFIRST, TRUE);
     1063  else if (sortflags & SORT_DIRSLAST)
     1064    WinCheckMenuItem(hwndMenu, IDM_SORTDIRSLAST, TRUE);
     1065  if (sortflags & SORT_REVERSE)
     1066    WinCheckMenuItem(hwndMenu, IDM_SORTREVERSE, TRUE);
     1067}
     1068
     1069VOID FreeMallocedMem(VOID * mem)
     1070{
     1071  /* for use by apps that don't use the DLLs runtime library */
     1072  free(mem);
     1073}
     1074
     1075VOID FcloseFile(FILE * fp)
     1076{
     1077  /* for use by apps that don't use the DLLs runtime library */
     1078  fclose(fp);
     1079}
     1080
     1081VOID SetupCommandMenu(HWND hwndMenu, HWND hwndCnr)
     1082{
     1083  MENUITEM mi, mit;
     1084  INT x;
     1085  SHORT numitems;
     1086  LINKCMDS *info;
     1087
     1088  if (!cmdloaded)
     1089    load_commands();
     1090  mi.iPosition = MIT_END;
     1091  mi.hwndSubMenu = (HWND) 0;
     1092  mi.hItem = 0L;
     1093  mi.afAttribute = 0;
     1094  mi.afStyle = MIS_TEXT;
     1095  memset(&mit, 0, sizeof(MENUITEM));
     1096  if (WinQueryWindowUShort(hwndMenu, QWS_ID) == IDM_COMMANDSMENU)
     1097    mit.hwndSubMenu = hwndMenu;
     1098  else
     1099    WinSendMsg(hwndMenu, MM_QUERYITEM,
     1100               MPFROM2SHORT(IDM_COMMANDSMENU, TRUE), MPFROMP(&mit));
     1101  if (mit.hwndSubMenu) {
     1102    numitems = (SHORT) WinSendMsg(mit.hwndSubMenu, MM_QUERYITEMCOUNT,
     1103                                  MPVOID, MPVOID);
     1104    WinSendMsg(mit.hwndSubMenu, MM_DELETEITEM, MPFROMSHORT(-1), MPVOID);
     1105    for (x = 0; x < numitems; x++)
     1106      WinSendMsg(mit.hwndSubMenu, MM_DELETEITEM,
     1107                 MPFROMSHORT((SHORT) (x + IDM_COMMANDSTART)), MPVOID);
     1108    if (hwndCnr && cmdhead) {
     1109      x = 0;
     1110      info = cmdhead;
     1111      while (info) {
     1112
     1113        CHAR s[CCHMAXPATH + 24];
     1114
     1115        sprintf(s,
     1116                "%s%s%s",
     1117                info->title,
     1118                (x < 20) ? "\tCtrl + " : NullStr,
     1119                (x < 20 && x > 9) ? "Shift + " : NullStr);
     1120        if (x < 20)
     1121          sprintf(&s[strlen(s)], "%d",
     1122                  (((x % 10) + 1) == 10) ? 0 : (x % 10) + 1);
     1123        mi.id = IDM_COMMANDSTART + x;
     1124        mi.afAttribute = (((info->flags & ONCE) != 0) ?
     1125                          MIA_CHECKED : 0) |
     1126          (((info->flags & PROMPT) != 0) ? MIA_FRAMED : 0);
     1127        mi.afStyle = MIS_TEXT;
     1128        if (!(x % 24) && x && info->next)
     1129          mi.afStyle |= MIS_BREAK;
     1130        WinSendMsg(mit.hwndSubMenu, MM_INSERTITEM, MPFROMP(&mi), MPFROMP(s));
     1131        x++;
     1132        info = info->next;
     1133      }
     1134    }
     1135  }
     1136}
     1137
     1138VOID LoadDetailsSwitches(CHAR * keyroot, DIRCNRDATA * dcd)
     1139{
     1140  ULONG size;
     1141  CHAR s[CCHMAXPATH], *eos = s;
     1142  BOOL *bool;
     1143
     1144  *s = 0;
     1145  if (keyroot) {
     1146    strcpy(s, keyroot);
     1147    strcat(s, ".");
     1148    eos = &s[strlen(s)];
     1149  }
     1150  strcpy(eos, "DetailsLongname");
     1151  if (dcd)
     1152    bool = &dcd->detailslongname;
     1153  else
     1154    bool = &detailslongname;
     1155  *bool = detailslongname;
     1156  size = sizeof(BOOL);
     1157  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1158  strcpy(eos, "DetailsSubject");
     1159  if (dcd)
     1160    bool = &dcd->detailssubject;
     1161  else
     1162    bool = &detailssubject;
     1163  *bool = detailssubject;
     1164  size = sizeof(BOOL);
     1165  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1166  strcpy(eos, "DetailsEA");
     1167  if (dcd)
     1168    bool = &dcd->detailsea;
     1169  else
     1170    bool = &detailsea;
     1171  *bool = detailsea;
     1172  size = sizeof(BOOL);
     1173  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1174  strcpy(eos, "DetailsSize");
     1175  if (dcd)
     1176    bool = &dcd->detailssize;
     1177  else
     1178    bool = &detailssize;
     1179  *bool = detailssize;
     1180  size = sizeof(BOOL);
     1181  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1182  strcpy(eos, "DetailsIcon");
     1183  if (dcd)
     1184    bool = &dcd->detailsicon;
     1185  else
     1186    bool = &detailsicon;
     1187  *bool = detailsicon;
     1188  size = sizeof(BOOL);
     1189  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1190  strcpy(eos, "DetailsAttr");
     1191  if (dcd)
     1192    bool = &dcd->detailsattr;
     1193  else
     1194    bool = &detailsattr;
     1195  *bool = detailsattr;
     1196  size = sizeof(BOOL);
     1197  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1198  strcpy(eos, "DetailsCRDate");
     1199  if (dcd)
     1200    bool = &dcd->detailscrdate;
     1201  else
     1202    bool = &detailscrdate;
     1203  *bool = detailscrdate;
     1204  size = sizeof(BOOL);
     1205  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1206  strcpy(eos, "DetailsCRTime");
     1207  if (dcd)
     1208    bool = &dcd->detailscrtime;
     1209  else
     1210    bool = &detailscrtime;
     1211  *bool = detailscrtime;
     1212  size = sizeof(BOOL);
     1213  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1214  strcpy(eos, "DetailsLWDate");
     1215  if (dcd)
     1216    bool = &dcd->detailslwdate;
     1217  else
     1218    bool = &detailslwdate;
     1219  *bool = detailslwdate;
     1220  size = sizeof(BOOL);
     1221  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1222  strcpy(eos, "DetailsLWTime");
     1223  if (dcd)
     1224    bool = &dcd->detailslwtime;
     1225  else
     1226    bool = &detailslwtime;
     1227  *bool = detailslwtime;
     1228  size = sizeof(BOOL);
     1229  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1230  strcpy(eos, "DetailsLADate");
     1231  if (dcd)
     1232    bool = &dcd->detailsladate;
     1233  else
     1234    bool = &detailsladate;
     1235  *bool = detailsladate;
     1236  size = sizeof(BOOL);
     1237  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1238  strcpy(eos, "DetailsLATime");
     1239  if (dcd)
     1240    bool = &dcd->detailslatime;
     1241  else
     1242    bool = &detailslatime;
     1243  *bool = detailslatime;
     1244  size = sizeof(BOOL);
     1245  PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
     1246}
     1247
     1248HWND FindDirCnr(HWND hwndParent)
     1249{
     1250  HWND found, hwndDir = (HWND) 0;
     1251  HENUM henum;
     1252
     1253  henum = WinBeginEnumWindows(hwndParent);
     1254  while ((found = WinGetNextWindow(henum)) != NULLHANDLE) {
     1255    hwndDir = WinWindowFromID(found, FID_CLIENT);
     1256    if (hwndDir) {
     1257      hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
     1258      if (hwndDir)
    10981259        break;
    1099     case IDM_SHOWSUBJECT:
    1100         bool = (dcd) ? &dcd -> detailssubject : &detailssubject;
    1101         strcpy(eos, "DetailsSubject");
     1260      hwndDir = (HWND) 0;
     1261    }
     1262  }
     1263  WinEndEnumWindows(henum);
     1264
     1265  return hwndDir;
     1266}
     1267
     1268VOID HeapThread(VOID * dummy)
     1269{
     1270  ULONG postcount;
     1271  APIRET rc;
     1272
     1273  rc = DosCreateEventSem(NULL, &CompactSem, 0L, FALSE);
     1274  if (rc)
     1275    Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
     1276              "DosCreateEventSem");
     1277  else {
     1278    priority_normal();
     1279    for (;;) {
     1280      if (DosWaitEventSem(CompactSem, SEM_INDEFINITE_WAIT))
    11021281        break;
    1103     case IDM_SHOWEAS:
    1104         bool = (dcd) ? &dcd -> detailsea : &detailsea;
    1105         strcpy(eos, "DetailsEA");
    1106         break;
    1107     case IDM_SHOWSIZE:
    1108         bool = (dcd) ? &dcd -> detailssize : &detailssize;
    1109         strcpy(eos, "DetailsSize");
    1110         break;
    1111     case IDM_SHOWICON:
    1112         bool = (dcd) ? &dcd -> detailsicon : &detailsicon;
    1113         strcpy(eos, "DetailsIcon");
    1114         break;
    1115     case IDM_SHOWLWDATE:
    1116         bool = (dcd) ? &dcd -> detailslwdate : &detailslwdate;
    1117         strcpy(eos, "DetailsLWDate");
    1118         break;
    1119     case IDM_SHOWLWTIME:
    1120         bool = (dcd) ? &dcd -> detailslwtime : &detailslwtime;
    1121         strcpy(eos, "DetailsLWTime");
    1122         break;
    1123     case IDM_SHOWLADATE:
    1124         bool = (dcd) ? &dcd -> detailsladate : &detailsladate;
    1125         strcpy(eos, "DetailsLADate");
    1126         break;
    1127     case IDM_SHOWLATIME:
    1128         bool = (dcd) ? &dcd -> detailslatime : &detailslatime;
    1129         strcpy(eos, "DetailsLATime");
    1130         break;
    1131     case IDM_SHOWCRDATE:
    1132         bool = (dcd) ? &dcd -> detailscrdate : &detailscrdate;
    1133         strcpy(eos, "DetailsCRDate");
    1134         break;
    1135     case IDM_SHOWCRTIME:
    1136         bool = (dcd) ? &dcd -> detailscrtime : &detailscrtime;
    1137         strcpy(eos, "DetailsCRTime");
    1138         break;
    1139     case IDM_SHOWATTR:
    1140         bool = (dcd) ? &dcd -> detailsattr : &detailsattr;
    1141         strcpy(eos, "DetailsAttr");
    1142         break;
    1143     default:
    1144         if (hwndMenu)
    1145             SetDetailsSwitches(hwndMenu, dcd);
    1146         return;
    1147     }
    1148     if (bool)
    1149         *bool = (*bool) ? FALSE : TRUE;
    1150     if (*s && bool)
    1151         PrfWriteProfileData(fmprof, appname, s, bool, sizeof(BOOL));
    1152     if (hwnd)
    1153         AdjustCnrColsForPref(hwnd, directory, dcd, compare);
    1154     if (hwndMenu)
    1155         SetDetailsSwitches(hwndMenu, dcd);
    1156 }
    1157 
    1158 VOID SetConditionalCascade(HWND hwndMenu, USHORT id, USHORT def)
    1159 {
    1160     MENUITEM mi;
    1161 
    1162     mi.iPosition = MIT_END;
    1163     mi.hItem = 0L;
    1164     mi.hwndSubMenu = (HWND) 0;
    1165     mi.afAttribute = 0;
    1166     mi.afStyle = MIS_TEXT;
    1167     if (WinSendMsg(hwndMenu, MM_QUERYITEM, MPFROM2SHORT(id, TRUE), MPFROMP(&mi)))
    1168     {
    1169         WinSetWindowBits(mi.hwndSubMenu, QWL_STYLE,
    1170                          MS_CONDITIONALCASCADE,
    1171                          MS_CONDITIONALCASCADE);
    1172         WinSendMsg(mi.hwndSubMenu, MM_SETDEFAULTITEMID, MPFROMSHORT(def), MPVOID);
    1173         WinCheckMenuItem(mi.hwndSubMenu, def, TRUE);
    1174     }
    1175 }
    1176 
    1177 VOID SetSortChecks(HWND hwndMenu, INT sortflags)
    1178 {
    1179     WinCheckMenuItem(hwndMenu, IDM_SORTNONE, FALSE);
    1180     WinCheckMenuItem(hwndMenu, IDM_SORTFIRST, FALSE);
    1181     WinCheckMenuItem(hwndMenu, IDM_SORTLAST, FALSE);
    1182     WinCheckMenuItem(hwndMenu, IDM_SORTSIZE, FALSE);
    1183     WinCheckMenuItem(hwndMenu, IDM_SORTEASIZE, FALSE);
    1184     WinCheckMenuItem(hwndMenu, IDM_SORTLWDATE, FALSE);
    1185     WinCheckMenuItem(hwndMenu, IDM_SORTLADATE, FALSE);
    1186     WinCheckMenuItem(hwndMenu, IDM_SORTCRDATE, FALSE);
    1187     WinCheckMenuItem(hwndMenu, IDM_SORTFILENAME, FALSE);
    1188     WinCheckMenuItem(hwndMenu, IDM_SORTNAME, FALSE);
    1189     WinCheckMenuItem(hwndMenu, IDM_SORTSUBJECT, FALSE);
    1190     WinCheckMenuItem(hwndMenu, IDM_SORTDIRSFIRST, FALSE);
    1191     WinCheckMenuItem(hwndMenu, IDM_SORTDIRSLAST, FALSE);
    1192     WinCheckMenuItem(hwndMenu, IDM_SORTREVERSE, FALSE);
    1193     if (sortflags & SORT_FIRSTEXTENSION)
    1194         WinCheckMenuItem(hwndMenu, IDM_SORTFIRST, TRUE);
    1195     else if (sortflags & SORT_LASTEXTENSION)
    1196         WinCheckMenuItem(hwndMenu, IDM_SORTLAST, TRUE);
    1197     else if (sortflags & SORT_SIZE)
    1198         WinCheckMenuItem(hwndMenu, IDM_SORTSIZE, TRUE);
    1199     else if (sortflags & SORT_EASIZE)
    1200         WinCheckMenuItem(hwndMenu, IDM_SORTEASIZE, TRUE);
    1201     else if (sortflags & SORT_LWDATE)
    1202         WinCheckMenuItem(hwndMenu, IDM_SORTLWDATE, TRUE);
    1203     else if (sortflags & SORT_LADATE)
    1204         WinCheckMenuItem(hwndMenu, IDM_SORTLADATE, TRUE);
    1205     else if (sortflags & SORT_CRDATE)
    1206         WinCheckMenuItem(hwndMenu, IDM_SORTCRDATE, TRUE);
    1207     else if (sortflags & SORT_FILENAME)
    1208         WinCheckMenuItem(hwndMenu, IDM_SORTFILENAME, TRUE);
    1209     else if (sortflags & SORT_NOSORT)
    1210         WinCheckMenuItem(hwndMenu, IDM_SORTNONE, TRUE);
    1211     else if (sortflags & SORT_SUBJECT)
    1212         WinCheckMenuItem(hwndMenu, IDM_SORTSUBJECT, TRUE);
     1282      _heapmin();
     1283      DosResetEventSem(CompactSem, &postcount);
     1284    }
     1285  }
     1286}
     1287
     1288VOID FixSwitchList(HWND hwnd, CHAR * text)
     1289{
     1290  HSWITCH hswitch;
     1291  SWCNTRL swctl;
     1292
     1293  hswitch = WinQuerySwitchHandle(hwnd, 0);
     1294  if (hswitch) {
     1295    if (!WinQuerySwitchEntry(hswitch, &swctl)) {
     1296      strcpy(swctl.szSwtitle, "FM/2");
     1297      WinChangeSwitchEntry(hswitch, &swctl);
     1298    }
     1299  }
     1300}
     1301
     1302VOID QuickPopup(HWND hwnd, DIRCNRDATA * dcd, HWND hwndMenu, USHORT id)
     1303{
     1304  dcd->hwndLastMenu = hwndMenu;
     1305  if (dcd->hwndLastMenu && !dcd->cnremphasized) {
     1306    WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID,
     1307               MPFROM2SHORT(TRUE, CRA_SOURCE));
     1308    dcd->cnremphasized = TRUE;
     1309  }
     1310  if (dcd->flWindowAttr & CV_MINI)
     1311    WinCheckMenuItem(dcd->hwndLastMenu, IDM_MINIICONS, TRUE);
     1312  if (!WinPopupMenu(hwnd, hwnd, dcd->hwndLastMenu,
     1313                    8, 8, 0,
     1314                    PU_HCONSTRAIN | PU_VCONSTRAIN |
     1315                    PU_KEYBOARD | PU_MOUSEBUTTON1)) {
     1316    if (dcd->cnremphasized) {
     1317      WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID,
     1318                 MPFROM2SHORT(FALSE, CRA_SOURCE));
     1319      dcd->cnremphasized = FALSE;
     1320    }
     1321  }
     1322  else
     1323    WinSendMsg(dcd->hwndLastMenu, MM_SELECTITEM,
     1324               MPFROM2SHORT(id, TRUE), MPFROM2SHORT(0, FALSE));
     1325}
     1326
     1327PMINIRECORDCORE CurrentRecord(HWND hwndCnr)
     1328{
     1329  SHORT attrib = (fSelectedAlways) ? CRA_SELECTED : CRA_CURSORED;
     1330  PMINIRECORDCORE pmi;
     1331
     1332  for (;;) {
     1333    pmi = (PMINIRECORDCORE) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
     1334                                       MPFROMLONG(CMA_FIRST),
     1335                                       MPFROMSHORT(attrib));
     1336    if ((!pmi || (INT) pmi == -1) && attrib == CRA_SELECTED)    /* punt */
     1337      attrib = CRA_CURSORED;
    12131338    else
    1214         WinCheckMenuItem(hwndMenu, IDM_SORTNAME, TRUE);
    1215     if (sortflags & SORT_DIRSFIRST)
    1216         WinCheckMenuItem(hwndMenu, IDM_SORTDIRSFIRST, TRUE);
    1217     else if (sortflags & SORT_DIRSLAST)
    1218         WinCheckMenuItem(hwndMenu, IDM_SORTDIRSLAST, TRUE);
    1219     if (sortflags & SORT_REVERSE)
    1220         WinCheckMenuItem(hwndMenu, IDM_SORTREVERSE, TRUE);
    1221 }
    1222 
    1223 VOID FreeMallocedMem(VOID * mem)
    1224 {
    1225     /* for use by apps that don't use the DLLs runtime library */
    1226 
    1227     free(mem);
    1228 }
    1229 
    1230 VOID FcloseFile(FILE * fp)
    1231 {
    1232     /* for use by apps that don't use the DLLs runtime library */
    1233 
    1234     fclose(fp);
    1235 }
    1236 
    1237 VOID SetupCommandMenu(HWND hwndMenu, HWND hwndCnr)
    1238 {
    1239     MENUITEM mi, mit;
    1240     INT x;
    1241     SHORT numitems;
    1242     LINKCMDS *info;
    1243 
    1244     if (!cmdloaded)
    1245         load_commands();
    1246     mi.iPosition = MIT_END;
    1247     mi.hwndSubMenu = (HWND) 0;
    1248     mi.hItem = 0L;
    1249     mi.afAttribute = 0;
    1250     mi.afStyle = MIS_TEXT;
    1251     memset(&mit, 0, sizeof(MENUITEM));
    1252     if (WinQueryWindowUShort(hwndMenu, QWS_ID) == IDM_COMMANDSMENU)
    1253         mit.hwndSubMenu = hwndMenu;
    1254     else
    1255         WinSendMsg(hwndMenu, MM_QUERYITEM,
    1256                    MPFROM2SHORT(IDM_COMMANDSMENU, TRUE),
    1257                    MPFROMP(&mit));
    1258     if (mit.hwndSubMenu)
    1259     {
    1260         numitems = (SHORT) WinSendMsg(mit.hwndSubMenu, MM_QUERYITEMCOUNT,
    1261                                       MPVOID, MPVOID);
    1262         WinSendMsg(mit.hwndSubMenu, MM_DELETEITEM, MPFROMSHORT(-1), MPVOID);
    1263         for (x = 0; x < numitems; x++)
    1264             WinSendMsg(mit.hwndSubMenu, MM_DELETEITEM,
    1265                        MPFROMSHORT((SHORT) (x + IDM_COMMANDSTART)),
    1266                        MPVOID);
    1267         if (hwndCnr && cmdhead)
    1268         {
    1269             x = 0;
    1270             info = cmdhead;
    1271             while (info)
    1272             {
    1273 
    1274                 CHAR s[CCHMAXPATH + 24];
    1275 
    1276                 sprintf(s,
    1277                         "%s%s%s",
    1278                         info -> title,
    1279                         (x < 20) ? "\tCtrl + " : NullStr,
    1280                         (x < 20 && x > 9) ? "Shift + " : NullStr);
    1281                 if (x < 20)
    1282                     sprintf(&s[strlen(s)], "%d", (((x % 10) + 1) == 10) ? 0 : (x % 10) + 1);
    1283                 mi.id = IDM_COMMANDSTART + x;
    1284                 mi.afAttribute = (((info -> flags & ONCE) != 0) ?
    1285                                   MIA_CHECKED : 0) |
    1286                     (((info -> flags & PROMPT) != 0) ?
    1287                      MIA_FRAMED : 0);
    1288                 mi.afStyle = MIS_TEXT;
    1289                 if (!(x % 24) && x && info -> next)
    1290                     mi.afStyle |= MIS_BREAK;
    1291                 WinSendMsg(mit.hwndSubMenu, MM_INSERTITEM, MPFROMP(&mi),
    1292                            MPFROMP(s));
    1293                 x++;
    1294                 info = info -> next;
    1295             }
     1339      break;
     1340  }
     1341  return ((INT) pmi == -1) ? NULL : pmi;
     1342}
     1343
     1344BOOL PostMsg(HWND h, ULONG msg, MPARAM mp1, MPARAM mp2)
     1345{
     1346  BOOL rc = WinPostMsg(h, msg, mp1, mp2);
     1347
     1348  if (!rc) {
     1349    PIB *ppib;
     1350    TIB *ptib;
     1351
     1352    if (!DosGetInfoBlocks(&ptib, &ppib)) {
     1353      PID pid;
     1354      TID tid;
     1355      QMSG qmsg;
     1356
     1357      if (WinQueryWindowProcess(h, &pid, &tid)) {
     1358        // If window owned by some other process or some other thread?
     1359        if (pid != ppib->pib_ulpid || tid != ptib->tib_ptib2->tib2_ultid) {
     1360          for (;;) {
     1361            DosSleep(1L);
     1362            rc = WinPostMsg(h, msg, mp1, mp2);
     1363            if (rc)
     1364              break;                    // OK
     1365            if (!WinIsWindow((HAB) 0, h))
     1366              break;                    // Window gone
     1367            if (WinPeekMsg((HAB) 0, &qmsg, (HWND) 0, 0, 0, PM_NOREMOVE))
     1368              break;                    // Queue has message(s)
     1369          }                             // for
    12961370        }
    1297     }
    1298 }
    1299 
    1300 VOID LoadDetailsSwitches(CHAR * keyroot, DIRCNRDATA * dcd)
    1301 {
    1302     ULONG size;
    1303     CHAR s[CCHMAXPATH], *eos = s;
    1304     BOOL *bool;
    1305 
    1306     *s = 0;
    1307     if (keyroot)
    1308     {
    1309         strcpy(s, keyroot);
    1310         strcat(s, ".");
    1311         eos = &s[strlen(s)];
    1312     }
    1313     strcpy(eos, "DetailsLongname");
    1314     if (dcd)
    1315         bool = &dcd -> detailslongname;
    1316     else
    1317         bool = &detailslongname;
    1318     *bool = detailslongname;
    1319     size = sizeof(BOOL);
    1320     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1321     strcpy(eos, "DetailsSubject");
    1322     if (dcd)
    1323         bool = &dcd -> detailssubject;
    1324     else
    1325         bool = &detailssubject;
    1326     *bool = detailssubject;
    1327     size = sizeof(BOOL);
    1328     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1329     strcpy(eos, "DetailsEA");
    1330     if (dcd)
    1331         bool = &dcd -> detailsea;
    1332     else
    1333         bool = &detailsea;
    1334     *bool = detailsea;
    1335     size = sizeof(BOOL);
    1336     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1337     strcpy(eos, "DetailsSize");
    1338     if (dcd)
    1339         bool = &dcd -> detailssize;
    1340     else
    1341         bool = &detailssize;
    1342     *bool = detailssize;
    1343     size = sizeof(BOOL);
    1344     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1345     strcpy(eos, "DetailsIcon");
    1346     if (dcd)
    1347         bool = &dcd -> detailsicon;
    1348     else
    1349         bool = &detailsicon;
    1350     *bool = detailsicon;
    1351     size = sizeof(BOOL);
    1352     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1353     strcpy(eos, "DetailsAttr");
    1354     if (dcd)
    1355         bool = &dcd -> detailsattr;
    1356     else
    1357         bool = &detailsattr;
    1358     *bool = detailsattr;
    1359     size = sizeof(BOOL);
    1360     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1361     strcpy(eos, "DetailsCRDate");
    1362     if (dcd)
    1363         bool = &dcd -> detailscrdate;
    1364     else
    1365         bool = &detailscrdate;
    1366     *bool = detailscrdate;
    1367     size = sizeof(BOOL);
    1368     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1369     strcpy(eos, "DetailsCRTime");
    1370     if (dcd)
    1371         bool = &dcd -> detailscrtime;
    1372     else
    1373         bool = &detailscrtime;
    1374     *bool = detailscrtime;
    1375     size = sizeof(BOOL);
    1376     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1377     strcpy(eos, "DetailsLWDate");
    1378     if (dcd)
    1379         bool = &dcd -> detailslwdate;
    1380     else
    1381         bool = &detailslwdate;
    1382     *bool = detailslwdate;
    1383     size = sizeof(BOOL);
    1384     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1385     strcpy(eos, "DetailsLWTime");
    1386     if (dcd)
    1387         bool = &dcd -> detailslwtime;
    1388     else
    1389         bool = &detailslwtime;
    1390     *bool = detailslwtime;
    1391     size = sizeof(BOOL);
    1392     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1393     strcpy(eos, "DetailsLADate");
    1394     if (dcd)
    1395         bool = &dcd -> detailsladate;
    1396     else
    1397         bool = &detailsladate;
    1398     *bool = detailsladate;
    1399     size = sizeof(BOOL);
    1400     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1401     strcpy(eos, "DetailsLATime");
    1402     if (dcd)
    1403         bool = &dcd -> detailslatime;
    1404     else
    1405         bool = &detailslatime;
    1406     *bool = detailslatime;
    1407     size = sizeof(BOOL);
    1408     PrfQueryProfileData(fmprof, appname, s, (PVOID) bool, &size);
    1409 }
    1410 
    1411 HWND FindDirCnr(HWND hwndParent)
    1412 {
    1413     HWND found, hwndDir = (HWND) 0;
    1414     HENUM henum;
    1415 
    1416     henum = WinBeginEnumWindows(hwndParent);
    1417     while ((found = WinGetNextWindow(henum)) != NULLHANDLE)
    1418     {
    1419         hwndDir = WinWindowFromID(found, FID_CLIENT);
    1420         if (hwndDir)
    1421         {
    1422             hwndDir = WinWindowFromID(hwndDir, DIR_CNR);
    1423             if (hwndDir)
    1424                 break;
    1425             hwndDir = (HWND) 0;
    1426         }
    1427     }
    1428     WinEndEnumWindows(henum);
    1429 
    1430     return hwndDir;
    1431 }
    1432 
    1433 VOID HeapThread(VOID * dummy)
    1434 {
    1435     ULONG postcount;
    1436     APIRET rc;
    1437 
    1438     rc = DosCreateEventSem(NULL, &CompactSem, 0L, FALSE);
    1439     if (rc)
    1440         Dos_Error(MB_CANCEL,rc,HWND_DESKTOP,pszSrcFile,__LINE__,"DosCreateEventSem");
    1441     else
    1442     {
    1443         priority_normal();
    1444         for (;;)
    1445         {
    1446             if (DosWaitEventSem(CompactSem, SEM_INDEFINITE_WAIT))
    1447                 break;
    1448             _heapmin();
    1449             DosResetEventSem(CompactSem, &postcount);
    1450         }
    1451     }
    1452 }
    1453 
    1454 VOID FixSwitchList(HWND hwnd, CHAR * text)
    1455 {
    1456     HSWITCH hswitch;
    1457     SWCNTRL swctl;
    1458 
    1459     hswitch = WinQuerySwitchHandle(hwnd, 0);
    1460     if (hswitch)
    1461     {
    1462         if (!WinQuerySwitchEntry(hswitch, &swctl))
    1463         {
    1464             strcpy(swctl.szSwtitle, "FM/2");
    1465             WinChangeSwitchEntry(hswitch, &swctl);
    1466         }
    1467     }
    1468 }
    1469 
    1470 VOID QuickPopup(HWND hwnd, DIRCNRDATA * dcd, HWND hwndMenu, USHORT id)
    1471 {
    1472     dcd -> hwndLastMenu = hwndMenu;
    1473     if (dcd -> hwndLastMenu && !dcd -> cnremphasized)
    1474     {
    1475         WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID,
    1476                    MPFROM2SHORT(TRUE, CRA_SOURCE));
    1477         dcd -> cnremphasized = TRUE;
    1478     }
    1479     if (dcd -> flWindowAttr & CV_MINI)
    1480         WinCheckMenuItem(dcd -> hwndLastMenu, IDM_MINIICONS, TRUE);
    1481     if (!WinPopupMenu(hwnd, hwnd, dcd -> hwndLastMenu,
    1482                       8, 8, 0,
    1483                       PU_HCONSTRAIN | PU_VCONSTRAIN |
    1484                       PU_KEYBOARD | PU_MOUSEBUTTON1))
    1485     {
    1486         if (dcd -> cnremphasized)
    1487         {
    1488             WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID,
    1489                        MPFROM2SHORT(FALSE, CRA_SOURCE));
    1490             dcd -> cnremphasized = FALSE;
    1491         }
    1492     }
    1493     else
    1494         WinSendMsg(dcd -> hwndLastMenu, MM_SELECTITEM,
    1495                    MPFROM2SHORT(id, TRUE),
    1496                    MPFROM2SHORT(0, FALSE));
    1497 }
    1498 
    1499 PMINIRECORDCORE CurrentRecord(HWND hwndCnr)
    1500 {
    1501     SHORT attrib = (fSelectedAlways) ? CRA_SELECTED : CRA_CURSORED;
    1502     PMINIRECORDCORE pmi;
    1503 
    1504     for (;;)
    1505     {
    1506         pmi = (PMINIRECORDCORE) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
    1507                                            MPFROMLONG(CMA_FIRST),
    1508                                            MPFROMSHORT(attrib));
    1509         if ((!pmi || (INT) pmi == -1) && attrib == CRA_SELECTED)        /* punt */
    1510             attrib = CRA_CURSORED;
    1511         else
    1512             break;
    1513     }
    1514     return ((INT) pmi == -1) ? NULL : pmi;
    1515 }
    1516 
    1517 BOOL PostMsg(HWND h, ULONG msg, MPARAM mp1, MPARAM mp2)
    1518 {
    1519     BOOL rc = WinPostMsg(h, msg, mp1, mp2);
    1520 
    1521     if (!rc)
    1522     {
    1523 
    1524         PIB *ppib;
    1525         TIB *ptib;
    1526 
    1527         if (!DosGetInfoBlocks(&ptib, &ppib))
    1528         {
    1529 
    1530             PID pid;
    1531             TID tid;
    1532             QMSG qmsg;
    1533 
    1534             if (WinQueryWindowProcess(h, &pid, &tid))
    1535             {
    1536                 if (pid != ppib -> pib_ulpid || tid != ptib -> tib_ptib2 -> tib2_ultid)
    1537                 {
    1538                     for (;;)
    1539                     {
    1540                         DosSleep(1L);
    1541                         rc = WinPostMsg(h, msg, mp1, mp2);
    1542                         if (!rc)
    1543                         {
    1544                             if (!WinIsWindow((HAB) 0, h))
    1545                                 break;
    1546                             if (WinPeekMsg((HAB) 0, &qmsg, (HWND) 0, 0, 0, PM_NOREMOVE))
    1547                                 break;
    1548                         }
    1549                         else
    1550                             break;
    1551                     }
    1552                 }
    1553             }
    1554         }
    1555     }
    1556     return rc;
     1371      }
     1372    }
     1373  }
     1374  return rc;
    15571375}
    15581376
    15591377VOID OpenEdit(HWND hwnd)
    15601378{
    1561     CNREDITDATA ced;
    1562     PCNRITEM pci;
    1563     PFIELDINFO pfi;
    1564 
    1565     pci = (PCNRITEM) WinSendMsg(hwnd,
    1566                                 CM_QUERYRECORDEMPHASIS,
    1567                                 MPFROMLONG(CMA_FIRST),
    1568                                 MPFROMSHORT(CRA_CURSORED));
    1569     if (pci && (INT) pci != -1)
    1570     {
    1571         memset(&ced, 0, sizeof(ced));
    1572         ced.cb = sizeof(ced);
    1573         ced.hwndCnr = hwnd;
    1574         ced.id = WinQueryWindowUShort(hwnd, QWS_ID);
    1575         ced.pRecord = (PRECORDCORE) pci;
     1379  CNREDITDATA ced;
     1380  PCNRITEM pci;
     1381  PFIELDINFO pfi;
     1382
     1383  pci = (PCNRITEM) WinSendMsg(hwnd,
     1384                              CM_QUERYRECORDEMPHASIS,
     1385                              MPFROMLONG(CMA_FIRST),
     1386                              MPFROMSHORT(CRA_CURSORED));
     1387  if (pci && (INT) pci != -1) {
     1388    memset(&ced, 0, sizeof(ced));
     1389    ced.cb = sizeof(ced);
     1390    ced.hwndCnr = hwnd;
     1391    ced.id = WinQueryWindowUShort(hwnd, QWS_ID);
     1392    ced.pRecord = (PRECORDCORE) pci;
     1393    pfi = (PFIELDINFO) WinSendMsg(hwnd,
     1394                                  CM_QUERYDETAILFIELDINFO,
     1395                                  MPVOID, MPFROMSHORT(CMA_FIRST));
     1396    if (!pfi)
     1397      WinSendMsg(hwnd, CM_OPENEDIT, MPFROMP(&ced), MPVOID);
     1398    else {
     1399      while (pfi && (INT) pfi != -1 &&
     1400             pfi->offStruct != FIELDOFFSET(CNRITEM, pszFileName))
    15761401        pfi = (PFIELDINFO) WinSendMsg(hwnd,
    15771402                                      CM_QUERYDETAILFIELDINFO,
    1578                                       MPVOID,
    1579                                       MPFROMSHORT(CMA_FIRST));
    1580         if (!pfi)
    1581             WinSendMsg(hwnd,
    1582                        CM_OPENEDIT,
    1583                        MPFROMP(&ced),
    1584                        MPVOID);
    1585         else
     1403                                      MPFROMP(pfi), MPFROMSHORT(CMA_NEXT));
     1404      if (pfi && (INT) pfi != -1) {
     1405        ced.pFieldInfo = pfi;
    15861406        {
    1587             while (pfi && (INT) pfi != -1 &&
    1588                     pfi -> offStruct != FIELDOFFSET(CNRITEM, pszFileName))
    1589                 pfi = (PFIELDINFO) WinSendMsg(hwnd,
    1590                                               CM_QUERYDETAILFIELDINFO,
    1591                                               MPFROMP(pfi),
    1592                                               MPFROMSHORT(CMA_NEXT));
    1593             if (pfi && (INT) pfi != -1)
    1594             {
    1595                 ced.pFieldInfo = pfi;
    1596                 {
    1597                     CNRINFO cnri;
    1598 
    1599                     memset(&cnri, 0, sizeof(CNRINFO));
    1600                     cnri.cb = sizeof(CNRINFO);
    1601                     WinSendMsg(hwnd,
    1602                                CM_QUERYCNRINFO,
    1603                                MPFROMP(&cnri),
    1604                                MPFROMLONG(sizeof(CNRINFO)));
    1605                     if (cnri.flWindowAttr & CV_DETAIL)
    1606                         ced.id = CID_LEFTDVWND;
    1607                 }
    1608                 WinSendMsg(hwnd,
    1609                            CM_OPENEDIT,
    1610                            MPFROMP(&ced),
    1611                            MPVOID);
    1612             }
     1407          CNRINFO cnri;
     1408
     1409          memset(&cnri, 0, sizeof(CNRINFO));
     1410          cnri.cb = sizeof(CNRINFO);
     1411          WinSendMsg(hwnd,
     1412                     CM_QUERYCNRINFO,
     1413                     MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)));
     1414          if (cnri.flWindowAttr & CV_DETAIL)
     1415            ced.id = CID_LEFTDVWND;
    16131416        }
    1614     }
     1417        WinSendMsg(hwnd, CM_OPENEDIT, MPFROMP(&ced), MPVOID);
     1418      }
     1419    }
     1420  }
    16151421}
    16161422
     
    16181424VOID QuickView(HWND hwnd, CHAR * filename)
    16191425{
    1620     if (filename && IsFile(filename) == 1)
     1426  if (filename && IsFile(filename) == 1) {
     1427    if (TestBinary(filename) && *binview) {
     1428
     1429      CHAR *list[2];
     1430
     1431      list[0] = filename;
     1432      list[1] = NULL;
     1433      ExecOnList(hwnd, binview, WINDOWED | SEPARATE, NULL, list, NULL);
     1434      return;
     1435    }
     1436    else if (*viewer) {
     1437
     1438      CHAR *list[2];
     1439
     1440      list[0] = filename;
     1441      list[1] = NULL;
     1442      ExecOnList(hwnd, viewer, WINDOWED | SEPARATE |
     1443                 ((fViewChild) ? CHILD : 0), NULL, list, NULL);
     1444      return;
     1445    }
     1446    StartMLEEditor(HWND_DESKTOP, 5, filename, (HWND) 0);
     1447  }
     1448}
     1449
     1450VOID QuickEdit(HWND hwnd, CHAR * filename)
     1451{
     1452  if (filename && IsFile(filename) == 1) {
     1453    if (TestBinary(filename) && *bined) {
     1454
     1455      CHAR *list[2];
     1456
     1457      list[0] = filename;
     1458      list[1] = NULL;
     1459      ExecOnList(hwnd, bined, WINDOWED | SEPARATE, NULL, list, NULL);
     1460      return;
     1461    }
     1462    else if (*editor) {
     1463
     1464      CHAR *list[2];
     1465
     1466      list[0] = filename;
     1467      list[1] = NULL;
     1468      ExecOnList(hwnd, editor, WINDOWED | SEPARATE, NULL, list, NULL);
     1469      return;
     1470    }
     1471    StartMLEEditor(HWND_DESKTOP, 4, filename, (HWND) 0);
     1472  }
     1473}
     1474#endif
     1475
     1476VOID PortholeInit(HWND hwndNew, MPARAM mp1, MPARAM mp2)
     1477{
     1478  static HWND DefMenu = (HWND) 0;
     1479  HWND hwndMenu = (HWND) mp2;
     1480
     1481  {
     1482    ULONG style;
     1483
     1484    style = WinQueryWindowULong(hwndMenu, QWL_STYLE);
     1485    if (!(style & MS_ACTIONBAR))
     1486      return;
     1487  }
     1488
     1489  switch (SHORT1FROMMP(mp1)) {
     1490  case 0:
    16211491    {
    1622         if (TestBinary(filename) && *binview)
    1623         {
    1624 
    1625             CHAR *list[2];
    1626 
    1627             list[0] = filename;
    1628             list[1] = NULL;
    1629             ExecOnList(hwnd, binview, WINDOWED | SEPARATE, NULL, list, NULL);
    1630             return;
     1492      HWND hwndNow;
     1493      MENUITEM mi;
     1494      ULONG ulStyle;
     1495
     1496      memset(&mi, 0, sizeof(mi));
     1497      mi.iPosition = MIT_END;
     1498      mi.afStyle = MIS_TEXT;
     1499      WinSendMsg(hwndMenu, MM_QUERYITEM,
     1500                 MPFROM2SHORT(IDM_FILESMENU, TRUE), MPFROMP(&mi));
     1501      if (!DefMenu)
     1502        DefMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, DEFMENU);
     1503      hwndNow = mi.hwndSubMenu;
     1504      mi.hwndSubMenu = hwndNew;
     1505      if (!mi.hwndSubMenu)
     1506        mi.hwndSubMenu = DefMenu;
     1507      WinSetParent(hwndNow, WinQueryObjectWindow(HWND_DESKTOP), FALSE);
     1508      WinSetOwner(hwndNow, WinQueryObjectWindow(HWND_DESKTOP));
     1509      WinSetOwner(mi.hwndSubMenu, hwndMenu);
     1510      WinSetParent(mi.hwndSubMenu, hwndMenu, FALSE);
     1511      WinSetWindowUShort(mi.hwndSubMenu, QWS_ID, IDM_FILESMENU);
     1512      mi.afStyle = MIS_SUBMENU;
     1513      ulStyle = WinQueryWindowULong(mi.hwndSubMenu, QWL_STYLE);
     1514      ulStyle &= -WS_SAVEBITS;
     1515      ulStyle |= MS_POPUP | WS_CLIPSIBLINGS | WS_SAVEBITS;
     1516      WinSetWindowULong(mi.hwndSubMenu, QWL_STYLE, ulStyle);
     1517      WinSendMsg(hwndMenu, MM_SETITEM, MPFROM2SHORT(0, TRUE), MPFROMP(&mi));
     1518    }
     1519    break;
     1520
     1521  case 1:
     1522    {
     1523      HWND hwndNow;
     1524      MENUITEM mi;
     1525      ULONG ulStyle;
     1526
     1527      memset(&mi, 0, sizeof(mi));
     1528      mi.iPosition = MIT_END;
     1529      mi.afStyle = MIS_TEXT;
     1530      WinSendMsg(hwndMenu, MM_QUERYITEM,
     1531                 MPFROM2SHORT(IDM_VIEWSMENU, TRUE), MPFROMP(&mi));
     1532      if (!DefMenu)
     1533        DefMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, DEFMENU);
     1534      hwndNow = mi.hwndSubMenu;
     1535      mi.hwndSubMenu = hwndNew;
     1536      if (!mi.hwndSubMenu)
     1537        mi.hwndSubMenu = DefMenu;
     1538      WinSetParent(hwndNow, WinQueryObjectWindow(HWND_DESKTOP), FALSE);
     1539      WinSetOwner(hwndNow, WinQueryObjectWindow(HWND_DESKTOP));
     1540      WinSetOwner(mi.hwndSubMenu, hwndMenu);
     1541      WinSetParent(mi.hwndSubMenu, hwndMenu, FALSE);
     1542      WinSetWindowUShort(mi.hwndSubMenu, QWS_ID, IDM_VIEWSMENU);
     1543      mi.afStyle = MIS_SUBMENU;
     1544      ulStyle = WinQueryWindowULong(mi.hwndSubMenu, QWL_STYLE);
     1545      ulStyle &= -WS_SAVEBITS;
     1546      ulStyle |= MS_POPUP | WS_CLIPSIBLINGS | WS_SAVEBITS;
     1547      WinSetWindowULong(mi.hwndSubMenu, QWL_STYLE, ulStyle);
     1548      WinSendMsg(hwndMenu, MM_SETITEM, MPFROM2SHORT(0, TRUE), MPFROMP(&mi));
     1549    }
     1550    break;
     1551  }
     1552}
     1553
     1554HWND CheckMenu(HWND * hwndMenu, USHORT id)
     1555{
     1556  /* load and adjust menus as required */
     1557  if (!*hwndMenu || !WinIsWindow((HAB) 0, *hwndMenu)) {
     1558    *hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id);
     1559    if (hwndMenu == &DirMenu) {
     1560      WinSetWindowUShort(DirMenu, QWS_ID, IDM_FILESMENU);
     1561      SetConditionalCascade(DirMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
     1562      SetConditionalCascade(DirMenu, IDM_COPYMENU, IDM_COPY);
     1563      SetConditionalCascade(DirMenu, IDM_MOVEMENU, IDM_MOVE);
     1564      SetConditionalCascade(DirMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
     1565      SetConditionalCascade(DirMenu, IDM_VIEWSUBMENU, IDM_INFO);
     1566      SetConditionalCascade(DirMenu, IDM_EDITSUBMENU, IDM_ATTRS);
     1567      SetConditionalCascade(DirMenu, IDM_DELETESUBMENU,
     1568                            (fDefaultDeletePerm) ? IDM_PERMDELETE :
     1569                            IDM_DELETE);
     1570      SetConditionalCascade(DirMenu, IDM_MISCSUBMENU, IDM_SIZES);
     1571      SetConditionalCascade(DirMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
     1572      if (fWorkPlace) {
     1573        WinSendMsg(DirMenu, MM_DELETEITEM,
     1574                   MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
     1575        WinSendMsg(DirMenu, MM_DELETEITEM,
     1576                   MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
     1577      }
     1578    }
     1579    else if (hwndMenu == &TreeMenu) {
     1580      WinSetWindowUShort(TreeMenu, QWS_ID, IDM_FILESMENU);
     1581      SetConditionalCascade(TreeMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
     1582      SetConditionalCascade(TreeMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
     1583      SetConditionalCascade(TreeMenu, IDM_EDITSUBMENU, IDM_ATTRS);
     1584      SetConditionalCascade(TreeMenu, IDM_EXPANDSUBMENU, IDM_EXPAND);
     1585      SetConditionalCascade(TreeMenu, IDM_MISCSUBMENU, IDM_SIZES);
     1586      SetConditionalCascade(TreeMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
     1587      if (fWorkPlace) {
     1588        WinSendMsg(TreeMenu, MM_DELETEITEM,
     1589                   MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
     1590        WinSendMsg(TreeMenu, MM_DELETEITEM,
     1591                   MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
     1592      }
     1593    }
     1594    else if (hwndMenu == &ArcMenu) {
     1595      WinSetWindowUShort(ArcMenu, QWS_ID, IDM_FILESMENU);
     1596      SetConditionalCascade(ArcMenu, IDM_EXTRACTSUBMENU, IDM_EXTRACT);
     1597      SetConditionalCascade(ArcMenu, IDM_EDITSUBMENU, IDM_EDIT);
     1598      SetConditionalCascade(ArcMenu, IDM_VIEWSUBMENU, IDM_VIEW);
     1599      if (fWorkPlace)
     1600        WinSendMsg(ArcMenu, MM_DELETEITEM,
     1601                   MPFROM2SHORT(IDM_FOLDERAFTEREXTRACT, TRUE), MPVOID);
     1602    }
     1603    else if (hwndMenu == &FileMenu) {
     1604      WinSetWindowUShort(FileMenu, QWS_ID, IDM_FILESMENU);
     1605      SetConditionalCascade(FileMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
     1606      SetConditionalCascade(FileMenu, IDM_COPYMENU, IDM_COPY);
     1607      SetConditionalCascade(FileMenu, IDM_MOVEMENU, IDM_MOVE);
     1608      SetConditionalCascade(FileMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
     1609      SetConditionalCascade(FileMenu, IDM_VIEWSUBMENU, IDM_VIEW);
     1610      SetConditionalCascade(FileMenu, IDM_EDITSUBMENU, IDM_EDIT);
     1611      SetConditionalCascade(FileMenu, IDM_COLLECTMENU, IDM_COLLECT);
     1612      SetConditionalCascade(FileMenu, IDM_DELETESUBMENU,
     1613                            (fDefaultDeletePerm) ? IDM_PERMDELETE :
     1614                            IDM_DELETE);
     1615      SetConditionalCascade(FileMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
     1616      SetConditionalCascade(FileMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
     1617      if (fWorkPlace) {
     1618        WinSendMsg(FileMenu, MM_DELETEITEM,
     1619                   MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
     1620        WinSendMsg(FileMenu, MM_DELETEITEM,
     1621                   MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
     1622      }
     1623    }
     1624    else if (hwndMenu == &DirCnrMenu) {
     1625      WinSetWindowUShort(DirCnrMenu, QWS_ID, IDM_VIEWSMENU);
     1626      SetConditionalCascade(DirCnrMenu, IDM_MISCSUBMENU, IDM_SIZES);
     1627      SetConditionalCascade(DirCnrMenu, IDM_OPENSUBMENU, IDM_OPENSETTINGSME);
     1628      if (fWorkPlace)
     1629        WinSendMsg(DirCnrMenu, MM_DELETEITEM,
     1630                   MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
     1631    }
     1632    else if (hwndMenu == &TreeCnrMenu)
     1633      WinSetWindowUShort(TreeCnrMenu, QWS_ID, IDM_VIEWSMENU);
     1634    else if (hwndMenu == &ArcCnrMenu) {
     1635      WinSetWindowUShort(ArcCnrMenu, QWS_ID, IDM_VIEWSMENU);
     1636      SetConditionalCascade(ArcCnrMenu, IDM_EXTRACTSUBMENU, IDM_ARCEXTRACT);
     1637      if (fWorkPlace)
     1638        WinSendMsg(ArcCnrMenu, MM_DELETEITEM,
     1639                   MPFROM2SHORT(IDM_FOLDERAFTEREXTRACT, TRUE), MPVOID);
     1640    }
     1641    else if (hwndMenu == &CollectorCnrMenu) {
     1642      WinSetWindowUShort(CollectorCnrMenu, QWS_ID, IDM_VIEWSMENU);
     1643      SetConditionalCascade(CollectorCnrMenu, IDM_COLLECTMENU,
     1644                            IDM_COLLECTFROMCLIP);
     1645    }
     1646    else if (hwndMenu == &CollectorFileMenu) {
     1647      WinSetWindowUShort(CollectorFileMenu, QWS_ID, IDM_FILESMENU);
     1648      SetConditionalCascade(CollectorFileMenu, IDM_COMMANDSMENU,
     1649                            IDM_DOITYOURSELF);
     1650      SetConditionalCascade(CollectorFileMenu, IDM_COPYMENU, IDM_COPY);
     1651      SetConditionalCascade(CollectorFileMenu, IDM_MOVEMENU, IDM_MOVE);
     1652      SetConditionalCascade(CollectorFileMenu, IDM_SAVESUBMENU,
     1653                            IDM_SAVETOCLIP);
     1654      SetConditionalCascade(CollectorFileMenu, IDM_VIEWSUBMENU, IDM_VIEW);
     1655      SetConditionalCascade(CollectorFileMenu, IDM_EDITSUBMENU, IDM_EDIT);
     1656      SetConditionalCascade(CollectorFileMenu, IDM_DELETESUBMENU,
     1657                            (fDefaultDeletePerm) ? IDM_PERMDELETE :
     1658                            IDM_DELETE);
     1659      SetConditionalCascade(CollectorFileMenu, IDM_OPENSUBMENU,
     1660                            IDM_OPENDEFAULT);
     1661      SetConditionalCascade(CollectorFileMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
     1662      if (fWorkPlace) {
     1663        WinSendMsg(CollectorFileMenu, MM_DELETEITEM,
     1664                   MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
     1665        WinSendMsg(CollectorFileMenu, MM_DELETEITEM,
     1666                   MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
     1667      }
     1668    }
     1669    else if (hwndMenu == &CollectorDirMenu) {
     1670      WinSetWindowUShort(CollectorDirMenu, QWS_ID, IDM_FILESMENU);
     1671      SetConditionalCascade(CollectorDirMenu, IDM_COMMANDSMENU,
     1672                            IDM_DOITYOURSELF);
     1673      SetConditionalCascade(CollectorDirMenu, IDM_COPYMENU, IDM_COPY);
     1674      SetConditionalCascade(CollectorDirMenu, IDM_MOVEMENU, IDM_MOVE);
     1675      SetConditionalCascade(CollectorDirMenu, IDM_SAVESUBMENU,
     1676                            IDM_SAVETOCLIP);
     1677      SetConditionalCascade(CollectorDirMenu, IDM_VIEWSUBMENU, IDM_INFO);
     1678      SetConditionalCascade(CollectorDirMenu, IDM_EDITSUBMENU, IDM_ATTRS);
     1679      SetConditionalCascade(CollectorDirMenu, IDM_DELETESUBMENU,
     1680                            (fDefaultDeletePerm) ? IDM_PERMDELETE :
     1681                            IDM_DELETE);
     1682      SetConditionalCascade(CollectorDirMenu, IDM_MISCSUBMENU, IDM_SIZES);
     1683      SetConditionalCascade(CollectorDirMenu, IDM_OPENSUBMENU,
     1684                            IDM_OPENWINDOW);
     1685      if (fWorkPlace) {
     1686        WinSendMsg(CollectorDirMenu, MM_DELETEITEM,
     1687                   MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
     1688        WinSendMsg(CollectorDirMenu, MM_DELETEITEM,
     1689                   MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
     1690      }
     1691    }
     1692    else if (hwndMenu == &MainPopupMenu) {
     1693      WinSetWindowUShort(MainPopupMenu, QWS_ID, IDM_MAINPOPUP);
     1694      SetConditionalCascade(MainPopupMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
     1695      SetConditionalCascade(MainPopupMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
     1696    }
     1697  }
     1698  return *hwndMenu;
     1699}
     1700
     1701SHORT AddToListboxBottom(HWND hwnd, CHAR * str)
     1702{
     1703  SHORT ln;
     1704
     1705  ln = (SHORT) WinSendMsg(hwnd, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0),
     1706                          MPFROMP(str));
     1707  if (ln)
     1708    WinSendMsg(hwnd, LM_SELECTITEM, MPFROM2SHORT(ln, 0), MPVOID);
     1709  return ln;
     1710}
     1711
     1712VOID SetSysMenu(HWND hwndSysMenu)
     1713{
     1714  CHAR s[128], *p;
     1715
     1716  if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
     1717                 MPFROM2SHORT(SC_RESTORE, 128), MPFROMP(s))) {
     1718    p = strchr(s, '\t');
     1719    if (p) {
     1720      p++;
     1721      strcpy(p, "Ctrl+Alt+F5");
     1722      WinSetMenuItemText(hwndSysMenu, SC_RESTORE, s);
     1723    }
     1724  }
     1725  if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
     1726                 MPFROM2SHORT(SC_CLOSE, 128), MPFROMP(s))) {
     1727    p = strchr(s, '\t');
     1728    if (p) {
     1729      p++;
     1730      strcpy(p, "Ctrl+Alt+F4");
     1731      WinSetMenuItemText(hwndSysMenu, SC_CLOSE, s);
     1732    }
     1733  }
     1734  if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
     1735                 MPFROM2SHORT(SC_MOVE, 128), MPFROMP(s))) {
     1736    p = strchr(s, '\t');
     1737    if (p) {
     1738      p++;
     1739      strcpy(p, "Ctrl+Alt+F7");
     1740      WinSetMenuItemText(hwndSysMenu, SC_MOVE, s);
     1741    }
     1742  }
     1743  if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
     1744                 MPFROM2SHORT(SC_SIZE, 128), MPFROMP(s))) {
     1745    p = strchr(s, '\t');
     1746    if (p) {
     1747      p++;
     1748      strcpy(p, "Ctrl+Alt+F8");
     1749      WinSetMenuItemText(hwndSysMenu, SC_SIZE, s);
     1750    }
     1751  }
     1752  if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
     1753                 MPFROM2SHORT(SC_MINIMIZE, 128), MPFROMP(s))) {
     1754    p = strchr(s, '\t');
     1755    if (p) {
     1756      p++;
     1757      strcpy(p, "Ctrl+Alt+F9");
     1758      WinSetMenuItemText(hwndSysMenu, SC_MINIMIZE, s);
     1759    }
     1760  }
     1761  if (WinSendMsg(hwndSysMenu,
     1762                 MM_QUERYITEMTEXT,
     1763                 MPFROM2SHORT(SC_MAXIMIZE, 128), MPFROMP(s))) {
     1764    p = strchr(s, '\t');
     1765    if (p) {
     1766      p++;
     1767      strcpy(p, "Ctrl+Alt+F10");
     1768      WinSetMenuItemText(hwndSysMenu, SC_MAXIMIZE, s);
     1769    }
     1770  }
     1771  if (WinSendMsg(hwndSysMenu,
     1772                 MM_QUERYITEMTEXT, MPFROM2SHORT(SC_HIDE, 128), MPFROMP(s))) {
     1773    p = strchr(s, '\t');
     1774    if (p) {
     1775      p++;
     1776      strcpy(p, "Ctrl+Alt+F11");
     1777      WinSetMenuItemText(hwndSysMenu, SC_HIDE, s);
     1778    }
     1779  }
     1780}
     1781
     1782VOID LoadLibPath(CHAR * str, LONG len)
     1783{
     1784  ULONG ver[2];
     1785  CHAR configsys[] = "C:\\CONFIG.SYS";
     1786  static CHAR var[8192], beg[16384], end[16384];
     1787  BOOL warp;
     1788  FILE *fp;
     1789  PFN DQELIBPATH = NULL;
     1790  HMODULE hmod;
     1791
     1792  if (str && len) {
     1793    *str = 0;
     1794    if (DosQuerySysInfo(QSV_BOOT_DRIVE,
     1795                        QSV_BOOT_DRIVE, (PVOID) ver, (ULONG) sizeof(ULONG)))
     1796      ver[0] = 3L;
     1797    *configsys = (CHAR) ver[0] + '@';
     1798    if (!DosQuerySysInfo(QSV_VERSION_MAJOR,
     1799                         QSV_VERSION_MINOR,
     1800                         (PVOID) ver, (ULONG) sizeof(ver)) && ver[1] >= 30)
     1801      warp = TRUE;
     1802    *var = *beg = *end = 0;
     1803    if (warp) {
     1804      if (!DosLoadModule(var, sizeof(var), "DOSCALL1.DLL", &hmod)) {
     1805        if (!DosQueryProcAddr(hmod,
     1806                              ORD_DOS32QUERYEXTLIBPATH,
     1807                              NULL, (PFN *) & DQELIBPATH)) {
     1808          DQELIBPATH(beg, BEGIN_LIBPATH);
     1809          DQELIBPATH(end, END_LIBPATH);
    16311810        }
    1632         else if (*viewer)
    1633         {
    1634 
    1635             CHAR *list[2];
    1636 
    1637             list[0] = filename;
    1638             list[1] = NULL;
    1639             ExecOnList(hwnd, viewer, WINDOWED | SEPARATE |
    1640                        ((fViewChild) ? CHILD : 0),
    1641                        NULL, list, NULL);
    1642             return;
     1811        DosFreeModule(hmod);
     1812      }
     1813      *var = 0;
     1814    }
     1815    fp = xfopen(configsys, "r", pszSrcFile, __LINE__);
     1816    if (fp) {
     1817      while (!feof(fp)) {
     1818        if (!fgets(var, 8192, fp))
     1819          break;
     1820        var[8191] = 0;
     1821        bstripcr(var);
     1822        if (!strnicmp(var, "LIBPATH=", 8)) {
     1823          memmove(var, var + 8, strlen(var + 8) + 1);
     1824          lstrip(var);
     1825          break;
    16431826        }
    1644         StartMLEEditor(HWND_DESKTOP, 5, filename, (HWND) 0);
    1645     }
    1646 }
    1647 
    1648 VOID QuickEdit(HWND hwnd, CHAR * filename)
    1649 {
    1650     if (filename && IsFile(filename) == 1)
    1651     {
    1652         if (TestBinary(filename) && *bined)
    1653         {
    1654 
    1655             CHAR *list[2];
    1656 
    1657             list[0] = filename;
    1658             list[1] = NULL;
    1659             ExecOnList(hwnd, bined, WINDOWED | SEPARATE, NULL, list, NULL);
    1660             return;
     1827      }
     1828      fclose(fp);
     1829    }
     1830    strncpy(str, beg, len);
     1831    strncat(str, var, len - strlen(str));
     1832    strncat(str, end, len - strlen(str));
     1833    str[len - 1] = 0;
     1834  }
     1835}
     1836
     1837void SetViewMenu(HWND hwndMenu, ULONG flWindowAttr)
     1838{
     1839  WinCheckMenuItem(hwndMenu, IDM_MINIICONS, ((flWindowAttr & CV_MINI)));
     1840  WinCheckMenuItem(hwndMenu, IDM_TEXT, ((flWindowAttr & CV_TEXT)));
     1841  WinCheckMenuItem(hwndMenu, IDM_ICON, ((flWindowAttr & CV_ICON) &&
     1842                                        !(flWindowAttr & CV_TREE)));
     1843  WinCheckMenuItem(hwndMenu, IDM_TREEVIEW, ((flWindowAttr & CV_TREE)));
     1844  WinCheckMenuItem(hwndMenu, IDM_DETAILS, ((flWindowAttr & CV_DETAIL)));
     1845  WinCheckMenuItem(hwndMenu, IDM_NAME, ((flWindowAttr & CV_NAME)));
     1846}
     1847
     1848void SaySort(HWND hwnd, INT sortflags, BOOL archive)
     1849{
     1850  char *s = NULL;
     1851
     1852  s = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
     1853  if (s) {
     1854    sprintf(s, "S:%s%s",
     1855            (sortflags & SORT_REVERSE) ? "^" : NullStr,
     1856            (sortflags & SORT_FIRSTEXTENSION) ? GetPString(IDS_FIRSTX) :
     1857            (sortflags & SORT_LASTEXTENSION) ? GetPString(IDS_LASTX) :
     1858            (sortflags & SORT_SIZE) ? "Size" :
     1859            (sortflags & SORT_EASIZE) ? (archive ==
     1860                                         0) ? GetPString(IDS_EASIZE) :
     1861            GetPString(IDS_CSIZE) : (sortflags & SORT_LWDATE) ? (archive
     1862                                                                 ==
     1863                                                                 0) ?
     1864            GetPString(IDS_LWDATE) : GetPString(IDS_DATE) : (sortflags &
     1865                                                             SORT_LADATE)
     1866            ? GetPString(IDS_LADATE) : (sortflags & SORT_CRDATE) ?
     1867            GetPString(IDS_CRDATE) : (sortflags & SORT_PATHNAME) ?
     1868            GetPString(IDS_PATH) : (sortflags & SORT_NOSORT) ?
     1869            GetPString(IDS_NONE) : (sortflags & SORT_SUBJECT) ?
     1870            GetPString(IDS_SUBJ) : GetPString(IDS_NAME));
     1871    WinSetWindowText(hwnd, s);
     1872    free(s);
     1873  }
     1874}
     1875
     1876void SayView(HWND hwnd, ULONG flWindowAttr)
     1877{
     1878  char *s = NULL;
     1879
     1880  s = xmalloc(CCHMAXPATH, pszSrcFile, __LINE__);
     1881  if (s) {
     1882    sprintf(s, "V:%s%s",
     1883            (flWindowAttr & CV_TREE) ? GetPString(IDS_TREE) :
     1884            (flWindowAttr & CV_NAME) ? GetPString(IDS_NAME) :
     1885            (flWindowAttr & CV_DETAIL) ? GetPString(IDS_DETAIL) :
     1886            (flWindowAttr & CV_TEXT) ? GetPString(IDS_TEXT) :
     1887            GetPString(IDS_ICON),
     1888            ((flWindowAttr & CV_MINI) &&
     1889             !(flWindowAttr & CV_TEXT)) ? GetPString(IDS_MINI) : NullStr);
     1890    WinSetWindowText(hwnd, s);
     1891    free(s);
     1892  }
     1893}
     1894
     1895void SayFilter(HWND hwnd, MASK * mask, BOOL archive)
     1896{
     1897  char *s = NULL;
     1898
     1899  s = xmalloc(CCHMAXPATH * 2, pszSrcFile, __LINE__);
     1900  if (s) {
     1901    sprintf(s, "F:%s%s",
     1902            mask->szMask,
     1903            (!archive && (mask->attrFile != ALLATTRS ||
     1904                          mask->antiattr != 0)) ? " " : NullStr,
     1905            (!archive && (mask->attrFile != ALLATTRS ||
     1906                          mask->antiattr !=
     1907                          0)) ? GetPString(IDS_ATTRTEXT) : NullStr);
     1908    if (!s[2])
     1909      sprintf(s, "F:%s", GetPString(IDS_ALLTEXT));
     1910    WinSetWindowText(hwnd, s);
     1911    free(s);
     1912  }
     1913}
     1914
     1915char *GetCmdSpec(BOOL dos)
     1916{
     1917  char *cmspec;
     1918
     1919  if (!dos) {
     1920    cmspec = getenv("OS2_SHELL");
     1921    if (!cmspec)
     1922      cmspec = getenv("COMSPEC");
     1923    if (!cmspec)
     1924      cmspec = "CMD.EXE";
     1925  }
     1926  else {
     1927    cmspec = getenv("DOS_SHELL");
     1928    if (!cmspec)
     1929      cmspec = "COMMAND.COM";
     1930  }
     1931  return cmspec;
     1932}
     1933
     1934void Broadcast(HAB hab, HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
     1935{
     1936  if (hwndMain)
     1937    WinBroadcastMsg(hwndMain, msg, mp1, mp2, BMSG_SEND | BMSG_FRAMEONLY);
     1938  if (hwnd &&
     1939      hwnd != HWND_DESKTOP &&
     1940      hwnd != hwndMain &&
     1941      hwnd != WinQueryDesktopWindow(hab, NULLHANDLE) &&
     1942      WinIsWindow(hab, hwnd) && (!hwndMain || !WinIsChild(hwnd, hwndMain)))
     1943    WinSendMsg(hwnd, msg, mp1, mp2);
     1944}
     1945
     1946void SetupWinList(HWND hwndMenu, HWND hwndTop, HWND hwndFrame)
     1947{
     1948  /*
     1949   * add switchlist entries to end of pulldown menu
     1950   */
     1951
     1952  SHORT sItemCount, x = 0, y = 0;
     1953  MENUITEM mi;
     1954
     1955  sItemCount = (SHORT) WinSendMsg(hwndMenu,
     1956                                  MM_QUERYITEMCOUNT, MPVOID, MPVOID);
     1957
     1958  /* clean out old additions */
     1959  while ((SHORT) WinSendMsg(hwndMenu,
     1960                            MM_DELETEITEM,
     1961                            MPFROM2SHORT(IDM_SWITCHSTART + x++,
     1962                                         TRUE), MPVOID) < sItemCount)
     1963    sItemCount--;
     1964  x = 0;
     1965  while ((SHORT) WinSendMsg(hwndMenu,
     1966                            MM_DELETEITEM,
     1967                            MPFROM2SHORT(IDM_WINDOWSTART + x++,
     1968                                         TRUE), MPVOID) < sItemCount)
     1969    sItemCount--;
     1970
     1971  x = 0;
     1972  if (hwndTop) {
     1973
     1974    char wtext[CCHMAXPATH + 8];
     1975    HENUM henum;
     1976    HWND hwndChild;
     1977
     1978    /* add children of the main FM/2 client */
     1979    henum = WinBeginEnumWindows(hwndTop);
     1980    memset(&mi, 0, sizeof(mi));
     1981    while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
     1982      if (WinQueryWindowUShort(hwndChild, QWS_ID) && hwndChild != hwndFrame) {
     1983        *wtext = 0;
     1984        WinQueryWindowText(hwndChild, CCHMAXPATH + 8, wtext);
     1985        if (*wtext) {
     1986          wtext[CCHMAXPATH + 7] = 0;
     1987          mi.afStyle = MIS_TEXT;
     1988          if (!((x + sItemCount) % 28))
     1989            mi.afStyle |= MIS_BREAK;
     1990          mi.id = IDM_WINDOWSTART + x;
     1991          mi.iPosition = MIT_END;
     1992          if ((SHORT) WinSendMsg(hwndMenu,
     1993                                 MM_INSERTITEM,
     1994                                 MPFROMP(&mi), MPFROMP(wtext)) >= 0)
     1995            x++;
    16611996        }
    1662         else if (*editor)
    1663         {
    1664 
    1665             CHAR *list[2];
    1666 
    1667             list[0] = filename;
    1668             list[1] = NULL;
    1669             ExecOnList(hwnd, editor, WINDOWED | SEPARATE, NULL, list, NULL);
    1670             return;
     1997      }
     1998    }
     1999    WinEndEnumWindows(henum);
     2000  }
     2001
     2002  /* add external FM/2 windows */
     2003  {
     2004    PSWBLOCK pswb;
     2005    ULONG ulSize, ulcEntries;
     2006    HWND hwndTopFrame;
     2007    register INT i;
     2008
     2009    hwndTopFrame = (hwndTop) ? WinQueryWindow(hwndTop, QW_PARENT) : (HWND) 0;
     2010    /* Get the switch list information */
     2011    x = 0;
     2012    ulcEntries = WinQuerySwitchList(0, NULL, 0);
     2013    ulSize = sizeof(SWBLOCK) + sizeof(HSWITCH) + (ulcEntries + 4L) *
     2014      (LONG) sizeof(SWENTRY);
     2015    /* Allocate memory for list */
     2016    pswb = xmalloc(ulSize, pszSrcFile, __LINE__);
     2017    if (pswb) {
     2018      /* Put the info in the list */
     2019      ulcEntries = WinQuerySwitchList(0, pswb, ulSize - sizeof(SWENTRY));
     2020      /* do the dirty deed */
     2021      memset(&mi, 0, sizeof(mi));
     2022      for (i = 0; i < pswb->cswentry; i++) {
     2023        if (pswb->aswentry[i].swctl.uchVisibility == SWL_VISIBLE &&
     2024            pswb->aswentry[i].swctl.fbJump == SWL_JUMPABLE &&
     2025            (pswb->aswentry[i].swctl.idProcess != mypid ||
     2026             !hwndFrame ||
     2027             pswb->aswentry[i].swctl.hwnd != hwndFrame) &&
     2028            (pswb->aswentry[i].swctl.idProcess != mypid ||
     2029             !hwndTopFrame ||
     2030             pswb->aswentry[i].swctl.hwnd != hwndTopFrame ||
     2031             !WinIsChild(hwndFrame, hwndTop))) {
     2032          if (!strnicmp(pswb->aswentry[i].swctl.szSwtitle, "AV/2", 4)
     2033              || !stricmp(pswb->aswentry[i].swctl.szSwtitle, "File Manager/2")
     2034              || !stricmp(pswb->aswentry[i].swctl.szSwtitle, "Collector")
     2035              || !strnicmp(pswb->aswentry[i].swctl.szSwtitle, "VTree", 5)
     2036              || !strnicmp(pswb->aswentry[i].swctl.szSwtitle, "VDir", 4)
     2037              || !strnicmp(pswb->aswentry[i].swctl.szSwtitle, FM2Str, 4)) {
     2038            mi.afStyle = MIS_TEXT;
     2039            if (x && !(x % 28))
     2040              mi.afStyle |= MIS_BREAK;
     2041            mi.id = IDM_SWITCHSTART + y;
     2042            mi.iPosition = MIT_END;
     2043            switches[y] = pswb->aswentry[i].hswitch;
     2044            if ((SHORT) WinSendMsg(hwndMenu,
     2045                                   MM_INSERTITEM,
     2046                                   MPFROMP(&mi),
     2047                                   MPFROMP(pswb->aswentry[i].
     2048                                           swctl.szSwtitle)) >= 0) {
     2049              y++;
     2050              x++;
     2051            }
     2052          }
    16712053        }
    1672         StartMLEEditor(HWND_DESKTOP, 4, filename, (HWND) 0);
    1673     }
    1674 }
    1675 #endif
    1676 
    1677 VOID PortholeInit(HWND hwndNew, MPARAM mp1, MPARAM mp2)
    1678 {
    1679     static HWND DefMenu = (HWND) 0;
    1680     HWND hwndMenu = (HWND) mp2;
    1681 
    1682     {
    1683         ULONG style;
    1684 
    1685         style = WinQueryWindowULong(hwndMenu, QWL_STYLE);
    1686         if (!(style & MS_ACTIONBAR))
    1687             return;
    1688     }
    1689 
    1690     switch (SHORT1FROMMP(mp1))
    1691     {
    1692     case 0:
    1693         {
    1694             HWND hwndNow;
    1695             MENUITEM mi;
    1696             ULONG ulStyle;
    1697 
    1698             memset(&mi, 0, sizeof(mi));
    1699             mi.iPosition = MIT_END;
    1700             mi.afStyle = MIS_TEXT;
    1701             WinSendMsg(hwndMenu, MM_QUERYITEM,
    1702                        MPFROM2SHORT(IDM_FILESMENU, TRUE), MPFROMP(&mi));
    1703             if (!DefMenu)
    1704                 DefMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, DEFMENU);
    1705             hwndNow = mi.hwndSubMenu;
    1706             mi.hwndSubMenu = hwndNew;
    1707             if (!mi.hwndSubMenu)
    1708                 mi.hwndSubMenu = DefMenu;
    1709             WinSetParent(hwndNow, WinQueryObjectWindow(HWND_DESKTOP), FALSE);
    1710             WinSetOwner(hwndNow, WinQueryObjectWindow(HWND_DESKTOP));
    1711             WinSetOwner(mi.hwndSubMenu, hwndMenu);
    1712             WinSetParent(mi.hwndSubMenu, hwndMenu, FALSE);
    1713             WinSetWindowUShort(mi.hwndSubMenu, QWS_ID, IDM_FILESMENU);
    1714             mi.afStyle = MIS_SUBMENU;
    1715             ulStyle = WinQueryWindowULong(mi.hwndSubMenu, QWL_STYLE);
    1716             ulStyle &= -WS_SAVEBITS;
    1717             ulStyle |= MS_POPUP | WS_CLIPSIBLINGS | WS_SAVEBITS;
    1718             WinSetWindowULong(mi.hwndSubMenu, QWL_STYLE, ulStyle);
    1719             WinSendMsg(hwndMenu, MM_SETITEM, MPFROM2SHORT(0, TRUE), MPFROMP(&mi));
    1720         }
    1721         break;
    1722 
    1723     case 1:
    1724         {
    1725             HWND hwndNow;
    1726             MENUITEM mi;
    1727             ULONG ulStyle;
    1728 
    1729             memset(&mi, 0, sizeof(mi));
    1730             mi.iPosition = MIT_END;
    1731             mi.afStyle = MIS_TEXT;
    1732             WinSendMsg(hwndMenu, MM_QUERYITEM,
    1733                        MPFROM2SHORT(IDM_VIEWSMENU, TRUE), MPFROMP(&mi));
    1734             if (!DefMenu)
    1735                 DefMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, DEFMENU);
    1736             hwndNow = mi.hwndSubMenu;
    1737             mi.hwndSubMenu = hwndNew;
    1738             if (!mi.hwndSubMenu)
    1739                 mi.hwndSubMenu = DefMenu;
    1740             WinSetParent(hwndNow, WinQueryObjectWindow(HWND_DESKTOP), FALSE);
    1741             WinSetOwner(hwndNow, WinQueryObjectWindow(HWND_DESKTOP));
    1742             WinSetOwner(mi.hwndSubMenu, hwndMenu);
    1743             WinSetParent(mi.hwndSubMenu, hwndMenu, FALSE);
    1744             WinSetWindowUShort(mi.hwndSubMenu, QWS_ID, IDM_VIEWSMENU);
    1745             mi.afStyle = MIS_SUBMENU;
    1746             ulStyle = WinQueryWindowULong(mi.hwndSubMenu, QWL_STYLE);
    1747             ulStyle &= -WS_SAVEBITS;
    1748             ulStyle |= MS_POPUP | WS_CLIPSIBLINGS | WS_SAVEBITS;
    1749             WinSetWindowULong(mi.hwndSubMenu, QWL_STYLE, ulStyle);
    1750             WinSendMsg(hwndMenu, MM_SETITEM, MPFROM2SHORT(0, TRUE), MPFROMP(&mi));
    1751         }
    1752         break;
    1753     }
    1754 }
    1755 
    1756 HWND CheckMenu(HWND * hwndMenu, USHORT id)
    1757 {
    1758     /* load and adjust menus as required */
    1759 
    1760     if (!*hwndMenu || !WinIsWindow((HAB) 0, *hwndMenu))
    1761     {
    1762         *hwndMenu = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id);
    1763         if (hwndMenu == &DirMenu)
    1764         {
    1765             WinSetWindowUShort(DirMenu, QWS_ID, IDM_FILESMENU);
    1766             SetConditionalCascade(DirMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
    1767             SetConditionalCascade(DirMenu, IDM_COPYMENU, IDM_COPY);
    1768             SetConditionalCascade(DirMenu, IDM_MOVEMENU, IDM_MOVE);
    1769             SetConditionalCascade(DirMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
    1770             SetConditionalCascade(DirMenu, IDM_VIEWSUBMENU, IDM_INFO);
    1771             SetConditionalCascade(DirMenu, IDM_EDITSUBMENU, IDM_ATTRS);
    1772             SetConditionalCascade(DirMenu, IDM_DELETESUBMENU, (fDefaultDeletePerm) ?
    1773                                   IDM_PERMDELETE :
    1774                                   IDM_DELETE);
    1775             SetConditionalCascade(DirMenu, IDM_MISCSUBMENU, IDM_SIZES);
    1776             SetConditionalCascade(DirMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
    1777             if (fWorkPlace)
    1778             {
    1779                 WinSendMsg(DirMenu, MM_DELETEITEM,
    1780                            MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
    1781                 WinSendMsg(DirMenu, MM_DELETEITEM,
    1782                            MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
     2054      }
     2055      numswitches = y;
     2056      free(pswb);
     2057      DosPostEventSem(CompactSem);
     2058    }
     2059  }
     2060}
     2061
     2062BOOL SwitchCommand(HWND hwndMenu, USHORT cmd)
     2063{
     2064  BOOL ret = FALSE;
     2065
     2066  if (hwndMain && hwndMenu && cmd >= IDM_WINDOWSTART && cmd < IDM_SWITCHSTART) {
     2067    /*
     2068     * select a child window (of client)
     2069     */
     2070
     2071    MENUITEM mi;
     2072    HWND hwndSubMenu = (HWND) 0, hwndChild;
     2073    CHAR s[CCHMAXPATH + 8];
     2074
     2075    if (WinQueryWindowUShort(hwndMenu, QWS_ID) != IDM_WINDOWSMENU) {
     2076      memset(&mi, 0, sizeof(mi));
     2077      mi.iPosition = MIT_END;
     2078      mi.afStyle = MIS_TEXT;
     2079      if (WinSendMsg(hwndMenu,
     2080                     MM_QUERYITEM,
     2081                     MPFROM2SHORT(IDM_WINDOWSMENU, TRUE), MPFROMP(&mi)))
     2082        hwndSubMenu = mi.hwndSubMenu;
     2083    }
     2084    else
     2085      hwndSubMenu = hwndMenu;
     2086    if (hwndSubMenu) {
     2087      *s = 0;
     2088      if (WinSendMsg(hwndSubMenu,
     2089                     MM_QUERYITEMTEXT,
     2090                     MPFROM2SHORT(cmd, CCHMAXPATH + 8), MPFROMP(s)) && *s) {
     2091
     2092        HENUM henum;
     2093        CHAR checkText[CCHMAXPATH + 8];
     2094        SWP swp;
     2095
     2096        s[CCHMAXPATH + 7] = 0;
     2097        henum = WinBeginEnumWindows(hwndMain);
     2098        while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE) {
     2099          if (WinQueryWindowUShort(hwndChild, QWS_ID)) {
     2100            *checkText = 0;
     2101            WinQueryWindowText(hwndChild, CCHMAXPATH + 8, checkText);
     2102            checkText[CCHMAXPATH + 7] = 0;
     2103            if (!stricmp(checkText, s)) {
     2104              if (WinQueryWindowPos(hwndChild, &swp)) {
     2105                if (swp.fl & (SWP_MINIMIZE | SWP_HIDE))
     2106                  WinSetWindowPos(hwndChild,
     2107                                  HWND_TOP,
     2108                                  0, 0, 0, 0, SWP_RESTORE | SWP_ZORDER);
     2109              }
     2110              WinSetActiveWindow(HWND_DESKTOP, hwndChild);
     2111              ret = TRUE;
     2112              break;
    17832113            }
    1784         }
    1785         else if (hwndMenu == &TreeMenu)
    1786         {
    1787             WinSetWindowUShort(TreeMenu, QWS_ID, IDM_FILESMENU);
    1788             SetConditionalCascade(TreeMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
    1789             SetConditionalCascade(TreeMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
    1790             SetConditionalCascade(TreeMenu, IDM_EDITSUBMENU, IDM_ATTRS);
    1791             SetConditionalCascade(TreeMenu, IDM_EXPANDSUBMENU, IDM_EXPAND);
    1792             SetConditionalCascade(TreeMenu, IDM_MISCSUBMENU, IDM_SIZES);
    1793             SetConditionalCascade(TreeMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
    1794             if (fWorkPlace)
    1795             {
    1796                 WinSendMsg(TreeMenu, MM_DELETEITEM,
    1797                            MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
    1798                 WinSendMsg(TreeMenu, MM_DELETEITEM,
    1799                            MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
    1800             }
    1801         }
    1802         else if (hwndMenu == &ArcMenu)
    1803         {
    1804             WinSetWindowUShort(ArcMenu, QWS_ID, IDM_FILESMENU);
    1805             SetConditionalCascade(ArcMenu, IDM_EXTRACTSUBMENU, IDM_EXTRACT);
    1806             SetConditionalCascade(ArcMenu, IDM_EDITSUBMENU, IDM_EDIT);
    1807             SetConditionalCascade(ArcMenu, IDM_VIEWSUBMENU, IDM_VIEW);
    1808             if (fWorkPlace)
    1809                 WinSendMsg(ArcMenu, MM_DELETEITEM,
    1810                         MPFROM2SHORT(IDM_FOLDERAFTEREXTRACT, TRUE), MPVOID);
    1811         }
    1812         else if (hwndMenu == &FileMenu)
    1813         {
    1814             WinSetWindowUShort(FileMenu, QWS_ID, IDM_FILESMENU);
    1815             SetConditionalCascade(FileMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
    1816             SetConditionalCascade(FileMenu, IDM_COPYMENU, IDM_COPY);
    1817             SetConditionalCascade(FileMenu, IDM_MOVEMENU, IDM_MOVE);
    1818             SetConditionalCascade(FileMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
    1819             SetConditionalCascade(FileMenu, IDM_VIEWSUBMENU, IDM_VIEW);
    1820             SetConditionalCascade(FileMenu, IDM_EDITSUBMENU, IDM_EDIT);
    1821             SetConditionalCascade(FileMenu, IDM_COLLECTMENU, IDM_COLLECT);
    1822             SetConditionalCascade(FileMenu, IDM_DELETESUBMENU, (fDefaultDeletePerm) ?
    1823                                   IDM_PERMDELETE :
    1824                                   IDM_DELETE);
    1825             SetConditionalCascade(FileMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
    1826             SetConditionalCascade(FileMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
    1827             if (fWorkPlace)
    1828             {
    1829                 WinSendMsg(FileMenu, MM_DELETEITEM,
    1830                            MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
    1831                 WinSendMsg(FileMenu, MM_DELETEITEM,
    1832                            MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
    1833             }
    1834         }
    1835         else if (hwndMenu == &DirCnrMenu)
    1836         {
    1837             WinSetWindowUShort(DirCnrMenu, QWS_ID, IDM_VIEWSMENU);
    1838             SetConditionalCascade(DirCnrMenu, IDM_MISCSUBMENU, IDM_SIZES);
    1839             SetConditionalCascade(DirCnrMenu, IDM_OPENSUBMENU, IDM_OPENSETTINGSME);
    1840             if (fWorkPlace)
    1841                 WinSendMsg(DirCnrMenu, MM_DELETEITEM,
    1842                            MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
    1843         }
    1844         else if (hwndMenu == &TreeCnrMenu)
    1845             WinSetWindowUShort(TreeCnrMenu, QWS_ID, IDM_VIEWSMENU);
    1846         else if (hwndMenu == &ArcCnrMenu)
    1847         {
    1848             WinSetWindowUShort(ArcCnrMenu, QWS_ID, IDM_VIEWSMENU);
    1849             SetConditionalCascade(ArcCnrMenu, IDM_EXTRACTSUBMENU, IDM_ARCEXTRACT);
    1850             if (fWorkPlace)
    1851                 WinSendMsg(ArcCnrMenu, MM_DELETEITEM,
    1852                         MPFROM2SHORT(IDM_FOLDERAFTEREXTRACT, TRUE), MPVOID);
    1853         }
    1854         else if (hwndMenu == &CollectorCnrMenu)
    1855         {
    1856             WinSetWindowUShort(CollectorCnrMenu, QWS_ID, IDM_VIEWSMENU);
    1857             SetConditionalCascade(CollectorCnrMenu, IDM_COLLECTMENU,
    1858                                   IDM_COLLECTFROMCLIP);
    1859         }
    1860         else if (hwndMenu == &CollectorFileMenu)
    1861         {
    1862             WinSetWindowUShort(CollectorFileMenu, QWS_ID, IDM_FILESMENU);
    1863             SetConditionalCascade(CollectorFileMenu, IDM_COMMANDSMENU,
    1864                                   IDM_DOITYOURSELF);
    1865             SetConditionalCascade(CollectorFileMenu, IDM_COPYMENU, IDM_COPY);
    1866             SetConditionalCascade(CollectorFileMenu, IDM_MOVEMENU, IDM_MOVE);
    1867             SetConditionalCascade(CollectorFileMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
    1868             SetConditionalCascade(CollectorFileMenu, IDM_VIEWSUBMENU, IDM_VIEW);
    1869             SetConditionalCascade(CollectorFileMenu, IDM_EDITSUBMENU, IDM_EDIT);
    1870             SetConditionalCascade(CollectorFileMenu, IDM_DELETESUBMENU, (fDefaultDeletePerm) ?
    1871                                   IDM_PERMDELETE :
    1872                                   IDM_DELETE);
    1873             SetConditionalCascade(CollectorFileMenu, IDM_OPENSUBMENU, IDM_OPENDEFAULT);
    1874             SetConditionalCascade(CollectorFileMenu, IDM_OBJECTSUBMENU, IDM_SHADOW);
    1875             if (fWorkPlace)
    1876             {
    1877                 WinSendMsg(CollectorFileMenu, MM_DELETEITEM,
    1878                            MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
    1879                 WinSendMsg(CollectorFileMenu, MM_DELETEITEM,
    1880                            MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
    1881             }
    1882         }
    1883         else if (hwndMenu == &CollectorDirMenu)
    1884         {
    1885             WinSetWindowUShort(CollectorDirMenu, QWS_ID, IDM_FILESMENU);
    1886             SetConditionalCascade(CollectorDirMenu, IDM_COMMANDSMENU,
    1887                                   IDM_DOITYOURSELF);
    1888             SetConditionalCascade(CollectorDirMenu, IDM_COPYMENU, IDM_COPY);
    1889             SetConditionalCascade(CollectorDirMenu, IDM_MOVEMENU, IDM_MOVE);
    1890             SetConditionalCascade(CollectorDirMenu, IDM_SAVESUBMENU, IDM_SAVETOCLIP);
    1891             SetConditionalCascade(CollectorDirMenu, IDM_VIEWSUBMENU, IDM_INFO);
    1892             SetConditionalCascade(CollectorDirMenu, IDM_EDITSUBMENU, IDM_ATTRS);
    1893             SetConditionalCascade(CollectorDirMenu, IDM_DELETESUBMENU, (fDefaultDeletePerm) ?
    1894                                   IDM_PERMDELETE :
    1895                                   IDM_DELETE);
    1896             SetConditionalCascade(CollectorDirMenu, IDM_MISCSUBMENU, IDM_SIZES);
    1897             SetConditionalCascade(CollectorDirMenu, IDM_OPENSUBMENU, IDM_OPENWINDOW);
    1898             if (fWorkPlace)
    1899             {
    1900                 WinSendMsg(CollectorDirMenu, MM_DELETEITEM,
    1901                            MPFROM2SHORT(IDM_OPENSUBMENU, TRUE), MPVOID);
    1902                 WinSendMsg(CollectorDirMenu, MM_DELETEITEM,
    1903                            MPFROM2SHORT(IDM_OBJECTSUBMENU, TRUE), MPVOID);
    1904             }
    1905         }
    1906         else if (hwndMenu == &MainPopupMenu)
    1907         {
    1908             WinSetWindowUShort(MainPopupMenu, QWS_ID, IDM_MAINPOPUP);
    1909             SetConditionalCascade(MainPopupMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
    1910             SetConditionalCascade(MainPopupMenu, IDM_AUTOVIEWSUBMENU, IDM_AUTOVIEW);
    1911         }
    1912     }
    1913     return *hwndMenu;
    1914 }
    1915 
    1916 SHORT AddToListboxBottom(HWND hwnd, CHAR * str)
    1917 {
    1918     SHORT ln;
    1919 
    1920     ln = (SHORT) WinSendMsg(hwnd, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0),
    1921                             MPFROMP(str));
    1922     if (ln)
    1923         WinSendMsg(hwnd, LM_SELECTITEM, MPFROM2SHORT(ln, 0), MPVOID);
    1924     return ln;
    1925 }
    1926 
    1927 VOID SetSysMenu(HWND hwndSysMenu)
    1928 {
    1929     CHAR s[128], *p;
    1930 
    1931     if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
    1932                    MPFROM2SHORT(SC_RESTORE, 128),
    1933                    MPFROMP(s)))
    1934     {
    1935         p = strchr(s, '\t');
    1936         if (p)
    1937         {
    1938             p++;
    1939             strcpy(p, "Ctrl+Alt+F5");
    1940             WinSetMenuItemText(hwndSysMenu, SC_RESTORE, s);
    1941         }
    1942     }
    1943     if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
    1944                    MPFROM2SHORT(SC_CLOSE, 128),
    1945                    MPFROMP(s)))
    1946     {
    1947         p = strchr(s, '\t');
    1948         if (p)
    1949         {
    1950             p++;
    1951             strcpy(p, "Ctrl+Alt+F4");
    1952             WinSetMenuItemText(hwndSysMenu, SC_CLOSE, s);
    1953         }
    1954     }
    1955     if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
    1956                    MPFROM2SHORT(SC_MOVE, 128),
    1957                    MPFROMP(s)))
    1958     {
    1959         p = strchr(s, '\t');
    1960         if (p)
    1961         {
    1962             p++;
    1963             strcpy(p, "Ctrl+Alt+F7");
    1964             WinSetMenuItemText(hwndSysMenu, SC_MOVE, s);
    1965         }
    1966     }
    1967     if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
    1968                    MPFROM2SHORT(SC_SIZE, 128),
    1969                    MPFROMP(s)))
    1970     {
    1971         p = strchr(s, '\t');
    1972         if (p)
    1973         {
    1974             p++;
    1975             strcpy(p, "Ctrl+Alt+F8");
    1976             WinSetMenuItemText(hwndSysMenu, SC_SIZE, s);
    1977         }
    1978     }
    1979     if (WinSendMsg(hwndSysMenu, MM_QUERYITEMTEXT,
    1980                    MPFROM2SHORT(SC_MINIMIZE, 128),
    1981                    MPFROMP(s)))
    1982     {
    1983         p = strchr(s, '\t');
    1984         if (p)
    1985         {
    1986             p++;
    1987             strcpy(p, "Ctrl+Alt+F9");
    1988             WinSetMenuItemText(hwndSysMenu, SC_MINIMIZE, s);
    1989         }
    1990     }
    1991     if (WinSendMsg(hwndSysMenu,
    1992                    MM_QUERYITEMTEXT,
    1993                    MPFROM2SHORT(SC_MAXIMIZE, 128),
    1994                    MPFROMP(s)))
    1995     {
    1996         p = strchr(s, '\t');
    1997         if (p)
    1998         {
    1999             p++;
    2000             strcpy(p, "Ctrl+Alt+F10");
    2001             WinSetMenuItemText(hwndSysMenu,
    2002                                SC_MAXIMIZE,
    2003                                s);
    2004         }
    2005     }
    2006     if (WinSendMsg(hwndSysMenu,
    2007                    MM_QUERYITEMTEXT,
    2008                    MPFROM2SHORT(SC_HIDE, 128),
    2009                    MPFROMP(s)))
    2010     {
    2011         p = strchr(s, '\t');
    2012         if (p)
    2013         {
    2014             p++;
    2015             strcpy(p, "Ctrl+Alt+F11");
    2016             WinSetMenuItemText(hwndSysMenu, SC_HIDE, s);
    2017         }
    2018     }
    2019 }
    2020 
    2021 VOID LoadLibPath(CHAR * str, LONG len)
    2022 {
    2023     ULONG ver[2];
    2024     CHAR configsys[] = "C:\\CONFIG.SYS";
    2025     static CHAR var[8192], beg[16384], end[16384];
    2026     BOOL warp;
    2027     FILE *fp;
    2028     PFN DQELIBPATH = NULL;
    2029     HMODULE hmod;
    2030 
    2031     if (str && len)
    2032     {
    2033         *str = 0;
    2034         if (DosQuerySysInfo(QSV_BOOT_DRIVE,
    2035                             QSV_BOOT_DRIVE,
    2036                             (PVOID) ver,
    2037                             (ULONG) sizeof(ULONG)))
    2038             ver[0] = 3L;
    2039         *configsys = (CHAR) ver[0] + '@';
    2040         if (!DosQuerySysInfo(QSV_VERSION_MAJOR,
    2041                              QSV_VERSION_MINOR,
    2042                              (PVOID) ver, (ULONG) sizeof(ver)) &&
    2043                 ver[1] >= 30)
    2044             warp = TRUE;
    2045         *var = *beg = *end = 0;
    2046         if (warp)
    2047         {
    2048             if (!DosLoadModule(var,
    2049                                sizeof(var),
    2050                                "DOSCALL1.DLL", &hmod))
    2051             {
    2052                 if (!DosQueryProcAddr(hmod,
    2053                                       ORD_DOS32QUERYEXTLIBPATH,
    2054                                       NULL,
    2055                                       (PFN *) & DQELIBPATH))
    2056                 {
    2057                     DQELIBPATH(beg, BEGIN_LIBPATH);
    2058                     DQELIBPATH(end, END_LIBPATH);
    2059                 }
    2060                 DosFreeModule(hmod);
    2061             }
    2062             *var = 0;
    2063         }
    2064         fp = xfopen(configsys, "r",pszSrcFile,__LINE__);
    2065         if (fp)
    2066         {
    2067             while (!feof(fp))
    2068             {
    2069                 if (!fgets(var, 8192, fp))
    2070                     break;
    2071                 var[8191] = 0;
    2072                 bstripcr(var);
    2073                 if (!strnicmp(var, "LIBPATH=", 8))
    2074                 {
    2075                     memmove(var, var + 8, strlen(var + 8) + 1);
    2076                     lstrip(var);
    2077                     break;
    2078                 }
    2079             }
    2080             fclose(fp);
    2081         }
    2082         strncpy(str, beg, len);
    2083         strncat(str, var, len - strlen(str));
    2084         strncat(str, end, len - strlen(str));
    2085         str[len - 1] = 0;
    2086     }
    2087 }
    2088 
    2089 void SetViewMenu(HWND hwndMenu, ULONG flWindowAttr)
    2090 {
    2091     WinCheckMenuItem(hwndMenu, IDM_MINIICONS, ((flWindowAttr & CV_MINI)));
    2092     WinCheckMenuItem(hwndMenu, IDM_TEXT, ((flWindowAttr & CV_TEXT)));
    2093     WinCheckMenuItem(hwndMenu, IDM_ICON, ((flWindowAttr & CV_ICON) &&
    2094                                           !(flWindowAttr & CV_TREE)));
    2095     WinCheckMenuItem(hwndMenu, IDM_TREEVIEW, ((flWindowAttr & CV_TREE)));
    2096     WinCheckMenuItem(hwndMenu, IDM_DETAILS, ((flWindowAttr & CV_DETAIL)));
    2097     WinCheckMenuItem(hwndMenu, IDM_NAME, ((flWindowAttr & CV_NAME)));
    2098 }
    2099 
    2100 void SaySort(HWND hwnd, INT sortflags, BOOL archive)
    2101 {
    2102     char *s = NULL;
    2103 
    2104     s = xmalloc(CCHMAXPATH,pszSrcFile,__LINE__);
    2105     if (s)
    2106     {
    2107         sprintf(s, "S:%s%s",
    2108                 (sortflags & SORT_REVERSE) ? "^" : NullStr,
    2109                 (sortflags & SORT_FIRSTEXTENSION) ? GetPString(IDS_FIRSTX) :
    2110                 (sortflags & SORT_LASTEXTENSION) ? GetPString(IDS_LASTX) :
    2111                 (sortflags & SORT_SIZE) ? "Size" :
    2112                 (sortflags & SORT_EASIZE) ? (archive == 0) ? GetPString(IDS_EASIZE) : GetPString(IDS_CSIZE) :
    2113                 (sortflags & SORT_LWDATE) ? (archive == 0) ? GetPString(IDS_LWDATE) : GetPString(IDS_DATE) :
    2114                 (sortflags & SORT_LADATE) ? GetPString(IDS_LADATE) :
    2115                 (sortflags & SORT_CRDATE) ? GetPString(IDS_CRDATE) :
    2116                 (sortflags & SORT_PATHNAME) ? GetPString(IDS_PATH) :
    2117                 (sortflags & SORT_NOSORT) ? GetPString(IDS_NONE) :
    2118                 (sortflags & SORT_SUBJECT) ? GetPString(IDS_SUBJ) :
    2119                 GetPString(IDS_NAME));
    2120         WinSetWindowText(hwnd, s);
    2121         free(s);
    2122     }
    2123 }
    2124 
    2125 void SayView(HWND hwnd, ULONG flWindowAttr)
    2126 {
    2127     char *s = NULL;
    2128 
    2129     s = xmalloc(CCHMAXPATH,pszSrcFile,__LINE__);
    2130     if (s)
    2131     {
    2132         sprintf(s, "V:%s%s",
    2133                 (flWindowAttr & CV_TREE) ? GetPString(IDS_TREE) :
    2134                 (flWindowAttr & CV_NAME) ? GetPString(IDS_NAME) :
    2135                 (flWindowAttr & CV_DETAIL) ? GetPString(IDS_DETAIL) :
    2136                 (flWindowAttr & CV_TEXT) ? GetPString(IDS_TEXT) :
    2137                 GetPString(IDS_ICON),
    2138                 ((flWindowAttr & CV_MINI) &&
    2139                !(flWindowAttr & CV_TEXT)) ? GetPString(IDS_MINI) : NullStr);
    2140         WinSetWindowText(hwnd, s);
    2141         free(s);
    2142     }
    2143 }
    2144 
    2145 void SayFilter(HWND hwnd, MASK * mask, BOOL archive)
    2146 {
    2147     char *s = NULL;
    2148 
    2149     s = xmalloc(CCHMAXPATH * 2,pszSrcFile,__LINE__);
    2150     if (s)
    2151     {
    2152         sprintf(s, "F:%s%s",
    2153                 mask -> szMask,
    2154                 (!archive && (mask -> attrFile != ALLATTRS ||
    2155                               mask -> antiattr != 0)) ? " " : NullStr,
    2156                 (!archive && (mask -> attrFile != ALLATTRS ||
    2157               mask -> antiattr != 0)) ? GetPString(IDS_ATTRTEXT) : NullStr);
    2158         if (!s[2])
    2159             sprintf(s, "F:%s", GetPString(IDS_ALLTEXT));
    2160         WinSetWindowText(hwnd, s);
    2161         free(s);
    2162     }
    2163 }
    2164 
    2165 char *GetCmdSpec(BOOL dos)
    2166 {
    2167     char *cmspec;
    2168 
    2169     if (!dos)
    2170     {
    2171         cmspec = getenv("OS2_SHELL");
    2172         if (!cmspec)
    2173             cmspec = getenv("COMSPEC");
    2174         if (!cmspec)
    2175             cmspec = "CMD.EXE";
    2176     }
    2177     else
    2178     {
    2179         cmspec = getenv("DOS_SHELL");
    2180         if (!cmspec)
    2181             cmspec = "COMMAND.COM";
    2182     }
    2183     return cmspec;
    2184 }
    2185 
    2186 void Broadcast(HAB hab, HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
    2187 {
    2188     if (hwndMain)
    2189         WinBroadcastMsg(hwndMain,
    2190                         msg,
    2191                         mp1,
    2192                         mp2,
    2193                         BMSG_SEND | BMSG_FRAMEONLY);
    2194     if (hwnd &&
    2195             hwnd != HWND_DESKTOP &&
    2196             hwnd != hwndMain &&
    2197             hwnd != WinQueryDesktopWindow(hab, NULLHANDLE) &&
    2198             WinIsWindow(hab, hwnd) &&
    2199             (!hwndMain ||
    2200              !WinIsChild(hwnd, hwndMain)))
    2201         WinSendMsg(hwnd,
    2202                    msg,
    2203                    mp1,
    2204                    mp2);
    2205 }
    2206 
    2207 void SetupWinList(HWND hwndMenu, HWND hwndTop, HWND hwndFrame)
    2208 {
    2209     /*
    2210      * add switchlist entries to end of pulldown menu
    2211      */
    2212 
    2213     SHORT sItemCount, x = 0, y = 0;
    2214     MENUITEM mi;
    2215 
    2216     sItemCount = (SHORT) WinSendMsg(hwndMenu,
    2217                                     MM_QUERYITEMCOUNT,
    2218                                     MPVOID,
    2219                                     MPVOID);
    2220 
    2221     /* clean out old additions */
    2222     while ((SHORT) WinSendMsg(hwndMenu,
    2223                               MM_DELETEITEM,
    2224                               MPFROM2SHORT(IDM_SWITCHSTART + x++,
    2225                                            TRUE),
    2226                               MPVOID) < sItemCount)
    2227         sItemCount--;
    2228     x = 0;
    2229     while ((SHORT) WinSendMsg(hwndMenu,
    2230                               MM_DELETEITEM,
    2231                               MPFROM2SHORT(IDM_WINDOWSTART + x++,
    2232                                            TRUE),
    2233                               MPVOID) < sItemCount)
    2234         sItemCount--;
    2235 
    2236     x = 0;
    2237     if (hwndTop)
    2238     {
    2239 
    2240         char wtext[CCHMAXPATH + 8];
    2241         HENUM henum;
    2242         HWND hwndChild;
    2243 
    2244         /* add children of the main FM/2 client */
    2245         henum = WinBeginEnumWindows(hwndTop);
    2246         memset(&mi, 0, sizeof(mi));
    2247         while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
    2248         {
    2249             if (WinQueryWindowUShort(hwndChild, QWS_ID) &&
    2250                     hwndChild != hwndFrame)
    2251             {
    2252                 *wtext = 0;
    2253                 WinQueryWindowText(hwndChild,
    2254                                    CCHMAXPATH + 8,
    2255                                    wtext);
    2256                 if (*wtext)
    2257                 {
    2258                     wtext[CCHMAXPATH + 7] = 0;
    2259                     mi.afStyle = MIS_TEXT;
    2260                     if (!((x + sItemCount) % 28))
    2261                         mi.afStyle |= MIS_BREAK;
    2262                     mi.id = IDM_WINDOWSTART + x;
    2263                     mi.iPosition = MIT_END;
    2264                     if ((SHORT) WinSendMsg(hwndMenu,
    2265                                            MM_INSERTITEM,
    2266                                            MPFROMP(&mi),
    2267                                            MPFROMP(wtext)) >= 0)
    2268                         x++;
    2269                 }
    2270             }
     2114          }
    22712115        }
    22722116        WinEndEnumWindows(henum);
    2273     }
    2274 
    2275     /* add external FM/2 windows */
    2276     {
    2277         PSWBLOCK pswb;
    2278         ULONG ulSize, ulcEntries;
    2279         HWND hwndTopFrame;
    2280         register INT i;
    2281 
    2282         hwndTopFrame = (hwndTop) ? WinQueryWindow(hwndTop, QW_PARENT) : (HWND) 0;
    2283         /* Get the switch list information */
    2284         x = 0;
    2285         ulcEntries = WinQuerySwitchList(0, NULL, 0);
    2286         ulSize = sizeof(SWBLOCK) + sizeof(HSWITCH) + (ulcEntries + 4L) *
    2287             (LONG) sizeof(SWENTRY);
    2288         /* Allocate memory for list */
    2289         pswb = xmalloc(ulSize,pszSrcFile,__LINE__);
    2290         if (pswb) {
    2291             /* Put the info in the list */
    2292             ulcEntries = WinQuerySwitchList(0, pswb,
    2293                                             ulSize - sizeof(SWENTRY));
    2294             /* do the dirty deed */
    2295             memset(&mi, 0, sizeof(mi));
    2296             for (i = 0; i < pswb -> cswentry; i++)
    2297             {
    2298                 if (pswb -> aswentry[i].swctl.uchVisibility == SWL_VISIBLE &&
    2299                         pswb -> aswentry[i].swctl.fbJump == SWL_JUMPABLE &&
    2300                         (pswb -> aswentry[i].swctl.idProcess != mypid ||
    2301                          !hwndFrame ||
    2302                          pswb -> aswentry[i].swctl.hwnd != hwndFrame) &&
    2303                         (pswb -> aswentry[i].swctl.idProcess != mypid ||
    2304                          !hwndTopFrame ||
    2305                          pswb -> aswentry[i].swctl.hwnd != hwndTopFrame ||
    2306                          !WinIsChild(hwndFrame, hwndTop)))
    2307                 {
    2308                     if (!strnicmp(pswb -> aswentry[i].swctl.szSwtitle, "AV/2", 4) ||
    2309                             !stricmp(pswb -> aswentry[i].swctl.szSwtitle, "File Manager/2") ||
    2310                             !stricmp(pswb -> aswentry[i].swctl.szSwtitle, "Collector") ||
    2311                             !strnicmp(pswb -> aswentry[i].swctl.szSwtitle, "VTree", 5) ||
    2312                             !strnicmp(pswb -> aswentry[i].swctl.szSwtitle, "VDir", 4) ||
    2313                             !strnicmp(pswb -> aswentry[i].swctl.szSwtitle, FM2Str, 4))
    2314                     {
    2315                         mi.afStyle = MIS_TEXT;
    2316                         if (x && !(x % 28))
    2317                             mi.afStyle |= MIS_BREAK;
    2318                         mi.id = IDM_SWITCHSTART + y;
    2319                         mi.iPosition = MIT_END;
    2320                         switches[y] = pswb -> aswentry[i].hswitch;
    2321                         if ((SHORT) WinSendMsg(hwndMenu,
    2322                                                MM_INSERTITEM,
    2323                                                MPFROMP(&mi),
    2324                          MPFROMP(pswb -> aswentry[i].swctl.szSwtitle)) >= 0)
    2325                         {
    2326                             y++;
    2327                             x++;
    2328                         }
    2329                     }
    2330                 }
    2331             }
    2332             numswitches = y;
    2333             free(pswb);
    2334             DosPostEventSem(CompactSem);
    2335         }
    2336     }
    2337 }
    2338 
    2339 BOOL SwitchCommand(HWND hwndMenu, USHORT cmd)
    2340 {
    2341     BOOL ret = FALSE;
    2342 
    2343     if (hwndMain && hwndMenu &&
    2344             cmd >= IDM_WINDOWSTART &&
    2345             cmd < IDM_SWITCHSTART)
    2346     {
    2347         /*
    2348          * select a child window (of client)
    2349          */
    2350 
    2351         MENUITEM mi;
    2352         HWND hwndSubMenu = (HWND) 0, hwndChild;
    2353         CHAR s[CCHMAXPATH + 8];
    2354 
    2355         if (WinQueryWindowUShort(hwndMenu, QWS_ID) != IDM_WINDOWSMENU)
    2356         {
    2357             memset(&mi, 0, sizeof(mi));
    2358             mi.iPosition = MIT_END;
    2359             mi.afStyle = MIS_TEXT;
    2360             if (WinSendMsg(hwndMenu,
    2361                            MM_QUERYITEM,
    2362                            MPFROM2SHORT(IDM_WINDOWSMENU,
    2363                                         TRUE),
    2364                            MPFROMP(&mi)))
    2365                 hwndSubMenu = mi.hwndSubMenu;
    2366         }
    2367         else
    2368             hwndSubMenu = hwndMenu;
    2369         if (hwndSubMenu)
    2370         {
    2371             *s = 0;
    2372             if (WinSendMsg(hwndSubMenu,
    2373                            MM_QUERYITEMTEXT,
    2374                            MPFROM2SHORT(cmd,
    2375                                         CCHMAXPATH + 8),
    2376                            MPFROMP(s)) &&
    2377                     *s)
    2378             {
    2379 
    2380                 HENUM henum;
    2381                 CHAR checkText[CCHMAXPATH + 8];
    2382                 SWP swp;
    2383 
    2384                 s[CCHMAXPATH + 7] = 0;
    2385                 henum = WinBeginEnumWindows(hwndMain);
    2386                 while ((hwndChild = WinGetNextWindow(henum)) != NULLHANDLE)
    2387                 {
    2388                     if (WinQueryWindowUShort(hwndChild, QWS_ID))
    2389                     {
    2390                         *checkText = 0;
    2391                         WinQueryWindowText(hwndChild,
    2392                                            CCHMAXPATH + 8,
    2393                                            checkText);
    2394                         checkText[CCHMAXPATH + 7] = 0;
    2395                         if (!stricmp(checkText, s))
    2396                         {
    2397                             if (WinQueryWindowPos(hwndChild,
    2398                                                   &swp))
    2399                             {
    2400                                 if (swp.fl & (SWP_MINIMIZE | SWP_HIDE))
    2401                                     WinSetWindowPos(hwndChild,
    2402                                                     HWND_TOP,
    2403                                                     0,
    2404                                                     0,
    2405                                                     0,
    2406                                                     0,
    2407                                                   SWP_RESTORE | SWP_ZORDER);
    2408                             }
    2409                             WinSetActiveWindow(HWND_DESKTOP,
    2410                                                hwndChild);
    2411                             ret = TRUE;
    2412                             break;
    2413                         }
    2414                     }
    2415                 }
    2416                 WinEndEnumWindows(henum);
    2417             }
    2418         }
    2419     }
    2420     else if (cmd >= IDM_SWITCHSTART &&
    2421              cmd < IDM_SWITCHSTART + 499)
    2422     {
    2423         if (cmd - IDM_SWITCHSTART < numswitches)
    2424         {
    2425             WinSwitchToProgram(switches[cmd - IDM_SWITCHSTART]);
    2426             ret = TRUE;
    2427         }
    2428     }
    2429 
    2430     return ret;
    2431 }
     2117      }
     2118    }
     2119  }
     2120  else if (cmd >= IDM_SWITCHSTART && cmd < IDM_SWITCHSTART + 499) {
     2121    if (cmd - IDM_SWITCHSTART < numswitches) {
     2122      WinSwitchToProgram(switches[cmd - IDM_SWITCHSTART]);
     2123      ret = TRUE;
     2124    }
     2125  }
     2126
     2127  return ret;
     2128}
Note: See TracChangeset for help on using the changeset viewer.