source: trunk/dll/common.c@ 1655

Last change on this file since 1655 was 1655, checked in by Gregg Young, 14 years ago

Cleanup and added comments

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