source: trunk/dll/mainwnd2.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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