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
RevLine 
[246]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
[1855]9 Copyright (c) 2001, 2015 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 *.
[1833]35 13 Jul 15 GKY Fix CN_REALLOCPSZ file name editing code to: 1) Eliminate the possibility of
[1855]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
[246]39
40***********************************************************************/
41
[907]42#include <stdlib.h>
43#include <string.h>
44#include <ctype.h>
45
[2]46#define INCL_DOS
47#define INCL_DOSERRORS
48#define INCL_WIN
49#define INCL_GPI
[907]50#define INCL_LONGLONG // dircnrs.h
[2]51
[1182]52#include "fm3dll.h"
[1221]53#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1205]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)
[2]63#include "fm3dlg.h"
64#include "fm3str.h"
65#include "mle.h"
[907]66#include "errutil.h" // Dos_Error...
67#include "strutil.h" // GetPString
[1159]68#include "autoview.h" // AutoViewProc
[1182]69#include "mainwnd.h" // BuildDriveBarButtons, GetNextWindowPos, TopWindow
[1159]70#include "dirsize.h" // DirSizeProc
71#include "info.h" // DrvInfoProc, SetDrvProc
72#include "seeall.h" // StartSeeAll
[1182]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
[1039]80#include "fortify.h"
[2]81
[1205]82// Data definitions
[2]83#pragma data_seg(DATA1)
[348]84static PSZ pszSrcFile = __FILE__;
[1205]85static HWND hwndLED;
86static HWND hwndLEDHdr;
[348]87
[1205]88#pragma data_seg(GLOBAL1)
89HWND hwndBack;
90
[551]91MRESULT EXPENTRY CommonFrameWndProc(USHORT id,
92 HWND hwnd,
93 ULONG msg, MPARAM mp1, MPARAM mp2)
[377]94{
[574]95 PFNWP oldproc = (PFNWP) WinQueryWindowPtr(hwnd, QWL_USER);
[2]96
[551]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);
[2]116
[551]117 case UM_CONTEXTMENU:
118 PostMsg(WinWindowFromID(hwnd, FID_CLIENT), msg, mp1, mp2);
119 return 0;
[2]120
[551]121 case UM_CONTAINERHWND:
122 return MRFROMLONG(WinWindowFromID(hwnd, id));
[2]123
[551]124 case DM_DROP:
125 case DM_DRAGOVER:
126 case DM_DRAGLEAVE:
127 case DM_DROPHELP:
128 {
129 CNRDRAGINFO cnd;
130 USHORT dcmd;
[2]131
[551]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;
[2]145 }
[551]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 }
[2]151
[551]152 case UM_RESCAN:
153 if (fAutoTile &&
[1855]154 !fAmClosing && !fNoTileUpdate && !ParentIsDesktop(hwnd, (HWND) 0))
[551]155 PostMsg(WinQueryWindow(hwnd, QW_PARENT), UM_RESCAN, MPVOID, MPVOID);
156 return 0;
[2]157
[551]158 case WM_MINMAXFRAME:
159 {
160 PSWP pswp = (PSWP) mp1;
161 MRESULT rc;
[2]162
[551]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 }
[2]168
[551]169 case WM_DESTROY:
170 WinSendMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
171 break;
[2]172 }
[551]173 return oldproc(hwnd, msg, mp1, mp2);
[2]174}
175
[551]176MRESULT EXPENTRY CommonTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]177{
[551]178 switch (msg) {
179 case WM_CREATE:
180 {
181 MRESULT rc;
[2]182
[551]183 rc = PFNWPStatic(hwnd, msg, mp1, mp2);
[1777]184 // 2014-06-11 SHL
185 switch (WinQueryWindowUShort(hwnd, QWS_ID)) {
186 case DIR_SORT:
187 case DIR_VIEW:
188 case DIR_FILTER:
[1855]189 //fixme to allow user to change presparams 1-10-09 GKY
190 SetPresParams(hwnd, &RGBGREY, &RGBBLACK, &RGBBLACK, FNT_8HELVETICA);
[1777]191 return rc;
192 }
[551]193 }
[1777]194 } // switch msg
[551]195 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]196}
197
[551]198void CommonTextPaint(HWND hwnd, HPS hps)
[377]199{
[2]200 int x;
[551]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 };
[2]205
[551]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);
[2]210 }
211}
212
[1400]213void CommonCreateTextChildren(HWND hwnd, PCSZ class, USHORT * ids)
[377]214{
[551]215 int x;
216 CHAR s[33];
[2]217 ULONG attrs;
[377]218 HWND hwndTmp;
[2]219
[377]220 if (!hwnd || !class || !ids) {
[1398]221 Runtime_Error(pszSrcFile, __LINE__, NULL);
[2]222 return;
[377]223 }
[2]224
[551]225 for (x = 0; ids[x]; x++) {
[2]226 *s = 0;
[551]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;
[2]241 }
[1498]242 hwndTmp = WinCreateWindow(hwnd, (CHAR *) class, s, attrs, 0, 0, 0, 0, hwnd,
[551]243 HWND_TOP, ids[x], NULL, NULL);
[377]244 if (!hwndTmp)
[1395]245 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__,
[1455]246 PCSZ_WINCREATEWINDOW);
[948]247 } // for
[2]248}
249
[551]250void CommonDriveCmd(HWND hwnd, char *drive, USHORT cmd)
[377]251{
[2]252 char dv[CCHMAXPATH];
253
[551]254 if (!drive || !*drive)
[2]255 return;
[551]256 strcpy(dv, drive);
[2]257 MakeValidDir(dv);
258
[551]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:
[552]269 strcpy(dv, drive); // Must use original drive letter
[551]270 if (WinDlgBox(HWND_DESKTOP,
271 hwnd,
272 SetDrvProc,
[1455]273 FM3ModHandle, DVS_FRAME, MPFROMP(dv)) && hwndTree)
[1444]274 if (!PostMsg(hwndTree, UM_SHOWME, MPFROMP(dv), MPVOID))
[1455]275 PostMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_UPDATE, 0), MPVOID);
[551]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:
[1041]285 {
286 HOBJECT hObject;
287 HWND hwndDesktop;
288
289 hObject = WinQueryObject("<XWP_TRASHCAN>");
290 if (hObject != NULLHANDLE && fTrashCan) {
[1455]291 hwndDesktop = WinQueryDesktopWindow((HAB) 0, NULLHANDLE);
292 WinSetFocus(HWND_DESKTOP, hwndDesktop);
293 WinOpenObject(hObject, 0, TRUE);
[1041]294 }
295 else
296 WinDlgBox(HWND_DESKTOP,
[1455]297 hwnd,
298 UndeleteDlgProc,
299 FM3ModHandle, UNDEL_FRAME, MPFROMP(dv));
[1041]300 }
[551]301 break;
302 case IDM_CHKDSK:
303 runemf2(SEPARATE | WINDOWED,
[907]304 hwnd, pszSrcFile, __LINE__, NULL, NULL,
305 "PMCHKDSK.EXE %c:", toupper(*dv));
[551]306 break;
307 case IDM_OPTIMIZE:
308 {
309 CHAR FileSystem[CCHMAXPATH];
310 ULONG type;
[2]311
[551]312 CheckDrive(*dv, FileSystem, &type);
313 if (*FileSystem) {
314 strcat(FileSystem, "OPT.CMD");
315 runemf2(SEPARATE | WINDOWED,
[888]316 hwnd, pszSrcFile, __LINE__,
[551]317 NULL,
318 NULL,
319 "%s /C %s %c:", GetCmdSpec(FALSE), FileSystem, toupper(*dv));
[2]320 }
[551]321 }
322 break;
323 case IDM_FORMAT:
324 runemf2(SEPARATE | WINDOWED,
[907]325 hwnd, pszSrcFile, __LINE__, NULL, NULL,
326 "PMFORMAT.EXE %c:", toupper(*dv));
[551]327 break;
[2]328
[551]329#if 0 // fixme to be gone?
[446]330
[551]331 case IDM_CLOSETRAY:
332 if (driveflags[*dv - 'A'] & DRIVE_CDROM) {
[2]333
[551]334 BYTE parm[4] = { "CD01" };
[841]335 ULONGLONG dlen;
336 ULONG plen;
[551]337 HFILE hfile;
338 APIRET rc;
[2]339
[551]340 dv[2] = 0;
[844]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);
[551]350 if (rc)
[844]351 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__, "DosOpen");
[551]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");
[2]361 }
[551]362 }
363 break;
[446]364#endif // fixme to be gone?
[2]365
[551]366 case IDM_LOCK:
367 case IDM_UNLOCK:
368 case IDM_EJECT:
369 {
[1368]370 UCHAR parm[2];
[551]371 ULONG plen = sizeof(parm), dlen = 0L;
[1391]372 APIRET rc;
[446]373
[551]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;
[2]384 }
[1368]385 parm[1] = *dv - 'A';
[551]386 DosError(FERR_DISABLEHARDERR);
[1391]387 rc = DosDevIOCtl(-1L, 8L, 0x40L, &parm, sizeof(parm), &plen, NULL, 0L, &dlen);
[1365]388 if (cmd == IDM_EJECT &&
[1455]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);
[1444]401 }
[551]402 }
403 break;
[1444]404
405 case IDM_RESCAN:
406 {
407 BOOL toggleTree = FALSE;
408
409 if (!hwndTree) {
[1455]410 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
411 toggleTree = TRUE;
[1444]412 }
413 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_RESCAN, 0), MPVOID);
414 if (toggleTree)
[1455]415 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
[1444]416 }
417 break;
418
419 case IDM_REFRESHREMOVABLES:
420 {
421 BOOL toggleTree = FALSE;
422
423 if (!hwndTree) {
[1455]424 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
425 toggleTree = TRUE;
[1444]426 }
427 WinSendMsg(hwndTree, WM_COMMAND, MPFROM2SHORT(IDM_REFRESHREMOVABLES, 0), MPVOID);
428 if (toggleTree)
[1455]429 WinSendMsg(hwndMain, WM_COMMAND, MPFROM2SHORT(IDM_VTREE, 0), MPVOID);
[1444]430 }
431 break;
[2]432 }
433}
434
[551]435void CommonCreateMainChildren(HWND hwnd, SWP * swp)
[377]436{
[551]437 HWND hwndFrame = WinQueryWindow(hwnd, QW_PARENT);
[377]438 HWND hwndTmp;
439 PFNWP oldproc;
[2]440
[377]441 // Create a children of frame window
[948]442 // Left status window
[377]443 hwndStatus = WinCreateWindow(hwndFrame,
[1498]444 (CHAR *) WC_STATUS,
[551]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);
[377]459 if (!hwndStatus)
[1395]460 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]461 PCSZ_WINCREATEWINDOW);
[377]462
[948]463 // Right status window
[377]464 hwndStatus2 = WinCreateWindow(hwndFrame,
[1498]465 (CHAR *) WC_STATUS,
[551]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);
[377]481 if (!hwndStatus2)
[1395]482 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]483 PCSZ_WINCREATEWINDOW);
[2]484
[377]485 hwndAttr = WinCreateWindow(hwndFrame,
[1498]486 (CHAR *) WC_STATUS,
[551]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);
[377]500 if (!hwndAttr)
[1395]501 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]502 PCSZ_WINCREATEWINDOW);
[377]503
504 hwndDate = WinCreateWindow(hwndFrame,
[1498]505 (CHAR *) WC_STATUS,
[551]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);
[377]519 if (!hwndDate)
[1395]520 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]521 PCSZ_WINCREATEWINDOW);
[377]522
523 hwndName = WinCreateWindow(hwndFrame,
[1498]524 (CHAR *) WC_STATUS,
[551]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);
[377]538 if (!hwndName)
[1395]539 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]540 PCSZ_WINCREATEWINDOW);
[2]541
[377]542 hwndTmp = WinCreateWindow(hwndFrame,
[1498]543 (CHAR *) WC_TOOLBACK,
[551]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);
[377]556 if (!hwndTmp)
[1395]557 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]558 PCSZ_WINCREATEWINDOW);
[377]559
560 hwndBack = WinCreateWindow(hwndFrame,
[1498]561 (CHAR *) WC_DRIVEBACK,
[551]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,
[1455]569 SV_CYSIZEBORDER)) -
570 (DRIVE_BUTTON_HEIGHT),
[551]571 swp->cx -
572 (WinQuerySysValue(HWND_DESKTOP,
573 SV_CXSIZEBORDER) * 2),
[1438]574 DRIVE_BUTTON_HEIGHT,
[551]575 hwndFrame, HWND_TOP, MAIN_DRIVES, NULL, NULL);
[2]576
[377]577 if (!hwndBack)
[1395]578 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]579 PCSZ_WINCREATEWINDOW);
[377]580
581 hwndLED = WinCreateWindow(hwndFrame,
[1498]582 (CHAR *) WC_LED,
[1455]583 "#920", // LEDOFF_BMP
[551]584 WS_VISIBLE | SS_BITMAP,
585 swp->cx - 58,
586 swp->y,
587 12,
588 12, hwndFrame, HWND_TOP, MAIN_LED, NULL, NULL);
[377]589 if (!hwndLED)
[1395]590 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]591 PCSZ_WINCREATEWINDOW);
[377]592
593 hwndLEDHdr = WinCreateWindow(hwndFrame,
[1498]594 (CHAR *) WC_LED,
[551]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);
[377]603 if (!hwndLEDHdr)
[1395]604 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]605 PCSZ_WINCREATEWINDOW);
[377]606
607 hwndAutoview = WinCreateWindow(hwndFrame,
[1498]608 (CHAR *) WC_AUTOVIEW,
[551]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);
[377]624 if (!hwndAutoview)
[1395]625 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]626 PCSZ_WINCREATEWINDOW);
[377]627
628 hwndAutoMLE = WinCreateWindow(hwndFrame,
[551]629 // GetPString(IDS_WCAUTOVIEW),
[1498]630 (CHAR *) WC_MLE,
[551]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);
[377]646 if (!hwndAutoMLE)
[1395]647 Win_Error(hwndFrame, hwnd, pszSrcFile, __LINE__,
[1455]648 PCSZ_WINCREATEWINDOW);
[2]649
[551]650 oldproc = WinSubclassWindow(hwndAutoMLE, AutoViewProc);
[574]651 WinSetWindowPtr(hwndAutoMLE, QWL_USER, (PVOID) oldproc);
[551]652 PostMsg(hwndAutoMLE, UM_SETUP, MPVOID, MPVOID);
[2]653}
654
[1455]655/**
656 * Called by MainWndProc and MainWndProc2 to process messages
657 * common to both fm/2 and fm/2 lite main window
658 */
659
[551]660MRESULT EXPENTRY CommonMainWndProc(HWND hwnd, ULONG msg, MPARAM mp1,
661 MPARAM mp2)
[377]662{
[1455]663 static BOOL fLedOn;
664 static LONG cWorkerThreads;
665
[551]666 switch (msg) {
667 case UM_THREADUSE:
668 if (hbmLEDon && hbmLEDoff) {
[1455]669 CHAR sz[33];
[551]670 if (mp1) {
[1455]671 cWorkerThreads++;
[1855]672 // 13 Sep 09 SHL FIXME to be SMP safe
[1455]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;
[551]677 WinSendMsg(hwndLED, SM_SETHANDLE, MPFROMLONG(hbmLEDon), MPVOID);
[377]678 }
679 }
[1455]680 else if (cWorkerThreads > 0)
681 cWorkerThreads--;
682
683 ltoa(cWorkerThreads, sz, 10);
684 WinSetWindowText(hwndLEDHdr, sz);
[809]685 DosSleep(0);
[551]686 }
687 return 0;
[2]688
[1455]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
[551]701 case UM_LOADFILE:
702 {
703 CHAR *s = NULL;
704 static CHAR lastfile[CCHMAXPATH] = "";
[2]705
[551]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) {
[1009]714 if (!mp2 && !stricmp(lastfile, (CHAR *)mp1))
[551]715 return 0;
[1009]716 strcpy(lastfile, (CHAR *)mp1);
[551]717 s = xstrdup(lastfile, pszSrcFile, __LINE__);
718 }
719 else
720 *lastfile = 0;
721 if (!PostMsg((fComments) ? hwndAutoMLE : hwndAutoview,
722 UM_LOADFILE, MPFROMP(s), MPVOID)) {
[1009]723 xfree(s, pszSrcFile, __LINE__);
[551]724 }
725 }
726 }
727 return 0;
[2]728
[551]729 case UM_BUILDDRIVEBAR:
730 BuildDriveBarButtons(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT),
731 MAIN_DRIVES));
732 return 0;
[2]733 }
[551]734 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[2]735}
736
[551]737MRESULT EXPENTRY CommonTextButton(HWND hwnd, ULONG msg, MPARAM mp1,
738 MPARAM mp2)
[377]739{
[551]740 static HWND hwndLast = (HWND) 0;
[2]741 static ULONG lastclick = 0;
742
[551]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;
[348]751
[551]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;
[2]760
[551]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;
[2]769
[551]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;
[2]777
[551]778 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &check, sizeof(check));
779 if (check > lastclick + 500) {
[2]780
[551]781 RECTL rcl;
782 POINTS pts;
[2]783
[551]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);
[2]789 }
[551]790 lastclick = check;
791 }
792 PostMsg(hwnd, UM_FOCUSME, MPFROMP(hwndLast), MPVOID);
793 hwndLast = (HWND) 0;
794 break;
[2]795
[551]796 case WM_SETFOCUS:
797 if (mp2)
798 hwndLast = (HWND) mp1;
799 break;
[2]800
[551]801 case UM_FOCUSME:
802 if (mp1) {
[2]803
[551]804 PID pid;
805 TID tid;
[2]806
[551]807 if (WinIsWindow(WinQueryAnchorBlock(hwnd), (HWND) mp1) &&
808 WinQueryWindowProcess((HWND) mp1, &pid, &tid) && pid == mypid) {
809 WinSetFocus(HWND_DESKTOP, (HWND) mp1);
810 return 0;
[2]811 }
[551]812 }
813 {
814 HWND htemp = (HWND) 0;
[2]815
[551]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;
[2]826 }
827
[551]828 return PFNWPStatic(hwnd, msg, mp1, mp2);
[2]829}
830
[551]831MRESULT EXPENTRY CommonCnrProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[377]832{
[574]833 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER);
[2]834
[551]835 switch (msg) {
836 case UM_FIXCNRMLE:
837 if (dcd) {
[2]838
[551]839 SWP swp, swpC;
[2]840
[551]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 }
[2]848 }
[551]849 if (mp1)
850 WinSendMsg(WinWindowFromID(hwnd, CID_MLE),
851 MLM_SETTEXTLIMIT, mp1, MPVOID);
852 }
853 return 0;
[2]854
[551]855 case UM_FIXEDITNAME:
856 if (dcd) {
857 if (mp1 && (INT) mp1 != -1) {
[2]858
[551]859 CHAR *p;
[2]860
[551]861 WinSendMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID);
862 MLEdelete(WinWindowFromID(hwnd, CID_MLE),
[1009]863 0, strlen((CHAR *)mp1) + 1);
864 WinSetDlgItemText(hwnd, CID_MLE, (CHAR *)mp1);
865 p = strrchr((CHAR *)mp1, '\\');
[551]866 if (p) {
867 p++;
[1009]868 MLEsetcurposa(WinWindowFromID(hwnd, CID_MLE), (p - (CHAR *)mp1));
869 MLEsetcurposc(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]870 }
871 else
[1009]872 MLEsetcurpos(WinWindowFromID(hwnd, CID_MLE), strlen((CHAR *)mp1));
[551]873 }
874 else if (mp2) {
[1855]875 Broadcast(WinQueryAnchorBlock(hwnd),
876 dcd->hwndParent, UM_UPDATERECORD, mp2, MPVOID);
877 xfree(mp2, pszSrcFile, __LINE__);
[2]878 }
[551]879 }
880 return 0;
[2]881 }
[551]882 return PFNWPCnr(hwnd, msg, mp1, mp2);
[2]883}
884
[551]885HWND OpenDirCnr(HWND hwnd, HWND hwndParent, HWND hwndRestore,
886 BOOL noautotile, char *directory)
[377]887{
[551]888 SWP swp;
[2]889 HWND hwndDir;
890
[551]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);
[2]907 WinSetWindowPos(hwndDir,
[551]908 HWND_TOP,
909 0, 0, 0, 0, SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
[2]910 }
911 }
912 else {
913
914 char s[256];
915
916 assign_ignores(s);
917 runemf2(WINDOWED | SEPARATE,
[888]918 hwnd, pszSrcFile, __LINE__,
[551]919 NULL,
920 NULL,
921 "VDIR.EXE %s%s\"%s%s\"",
922 (*s) ? s : NullStr, (*s) ? " " : NullStr,
923 directory,
[1438]924 (directory[strlen(directory) - 1] == '\\') ? PCSZ_BACKSLASH : NullStr);
[2]925 }
926 return hwndDir;
927}
928
[536]929//= IncrThreadUsage() Increment thread usage counter ==
930
931VOID IncrThreadUsage(VOID)
932{
933 if (hwndMain)
[551]934 WinPostMsg(hwndMain, UM_THREADUSE, MPFROMLONG(1), MPVOID);
[536]935}
936
937//= DecrThreadUsage() Decrement thread usage counter ==
938
939VOID DecrThreadUsage(VOID)
940{
941 if (hwndMain)
[551]942 WinPostMsg(hwndMain, UM_THREADUSE, MPVOID, MPVOID);
[536]943}
[793]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.