source: trunk/dll/common.c@ 1455

Last change on this file since 1455 was 1455, checked in by Steven Levine, 16 years ago

Blink thread LEDs while worker threads are working
Drop expermental code

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