source: trunk/dll/common.c@ 1876

Last change on this file since 1876 was 1876, checked in by Gregg Young, 10 years ago

Eliminate some unnecessary Flesh and UnFlesh calls.Update icon and display name on CD/DVD eject in all cases.
Don't use Flesh thread for floppy drive scans fix them getting mistakenly identified as directories and add nonexistent subdirectories.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.6 KB
Line 
1
2/***********************************************************************
3
4 $Id: common.c 1876 2015-10-10 23:42:28Z gyoung $
5
6 Common window functions
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2001, 2015 Steven H. Levine
10
11 13 Aug 05 SHL Renames
12 22 Jul 06 SHL Check more run time errors
13 15 Aug 06 SHL Use Dos_Error
14 03 Nov 06 SHL Rework thread usage count logic
15 07 Jan 07 GKY Move error strings etc. to string file
16 07 Jan 07 GKY Updated Helv font to vector font Helvetica
17 22 Mar 07 GKY Use QWL_USER
18 30 Mar 07 GKY Remove GetPString for window class names
19 02 Aug 07 SHL Sync with CNRITEM mods
20 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
21 26 Aug 07 SHL Change to DosSleep(0)
22 29 Feb 08 GKY Use xfree where appropriate
23 06 Jul 08 GKY Update delete/undelete to include move to and open XWP trashcan
24 01 Jan 09 GKY Add option to rescan tree container on eject of removable media
25 11 Jan 09 GKY Replace font names in the string file with global set at compile in init.c
26 07 Feb 09 GKY Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error
27 08 Mar 09 GKY Additional strings move to PCSZs in init.c
28 22 Jul 09 GKY Drivebar enhancements add refresh removable, rescan all drives, drive button
29 22 Jul 09 GKY Drivebar enhancements add refresh removable, rescan all drives, drive button
30 loads drive root directory in directory container or expands drive tree
31 and rescans drive in tree container depending on container focus, greyed out
32 inappropriate menu context choices
33 14 Sep 09 SHL Blink thread LEDs while threads working
34 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
35 13 Jul 15 GKY Fix CN_REALLOCPSZ file name editing code to: 1) Eliminate the possibility of
36 updating the container before CN_ENDEDIT is called. 2) Don't call RemoveCnrItems
37 for tree container and collector.
38 07 Aug 15 SHL Clean up and comment
39 10 Oct 15 GKY Update icon and display name on CD/DVD eject in all cases.
40
41***********************************************************************/
42
43#include <stdlib.h>
44#include <string.h>
45#include <ctype.h>
46
47#define INCL_DOS
48#define INCL_DOSERRORS
49#define INCL_WIN
50#define INCL_GPI
51#define INCL_LONGLONG // dircnrs.h
52
53#include "fm3dll.h"
54#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
55#include "mainwnd2.h" // Data declaration(s)
56#include "killproc.h" // Data declaration(s)
57#include "collect.h" // Data declaration(s)
58#include "grep.h" // Data declaration(s)
59#include "dircnrs.h" // Data declaration(s)
60#include "notebook.h" // Data declaration(s)
61#include "inis.h" // Data declaration(s)
62#include "init.h" // Data declaration(s)
63#include "treecnr.h" // Data declaration(s)
64#include "fm3dlg.h"
65#include "fm3str.h"
66#include "mle.h"
67#include "errutil.h" // Dos_Error...
68#include "strutil.h" // GetPString
69#include "autoview.h" // AutoViewProc
70#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
71#include "dirsize.h" // DirSizeProc
72#include "info.h" // DrvInfoProc, SetDrvProc
73#include "seeall.h" // StartSeeAll
74#include "misc.h" // Broadcast
75#include "valid.h" // CheckDrive
76#include "mkdir.h" // PMMkDir
77#include "presparm.h" // SetPresParams
78#include "undel.h" // UndeleteDlgProc
79#include "systemf.h" // runemf2
80#include "wrappers.h" // xfree
81#include "fortify.h"
82
83// Data definitions
84#pragma data_seg(DATA1)
85static PSZ pszSrcFile = __FILE__;
86static HWND hwndLED;
87static HWND hwndLEDHdr;
88
89#pragma data_seg(GLOBAL1)
90HWND hwndBack;
91
92MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
93 HWND hwnd,
94 ULONG msg, MPARAM mp1, MPARAM mp2)
95{
96 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
97
98 switch (msg) {
99 case UM_TIMER:
100 case UM_ACTION:
101 case UM_SHOWME:
102 case UM_OPENWINDOWFORME:
103 case UM_MINIMIZE:
104 case UM_MAXIMIZE:
105 case UM_CONTAINERDIR:
106 case UM_FILTER:
107 case UM_INITMENU:
108 case UM_COMMAND:
109 case UM_UPDATERECORD:
110 case UM_UPDATERECORDLIST:
111 case WM_COMMAND:
112 case MM_PORTHOLEINIT:
113 case WM_INITMENU:
114 case UM_CONTAINER_FILLED:
115 case UM_FILESMENU:
116 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
117
118 case UM_CONTEXTMENU:
119 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
120 return 0;
121
122 case UM_CONTAINERHWND:
123 return MRFROMLONG(WinWindowFromID(hwnd, id));
124
125 case DM_DROP:
126 case DM_DRAGOVER:
127 case DM_DRAGLEAVE:
128 case DM_DROPHELP:
129 {
130 CNRDRAGINFO cnd;
131 USHORT dcmd;
132
133 switch (msg) {
134 case DM_DROP:
135 dcmd = CN_DROP;
136 break;
137 case DM_DRAGOVER:
138 dcmd = CN_DRAGOVER;
139 break;
140 case DM_DRAGLEAVE:
141 dcmd = CN_DRAGLEAVE;
142 break;
143 case DM_DROPHELP:
144 dcmd = CN_DROPHELP;
145 break;
146 }
147 cnd.pDragInfo = (PDRAGINFO) mp1;
148 cnd.pRecord = NULL;
149 return WinSendMsg(WinWindowFromID(hwnd, FID_CLIENT),
150 WM_CONTROL, MPFROM2SHORT(id, dcmd), MPFROMP(&cnd));
151 }
152
153 case UM_RESCAN:
154 if (fAutoTile &&
155 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
156 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
157 return 0;
158
159 case WM_MINMAXFRAME:
160 {
161 PSWP pswp = (PSWP) mp1;
162 MRESULT rc;
163
164 rc = oldproc(hwnd, msg, mp1, mp2);
165 if (pswp->fl & (SWP_MINIMIZE | SWP_HIDE | SWP_RESTORE))
166 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
167 return rc;
168 }
169
170 case WM_DESTROY:
171 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
172 break;
173 }
174 return oldproc(hwnd, msg, mp1, mp2);
175}
176
177MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
178{
179 switch (msg) {
180 case WM_CREATE:
181 {
182 MRESULT rc;
183
184 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
185 // 2014-06-11 SHL
186 switch (WinQueryWindowUShort(hwnd, QWS_ID)) {
187 case DIR_SORT:
188 case DIR_VIEW:
189 case DIR_FILTER:
190 //fixme to allow user to change presparams 1-10-09 GKY
191 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
192 return rc;
193 }
194 }
195 } // switch msg
196 return PFNWPStatic(hwnd, msg, mp1, mp2);
197}
198
199void CommonTextPaint(HWND hwnd, HPS hps)
200{
201 int x;
202 USHORT ids[] = { DIR_FOLDERICON, DIR_TOTALS, DIR_SELECTED, DIR_VIEW,
203 DIR_FILTER, DIR_SORT, DIR_MAX, 0
204 };
205 BOOL bools[] = { TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE };
206
207 for (x = 0; ids[x]; x++) {
208 if (WinWindowFromID(hwnd, ids[x]) != (HWND) 0)
209 PaintRecessedWindow(WinWindowFromID(hwnd, ids[x]), hps,
210 bools[x], FALSE);
211 }
212}
213
214void CommonCreateTextChildren(HWND hwnd, PCSZ class, USHORT * ids)
215{
216 int x;
217 CHAR s[33];
218 ULONG attrs;
219 HWND hwndTmp;
220
221 if (!hwnd || !class || !ids) {
222 Runtime_Error(pszSrcFile, __LINE__, NULL);
223 return;
224 }
225
226 for (x = 0; ids[x]; x++) {
227 *s = 0;
228 switch (ids[x]) {
229 case DIR_SORT:
230 case DIR_FILTER:
231 case DIR_VIEW:
232 attrs = SS_TEXT | DT_LEFT | DT_VCENTER;
233 break;
234 case DIR_FOLDERICON:
235 case DIR_MAX:
236 attrs = SS_BITMAP;
237 sprintf(s, "#%d", ids[x]);
238 break;
239 default:
240 attrs = SS_TEXT | DT_CENTER | DT_VCENTER;
241 break;
242 }
243 hwndTmp = WinCreateWindow(hwnd, (CHAR *) class, s, attrs, 0, 0, 0, 0, hwnd,
244 HWND_TOP, ids[x], NULL, NULL);
245 if (!hwndTmp)
246 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
247 PCSZ_WINCREATEWINDOW);
248 } // for
249}
250
251void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
252{
253 char dv[CCHMAXPATH];
254
255 if (!drive || !*drive)
256 return;
257 strcpy(dv, drive);
258 MakeValidDir(dv);
259
260 switch (cmd) {
261 case IDM_MKDIR:
262 PMMkDir(hwnd, dv, FALSE);
263 break;
264 case IDM_INFO:
265 WinDlgBox(HWND_DESKTOP,
266 HWND_DESKTOP,
267 DrvInfoProc, FM3ModHandle, INFO_FRAME, (PVOID) dv);
268 break;
269 case IDM_DRVFLAGS:
270 strcpy(dv, drive); // Must use original drive letter
271 if (WinDlgBox(HWND_DESKTOP,
272 hwnd,
273 SetDrvProc,
274 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
275 if (!PostMsg(hwndTree, UM_SHOWME, MPFROMP(dv), MPVOID))
276 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
277 break;
278 case IDM_SIZES:
279 WinDlgBox(HWND_DESKTOP,
280 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, dv);
281 break;
282 case IDM_SHOWALLFILES:
283 StartSeeAll(HWND_DESKTOP, FALSE, dv);
284 break;
285 case IDM_UNDELETE:
286 {
287 HOBJECT hObject;
288 HWND hwndDesktop;
289
290 hObject = WinQueryObject("<XWP_TRASHCAN>");
291 if (hObject != NULLHANDLE && fTrashCan) {
292 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
293 WinSetFocus(HWND_DESKTOP, hwndDesktop);
294 WinOpenObject(hObject, 0, TRUE);
295 }
296 else
297 WinDlgBox(HWND_DESKTOP,
298 hwnd,
299 UndeleteDlgProc,
300 FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
301 }
302 break;
303 case IDM_CHKDSK:
304 runemf2(SEPARATE | WINDOWED,
305 hwnd, pszSrcFile, __LINE__, NULL, NULL,
306 "PMCHKDSK.EXE %c:", toupper(*dv));
307 break;
308 case IDM_OPTIMIZE:
309 {
310 CHAR FileSystem[CCHMAXPATH];
311 ULONG type;
312
313 CheckDrive(*dv, FileSystem, &type);
314 if (*FileSystem) {
315 strcat(FileSystem, "OPT.CMD");
316 runemf2(SEPARATE | WINDOWED,
317 hwnd, pszSrcFile, __LINE__,
318 NULL,
319 NULL,
320 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
321 }
322 }
323 break;
324 case IDM_FORMAT:
325 runemf2(SEPARATE | WINDOWED,
326 hwnd, pszSrcFile, __LINE__, NULL, NULL,
327 "PMFORMAT.EXE %c:", toupper(*dv));
328 break;
329
330#if 0 // fixme to be gone?
331
332 case IDM_CLOSETRAY:
333 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
334
335 BYTE parm[4] = { "CD01" };
336 ULONGLONG dlen;
337 ULONG plen;
338 HFILE hfile;
339 APIRET rc;
340
341 dv[2] = 0;
342 rc = DosOpen(dv,
343 &hfile,
344 &dlen,
345 0,
346 0,
347 OPEN_ACTION_OPEN_IF_EXISTS |
348 OPEN_ACTION_CREATE_IF_NEW,
349 OPEN_FLAGS_DASD |
350 OPEN_FLAGS_FAIL_ON_ERROR | OPEN_SHARE_DENYNONE, NULL);
351 if (rc)
352 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
353 else {
354 dlen = 0;
355 plen = sizeof(parm);
356 rc = DosDevIOCtl(hfile,
357 0x80,
358 0x45, &parm, sizeof(parm), &plen, NULL, 0, &dlen);
359 DosClose(hfile);
360 if (rc)
361 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosDevIOCtl");
362 }
363 }
364 break;
365#endif // fixme to be gone?
366
367 case IDM_LOCK:
368 case IDM_UNLOCK:
369 case IDM_EJECT:
370 {
371 UCHAR parm[2];
372 ULONG plen = sizeof(parm), dlen = 0L;
373 APIRET rc;
374
375 switch (SHORT1FROMMP(cmd)) {
376 case IDM_LOCK:
377 parm[0] = 1;
378 break;
379 case IDM_UNLOCK:
380 parm[0] = 0;
381 break;
382 case IDM_EJECT:
383 parm[0] = 2;
384 break;
385 }
386 parm[1] = *dv - 'A';
387 DosError(FERR_DISABLEHARDERR);
388 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
389 if (cmd == IDM_EJECT) {
390 if ((fEjectFlpyScan ? TRUE : parm[1] > 1) &&
391 (fEjectCDScan ? TRUE : !(driveflags[parm[1]] & DRIVE_CDROM)) &&
392 (fEjectRemovableScan ? TRUE : (parm[1] < 2 ||
393 driveflags[parm[1]] & DRIVE_CDROM))) {
394 BOOL toggleTree = FALSE;
395
396 if (!hwndTree) {
397 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
398 toggleTree = TRUE;
399 }
400 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
401 if (toggleTree)
402 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
403 }
404 else if (driveflags[parm[1]] & DRIVE_CDROM) {
405 driveflags[parm[1]] |= DRIVE_INVALID;
406 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
407 }
408 }
409 }
410 break;
411
412 case IDM_RESCAN:
413 {
414 BOOL toggleTree = FALSE;
415
416 if (!hwndTree) {
417 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
418 toggleTree = TRUE;
419 }
420 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
421 if (toggleTree)
422 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
423 }
424 break;
425
426 case IDM_REFRESHREMOVABLES:
427 {
428 BOOL toggleTree = FALSE;
429
430 if (!hwndTree) {
431 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
432 toggleTree = TRUE;
433 }
434 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_REFRESHREMOVABLES, 0), MPVOID);
435 if (toggleTree)
436 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
437 }
438 break;
439 }
440}
441
442void CommonCreateMainChildren(HWND hwnd, SWP * swp)
443{
444 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
445 HWND hwndTmp;
446 PFNWP oldproc;
447
448 // Create a children of frame window
449 // Left status window
450 hwndStatus = WinCreateWindow(hwndFrame,
451 (CHAR *) WC_STATUS,
452 "Status",
453 WS_VISIBLE | SS_TEXT | DT_LEFT |
454 DT_VCENTER,
455 swp->x + 4 +
456 WinQuerySysValue(HWND_DESKTOP,
457 SV_CXSIZEBORDER),
458 swp->y + 4 +
459 WinQuerySysValue(HWND_DESKTOP,
460 SV_CYSIZEBORDER),
461 ((swp->cx / 2) - 8) -
462 (WinQuerySysValue(HWND_DESKTOP,
463 SV_CXSIZEBORDER) * 2),
464 20,
465 hwndFrame, HWND_TOP, MAIN_STATUS, NULL, NULL);
466 if (!hwndStatus)
467 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
468 PCSZ_WINCREATEWINDOW);
469
470 // Right status window
471 hwndStatus2 = WinCreateWindow(hwndFrame,
472 (CHAR *) WC_STATUS,
473 "Status2",
474 WS_VISIBLE | SS_TEXT | DT_LEFT |
475 DT_VCENTER,
476 ((swp->cx / 2) + 4) +
477 WinQuerySysValue(HWND_DESKTOP,
478 SV_CXSIZEBORDER),
479 ((swp->cy / 2) + 4) +
480 WinQuerySysValue(HWND_DESKTOP,
481 SV_CYSIZEBORDER),
482 ((swp->cx / 2) - 8) -
483 (WinQuerySysValue(HWND_DESKTOP,
484 SV_CXSIZEBORDER) * 2),
485 20,
486 hwndFrame,
487 HWND_TOP, MAIN_STATUS2, NULL, NULL);
488 if (!hwndStatus2)
489 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
490 PCSZ_WINCREATEWINDOW);
491
492 hwndAttr = WinCreateWindow(hwndFrame,
493 (CHAR *) WC_STATUS,
494 "Attr",
495 WS_VISIBLE | SS_TEXT | DT_CENTER |
496 DT_VCENTER,
497 swp->x + 4 +
498 WinQuerySysValue(HWND_DESKTOP,
499 SV_CXSIZEBORDER),
500 swp->y + 4 + 24 +
501 WinQuerySysValue(HWND_DESKTOP,
502 SV_CYSIZEBORDER),
503 ((swp->cx / 4) - 8) -
504 (WinQuerySysValue(HWND_DESKTOP,
505 SV_CXSIZEBORDER) * 2),
506 20, hwndFrame, HWND_TOP, IDM_ATTRS, NULL, NULL);
507 if (!hwndAttr)
508 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
509 PCSZ_WINCREATEWINDOW);
510
511 hwndDate = WinCreateWindow(hwndFrame,
512 (CHAR *) WC_STATUS,
513 "Date",
514 WS_VISIBLE | SS_TEXT | DT_CENTER |
515 DT_VCENTER,
516 ((swp->x / 4) * 2) + 4 +
517 WinQuerySysValue(HWND_DESKTOP,
518 SV_CXSIZEBORDER),
519 swp->y + 4 + 24 +
520 WinQuerySysValue(HWND_DESKTOP,
521 SV_CYSIZEBORDER),
522 ((swp->cx / 4) - 8) -
523 (WinQuerySysValue(HWND_DESKTOP,
524 SV_CXSIZEBORDER) * 2),
525 20, hwndFrame, HWND_TOP, IDM_INFO, NULL, NULL);
526 if (!hwndDate)
527 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
528 PCSZ_WINCREATEWINDOW);
529
530 hwndName = WinCreateWindow(hwndFrame,
531 (CHAR *) WC_STATUS,
532 "Name",
533 WS_VISIBLE | SS_TEXT | DT_LEFT |
534 DT_VCENTER,
535 ((swp->x / 4) * 3) + 4 +
536 WinQuerySysValue(HWND_DESKTOP,
537 SV_CXSIZEBORDER),
538 swp->y + 4 +
539 WinQuerySysValue(HWND_DESKTOP,
540 SV_CYSIZEBORDER),
541 ((swp->cx / 4) - 8) -
542 (WinQuerySysValue(HWND_DESKTOP,
543 SV_CXSIZEBORDER) * 2),
544 20, hwndFrame, HWND_TOP, IDM_RENAME, NULL, NULL);
545 if (!hwndName)
546 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
547 PCSZ_WINCREATEWINDOW);
548
549 hwndTmp = WinCreateWindow(hwndFrame,
550 (CHAR *) WC_TOOLBACK,
551 NullStr,
552 WS_VISIBLE | SS_TEXT | DT_CENTER | DT_VCENTER,
553 swp->x +
554 WinQuerySysValue(HWND_DESKTOP,
555 SV_CXSIZEBORDER),
556 (swp->cy -
557 WinQuerySysValue(HWND_DESKTOP,
558 SV_CYSIZEBORDER)) - 30,
559 swp->cx -
560 (WinQuerySysValue(HWND_DESKTOP,
561 SV_CXSIZEBORDER) * 2),
562 30, hwndFrame, HWND_TOP, MAIN_TOOLS, NULL, NULL);
563 if (!hwndTmp)
564 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
565 PCSZ_WINCREATEWINDOW);
566
567 hwndBack = WinCreateWindow(hwndFrame,
568 (CHAR *) WC_DRIVEBACK,
569 NullStr,
570 WS_VISIBLE | SS_TEXT | DT_RIGHT | DT_BOTTOM,
571 swp->x +
572 WinQuerySysValue(HWND_DESKTOP,
573 SV_CXSIZEBORDER),
574 (swp->cy -
575 WinQuerySysValue(HWND_DESKTOP,
576 SV_CYSIZEBORDER)) -
577 (DRIVE_BUTTON_HEIGHT),
578 swp->cx -
579 (WinQuerySysValue(HWND_DESKTOP,
580 SV_CXSIZEBORDER) * 2),
581 DRIVE_BUTTON_HEIGHT,
582 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
583
584 if (!hwndBack)
585 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
586 PCSZ_WINCREATEWINDOW);
587
588 hwndLED = WinCreateWindow(hwndFrame,
589 (CHAR *) WC_LED,
590 "#920", // LEDOFF_BMP
591 WS_VISIBLE | SS_BITMAP,
592 swp->cx - 58,
593 swp->y,
594 12,
595 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
596 if (!hwndLED)
597 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
598 PCSZ_WINCREATEWINDOW);
599
600 hwndLEDHdr = WinCreateWindow(hwndFrame,
601 (CHAR *) WC_LED,
602 "0",
603 WS_VISIBLE | SS_TEXT | DT_VCENTER |
604 DT_CENTER,
605 swp->cx - 58,
606 swp->y + 12,
607 12,
608 12,
609 hwndFrame, HWND_TOP, MAIN_LEDHDR, NULL, NULL);
610 if (!hwndLEDHdr)
611 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
612 PCSZ_WINCREATEWINDOW);
613
614 hwndAutoview = WinCreateWindow(hwndFrame,
615 (CHAR *) WC_AUTOVIEW,
616 NullStr,
617 WS_VISIBLE | SS_TEXT | DT_LEFT |
618 DT_TOP | DT_WORDBREAK,
619 swp->x + 4 +
620 WinQuerySysValue(HWND_DESKTOP,
621 SV_CXSIZEBORDER),
622 swp->y + 4 +
623 WinQuerySysValue(HWND_DESKTOP,
624 SV_CYSIZEBORDER) + 16,
625 (swp->cx - 8) -
626 (WinQuerySysValue(HWND_DESKTOP,
627 SV_CXSIZEBORDER) * 2),
628 48,
629 hwndFrame,
630 HWND_TOP, MAIN_AUTOVIEW, NULL, NULL);
631 if (!hwndAutoview)
632 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
633 PCSZ_WINCREATEWINDOW);
634
635 hwndAutoMLE = WinCreateWindow(hwndFrame,
636 // GetPString(IDS_WCAUTOVIEW),
637 (CHAR *) WC_MLE,
638 NullStr,
639 WS_VISIBLE | MLS_HSCROLL |
640 MLS_VSCROLL | MLS_BORDER,
641 swp->x + 4 +
642 WinQuerySysValue(HWND_DESKTOP,
643 SV_CXSIZEBORDER),
644 swp->y + 4 +
645 WinQuerySysValue(HWND_DESKTOP,
646 SV_CYSIZEBORDER) + 16,
647 (swp->cx - 8) -
648 (WinQuerySysValue(HWND_DESKTOP,
649 SV_CXSIZEBORDER) * 2),
650 48,
651 hwndFrame,
652 HWND_TOP, MAIN_AUTOVIEWMLE, NULL, NULL);
653 if (!hwndAutoMLE)
654 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
655 PCSZ_WINCREATEWINDOW);
656
657 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
658 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
659 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
660}
661
662/**
663 * Called by MainWndProc and MainWndProc2 to process messages
664 * common to both fm/2 and fm/2 lite main window
665 */
666
667MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
668 MPARAM mp2)
669{
670 static BOOL fLedOn;
671 static LONG cWorkerThreads;
672
673 switch (msg) {
674 case UM_THREADUSE:
675 if (hbmLEDon && hbmLEDoff) {
676 CHAR sz[33];
677 if (mp1) {
678 cWorkerThreads++;
679 // 13 Sep 09 SHL FIXME to be SMP safe
680 if (cWorkerThreads == 1) {
681 if (!WinStartTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_LED_TIMER, 500))
682 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "WinStartTimer");
683 fLedOn = TRUE;
684 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
685 }
686 }
687 else if (cWorkerThreads > 0)
688 cWorkerThreads--;
689
690 ltoa(cWorkerThreads, sz, 10);
691 WinSetWindowText(hwndLEDHdr, sz);
692 DosSleep(0);
693 }
694 return 0;
695
696 case WM_TIMER:
697 fLedOn = !fLedOn;
698 WinSendMsg(hwndLED,
699 SM_SETHANDLE,
700 fLedOn ? MPFROMLONG(hbmLEDon) : MPFROMLONG(hbmLEDoff),
701 MPVOID);
702 if (!fLedOn && cWorkerThreads == 0) {
703 if (!WinStopTimer(WinQueryAnchorBlock(hwnd), hwnd, ID_LED_TIMER))
704 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, "WinStartTimer");
705 }
706 break;
707
708 case UM_LOADFILE:
709 {
710 CHAR *s = NULL;
711 static CHAR lastfile[CCHMAXPATH] = "";
712
713 if (!fAutoView) {
714 if (*lastfile)
715 PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
716 UM_LOADFILE, MPVOID, MPVOID);
717 *lastfile = 0;
718 }
719 else {
720 if (mp1) {
721 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
722 return 0;
723 strcpy(lastfile, (CHAR *)mp1);
724 s = xstrdup(lastfile, pszSrcFile, __LINE__);
725 }
726 else
727 *lastfile = 0;
728 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
729 UM_LOADFILE, MPFROMP(s), MPVOID)) {
730 xfree(s, pszSrcFile, __LINE__);
731 }
732 }
733 }
734 return 0;
735
736 case UM_BUILDDRIVEBAR:
737 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
738 MAIN_DRIVES));
739 return 0;
740 }
741 return WinDefWindowProc(hwnd, msg, mp1, mp2);
742}
743
744MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
745 MPARAM mp2)
746{
747 static HWND hwndLast = (HWND) 0;
748 static ULONG lastclick = 0;
749
750 switch (msg) {
751 case WM_MOUSEMOVE:
752 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
753 if (!fNoFinger) {
754 WinSetPointer(HWND_DESKTOP, hptrFinger);
755 return MRFROMLONG(TRUE);
756 }
757 break;
758
759 case WM_BUTTON1DOWN:
760 case WM_BUTTON3DOWN:
761 if (hwndBubble)
762 WinDestroyWindow(hwndBubble);
763 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
764 WinSetCapture(HWND_DESKTOP, hwnd);
765 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
766 break;
767
768 case WM_BUTTON2UP:
769 case WM_BUTTON2DOWN:
770 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
771 if (msg == WM_BUTTON2UP && hwndLast) {
772 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
773 hwndLast = (HWND) 0;
774 }
775 break;
776
777 case WM_BUTTON1UP:
778 case WM_BUTTON3UP:
779 shiftstate = (SHORT2FROMMP(mp2) & (KC_SHIFT | KC_ALT | KC_CTRL));
780 WinSetCapture(HWND_DESKTOP, (HWND) 0);
781 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE);
782 {
783 ULONG check;
784
785 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
786 if (check > lastclick + 500) {
787
788 RECTL rcl;
789 POINTS pts;
790
791 pts.x = SHORT1FROMMP(mp1);
792 pts.y = SHORT2FROMMP(mp1);
793 WinQueryWindowRect(hwnd, &rcl);
794 if (pts.x > 0 && pts.y > 0 && pts.x < rcl.xRight && pts.y < rcl.yTop)
795 PostMsg(hwnd, UM_CLICKED + (msg == WM_BUTTON3UP), mp1, mp2);
796 }
797 lastclick = check;
798 }
799 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
800 hwndLast = (HWND) 0;
801 break;
802
803 case WM_SETFOCUS:
804 if (mp2)
805 hwndLast = (HWND) mp1;
806 break;
807
808 case UM_FOCUSME:
809 if (mp1) {
810
811 PID pid;
812 TID tid;
813
814 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
815 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
816 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
817 return 0;
818 }
819 }
820 {
821 HWND htemp = (HWND) 0;
822
823 if (hwndMain)
824 htemp = TopWindow(hwndMain, (HWND) 0);
825 if (!htemp)
826 htemp = hwndTree;
827 if (htemp)
828 WinSetFocus(HWND_DESKTOP, htemp);
829 else
830 WinSetFocus(HWND_DESKTOP, WinQueryWindow(hwnd, QW_PARENT));
831 }
832 return 0;
833 }
834
835 return PFNWPStatic(hwnd, msg, mp1, mp2);
836}
837
838MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
839{
840 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
841
842 switch (msg) {
843 case UM_FIXCNRMLE:
844 if (dcd) {
845
846 SWP swp, swpC;
847
848 if (WinQueryWindowPos(WinWindowFromID(hwnd, CID_MLE), &swp)) {
849 if (WinQueryWindowPos(hwnd, &swpC)) {
850 swpC.cx -= (WinQuerySysValue(HWND_DESKTOP, SV_CXVSCROLL) + 4);
851 swpC.cx -= swp.x;
852 WinSetWindowPos(WinWindowFromID(hwnd, CID_MLE),
853 HWND_TOP, 0, 0, swpC.cx, swp.cy + 2, SWP_SIZE);
854 }
855 }
856 if (mp1)
857 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
858 MLM_SETTEXTLIMIT, mp1, MPVOID);
859 }
860 return 0;
861
862 case UM_FIXEDITNAME:
863 if (dcd) {
864 if (mp1 && (INT) mp1 != -1) {
865
866 CHAR *p;
867
868 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
869 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
870 0, strlen((CHAR *)mp1) + 1);
871 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
872 p = strrchr((CHAR *)mp1, '\\');
873 if (p) {
874 p++;
875 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
876 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
877 }
878 else
879 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
880 }
881 else if (mp2) {
882 Broadcast(WinQueryAnchorBlock(hwnd),
883 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
884 xfree(mp2, pszSrcFile, __LINE__);
885 }
886 }
887 return 0;
888 }
889 return PFNWPCnr(hwnd, msg, mp1, mp2);
890}
891
892HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
893 BOOL noautotile, char *directory)
894{
895 SWP swp;
896 HWND hwndDir;
897
898 if (ParentIsDesktop(hwnd, hwndParent) || *(ULONG *) realappname != FM3UL)
899 StartDirCnr(HWND_DESKTOP, directory, hwndRestore, 1);
900 else if (*(ULONG *) realappname == FM3UL) {
901 if (!fAutoTile)
902 GetNextWindowPos(hwndParent, &swp, NULL, NULL);
903 hwndDir = StartDirCnr(hwndParent, directory, hwndRestore, 1);
904 if (hwndDir) {
905 if (!fAutoTile)
906 WinSetWindowPos(hwndDir,
907 HWND_TOP,
908 swp.x,
909 swp.y,
910 swp.cx,
911 swp.cy, SWP_MOVE | SWP_SIZE | SWP_SHOW | SWP_ZORDER);
912 else if (!noautotile)
913 TileChildren(hwndParent, TRUE);
914 WinSetWindowPos(hwndDir,
915 HWND_TOP,
916 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
917 }
918 }
919 else {
920
921 char s[256];
922
923 assign_ignores(s);
924 runemf2(WINDOWED | SEPARATE,
925 hwnd, pszSrcFile, __LINE__,
926 NULL,
927 NULL,
928 "VDIR.EXE %s%s\"%s%s\"",
929 (*s) ? s : NullStr, (*s) ? " " : NullStr,
930 directory,
931 (directory[strlen(directory) - 1] == '\\') ? PCSZ_BACKSLASH : NullStr);
932 }
933 return hwndDir;
934}
935
936//= IncrThreadUsage() Increment thread usage counter ==
937
938VOID IncrThreadUsage(VOID)
939{
940 if (hwndMain)
941 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
942}
943
944//= DecrThreadUsage() Decrement thread usage counter ==
945
946VOID DecrThreadUsage(VOID)
947{
948 if (hwndMain)
949 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
950}
951
952#pragma alloc_text(COMMON,CommonFrameWndProc,CommonTextProc,CommonTextPaint)
953#pragma alloc_text(COMMON1,CommonCreateTextChildren,CommonCreateMainChildren)
954#pragma alloc_text(COMMON2,CommonDriveCmd,CommonTextButton)
955#pragma alloc_text(COMMON3,CommonMainWndProc,IncrThreadUsage,DecrThreadUsage)
956#pragma alloc_text(COMMON4,CommonCnrProc)
957#pragma alloc_text(COMMON5,OpenDirCnr)
Note: See TracBrowser for help on using the repository browser.