source: trunk/dll/common.c@ 1444

Last change on this file since 1444 was 1444, checked in by Gregg Young, 16 years ago

Rework of drivebar to rescan all drives and refresh media buttons and menu items grey out inappropriate menu items. Streamline Tree scan code and use semaphores to serialize access. Add NOEASUPPORT and LOCALHD driveflag; .LONGNAME usage fixes; (Tickets 377-386)

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