source: trunk/dll/mainwnd2.c@ 1777

Last change on this file since 1777 was 1777, checked in by Steven Levine, 11 years ago

Rework FM/2 Config menu. Add confirm delete toggle. (Steven)
Rework FM/2 Lite Config menu. Add drag&drop dialog toggle and confirm delete toggles. (Steven)
Correct View, Sort and Filter button initialization. (Steven)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 42.1 KB
RevLine 
[133]1
2/***********************************************************************
3
4 $Id: mainwnd2.c 1777 2014-06-13 01:51:31Z stevenhl $
5
[178]6 fm/4 main window
[133]7
8 Copyright (c) 1993-98 M. Kimes
[1498]9 Copyright (c) 2005, 2010 Steven H. Levine
[133]10
11 23 May 05 SHL Use datamin.h
[178]12 26 May 05 SHL Comments and localize code
[246]13 06 Aug 05 SHL Renames
[299]14 02 Jan 06 SHL Use QWL_USER more
15 02 Jan 06 SHL Map IDM_WINDOWDLG to match IBM_TWODIRS
[352]16 17 Jul 06 SHL Use Runtime_Error
[593]17 30 Mar 07 GKY Remove GetPString for window class names
[672]18 12 May 07 SHL Pass ulItemsToUnHilite to UnHilite
[775]19 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
[773]20 07 Aug 07 SHL Use BldQuotedFileName
[793]21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[917]22 10 Jan 08 SHL Sync with CfgDlgProc mods
[940]23 19 Jan 08 GKY Rework Utilities menu
[953]24 14 Feb 08 SHL Rework to support settings menu conditional cascade
[985]25 29 Feb 08 GKY Use xfree where appropriate
[1128]26 27 Aug 08 JBS Ticket 259: Support saving/restoring toolbars with states
[1140]27 01 Sep 08 GKY Add bmps for default toolbars
[1335]28 10 Dec 08 SHL Integrate exception handler support
[1375]29 03 Jan 09 GKY Check for system that is protectonly to gray out Dos/Win command lines and prevent
[1777]30 Dos/Win programs from being inserted into the execute dialog with message why.
[1437]31 21 Jun 09 GKY Added drive letter to bitmap buttons in drive bar; Eliminate static drive
[1777]32 letter windows; Use button ID to identify drive letter for processing.
[1444]33 22 Jul 09 GKY Code changes to use semaphores to serialize drive scanning
[1454]34 12 Sep 09 GKY Add FM3.INI User ini and system ini to submenu for view ini
[1482]35 13 Dec 09 GKY Fixed separate paramenters. Please note that appname should be used in
[1777]36 profile calls for user settings that work and are setable in more than one
37 miniapp; FM3Str should be used for setting only relavent to FM/2 or that
38 aren't user settable; realappname should be used for setting applicable to
39 one or more miniapp but not to FM/2
[1498]40 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
[1506]41 11 Apr 10 GKY Fix drive tree rescan failure and program hang caused by event sem
[1777]42 never being posted
[1670]43 12 Aug 12 GKY Allow for selection of include subdirectories or a list file on initial startup of compare dirs
[672]44
[133]45***********************************************************************/
46
[907]47#include <stdlib.h>
48#include <string.h>
49#include <share.h>
[1335]50// #include <process.h> // _beginthread
[907]51
[2]52#define INCL_DOS
53#define INCL_WIN
54#define INCL_GPI
[841]55#define INCL_LONGLONG
[2]56
[1186]57#include "fm3dll.h"
[1224]58#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1210]59#include "killproc.h" // Data declaration(s)
60#include "grep.h" // Data declaration(s)
61#include "autoview.h" // Data declaration(s)
62#include "dircnrs.h" // Data declaration(s)
63#include "worker.h" // Data declaration(s)
64#include "init.h" // Data declaration(s)
[2]65#include "fm3dlg.h"
66#include "fm3str.h"
67#include "tools.h"
[133]68#include "datamin.h"
[907]69#include "comp.h" // COMPARE
[989]70#include "pathutil.h" // BldQuotedFileName
[907]71#include "errutil.h" // Dos_Error...
72#include "strutil.h" // GetPString
[953]73#include "notebook.h" // CfgDlgProc
[989]74#include "command.h" // RunCommand
[1161]75#include "misc.h" // BoxWindow, FixSwitchList, SetConditionalCascade
76 // SetSysMenu
77#include "mainwnd.h" // CloseChildren, MainWMCommand, MakeMainObjWin, ResizeDrives
[1777]78 // TopWindow
[1161]79#include "common.h" // CommonCreateMainChildren, CommonMainWndProc
80#include "notify.h" // HideNote
81#include "mainwnd2.h"
82#include "remap.h" // RemapDlgProc
83#include "treecnr.h" // StartTreeCnr
84#include "walkem.h" // WalkTwoCmpDlgProc, WalkTwoSetDlgProc
85#include "dirs.h" // switch_to
[1186]86#include "filter.h" // Filter
87#include "collect.h" // StartCollector
88#include "select.h" // UnHilite
89#include "valid.h" // MakeValidDir
90#include "systemf.h" // runemf2
91#include "wrappers.h" // xfree
[1039]92#include "fortify.h"
[1335]93#include "excputil.h" // xbeginthread
[2]94
[133]95typedef struct
96{
97 USHORT size;
98 USHORT dummy;
99 HWND hwndDir1;
100 HWND hwndDir2;
101 HWND hwndCurr;
102 HWND hwndLastDir;
103 HWND hwndMax;
[551]104}
105PERSON1DATA;
[2]106
[1210]107// Data definitions
[352]108static PSZ pszSrcFile = __FILE__;
[1210]109static ULONG TreeWidth;
[352]110
[1210]111#pragma data_seg(GLOBAL1)
112PFNWP PFNWPFrame;
113
114#pragma data_seg(GLOBAL2)
115CHAR realappname[12];
116
[551]117static MRESULT EXPENTRY MainFrameWndProc2(HWND hwnd, ULONG msg, MPARAM mp1,
118 MPARAM mp2)
[133]119{
[299]120 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]121
[551]122 switch (msg) {
[133]123 case WM_ADJUSTWINDOWPOS:
124 {
125 SWP *pswp;
[2]126
[133]127 pswp = (SWP *) mp1;
[551]128 if (pswp->fl & (SWP_SHOW | SWP_RESTORE))
[133]129 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_SIZE, MPVOID, MPVOID);
[551]130 if (fDataMin && !fAmClosing) {
131 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE)) {
[2]132
[133]133 SWP swp;
[2]134
[133]135 WinQueryWindowPos(hwnd, &swp);
136 PostMsg(hwnd, UM_FOCUSME, MPFROMLONG(swp.fl), MPVOID);
137 HideNote();
138 }
[551]139 else if (pswp->fl & (SWP_SHOW | SWP_RESTORE)) {
[133]140 if (DataHwnd)
141 PostMsg(DataHwnd, WM_CLOSE, MPVOID, MPVOID);
142 }
[2]143 }
[551]144 if (!fAmClosing) {
145 if (pswp->fl & (SWP_HIDE | SWP_MINIMIZE))
[133]146 HideNote();
147 }
148 }
149 break;
[2]150
[133]151 case UM_FOCUSME:
152 CreateDataBar(HWND_DESKTOP, (ULONG) mp1);
153 return 0;
[2]154
[133]155 case WM_BUTTON1UP:
156 case WM_BUTTON2UP:
157 case WM_BUTTON3UP:
158 case WM_MOUSEMOVE:
159 case WM_CHORD:
160 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
161 break;
[2]162
[133]163 case WM_CHAR:
164 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
165 break;
[2]166
[133]167 case WM_CONTROL:
[551]168 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), UM_CONTROL, mp1,
169 mp2);
[2]170
[133]171 case WM_COMMAND:
172 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
[2]173
[133]174 case WM_CALCFRAMERECT:
175 {
176 MRESULT mr;
177 PRECTL prectl;
178 LONG sheight = 20, bheight = 20;
[2]179
[133]180 mr = (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
181 PFNWPFrame(hwnd, msg, mp1, mp2);
[2]182
[1673]183 /**
[133]184 * Calculate the position of the client rectangle.
[773]185 * Otherwise, we'll see a lot of redraw when we move the
[133]186 * client during WM_FORMATFRAME.
187 */
[2]188
[551]189 if (mr && mp2) {
[133]190 prectl = (PRECTL) mp1;
[551]191 if (prectl->yBottom != prectl->yTop) {
[133]192 {
193 HPS hps;
194 POINTL aptl[TXTBOX_COUNT];
[2]195
[133]196 hps = WinGetPS(hwndStatus);
197 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
198 WinReleasePS(hps);
199 sheight = aptl[TXTBOX_TOPLEFT].y + 6;
200 hps = WinGetPS(hwndName);
201 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
202 WinReleasePS(hps);
203 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
204 }
[551]205 prectl->yBottom += (sheight + 4);
206 prectl->yTop -= (sheight + 4);
207 prectl->yBottom += (bheight + 4);
208 prectl->yTop -= (bheight + 4);
209 if (fToolbar) {
[133]210 if (!fTextTools)
[551]211 prectl->yTop -= ((fToolTitles) ? 50 : 40);
[133]212 else
[551]213 prectl->yTop -= 32;
[133]214 }
215 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES),
[551]216 ((prectl->xRight -
[133]217 (WinQuerySysValue(HWND_DESKTOP,
218 SV_CYSIZEBORDER) * 2)) - 4));
[1436]219 prectl->yTop -= (16 * (DriveLines * 22));
[551]220 prectl->yTop -= 2;
221 if (fAutoView) {
[133]222 AutoviewHeight = min(AutoviewHeight,
[551]223 (prectl->yTop - prectl->yBottom) - 116);
[1436]224 AutoviewHeight = max(AutoviewHeight, 44);
[551]225 prectl->yBottom += (AutoviewHeight + 6);
[133]226 }
227 }
[2]228 }
[133]229 return mr;
230 }
[2]231
[133]232 case WM_FORMATFRAME:
233 {
234 SHORT sCount, soldCount;
235 PSWP pswp, pswpClient, pswpNew;
236 SWP swpClient;
[1438]237 ULONG theight = 48L, dheight = DRIVE_BUTTON_HEIGHT, bheight = 20, sheight = 20;
[133]238 LONG width, lastx;
[2]239
[133]240 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
241 PFNWPFrame(hwnd, msg, mp1, mp2));
242 soldCount = sCount;
[1673]243 /**
[133]244 * Reformat the frame to "squeeze" the client
245 * and make room for status window sibling beneath
246 * and toolbar above (if toolbar's on) and userlists
247 * (if userlists are on).
248 */
[2]249
[133]250 pswp = (PSWP) mp1;
251 {
252 SHORT x;
[2]253
[551]254 for (x = 0; x < sCount; x++) {
255 if (WinQueryWindowUShort(pswp->hwnd, QWS_ID) == FID_CLIENT) {
[133]256 pswpClient = pswp;
257 break;
258 }
259 pswp++;
260 }
261 }
[2]262
[133]263 {
264 HPS hps;
265 POINTL aptl[TXTBOX_COUNT];
[2]266
[133]267 hps = WinGetPS(hwndStatus);
268 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
269 WinReleasePS(hps);
270 bheight = sheight = aptl[TXTBOX_TOPLEFT].y + 6;
271 hps = WinGetPS(hwndName);
272 GpiQueryTextBox(hps, 6, "$`WjgT", TXTBOX_COUNT, aptl);
273 WinReleasePS(hps);
274 bheight = aptl[TXTBOX_TOPLEFT].y + 6;
275 }
[2]276
[133]277 pswpNew = (PSWP) mp1 + soldCount;
278 *pswpNew = *pswpClient;
279 swpClient = *pswpClient;
[551]280 pswpNew->hwnd = hwndStatus;
281 pswpNew->x = swpClient.x + 3;
282 pswpNew->y = swpClient.y + 2;
[133]283 width = (swpClient.cx / 2) - 6;
284 width = max(width, 10);
[551]285 pswpNew->cx = width - 6;
286 pswpNew->cy = sheight;
287 pswpClient->y = pswpNew->y + pswpNew->cy + 3;
288 pswpClient->cy = (swpClient.cy - pswpNew->cy) - 3;
[133]289 sCount++;
[2]290
[133]291 pswpNew = (PSWP) mp1 + (soldCount + 1);
292 *pswpNew = *pswpClient;
[551]293 pswpNew->hwnd = hwndStatus2;
294 pswpNew->x = width + 8;
295 pswpNew->y = swpClient.y + 2;
296 pswpNew->cx = width - 6;
297 pswpNew->cy = sheight;
[133]298 sCount++;
[2]299
[551]300 if (fToolbar) {
[133]301 if (fTextTools)
302 theight = 32L;
303 else if (!fToolTitles)
304 theight = 40L;
305 pswpNew = (PSWP) mp1 + (soldCount + 2);
306 *pswpNew = *pswpClient;
[551]307 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_TOOLS);
308 pswpNew->x = swpClient.x + 2;
309 pswpNew->y = (swpClient.y + swpClient.cy) - (theight - 2);
310 pswpNew->cx = swpClient.cx - 4;
311 pswpNew->cy = theight - 4;
312 pswpClient->cy -= theight;
[133]313 sCount++;
314 }
315 else
316 WinShowWindow(WinWindowFromID(hwnd, MAIN_TOOLS), FALSE);
[2]317
[551]318 ResizeDrives(WinWindowFromID(hwnd, MAIN_DRIVES), pswpClient->cx - 4);
[133]319 pswpNew = (PSWP) mp1 + (soldCount + 2 + (fToolbar != FALSE));
320 *pswpNew = *pswpClient;
[551]321 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_DRIVES);
322 pswpNew->x = swpClient.x + 2;
[1438]323 dheight += ((dheight) * DriveLines);
324 pswpNew->y = (swpClient.y + swpClient.cy) - (dheight);
[133]325 if (fToolbar)
[551]326 pswpNew->y -= theight;
327 pswpNew->cx = swpClient.cx - 4;
[1438]328 pswpNew->cy = dheight;
[551]329 pswpClient->cy -= dheight;
330 pswpClient->cy -= 2;
[133]331 sCount++;
[2]332
[551]333 if (fAutoView) {
[133]334 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE));
335 *pswpNew = *pswpClient;
[551]336 pswpNew->hwnd = (fComments) ? hwndAutoMLE : hwndAutoview;
337 pswpNew->x = pswpClient->x + 3;
338 pswpNew->y = pswpClient->y + 3;
[133]339 if (fMoreButtons)
[551]340 pswpNew->y += (bheight + 4);
341 pswpNew->cx = pswpClient->cx - 6;
342 AutoviewHeight = min(AutoviewHeight, pswpClient->cy - 116);
[1436]343 AutoviewHeight = max(AutoviewHeight, 44);
[551]344 pswpNew->cy = AutoviewHeight;
345 pswpClient->y += (AutoviewHeight + 6);
346 pswpClient->cy -= (AutoviewHeight + 6);
[133]347 sCount++;
348 WinShowWindow((fComments) ? hwndAutoview : hwndAutoMLE, FALSE);
349 }
[551]350 else {
[133]351 WinShowWindow(hwndAutoview, FALSE);
352 WinShowWindow(hwndAutoMLE, FALSE);
353 }
[2]354
[133]355 pswpNew = (PSWP) mp1 + (soldCount + 3 + (fToolbar != FALSE) +
356 (fAutoView != FALSE));
357 *pswpNew = *pswpClient;
[551]358 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LED);
359 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
360 pswpNew->y = swpClient.y;
361 pswpNew->cx = 12;
362 pswpNew->cy = 12;
[133]363 sCount++;
[2]364
[133]365 pswpNew = (PSWP) mp1 + (soldCount + 4 + (fToolbar != FALSE) +
366 (fAutoView != FALSE));
367 *pswpNew = *pswpClient;
[551]368 pswpNew->hwnd = WinWindowFromID(hwnd, MAIN_LEDHDR);
369 pswpNew->x = (swpClient.x + swpClient.cx) - 12;
370 pswpNew->y = swpClient.y + 12;
371 pswpNew->cx = 12;
372 pswpNew->cy = sheight - 8;
[133]373 sCount++;
[2]374
[133]375 pswpNew = (PSWP) mp1 + (soldCount + 5 + (fToolbar != FALSE) +
376 (fAutoView != FALSE));
377 *pswpNew = *pswpClient;
[551]378 pswpNew->hwnd = hwndName;
379 pswpNew->x = swpClient.x + 3;
380 pswpNew->y = swpClient.y + (sheight + 6);
381 pswpNew->cx = ((swpClient.cx / 2) + (swpClient.cx / 5)) - 3;
382 lastx = pswpNew->x + pswpNew->cx;
383 pswpNew->cy = bheight;
384 pswpClient->y += (bheight + 4);
385 pswpClient->cy -= (bheight + 4);
[133]386 sCount++;
[2]387
[133]388 pswpNew = (PSWP) mp1 + (soldCount + 6 + (fToolbar != FALSE) +
389 (fAutoView != FALSE));
390 *pswpNew = *pswpClient;
[551]391 pswpNew->hwnd = hwndDate;
392 pswpNew->x = lastx + 3;
393 pswpNew->y = swpClient.y + (sheight + 6);
394 pswpNew->cx = (swpClient.cx / 6) + (swpClient.cx / 16) - 3;
395 lastx = pswpNew->x + pswpNew->cx;
396 pswpNew->cy = bheight;
[133]397 sCount++;
[2]398
[133]399 pswpNew = (PSWP) mp1 + (soldCount + 7 + (fToolbar != FALSE) +
400 (fAutoView != FALSE));
401 *pswpNew = *pswpClient;
[551]402 pswpNew->hwnd = hwndAttr;
403 pswpNew->x = lastx + 3;
404 pswpNew->y = swpClient.y + (sheight + 6);
405 pswpNew->cx = (swpClient.cx - pswpNew->x) - 1;
406 pswpNew->cy = bheight;
[133]407 sCount++;
[2]408
[133]409 return MRFROMSHORT(sCount);
410 }
[2]411
[133]412 case WM_QUERYFRAMECTLCOUNT:
413 {
414 SHORT sCount;
[2]415
[133]416 sCount = (SHORT) ((oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
417 PFNWPFrame(hwnd, msg, mp1, mp2));
418 sCount += 8;
419 if (fToolbar)
420 sCount++;
421 if (fAutoView)
422 sCount++;
423 return MRFROMSHORT(sCount);
424 }
[2]425
[133]426 case WM_CLOSE:
427 WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
428 return 0;
[2]429 }
[133]430 return (oldproc) ? oldproc(hwnd, msg, mp1, mp2) :
431 PFNWPFrame(hwnd, msg, mp1, mp2);
[2]432}
433
[551]434static MRESULT EXPENTRY MainWMCommand2(HWND hwnd, ULONG msg, MPARAM mp1,
435 MPARAM mp2)
[133]436{
[2]437 PERSON1DATA *pd;
438
439 SetShiftState();
[551]440 switch (SHORT1FROMMP(mp1)) {
[133]441 case IDM_TOAUTOMLE:
442 case IDM_CLI:
443 case IDM_CREATETOOL:
444 case IDM_ABOUT:
445 case IDM_WINFULLSCREEN:
446 case IDM_DOSCOMMANDLINE:
447 case IDM_INIVIEWER:
[1454]448 case IDM_INIVIEWERFM2:
449 case IDM_INIVIEWERSYS:
[133]450 case IDM_EDITASSOC:
451 case IDM_COMMANDLINE:
452 case IDM_KILLPROC:
453 case IDM_TOOLBAR:
454 case IDM_TEXTTOOLS:
455 case IDM_TOOLTITLES:
456 case IDM_TOOLLEFT:
457 case IDM_TOOLRIGHT:
458 case IDM_AUTOVIEWCOMMENTS:
459 case IDM_AUTOVIEWFILE:
460 case IDM_AUTOVIEW:
[1777]461 case IDM_CONFIRMDELETE: // 2014-05-17 SHL
462 case IDM_TOGGLEDRAGDIALOG: // 2014-05-15 SHL
[2]463// case IDM_SYSINFO:
[133]464 case IDM_HIDENOTEWND:
465 case IDM_SHOWNOTEWND:
466 case IDM_INSTANT:
467 case IDM_HELPCONTEXT:
468 case IDM_HELPHINTS:
469 case IDM_HELPPIX:
470 case IDM_KILLME:
471 case IDM_EXIT:
472 case IDM_HELPTUTOR:
473 case IDM_HELPCONTENTS:
474 case IDM_HELPGENERAL:
475 case IDM_HELPKEYS:
476 case IDM_HELPMOUSE:
477 case IDM_HELP:
[1416]478 case IDM_FONTPALETTE:
479 case IDM_HICOLORPALETTE:
480 case IDM_COLORPALETTE:
481 case IDM_SYSTEMCLOCK:
[133]482 return MainWMCommand(hwnd, msg, mp1, mp2);
[2]483
[133]484 case IDM_REMAP:
485 WinDlgBox(HWND_DESKTOP,
[551]486 hwnd, RemapDlgProc, FM3ModHandle, MAP_FRAME, NULL);
[133]487 break;
[2]488
[551]489 case IDM_TWODIRS: // Menu action
490 case IDM_WINDOWDLG: // Toolbar action
[299]491 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]492 if (pd) {
[2]493
[133]494 WALK2 wa;
[2]495
[133]496 memset(&wa, 0, sizeof(wa));
497 wa.size = sizeof(wa);
498 *wa.szCurrentPath1 = 0;
[551]499 WinSendMsg(pd->hwndDir1,
500 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
[133]501 MakeValidDir(wa.szCurrentPath1);
502 *wa.szCurrentPath2 = 0;
[551]503 WinSendMsg(pd->hwndDir2,
504 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
[133]505 MakeValidDir(wa.szCurrentPath2);
506 if (WinDlgBox(HWND_DESKTOP,
507 hwnd,
508 WalkTwoSetDlgProc,
509 FM3ModHandle,
510 WALK2_FRAME,
511 MPFROMP(&wa)) &&
512 (IsRoot(wa.szCurrentPath1) ||
513 !IsFile(wa.szCurrentPath1)) &&
[551]514 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
515 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir1,
[133]516 FID_CLIENT), DIR_CNR),
[551]517 UM_SETDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
518 WinSendMsg(WinWindowFromID(WinWindowFromID(pd->hwndDir2,
[133]519 FID_CLIENT), DIR_CNR),
[551]520 UM_SETDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
[2]521 }
[133]522 }
523 break;
[2]524
[133]525 case IDM_COMPARE:
[299]526 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]527 if (pd) {
[2]528
[133]529 WALK2 wa;
[2]530
[133]531 memset(&wa, 0, sizeof(wa));
532 wa.size = sizeof(wa);
533 *wa.szCurrentPath1 = 0;
[551]534 WinSendMsg(pd->hwndDir1,
535 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath1), MPVOID);
[133]536 MakeValidDir(wa.szCurrentPath1);
537 *wa.szCurrentPath2 = 0;
[551]538 WinSendMsg(pd->hwndDir2,
539 UM_CONTAINERDIR, MPFROMP(wa.szCurrentPath2), MPVOID);
[133]540 MakeValidDir(wa.szCurrentPath2);
541 if (WinDlgBox(HWND_DESKTOP,
542 hwnd,
543 WalkTwoCmpDlgProc,
544 FM3ModHandle,
545 WALK2_FRAME,
546 MPFROMP(&wa)) &&
547 (IsRoot(wa.szCurrentPath1) ||
548 !IsFile(wa.szCurrentPath1)) &&
[551]549 (IsRoot(wa.szCurrentPath2) || !IsFile(wa.szCurrentPath2))) {
550 if (!*dircompare) {
[2]551
[133]552 COMPARE *cmp;
[2]553
[551]554 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__);
[352]555 if (cmp) {
[551]556 cmp->size = sizeof(COMPARE);
557 strcpy(cmp->leftdir, wa.szCurrentPath1);
558 strcpy(cmp->rightdir, wa.szCurrentPath2);
[1777]559 cmp->listfile = wa.listfile;
560 cmp->includesubdirs = wa.includesubdirs;
[551]561 cmp->hwndParent = hwnd;
562 cmp->dcd.hwndParent = hwnd;
[133]563 WinDlgBox(HWND_DESKTOP,
564 HWND_DESKTOP,
[551]565 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp));
[133]566 }
567 }
[551]568 else {
[773]569 CHAR szPath1[CCHMAXPATH];
570 CHAR szPath2[CCHMAXPATH];
[133]571 runemf2(SEPARATE,
[917]572 HWND_DESKTOP, pszSrcFile, __LINE__,
573 NULL, NULL,
[773]574 "%s %s %s",
[133]575 dircompare,
[773]576 BldQuotedFileName(szPath1, wa.szCurrentPath1),
577 BldQuotedFileName(szPath2, wa.szCurrentPath2));
[133]578 }
[2]579 }
[133]580 }
581 break;
[2]582
[133]583 case IDM_VTREE:
[551]584 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
585 if (hwndTree) {
[133]586 WinShowWindow(hwndTree, FALSE);
[551]587 PostMsg(hwndTree, WM_CLOSE, MPVOID, MPVOID);
588 hwndTree = (HWND) 0;
[133]589 }
[551]590 else {
[2]591
[133]592 ULONG size = sizeof(ULONG);
[2]593
[133]594 hwndTree = StartTreeCnr(hwnd, 3);
595 PrfQueryProfileData(fmprof,
596 realappname,
[551]597 "FM/4 TreeWidth", (PVOID) & TreeWidth, &size);
[133]598 TreeWidth = max(TreeWidth, 80);
599 }
600 {
[551]601 BOOL dummy = (hwndTree != (HWND) 0);
[2]602
603 PrfWriteProfileData(fmprof,
[133]604 realappname,
[551]605 "FM/4 TreeUp", (PVOID) & dummy, sizeof(dummy));
[133]606 }
[551]607 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]608 break;
[2]609
[133]610 case IDM_TILEBACKWARDS:
[551]611 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
[133]612 fTileBackwards = (fTileBackwards) ? FALSE : TRUE;
613 PrfWriteProfileData(fmprof,
[1506]614 FM3Str,
[133]615 "TileBackwards",
[551]616 (PVOID) & fTileBackwards, sizeof(BOOL));
617 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]618 break;
[2]619
[133]620 case IDM_NEXTWINDOW:
621 case IDM_PREVWINDOW:
[299]622 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]623 if (pd) {
[2]624
[133]625 HWND hwndFocus;
626
[551]627 if (hwndTree) {
628 if (pd->hwndMax) {
629 if (hwndTree == pd->hwndCurr)
630 hwndFocus = pd->hwndMax;
[133]631 else
632 hwndFocus = hwndTree;
633 }
[551]634 else {
635 if (hwndTree == pd->hwndCurr)
[133]636 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
[551]637 pd->hwndDir1 : pd->hwndDir2;
638 else if (pd->hwndDir1 == pd->hwndCurr)
[133]639 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
[551]640 pd->hwndDir2 : hwndTree;
[133]641 else
642 hwndFocus = (SHORT1FROMMP(mp1) == IDM_PREVWINDOW) ?
[551]643 hwndTree : pd->hwndDir1;
[133]644 }
[2]645 }
[551]646 else {
647 if (pd->hwndMax)
648 hwndFocus = pd->hwndMax;
[133]649 else
[953]650 hwndFocus = pd->hwndCurr == pd->hwndDir1 ?
651 pd->hwndDir2 : pd->hwndDir1;
[133]652 }
653 WinSetFocus(HWND_DESKTOP, hwndFocus);
654 }
655 break;
[2]656
[133]657 case IDM_NOTEBOOK:
[953]658 case IDM_DIRCNRSETTINGS:
659 case IDM_DIRVIEWSETTINGS:
660 case IDM_DIRSORTSETTINGS:
661 case IDM_COLLECTORVIEWSETTINGS:
662 case IDM_COLLECTORSORTSETTINGS:
663 case IDM_ARCHIVERSETTINGS:
664 case IDM_TREECNRVIEWSETTINGS:
665 case IDM_TREECNRSORTSETTINGS:
666 case IDM_VIEWERSETTINGS:
667 case IDM_VIEWERSETTINGS2:
668 case IDM_COMPARESETTINGS:
669 case IDM_MONOLITHICSETTINGS:
670 case IDM_GENERALSETTINGS:
671 case IDM_SCANSETTINGS:
672 case IDM_BUBBLESSETTINGS:
[133]673 WinDlgBox(HWND_DESKTOP,
674 hwnd,
[917]675 CfgDlgProc,
676 FM3ModHandle,
677 CFG_FRAME,
[953]678 MPFROMLONG(mp1)); // 15 Feb 08 SHL
[551]679 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]680 break;
[2]681
[133]682 case IDM_SEEALL:
683 case IDM_GREP:
684 case IDM_COLLECTOR:
685 {
686 HWND hwndC;
687
688 hwndC = StartCollector(HWND_DESKTOP, 4);
[551]689 if (hwndC) {
[133]690 WinSetWindowPos(hwndC,
691 HWND_TOP,
[551]692 0, 0, 0, 0, SWP_SHOW | SWP_RESTORE | SWP_ACTIVATE);
[133]693 if (SHORT1FROMMP(mp1) == IDM_GREP)
694 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
[551]695 WM_COMMAND, MPFROM2SHORT(IDM_GREP, 0), MPVOID);
[133]696 if (SHORT1FROMMP(mp1) == IDM_SEEALL)
697 PostMsg(WinWindowFromID(hwndC, FID_CLIENT),
[551]698 WM_COMMAND, MPFROM2SHORT(IDM_SEEALL, 0), MPVOID);
[2]699 }
[133]700 }
701 break;
[2]702
[133]703 case IDM_EDITCOMMANDS:
704 EditCommands(hwnd);
705 break;
706
707 default:
708 if (SHORT1FROMMP(mp1) >= IDM_SWITCHSTART &&
[551]709 SHORT1FROMMP(mp1) < IDM_SWITCHSTART + 499) {
[133]710 if (SHORT1FROMMP(mp1) - IDM_SWITCHSTART < numswitches)
[551]711 WinSwitchToProgram(switches[SHORT1FROMMP(mp1) - IDM_SWITCHSTART]);
[2]712 break;
[133]713 }
714 else if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART &&
[551]715 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) {
[2]716
[133]717 INT x;
718 HWND hwndCnr;
719
720 if (!cmdloaded)
721 load_commands();
[551]722 hwndCnr = TopWindow(hwnd, (HWND) 0);
723 hwndCnr = (HWND) WinSendMsg(WinWindowFromID(hwndCnr, FID_CLIENT),
724 UM_CONTAINERHWND, MPVOID, MPVOID);
725 if (!hwndCnr) {
[1398]726 Runtime_Error(pszSrcFile, __LINE__, NULL);
[133]727 break;
[2]728 }
[1486]729 x = SHORT1FROMMP(mp1);// - IDM_COMMANDSTART;
[551]730 if (x >= 0) {
[1486]731 //x++;
[133]732 RunCommand(hwndCnr, x);
[551]733 if (fUnHilite) {
[2]734
[133]735 PCNRITEM pci;
736 DIRCNRDATA *dcd = NULL;
[2]737
[133]738 if (WinQueryWindowUShort(hwndCnr, QWS_ID) != TREE_CNR)
739 dcd = INSTDATA(hwndCnr);
740 pci = (PCNRITEM) WinSendMsg(hwndCnr,
741 CM_QUERYRECORDEMPHASIS,
742 MPFROMLONG(CMA_FIRST),
743 MPFROMSHORT(CRA_CURSORED));
[672]744 if (pci && (INT) pci != -1 && (pci->rc.flRecordAttr & CRA_SELECTED)) {
745 UnHilite(hwnd,
746 TRUE,
747 dcd ? &dcd->lastselection : NULL,
748 dcd ? dcd->ulItemsToUnHilite : 0);
749 }
[133]750 }
[2]751 }
[133]752 }
753 else if (SHORT1FROMMP(mp1) >= IDM_QUICKTOOLSTART &&
[1131]754 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART + 51) {
[133]755 if (!qtloaded)
756 load_quicktools();
[1131]757 if (quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]) {
[133]758 if (fToolsChanged)
759 save_tools(NULL);
[1131]760 if (!load_tools(quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]))
[133]761 load_tools(NULL);
[551]762 else {
[1125]763 strcpy(lasttoolbar,
[1131]764 quicktool[SHORT1FROMMP(mp1) - IDM_QUICKTOOLSTART - 1]);
[1128]765 PrfWriteProfileString(fmprof, appname, "LastToolbar", lasttoolbar);
[133]766 }
[1125]767 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
[2]768 }
[133]769 }
[551]770 else {
[2]771
[133]772 HWND hwndActive;
[2]773
[551]774 hwndActive = TopWindow(hwnd, (HWND) 0);
[133]775 if (hwndActive)
[551]776 PostMsg(WinWindowFromID(hwndActive, FID_CLIENT), msg, mp1, mp2);
[133]777 }
778 break;
[2]779 }
780 return 0;
781}
782
[551]783static MRESULT EXPENTRY MainWMOnce2(HWND hwnd, ULONG msg, MPARAM mp1,
784 MPARAM mp2)
[133]785{
[2]786 PERSON1DATA *pd;
[1777]787 TID tid;
788 SWP swp;
789 PFNWP oldproc;
790 HWND hwndMenu;
791 DIRCNRDATA *dcd;
792 HWND hwndC;
793 ULONG which;
794 ULONG size;
[2]795
[551]796 switch (msg) {
[133]797 case WM_CREATE:
[1777]798 WinQueryWindowProcess(hwnd, &mypid, &tid);
799 hwndMain = hwnd;
[2]800
[133]801 WinSetWindowUShort(hwnd, QWL_USER + 8, 0);
802 WinSetWindowUShort(hwnd, QWL_USER + 10, 0);
803 WinSetWindowUShort(hwnd, QWL_USER + 12, 0);
804 WinSetWindowUShort(hwnd, QWL_USER + 16, 0);
[1335]805 if (xbeginthread(MakeMainObjWin,
806 245760,
807 MPVOID,
808 pszSrcFile,
809 __LINE__) == -1)
810 {
[551]811 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
[133]812 return 0;
813 }
814 else
[771]815 DosSleep(32);//05 Aug 07 GKY 64
[2]816
[551]817 pd = xmallocz(sizeof(PERSON1DATA), pszSrcFile, __LINE__);
[133]818 if (!pd)
819 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
[352]820 else {
[551]821 pd->size = sizeof(PERSON1DATA);
822 WinSetWindowPtr(hwnd, QWL_USER + 4, (PVOID) pd);
[133]823 }
[2]824
[1777]825 // create frame children (not client children, frame children)
826 DosSleep(1);
827 WinQueryWindowPos(WinQueryWindow(hwnd, QW_PARENT), &swp);
828 oldproc = WinSubclassWindow(WinQueryWindow(hwnd, QW_PARENT),
829 (PFNWP) MainFrameWndProc2);
830 if (oldproc)
831 WinSetWindowPtr(WinQueryWindow(hwnd, QW_PARENT), QWL_USER, (PVOID) oldproc);
[2]832
[1777]833 CommonCreateMainChildren(hwnd, &swp);
[2]834
[1777]835 hwndMenu = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_MENU);
836 WinSetWindowULong(hwnd, QWL_USER, hwndMenu);
837
838 // 2014-05-15 SHL FIXME to be sure needed
839 // WinCheckMenuItem(hwndMenu, IDM_TOGGLEDRAGDIALOG, fDragndropDlg); // 2014-05-15 SHL
840
841 CfgMenuInit(hwndMenu, FALSE); // 14 Feb 08 SHL
842 SetConditionalCascade(hwndMenu, IDM_COMMANDLINESUBMENU, IDM_COMMANDLINE);
843
844 if (fProtectOnly) {
845 WinEnableMenuItem(hwndMenu, IDM_DOSCOMMANDLINE, FALSE);
846 WinEnableMenuItem(hwndMenu, IDM_WINFULLSCREEN, FALSE);
[133]847 }
[1777]848
849 SetConditionalCascade(hwndMenu, IDM_COMMANDSMENU, IDM_DOITYOURSELF);
850 SetConditionalCascade(hwndMenu, IDM_TOOLSUBMENU, IDM_TOOLBAR);
851
[133]852 WinSetWindowText(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
[551]853 FID_TITLEBAR), "FM/2 Lite");
[1777]854
[551]855 FixSwitchList(WinQueryWindow(hwnd, QW_PARENT), NULL);
856 SetSysMenu(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), FID_SYSMENU));
[133]857 break;
[2]858
[133]859 case UM_SETUP:
[299]860 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]861 if (pd) {
[133]862 CHAR s[CCHMAXPATH];
863 BOOL dummy = TRUE;
[2]864
[133]865 size = sizeof(BOOL);
[1482]866 PrfQueryProfileData(fmprof, realappname, "FM/4 TreeUp",
[1777]867 (PVOID) &dummy, &size);
[551]868 if (dummy) {
[133]869 size = sizeof(ULONG);
870 hwndTree = StartTreeCnr(hwnd, 3);
[1777]871 PrfQueryProfileData(fmprof, realappname, "FM/4 TreeWidth",
872 (PVOID) &TreeWidth, &size);
[133]873 TreeWidth = max(TreeWidth, 80);
874 }
875 size = sizeof(BOOL);
[1482]876 if (PrfQueryProfileData(fmprof, appname, "Toolbar", &dummy, &size) &&
[1777]877 size && !dummy)
[551]878 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_TOOLBAR, 0), MPVOID);
[2]879
[133]880 size = sizeof(s);
881 *s = 0;
[1482]882 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir1", s, &size) && *s)
[133]883 MakeValidDir(s);
884 else
885 save_dir(s);
[551]886 pd->hwndLastDir = pd->hwndCurr = pd->hwndDir1 =
887 StartDirCnr(hwnd, s, (HWND) 0, 3);
[133]888 size = sizeof(s);
889 *s = 0;
[1482]890 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir2", s, &size) && *s)
[133]891 MakeValidDir(s);
892 else
893 save_dir(s);
[551]894 pd->hwndDir2 = StartDirCnr(hwnd, s, (HWND) 0, 3);
895 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
[2]896
[551]897 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
898 if (hwndC) {
[299]899 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]900 if (dcd) {
[133]901 size = sizeof(INT);
[1482]902 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir1.Sort",
[551]903 (PVOID) & dcd->sortFlags,
904 &size) && size == sizeof(INT)) {
905 if (!dcd->sortFlags)
906 dcd->sortFlags = SORT_PATHNAME;
[133]907 }
908 size = sizeof(MASK);
[1482]909 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir1.Filter",
[551]910 (PVOID) & dcd->mask, &size) && size) {
911 if (*dcd->mask.szMask)
[133]912 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]913 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]914 }
[551]915 *(dcd->mask.prompt) = 0;
[133]916 size = sizeof(ULONG);
[1482]917 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir1.View",
[551]918 (PVOID) & dcd->flWindowAttr,
919 &size) && size == sizeof(ULONG)) {
[2]920
[133]921 CNRINFO cnri;
[2]922
[133]923 memset(&cnri, 0, sizeof(CNRINFO));
924 cnri.cb = sizeof(CNRINFO);
925 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
926 CM_QUERYCNRINFO,
[551]927 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
928 cnri.flWindowAttr = dcd->flWindowAttr;
[133]929 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
930 CM_SETCNRINFO,
[551]931 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
[133]932 }
933 }
934 }
935 }
[2]936
[551]937 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
938 if (hwndC) {
[299]939 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]940 if (dcd) {
[133]941 size = sizeof(INT);
[1482]942 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir2.Sort",
[551]943 (PVOID) & dcd->sortFlags,
944 &size) && size == sizeof(INT)) {
945 if (!dcd->sortFlags)
946 dcd->sortFlags = SORT_PATHNAME;
[133]947 }
948 size = sizeof(MASK);
[1482]949 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir2.Filter",
[551]950 (PVOID) & dcd->mask, &size) && size) {
951 if (*dcd->mask.szMask)
[133]952 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
[551]953 UM_FILTER, MPFROMP(dcd->mask.szMask), MPVOID);
[133]954 }
[551]955 *(dcd->mask.prompt) = 0;
[133]956 size = sizeof(ULONG);
[1482]957 if (PrfQueryProfileData(fmprof, realappname, "FM/4 Dir2.View",
[551]958 (PVOID) & dcd->flWindowAttr,
959 &size) && size == sizeof(ULONG)) {
[2]960
[133]961 CNRINFO cnri;
[2]962
[133]963 memset(&cnri, 0, sizeof(CNRINFO));
964 cnri.cb = sizeof(CNRINFO);
965 if (WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
966 CM_QUERYCNRINFO,
[551]967 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO)))) {
968 cnri.flWindowAttr = dcd->flWindowAttr;
[133]969 WinSendMsg(WinWindowFromID(hwndC, DIR_CNR),
970 CM_SETCNRINFO,
[551]971 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR));
[133]972 }
973 }
974 }
[2]975 }
[133]976 }
[1777]977 // 2014-06-11 SHL Initialize view, sort and filter button text
978 if (pd->hwndDir1) {
979 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
980 if (hwndC) {
981 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
982 if (dcd && dcd->hwndCnr)
983 PostMsg(dcd->hwndCnr, UM_SETUP2, MPVOID, MPVOID);
[2]984 }
[133]985 }
[1777]986 if (pd->hwndDir2) {
987 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
988 if (hwndC) {
989 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
990 if (dcd && dcd->hwndCnr)
991 PostMsg(dcd->hwndCnr, UM_SETUP2, MPVOID, MPVOID);
992 }
993 }
994
995 which = 0;
996 size = sizeof(ULONG);
997 if (PrfQueryProfileData(fmprof,
998 realappname,
999 "FM/4 Max",
1000 (PVOID)&which,
1001 &size) &&
1002 size == sizeof(ULONG) &&
1003 which)
1004 {
1005 PostMsg(hwnd,
1006 UM_MAXIMIZE,
1007 MPFROMLONG(((which == 1) ?
1008 pd->hwndDir1 : pd->hwndDir2)), MPVOID);
1009 }
[551]1010 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]1011 if (!hwndTree)
[551]1012 PostMsg(hwnd, UM_BUILDDRIVEBAR, MPVOID, MPVOID);
[133]1013 load_tools(NULL);
[1125]1014 PostMsg(hwndToolback, UM_SETUP2, MPVOID, MPVOID);
[133]1015 fRunning = TRUE;
1016 return 0;
[2]1017
[133]1018 case WM_SAVEAPPLICATION:
[1498]1019 WinStoreWindowPos((CHAR *) FM2Str,
[551]1020 "MainWindowPos2", WinQueryWindow(hwnd, QW_PARENT));
[299]1021 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1022 if (pd) {
[2]1023
[133]1024 CHAR s[CCHMAXPATH];
1025 HWND hwndC;
1026 DIRCNRDATA *dcd;
1027 ULONG flWindowAttr;
[2]1028
[133]1029 *s = 0;
[551]1030 WinSendMsg(pd->hwndDir1, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
1031 if (*s) {
[133]1032 MakeValidDir(s);
[551]1033 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir1", s);
[133]1034 }
1035 *s = 0;
[551]1036 WinSendMsg(pd->hwndDir2, UM_CONTAINERDIR, MPFROMP(s), MPVOID);
1037 if (*s) {
[133]1038 MakeValidDir(s);
[551]1039 PrfWriteProfileString(fmprof, realappname, "FM/4 Dir2", s);
[133]1040 }
[551]1041 flWindowAttr = (pd->hwndMax == pd->hwndDir1) ?
1042 1 : (pd->hwndMax == pd->hwndDir2) ? 2 : 0;
[133]1043 PrfWriteProfileData(fmprof,
1044 realappname,
[551]1045 "FM/4 Max", &flWindowAttr, sizeof(flWindowAttr));
1046 hwndC = WinWindowFromID(pd->hwndDir1, FID_CLIENT);
1047 if (hwndC) {
[299]1048 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]1049 if (dcd) {
1050 flWindowAttr = dcd->flWindowAttr;
1051 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
[133]1052 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
[551]1053 if (dcd->lastattr) {
1054 if (dcd->lastattr & CV_TEXT)
[133]1055 flWindowAttr |= CV_TEXT;
[551]1056 else if (dcd->lastattr & CV_DETAIL)
[133]1057 flWindowAttr |= CV_DETAIL;
[551]1058 else if (dcd->lastattr & CV_ICON)
[133]1059 flWindowAttr |= CV_ICON;
1060 else
1061 flWindowAttr |= CV_NAME;
1062 }
1063 else
1064 flWindowAttr |= CV_NAME;
1065 }
[1482]1066 PrfWriteProfileData(fmprof, realappname, "FM/4 Dir1.Sort",
[551]1067 (PVOID) & dcd->sortFlags, sizeof(INT));
[1482]1068 PrfWriteProfileData(fmprof, realappname, "FM/4 Dir1.Filter",
[551]1069 (PVOID) & dcd->mask, sizeof(MASK));
[1482]1070 PrfWriteProfileData(fmprof, realappname, "FM/4 Dir1.View",
[551]1071 (PVOID) & flWindowAttr, sizeof(ULONG));
[133]1072 }
1073 }
[2]1074
[551]1075 hwndC = WinWindowFromID(pd->hwndDir2, FID_CLIENT);
1076 if (hwndC) {
[299]1077 dcd = WinQueryWindowPtr(WinWindowFromID(hwndC, DIR_CNR), QWL_USER);
[551]1078 if (dcd) {
1079 flWindowAttr = dcd->flWindowAttr;
1080 if (!fLeaveTree && (flWindowAttr & CV_TREE)) {
[133]1081 flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT));
[551]1082 if (dcd->lastattr) {
1083 if (dcd->lastattr & CV_TEXT)
[133]1084 flWindowAttr |= CV_TEXT;
[551]1085 else if (dcd->lastattr & CV_DETAIL)
[133]1086 flWindowAttr |= CV_DETAIL;
[551]1087 else if (dcd->lastattr & CV_ICON)
[133]1088 flWindowAttr |= CV_ICON;
1089 else
1090 flWindowAttr |= CV_NAME;
1091 }
1092 else
1093 flWindowAttr |= CV_NAME;
1094 }
[1482]1095 PrfWriteProfileData(fmprof, realappname, "FM/4 Dir2.Sort",
[551]1096 (PVOID) & dcd->sortFlags, sizeof(INT));
[1482]1097 PrfWriteProfileData(fmprof, realappname, "FM/4 Dir2.Filter",
[551]1098 (PVOID) & dcd->mask, sizeof(MASK));
[1482]1099 PrfWriteProfileData(fmprof, realappname, "FM/4 Dir2.View",
[551]1100 (PVOID) & flWindowAttr, sizeof(ULONG));
[133]1101 }
[2]1102 }
[133]1103 }
1104 break;
[2]1105 }
[133]1106 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1107}
1108
[133]1109MRESULT EXPENTRY MainWndProc2(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
1110{
[2]1111 PERSON1DATA *pd;
1112
[551]1113 switch (msg) {
[133]1114 case WM_SAVEAPPLICATION:
1115 case UM_SETUP:
1116 case WM_CREATE:
1117 return MainWMOnce2(hwnd, msg, mp1, mp2);
[2]1118
[133]1119 case UM_THREADUSE:
1120 case UM_LOADFILE:
[246]1121 case UM_BUILDDRIVEBAR:
[1457]1122 case WM_TIMER:
[133]1123 return CommonMainWndProc(hwnd, msg, mp1, mp2);
[2]1124
[133]1125 case UM_SETUP2:
[299]1126 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1127 if (pd) {
1128 if (mp1) {
1129 if (pd->hwndDir1 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir1))
1130 BoxWindow(pd->hwndDir1, (HPS) 0, CLR_PALEGRAY);
1131 if (pd->hwndDir2 && (!pd->hwndMax || pd->hwndMax == pd->hwndDir2))
1132 BoxWindow(pd->hwndDir2, (HPS) 0, CLR_PALEGRAY);
[133]1133 if (hwndTree)
[551]1134 BoxWindow(hwndTree, (HPS) 0, CLR_PALEGRAY);
[2]1135 }
[551]1136 else {
[133]1137 if (hwndTree)
1138 BoxWindow(hwndTree,
1139 (HPS) 0,
[551]1140 (pd->hwndCurr == hwndTree) ? CLR_RED : CLR_WHITE);
1141 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir1)
1142 BoxWindow(pd->hwndDir1,
[133]1143 (HPS) 0,
[551]1144 (pd->hwndDir1 == pd->hwndCurr) ?
[133]1145 CLR_RED :
[551]1146 (pd->hwndDir1 == pd->hwndLastDir) ?
1147 CLR_DARKRED : CLR_PALEGRAY);
1148 if (!pd->hwndMax || pd->hwndMax == pd->hwndDir2)
1149 BoxWindow(pd->hwndDir2,
[133]1150 (HPS) 0,
[551]1151 (pd->hwndDir2 == pd->hwndCurr) ?
[133]1152 CLR_RED :
[551]1153 (pd->hwndDir2 == pd->hwndLastDir) ?
1154 CLR_DARKRED : CLR_PALEGRAY);
[133]1155 }
1156 }
1157 return 0;
[2]1158
[133]1159 case WM_BUTTON1DOWN:
1160 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
[551]1161 if (hwndTree) {
[2]1162
[133]1163 SWP swp;
[2]1164
[133]1165 WinQueryWindowPos(hwndTree, &swp);
1166 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
[551]1167 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3) {
[2]1168
[133]1169 SWP swpC;
1170 TRACKINFO track;
[2]1171
[133]1172 WinQueryWindowPos(hwnd, &swpC);
1173 track.cxBorder = 4;
1174 track.cyBorder = 4;
1175 track.cxGrid = 1;
1176 track.cyGrid = 1;
1177 track.cxKeyboard = 8;
1178 track.cyKeyboard = 8;
1179 track.rclTrack.yBottom = 2;
1180 track.rclTrack.yTop = swpC.cy - 4;
1181 track.rclTrack.xLeft = 2;
1182 track.rclTrack.xRight = swp.x + swp.cx + 2;
1183 track.rclBoundary = track.rclTrack;
1184 track.rclBoundary.xRight = swpC.cx - 80;
1185 track.ptlMinTrackSize.x = 80;
1186 track.ptlMinTrackSize.y = swpC.cy - 4;
1187 track.ptlMaxTrackSize.x = swpC.cx - 80;
1188 track.ptlMaxTrackSize.y = swpC.cy - 4;
1189 track.fs = TF_RIGHT;
[551]1190 if (WinTrackRect(hwnd, (HPS) 0, &track)) {
[133]1191 TreeWidth = track.rclTrack.xRight - track.rclTrack.xLeft;
1192 PrfWriteProfileData(fmprof,
1193 realappname,
[551]1194 "FM/4 TreeWidth", &TreeWidth, sizeof(ULONG));
1195 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1196 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[133]1197 }
1198 return (MRESULT) TRUE;
[2]1199 }
[133]1200 }
1201 break;
[2]1202
[133]1203 case WM_MOUSEMOVE:
1204 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL));
[551]1205 if (hwndTree) {
[2]1206
[133]1207 SWP swp;
[2]1208
[551]1209 if (WinQueryWindowPos(hwndTree, &swp)) {
[133]1210 if (SHORT1FROMMP(mp1) > (swp.x + swp.cx) - 3 &&
1211 SHORT1FROMMP(mp1) < (swp.x + swp.cx) + 3)
1212 WinSetPointer(HWND_DESKTOP, hptrEW);
1213 else
1214 WinSetPointer(HWND_DESKTOP, hptrArrow);
[2]1215 }
[133]1216 else
1217 WinSetPointer(HWND_DESKTOP, hptrArrow);
1218 }
1219 return (MRESULT) TRUE;
[2]1220
[133]1221 case WM_BUTTON1UP:
1222 case WM_BUTTON2UP:
1223 case WM_BUTTON3UP:
1224 case WM_CHAR:
1225 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL));
1226 break;
[2]1227
[133]1228 case UM_ADVISEFOCUS:
[299]1229 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1230 if (mp1 && pd && (HWND) mp1 != pd->hwndCurr) {
1231 if ((HWND) mp1 != hwndTree)
1232 pd->hwndLastDir = (HWND) mp1;
1233 pd->hwndCurr = (HWND) mp1;
1234 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[133]1235 }
1236 return 0;
[2]1237
[133]1238 case UM_MAXIMIZE:
[551]1239 if (mp1) {
[299]1240 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1241 if (pd) {
1242 WinSendMsg(hwnd, UM_SETUP2, MPFROMLONG(1), MPVOID);
1243 if (pd->hwndMax != (HWND) mp1) {
1244 pd->hwndMax = (HWND) mp1;
1245 WinSetFocus(HWND_DESKTOP, pd->hwndMax);
[133]1246 }
1247 else
[551]1248 pd->hwndMax = (HWND) 0;
1249 PostMsg(hwnd, UM_SIZE, MPVOID, MPVOID);
[2]1250 }
[133]1251 }
1252 return 0;
[2]1253
[133]1254 case WM_INITMENU:
[551]1255 switch (SHORT1FROMMP(mp1)) {
[133]1256 case IDM_FILESMENU:
1257 case IDM_VIEWSMENU:
1258 case IDM_DETAILSSETUP:
1259 case IDM_COMMANDSMENU:
1260 case IDM_SORTSUBMENU:
[299]1261 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1262 if (pd)
[551]1263 WinSendMsg(pd->hwndCurr, UM_INITMENU, mp1, mp2);
[2]1264 break;
[133]1265 case IDM_CONFIGMENU:
[1777]1266 // 2014-05-17 SHL FIXME to use SetToggleChecks maybe
[551]1267 WinCheckMenuItem((HWND) mp2, IDM_TOOLSUBMENU, fToolbar);
1268 WinCheckMenuItem((HWND) mp2, IDM_AUTOVIEW, fAutoView);
[1777]1269 WinCheckMenuItem((HWND) mp2, IDM_CONFIRMDELETE, fConfirmDelete); // 2014-05-17 SHL
1270 WinCheckMenuItem((HWND) mp2, IDM_TOGGLEDRAGDIALOG, fDragndropDlg); // 2014-05-15 SHL
[2]1271 break;
[133]1272 case IDM_TOOLSUBMENU:
[1777]1273 // 2014-05-17 SHL FIXME to use SetToggleChecks maybe
[551]1274 WinCheckMenuItem((HWND) mp2, IDM_TOOLBAR, fToolbar);
1275 WinCheckMenuItem((HWND) mp2, IDM_TEXTTOOLS, fTextTools);
1276 WinCheckMenuItem((HWND) mp2, IDM_TOOLTITLES, fToolTitles);
[133]1277 break;
1278 case IDM_WINDOWSMENU:
[1777]1279 // 2014-05-17 SHL FIXME to use SetToggleChecks maybe
[551]1280 WinCheckMenuItem((HWND) mp2, IDM_VTREE, (hwndTree != (HWND) 0));
1281 WinCheckMenuItem((HWND) mp2, IDM_TILEBACKWARDS, fTileBackwards);
1282 SetupWinList((HWND) mp2, hwnd, WinQueryWindow(hwnd, QW_PARENT));
[133]1283 break;
1284 }
1285 break;
[2]1286
[133]1287 case WM_SETFOCUS:
1288 if (mp2)
[551]1289 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID);
[133]1290 break;
[2]1291
[133]1292 case UM_FOCUSME:
[299]1293 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[133]1294 if (pd)
[551]1295 WinSetFocus(HWND_DESKTOP, pd->hwndCurr);
[133]1296 return 0;
[2]1297
[133]1298 case UM_RESCAN:
1299 return 0;
1300
1301 case UM_SIZE:
1302 {
1303 SWP swp;
1304
[551]1305 if (WinQueryWindowPos(hwnd, &swp)) {
[133]1306 mp1 = MPFROM2SHORT(swp.cx, swp.cy);
1307 mp2 = MPFROM2SHORT(swp.cx, swp.cy);
[2]1308 }
[133]1309 else
1310 return 0;
1311 }
[1673]1312 // intentional fallthru
[133]1313 case WM_SIZE:
[299]1314 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[551]1315 if (mp1 && mp2 && pd && pd->hwndDir1 && pd->hwndDir2) {
[133]1316 if (hwndTree)
1317 WinSetWindowPos(hwndTree,
1318 HWND_TOP,
1319 2,
1320 2,
1321 TreeWidth - 4,
1322 SHORT2FROMMP(mp2) - 4,
1323 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1324 else
1325 TreeWidth = 0;
[551]1326 if (!pd->hwndMax) {
1327 if (fTileBackwards) {
1328 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
[133]1329 (((SHORT1FROMMP(mp2) - TreeWidth) / 2) +
1330 TreeWidth) + 2,
1331 2,
1332 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1333 SHORT2FROMMP(mp2) - 4,
1334 SWP_SHOW | SWP_MOVE | SWP_SIZE);
[551]1335 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
[133]1336 TreeWidth + 2,
1337 2,
1338 ((SHORT1FROMMP(mp2) - TreeWidth) / 2) - 4,
1339 SHORT2FROMMP(mp2) - 4,
1340 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1341 }
[551]1342 else {
1343 WinSetWindowPos(pd->hwndDir1, HWND_TOP,
[133]1344 TreeWidth + 2,
1345 2,
1346 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1347 (SHORT2FROMMP(mp2) / 2) - 4,
1348 SWP_SHOW | SWP_MOVE | SWP_SIZE);
[551]1349 WinSetWindowPos(pd->hwndDir2, HWND_TOP,
[133]1350 TreeWidth + 2,
1351 (SHORT2FROMMP(mp2) / 2) + 2,
1352 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1353 (SHORT2FROMMP(mp2) / 2) - 4,
1354 SWP_SHOW | SWP_MOVE | SWP_SIZE);
1355 }
1356 }
[551]1357 else {
[2]1358
[133]1359 HWND hwndOther;
[2]1360
[551]1361 WinSetWindowPos(pd->hwndMax, HWND_TOP,
[133]1362 TreeWidth + 2,
1363 2,
1364 (SHORT1FROMMP(mp2) - TreeWidth) - 4,
1365 SHORT2FROMMP(mp2) - 4,
1366 SWP_SHOW | SWP_MOVE | SWP_SIZE);
[551]1367 hwndOther = (pd->hwndMax == pd->hwndDir1) ?
1368 pd->hwndDir2 : pd->hwndDir1;
[133]1369 WinSetWindowPos(hwndOther, HWND_BOTTOM, 0, 0, 0, 0, SWP_HIDE);
[2]1370 }
[551]1371 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[133]1372 }
1373 if (msg == UM_SIZE)
[2]1374 return 0;
[133]1375 break;
[2]1376
[133]1377 case WM_ERASEBACKGROUND:
[551]1378 WinFillRect((HPS) mp1, (PRECTL) mp2, 0x00d0d0d0);
[133]1379 return 0;
1380
1381 case WM_PAINT:
1382 {
1383 HPS hps;
1384 RECTL rcl;
1385
[551]1386 hps = WinBeginPaint(hwnd, NULLHANDLE, NULL);
1387 if (hps) {
[133]1388 WinQueryWindowRect(hwnd, &rcl);
[551]1389 WinFillRect(hps, (PRECTL) & rcl, CLR_PALEGRAY);
[133]1390 WinEndPaint(hps);
[551]1391 WinSendMsg(hwnd, UM_SETUP2, MPVOID, MPVOID);
[2]1392 }
[133]1393 }
1394 break;
[2]1395
[133]1396 case UM_COMMAND:
1397 case WM_COMMAND:
1398 return MainWMCommand2(hwnd, msg, mp1, mp2);
[2]1399
[133]1400 case WM_CLOSE:
1401 fAmClosing = TRUE;
[551]1402 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID);
[133]1403 CloseChildren(hwnd);
[551]1404 PostMsg(hwnd, UM_CLOSE, MPVOID, MPVOID);
[771]1405 DosSleep(1);
[1700]1406 return 0; // Suppress WinDefWindowProc WM_QUIT message generation
[2]1407
[133]1408 case UM_CLOSE:
1409 WinDestroyWindow(WinQueryWindow(hwnd, QW_PARENT));
1410 return 0;
[2]1411
[133]1412 case WM_DESTROY:
[551]1413 hwndMain = (HWND) 0;
[299]1414 pd = WinQueryWindowPtr(hwnd, QWL_USER + 4);
[1009]1415 xfree(pd, pszSrcFile, __LINE__);
[551]1416 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID))
1417 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID);
[133]1418 break;
[2]1419 }
[133]1420 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]1421}
1422
[133]1423HWND StartFM32(HAB hab, INT argc, CHAR ** argv)
1424{
1425 HWND hwndFrame, hwndClient;
1426 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
[551]1427 FCF_SIZEBORDER | FCF_MINMAX |
1428 FCF_ACCELTABLE | FCF_MENU | FCF_ICON | FCF_TASKLIST | FCF_NOBYTEALIGN;
[2]1429
1430 {
1431 INT x;
1432
[551]1433 for (x = 1; x < argc; x++) {
[133]1434 if (*argv[x] == '+' && !argv[x][1])
1435 fLogFile = TRUE;
[551]1436 if (*argv[x] == '-') {
[133]1437 if (argv[x][1])
1438 strcpy(profile, &argv[x][1]);
[2]1439 }
1440 }
1441 }
1442 {
[133]1443 CHAR inipath[CCHMAXPATH], fullpath[CCHMAXPATH];
[843]1444 FILESTATUS3 fsa;
[2]1445
[133]1446 if (PrfQueryProfileString(HINI_USERPROFILE,
[1498]1447 (CHAR *) FM2Str,
[551]1448 "Home", NULL, inipath, sizeof(inipath))) {
[843]1449 if (!DosQueryPathInfo(inipath, FIL_STANDARD, &fsa, sizeof(fsa))) {
[551]1450 if (fsa.attrFile & FILE_DIRECTORY) {
[133]1451 if (DosQueryPathInfo(inipath,
[551]1452 FIL_QUERYFULLNAME, fullpath, sizeof(fullpath)))
[133]1453 strcpy(fullpath, inipath);
1454 switch_to(fullpath);
1455 }
[2]1456 }
1457 }
1458 }
1459
1460 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
[133]1461 WS_VISIBLE,
1462 &FrameFlags,
[1498]1463 (CHAR *) WC_MAINWND2,
[133]1464 NULL,
1465 WS_VISIBLE | WS_ANIMATE,
[551]1466 FM3ModHandle, MAIN2_FRAME, &hwndClient);
1467 if (hwndFrame) {
[875]1468 hwndMainMenu = WinWindowFromID(hwndFrame, FID_MENU);
[1498]1469 if (!WinRestoreWindowPos((CHAR *) FM2Str, "MainWindowPos2", hwndFrame)) {
[2]1470
[133]1471 ULONG fl = SWP_MOVE | SWP_SIZE;
[2]1472 RECTL rcl;
[133]1473 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1474 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
[2]1475
[133]1476 WinQueryWindowRect(HWND_DESKTOP, &rcl);
[2]1477 rcl.yBottom += icz;
1478 rcl.yTop -= bsz;
1479 rcl.xLeft += bsz;
1480 rcl.xRight -= bsz;
1481 WinSetWindowPos(hwndFrame,
[133]1482 HWND_TOP,
1483 rcl.xLeft,
1484 rcl.yBottom,
[551]1485 rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom, fl);
[2]1486 }
[1544]1487 if (fLogFile) {
1488 CHAR *modea = "a+";
1489
1490 LogFileHandle = xfsopen("FM2.LOG", modea, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
1491 }
[133]1492 if (hwndHelp)
1493 WinAssociateHelpInstance(hwndHelp, hwndFrame);
[551]1494 PostMsg(hwndClient, UM_SETUP, MPFROMLONG(argc), MPFROMP(argv));
[2]1495 }
1496 return hwndFrame;
1497}
[793]1498
1499#pragma alloc_text(PERSON11,MainFrameWndProc2,MainWndProc2)
1500#pragma alloc_text(PERSON12,StartFM32,MainWMOnce2)
1501#pragma alloc_text(PERSON13,MainWMCommand2)
Note: See TracBrowser for help on using the repository browser.