source: trunk/dll/common.c@ 1855

Last change on this file since 1855 was 1855, checked in by Steven Levine, 10 years ago

Clean up and comment

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