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
RevLine 
[246]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
[907]9 Copyright (c) 2001, 2008 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
[246]34
35***********************************************************************/
36
[907]37#include <stdlib.h>
38#include <string.h>
39#include <ctype.h>
40
[2]41#define INCL_DOS
42#define INCL_DOSERRORS
43#define INCL_WIN
44#define INCL_GPI
[907]45#define INCL_LONGLONG // dircnrs.h
[2]46
[1182]47#include "fm3dll.h"
[1221]48#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1205]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)
[2]58#include "fm3dlg.h"
59#include "fm3str.h"
60#include "mle.h"
[907]61#include "filldir.h" // RemoveCnrItems
62#include "errutil.h" // Dos_Error...
63#include "strutil.h" // GetPString
[1159]64#include "autoview.h" // AutoViewProc
[1182]65#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
[1159]66#include "common.h"
67#include "dirsize.h" // DirSizeProc
68#include "info.h" // DrvInfoProc, SetDrvProc
69#include "seeall.h" // StartSeeAll
[1182]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
[1039]77#include "fortify.h"
[2]78
[1205]79// Data definitions
[2]80#pragma data_seg(DATA1)
[348]81static PSZ pszSrcFile = __FILE__;
[1205]82static HWND hwndLED;
83static HWND hwndLEDHdr;
[348]84
[1205]85#pragma data_seg(GLOBAL1)
86HWND hwndBack;
87
[551]88MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
89 HWND hwnd,
90 ULONG msg, MPARAM mp1, MPARAM mp2)
[377]91{
[574]92 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]93
[551]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);
[2]113
[551]114 case UM_CONTEXTMENU:
115 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
116 return 0;
[2]117
[551]118 case UM_CONTAINERHWND:
119 return MRFROMLONG(WinWindowFromID(hwnd, id));
[2]120
[551]121 case DM_DROP:
122 case DM_DRAGOVER:
123 case DM_DRAGLEAVE:
124 case DM_DROPHELP:
125 {
126 CNRDRAGINFO cnd;
127 USHORT dcmd;
[2]128
[551]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;
[2]142 }
[551]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 }
[2]148
[551]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;
[2]154
[551]155 case WM_MINMAXFRAME:
156 {
157 PSWP pswp = (PSWP) mp1;
158 MRESULT rc;
[2]159
[551]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 }
[2]165
[551]166 case WM_DESTROY:
167 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
168 break;
[2]169 }
[551]170 return oldproc(hwnd, msg, mp1, mp2);
[2]171}
172
[551]173MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]174{
[551]175 switch (msg) {
176 case WM_CREATE:
177 {
178 MRESULT rc;
[2]179
[551]180 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
[552]181 switch (WinQueryWindowUShort(hwnd, QWS_ID))
[551]182 case DIR_SORT:
183 case DIR_VIEW:
184 case DIR_FILTER:
[1391]185 //fixme to allow user to change presparams 1-10-09 GKY
186 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
[551]187 return rc;
188 }
[2]189 }
[551]190 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]191}
192
[551]193void CommonTextPaint(HWND hwnd, HPS hps)
[377]194{
[2]195 int x;
[551]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 };
[2]200
[551]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);
[2]205 }
206}
207
[1400]208void CommonCreateTextChildren(HWND hwnd, PCSZ class, USHORT * ids)
[377]209{
[551]210 int x;
211 CHAR s[33];
[2]212 ULONG attrs;
[377]213 HWND hwndTmp;
[2]214
[377]215 if (!hwnd || !class || !ids) {
[1398]216 Runtime_Error(pszSrcFile, __LINE__, NULL);
[2]217 return;
[377]218 }
[2]219
[551]220 for (x = 0; ids[x]; x++) {
[2]221 *s = 0;
[551]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;
[2]236 }
[551]237 hwndTmp = WinCreateWindow(hwnd, class, s, attrs, 0, 0, 0, 0, hwnd,
238 HWND_TOP, ids[x], NULL, NULL);
[377]239 if (!hwndTmp)
[1395]240 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
[1455]241 PCSZ_WINCREATEWINDOW);
[948]242 } // for
[2]243}
244
[551]245void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
[377]246{
[2]247 char dv[CCHMAXPATH];
248
[551]249 if (!drive || !*drive)
[2]250 return;
[551]251 strcpy(dv, drive);
[2]252 MakeValidDir(dv);
253
[551]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:
[552]264 strcpy(dv, drive); // Must use original drive letter
[551]265 if (WinDlgBox(HWND_DESKTOP,
266 hwnd,
267 SetDrvProc,
[1455]268 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
[1444]269 if (!PostMsg(hwndTree, UM_SHOWME, MPFROMP(dv), MPVOID))
[1455]270 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
[551]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:
[1041]280 {
281 HOBJECT hObject;
282 HWND hwndDesktop;
283
284 hObject = WinQueryObject("<XWP_TRASHCAN>");
285 if (hObject != NULLHANDLE && fTrashCan) {
[1455]286 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
287 WinSetFocus(HWND_DESKTOP, hwndDesktop);
288 WinOpenObject(hObject, 0, TRUE);
[1041]289 }
290 else
291 WinDlgBox(HWND_DESKTOP,
[1455]292 hwnd,
293 UndeleteDlgProc,
294 FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
[1041]295 }
[551]296 break;
297 case IDM_CHKDSK:
298 runemf2(SEPARATE | WINDOWED,
[907]299 hwnd, pszSrcFile, __LINE__, NULL, NULL,
300 "PMCHKDSK.EXE %c:", toupper(*dv));
[551]301 break;
302 case IDM_OPTIMIZE:
303 {
304 CHAR FileSystem[CCHMAXPATH];
305 ULONG type;
[2]306
[551]307 CheckDrive(*dv, FileSystem, &type);
308 if (*FileSystem) {
309 strcat(FileSystem, "OPT.CMD");
310 runemf2(SEPARATE | WINDOWED,
[888]311 hwnd, pszSrcFile, __LINE__,
[551]312 NULL,
313 NULL,
314 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
[2]315 }
[551]316 }
317 break;
318 case IDM_FORMAT:
319 runemf2(SEPARATE | WINDOWED,
[907]320 hwnd, pszSrcFile, __LINE__, NULL, NULL,
321 "PMFORMAT.EXE %c:", toupper(*dv));
[551]322 break;
[2]323
[551]324#if 0 // fixme to be gone?
[446]325
[551]326 case IDM_CLOSETRAY:
327 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
[2]328
[551]329 BYTE parm[4] = { "CD01" };
[841]330 ULONGLONG dlen;
331 ULONG plen;
[551]332 HFILE hfile;
333 APIRET rc;
[2]334
[551]335 dv[2] = 0;
[844]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);
[551]345 if (rc)
[844]346 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
[551]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");
[2]356 }
[551]357 }
358 break;
[446]359#endif // fixme to be gone?
[2]360
[551]361 case IDM_LOCK:
362 case IDM_UNLOCK:
363 case IDM_EJECT:
364 {
[1368]365 UCHAR parm[2];
[551]366 ULONG plen = sizeof(parm), dlen = 0L;
[1391]367 APIRET rc;
[446]368
[551]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;
[2]379 }
[1368]380 parm[1] = *dv - 'A';
[551]381 DosError(FERR_DISABLEHARDERR);
[1391]382 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
[1365]383 if (cmd == IDM_EJECT &&
[1455]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);
[1444]396 }
[551]397 }
398 break;
[1444]399
400 case IDM_RESCAN:
401 {
402 BOOL toggleTree = FALSE;
403
404 if (!hwndTree) {
[1455]405 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
406 toggleTree = TRUE;
[1444]407 }
408 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
409 if (toggleTree)
[1455]410 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
[1444]411 }
412 break;
413
414 case IDM_REFRESHREMOVABLES:
415 {
416 BOOL toggleTree = FALSE;
417
418 if (!hwndTree) {
[1455]419 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
420 toggleTree = TRUE;
[1444]421 }
422 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_REFRESHREMOVABLES, 0), MPVOID);
423 if (toggleTree)
[1455]424 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
[1444]425 }
426 break;
[2]427 }
428}
429
[551]430void CommonCreateMainChildren(HWND hwnd, SWP * swp)
[377]431{
[551]432 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[377]433 HWND hwndTmp;
434 PFNWP oldproc;
[2]435
[377]436 // Create a children of frame window
[948]437 // Left status window
[377]438 hwndStatus = WinCreateWindow(hwndFrame,
[593]439 WC_STATUS,
[551]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);
[377]454 if (!hwndStatus)
[1395]455 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]456 PCSZ_WINCREATEWINDOW);
[377]457
[948]458 // Right status window
[377]459 hwndStatus2 = WinCreateWindow(hwndFrame,
[593]460 WC_STATUS,
[551]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);
[377]476 if (!hwndStatus2)
[1395]477 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]478 PCSZ_WINCREATEWINDOW);
[2]479
[377]480 hwndAttr = WinCreateWindow(hwndFrame,
[593]481 WC_STATUS,
[551]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);
[377]495 if (!hwndAttr)
[1395]496 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]497 PCSZ_WINCREATEWINDOW);
[377]498
499 hwndDate = WinCreateWindow(hwndFrame,
[593]500 WC_STATUS,
[551]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);
[377]514 if (!hwndDate)
[1395]515 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]516 PCSZ_WINCREATEWINDOW);
[377]517
518 hwndName = WinCreateWindow(hwndFrame,
[593]519 WC_STATUS,
[551]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);
[377]533 if (!hwndName)
[1395]534 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]535 PCSZ_WINCREATEWINDOW);
[2]536
[377]537 hwndTmp = WinCreateWindow(hwndFrame,
[593]538 WC_TOOLBACK,
[551]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);
[377]551 if (!hwndTmp)
[1395]552 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]553 PCSZ_WINCREATEWINDOW);
[377]554
555 hwndBack = WinCreateWindow(hwndFrame,
[593]556 WC_DRIVEBACK,
[551]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,
[1455]564 SV_CYSIZEBORDER)) -
565 (DRIVE_BUTTON_HEIGHT),
[551]566 swp->cx -
567 (WinQuerySysValue(HWND_DESKTOP,
568 SV_CXSIZEBORDER) * 2),
[1438]569 DRIVE_BUTTON_HEIGHT,
[551]570 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
[2]571
[377]572 if (!hwndBack)
[1395]573 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]574 PCSZ_WINCREATEWINDOW);
[377]575
576 hwndLED = WinCreateWindow(hwndFrame,
[593]577 WC_LED,
[1455]578 "#920", // LEDOFF_BMP
[551]579 WS_VISIBLE | SS_BITMAP,
580 swp->cx - 58,
581 swp->y,
582 12,
583 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
[377]584 if (!hwndLED)
[1395]585 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]586 PCSZ_WINCREATEWINDOW);
[377]587
588 hwndLEDHdr = WinCreateWindow(hwndFrame,
[593]589 WC_LED,
[551]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);
[377]598 if (!hwndLEDHdr)
[1395]599 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]600 PCSZ_WINCREATEWINDOW);
[377]601
602 hwndAutoview = WinCreateWindow(hwndFrame,
[593]603 WC_AUTOVIEW,
[551]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);
[377]619 if (!hwndAutoview)
[1395]620 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]621 PCSZ_WINCREATEWINDOW);
[377]622
623 hwndAutoMLE = WinCreateWindow(hwndFrame,
[551]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);
[377]641 if (!hwndAutoMLE)
[1395]642 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]643 PCSZ_WINCREATEWINDOW);
[2]644
[551]645 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
[574]646 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
[551]647 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
[2]648}
649
[1455]650/**
651 * Called by MainWndProc and MainWndProc2 to process messages
652 * common to both fm/2 and fm/2 lite main window
653 */
654
[551]655MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
656 MPARAM mp2)
[377]657{
[1455]658 static BOOL fLedOn;
659 static LONG cWorkerThreads;
660
[551]661 switch (msg) {
662 case UM_THREADUSE:
663 if (hbmLEDon && hbmLEDoff) {
[1455]664 CHAR sz[33];
[551]665 if (mp1) {
[1455]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;
[551]672 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
[377]673 }
674 }
[1455]675 else if (cWorkerThreads > 0)
676 cWorkerThreads--;
677
678 ltoa(cWorkerThreads, sz, 10);
679 WinSetWindowText(hwndLEDHdr, sz);
[809]680 DosSleep(0);
[551]681 }
682 return 0;
[2]683
[1455]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
[551]696 case UM_LOADFILE:
697 {
698 CHAR *s = NULL;
699 static CHAR lastfile[CCHMAXPATH] = "";
[2]700
[551]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) {
[1009]709 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
[551]710 return 0;
[1009]711 strcpy(lastfile, (CHAR *)mp1);
[551]712 s = xstrdup(lastfile, pszSrcFile, __LINE__);
713 }
714 else
715 *lastfile = 0;
716 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
717 UM_LOADFILE, MPFROMP(s), MPVOID)) {
[1009]718 xfree(s, pszSrcFile, __LINE__);
[551]719 }
720 }
721 }
722 return 0;
[2]723
[551]724 case UM_BUILDDRIVEBAR:
725 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
726 MAIN_DRIVES));
727 return 0;
[2]728 }
[551]729 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]730}
731
[551]732MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
733 MPARAM mp2)
[377]734{
[551]735 static HWND hwndLast = (HWND) 0;
[2]736 static ULONG lastclick = 0;
737
[551]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;
[348]746
[551]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;
[2]755
[551]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;
[2]764
[551]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;
[2]772
[551]773 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
774 if (check > lastclick + 500) {
[2]775
[551]776 RECTL rcl;
777 POINTS pts;
[2]778
[551]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);
[2]784 }
[551]785 lastclick = check;
786 }
787 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
788 hwndLast = (HWND) 0;
789 break;
[2]790
[551]791 case WM_SETFOCUS:
792 if (mp2)
793 hwndLast = (HWND) mp1;
794 break;
[2]795
[551]796 case UM_FOCUSME:
797 if (mp1) {
[2]798
[551]799 PID pid;
800 TID tid;
[2]801
[551]802 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
803 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
804 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
805 return 0;
[2]806 }
[551]807 }
808 {
809 HWND htemp = (HWND) 0;
[2]810
[551]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;
[2]821 }
822
[551]823 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]824}
825
[551]826MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]827{
[574]828 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
[2]829
[551]830 switch (msg) {
831 case UM_FIXCNRMLE:
832 if (dcd) {
[2]833
[551]834 SWP swp, swpC;
[2]835
[551]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 }
[2]843 }
[551]844 if (mp1)
845 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
846 MLM_SETTEXTLIMIT, mp1, MPVOID);
847 }
848 return 0;
[2]849
[551]850 case UM_FIXEDITNAME:
851 if (dcd) {
852 if (mp1 && (INT) mp1 != -1) {
[2]853
[551]854 CHAR *p;
[2]855
[551]856 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
857 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
[1009]858 0, strlen((CHAR *)mp1) + 1);
859 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
860 p = strrchr((CHAR *)mp1, '\\');
[551]861 if (p) {
862 p++;
[1009]863 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
864 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]865 }
866 else
[1009]867 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]868 }
869 else if (mp2) {
870 if ((INT) mp1 == -1) {
871 PCNRITEM pci = (PCNRITEM) mp2;
[751]872 RemoveCnrItems(hwnd, pci, 1, CMA_FREE | CMA_INVALIDATE);
[551]873 }
874 else {
875 Broadcast(WinQueryAnchorBlock(hwnd),
876 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
[1039]877 free(mp2);
[551]878 }
[2]879 }
[551]880 }
881 return 0;
[2]882 }
[551]883 return PFNWPCnr(hwnd, msg, mp1, mp2);
[2]884}
885
[551]886HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
887 BOOL noautotile, char *directory)
[377]888{
[551]889 SWP swp;
[2]890 HWND hwndDir;
891
[551]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);
[2]908 WinSetWindowPos(hwndDir,
[551]909 HWND_TOP,
910 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
[2]911 }
912 }
913 else {
914
915 char s[256];
916
917 assign_ignores(s);
918 runemf2(WINDOWED | SEPARATE,
[888]919 hwnd, pszSrcFile, __LINE__,
[551]920 NULL,
921 NULL,
922 "VDIR.EXE %s%s\"%s%s\"",
923 (*s) ? s : NullStr, (*s) ? " " : NullStr,
924 directory,
[1438]925 (directory[strlen(directory) - 1] == '\\') ? PCSZ_BACKSLASH : NullStr);
[2]926 }
927 return hwndDir;
928}
929
[536]930//= IncrThreadUsage() Increment thread usage counter ==
931
932VOID IncrThreadUsage(VOID)
933{
934 if (hwndMain)
[551]935 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
[536]936}
937
938//= DecrThreadUsage() Decrement thread usage counter ==
939
940VOID DecrThreadUsage(VOID)
941{
942 if (hwndMain)
[551]943 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
[536]944}
[793]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.