source: trunk/dll/common.c@ 1829

Last change on this file since 1829 was 1829, checked in by Gregg Young, 10 years ago

Fix CN_REALLOCPSZ file name editing code to: 1) Actually reallocate the buffer. 2) Point pci->pszDisplayName into the new buffer 3) Eliminate the possibility of updating the container before CN_ENDEDIT is called. 4) Only call RemoveCnrItems for tree container and collector. Ticket [557]

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