Changeset 231


Ignore:
Timestamp:
Jul 25, 2005, 1:20:35 AM (20 years ago)
Author:
root
Message:

Beautify

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/dll/misc.c

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